diff --git a/.github/workflows/deno-publish.yml b/.github/workflows/deno-publish.yml index 0f20475..8c8f514 100644 --- a/.github/workflows/deno-publish.yml +++ b/.github/workflows/deno-publish.yml @@ -25,7 +25,7 @@ jobs: - name: Setup Deno uses: denoland/setup-deno@v1.1.4 with: - deno-version: v1.40.x + deno-version: v1.43.3 - name: Node setup uses: actions/setup-node@v4.0.1 diff --git a/.github/workflows/deno-test.yml b/.github/workflows/deno-test.yml index 47add4a..ff98bf5 100644 --- a/.github/workflows/deno-test.yml +++ b/.github/workflows/deno-test.yml @@ -24,7 +24,8 @@ jobs: uses: denoland/setup-deno@v1.1.4 # uses: denoland/setup-deno@9db7f66e8e16b5699a514448ce994936c63f0d54 with: - deno-version: v1.40.x # required due to usage of Deno.stdout.isTerminal() + deno-version: v1.43.3 + # deno-version: v1.40.x # required due to usage of Deno.stdout.isTerminal() # deno-version: v1.x - name: Verify formatting diff --git a/.github/workflows/jsr-publish.yml b/.github/workflows/jsr-publish.yml new file mode 100644 index 0000000..5fccf1a --- /dev/null +++ b/.github/workflows/jsr-publish.yml @@ -0,0 +1,47 @@ +name: Publish to JSR + +on: + release: + types: [created] + workflow_dispatch: + inputs: + npm_version: + description: 'Version number to publish on JSR X.Y.Z' + required: true +permissions: + contents: read + +jobs: + publish: + runs-on: ubuntu-latest + + permissions: + contents: read + id-token: write + + steps: + - name: Setup repo + uses: actions/checkout@v4.1.1 # use nodeJS 20 + + - name: Setup Deno + uses: denoland/setup-deno@v1.1.4 + with: + deno-version: v1.43.3 + + - name: Node setup + uses: actions/setup-node@v4.0.1 + with: + node-version: 20 + registry-url: https://registry.npmjs.org/ + + - name: Run linter + run: deno lint + + - name: Run tests + run: deno test -A + + - name: show deno version + run: deno --version + + - name: Publish package ${{inputs.npm_version}} + run: npx jsr publish diff --git a/README.md b/README.md index 1939c5c..e8b0332 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # deno-logger [![NPM Version](https://img.shields.io/npm/v/@denodnt/logger.svg?style=flat)](https://www.npmjs.org/package/@denodnt/logger) +[![JSR Version](https://jsr.io/badges/@deno-lib/logger)](https://jsr.io/@deno-lib/logger) + Deno / NodeJS colorful logger colorful logger For Deno usage refer to [deno-logger doc](https://deno.land/x/logger) @@ -10,7 +12,7 @@ For Deno usage refer to [deno-logger doc](https://deno.land/x/logger) ### console logger ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); @@ -22,7 +24,7 @@ logger.error("i am from consoleLogger", new Error("test")); ### file and console logger ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); @@ -42,7 +44,7 @@ logger.error("i am from fileLogger", new Error("test")); ### file logger only ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); await logger.initFileLogger("../log"); @@ -68,7 +70,7 @@ interface fileLoggerOptions { example ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); // cut by day @@ -97,25 +99,23 @@ await logger.initFileLogger("../log", { // filename is [type].log.[n] // example info.log.1, info.log.2 ... // when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite -/* - detail: -`maxBytes` specifies the maximum size -in bytes that the log file can grow to before rolling over to a new one. If the -size of the new log message plus the current log file size exceeds `maxBytes` -then a roll over is triggered. When a roll over occurs, before the log message -is written, the log file is renamed and appended with `.1`. If a `.1` version -already existed, it would have been renamed `.2` first and so on. The maximum -number of log files to keep is specified by `maxBackupCount`. After the renames -are complete the log message is written to the original, now blank, file. - -Example: Given `log.txt`, `log.txt.1`, `log.txt.2` and `log.txt.3`, a -`maxBackupCount` of 3 and a new log message which would cause `log.txt` to -exceed `maxBytes`, then `log.txt.2` would be renamed to `log.txt.3` (thereby -discarding the original contents of `log.txt.3` since 3 is the maximum number of -backups to keep), `log.txt.1` would be renamed to `log.txt.2`, `log.txt` would -be renamed to `log.txt.1` and finally `log.txt` would be created from scratch -where the new log message would be written. -*/ +// detail: +// `maxBytes` specifies the maximum size +// in bytes that the log file can grow to before rolling over to a new one. If the +// size of the new log message plus the current log file size exceeds `maxBytes` +// then a roll over is triggered. When a roll over occurs, before the log message +// is written, the log file is renamed and appended with `.1`. If a `.1` version +// already existed, it would have been renamed `.2` first and so on. The maximum +// number of log files to keep is specified by `maxBackupCount`. After the renames +// are complete the log message is written to the original, now blank, file. +// +// Example: Given `log.txt`, `log.txt.1`, `log.txt.2` and `log.txt.3`, a +// `maxBackupCount` of 3 and a new log message which would cause `log.txt` to +// exceed `maxBytes`, then `log.txt.2` would be renamed to `log.txt.3` (thereby +// discarding the original contents of `log.txt.3` since 3 is the maximum number of +// backups to keep), `log.txt.1` would be renamed to `log.txt.2`, `log.txt` would +// be renamed to `log.txt.1` and finally `log.txt` would be created from scratch +// where the new log message would be written. await logger.initFileLogger("../log", { maxBytes: 10 * 1024, maxBackupCount: 10, @@ -158,7 +158,7 @@ await logger.initFileLogger("../log", { ## disableConsole and enableConsole ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); @@ -175,7 +175,7 @@ logger.info("console enabled, you can see me"); ## disableFile and enableFile ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); await logger.initFileLogger("../log"); @@ -202,7 +202,7 @@ example: 3. fileLogger, consoleLogger => disable => enable => fileLogger, consoleLogger ```js -import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; +import Logger from "https://deno.land/x/logger@v1.1.6/logger.ts"; const logger = new Logger(); await logger.initFileLogger("../log"); @@ -228,7 +228,7 @@ To convert your Deno project to a dual-stack npm project, you should use `scripts/build_npm.ts` that looks like: ```ts -import { build, emptyDir } from "https://deno.land/x/dnt/mod.ts"; +import { build, emptyDir } from "@deno/dnt"; // grap the next version number as you want const version: Deno.args[0]; @@ -249,9 +249,9 @@ await build({ }, // map your favorite deno logger to its npm port. mappings: { - "https://deno.land/x/logger@v1.2.0/logger.ts": { + "https://deno.land/x/logger@v1.1.6/logger.ts": { name: "@denodnt/logger", - version: "1.2.0", + version: "1.1.6", peerDependency: false, }, }, diff --git a/_build_npm.ts b/_build_npm.ts index ccc3590..a81fa8f 100644 --- a/_build_npm.ts +++ b/_build_npm.ts @@ -1,10 +1,7 @@ // dnt deps can not be moved to dev_deps.ts -import { - build, - emptyDir, - type PackageJson, -} from "https://deno.land/x/dnt@0.40.0/mod.ts"; -import * as pc from "https://deno.land/std@0.189.0/fmt/colors.ts"; +import { build, emptyDir } from "@deno/dnt"; +import type { PackageJson } from "@deno/dnt"; +import * as pc from "jsr:@std/fmt@0.225.1/colors"; export async function buildDnt() { let version = Deno.args[0]; diff --git a/_updateMod.ts b/_updateMod.ts new file mode 100644 index 0000000..969740a --- /dev/null +++ b/_updateMod.ts @@ -0,0 +1,40 @@ +const readmeContentOriginal = Deno.readTextFileSync("README.md"); +const jsonStr = Deno.readTextFileSync("deno.jsonc"); +const jsonConf = JSON.parse(jsonStr) as { version: string }; + +let readmeContent = readmeContentOriginal.replaceAll( + /https:\/\/deno.land\/x\/logger@v[\d.]+\/logger.ts/g, + `https://deno.land/x/logger@v${jsonConf.version}/logger.ts`, +).replaceAll( + /version: "[\d.]+"/g, + `version: "${jsonConf.version}"`, +); + +// update current version in readme +if (readmeContent !== readmeContentOriginal) { + Deno.writeTextFileSync("README.md", readmeContent); +} + +readmeContent = readmeContent.replaceAll( + /https:\/\/deno.land\/x\/logger@v[\d.]+\/logger.ts/g, + `jsr:@deno-lib/logger@${jsonConf.version}/logger`, +); + +// Write the updated content back to the mod.ts file +Deno.writeTextFileSync( + "mod.ts", + `/** +* ${readmeContent} +* @module +*/ + +/** + * The Logger class + */ +export { default as Logger } from "./logger.ts"; +/** + * The Logger class default instance + */ +export { default as default } from "./logger.ts"; +`, +); diff --git a/changelog.md b/changelog.md index 317d5a2..ad8e2c8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,10 @@ ## Changelog +### v1.1.6 - 2024.05.17 + +- use JSR publish +- add docs + ### v1.1.1 - 2023.05.19 - New build / deployement script diff --git a/date.ts b/date.ts index e2bd383..7daff2d 100644 --- a/date.ts +++ b/date.ts @@ -1,13 +1,26 @@ // const format = n => n > 9 ? n : `0${n}`; const format = (n: number) => n.toString().padStart(2, "0"); +/** + * Dater extends Date to provide more formating methods. + */ export default class Dater extends Date { + /** + * Get date string as yyyy-mm-dd hh:mm:ss + * @param separator + * @returns + */ toLocaleString(separator = "-"): string { const dateString = this.toLocaleDateString(separator); const timeString = this.toLocaleTimeString(); return `${dateString} ${timeString}`; } + /** + * Get date string as yyyy-mm-dd + * @param separator + * @returns + */ toLocaleDateString(separator = "-"): string { const year = format(this.getFullYear()); const month = format(this.getMonth() + 1); @@ -15,6 +28,10 @@ export default class Dater extends Date { return `${year}${separator}${month}${separator}${day}`; } + /** + * Get time string as hh:mm:ss + * @returns + */ toLocaleTimeString(): string { const hour = format(this.getHours()); const minute = format(this.getMinutes()); diff --git a/deno.jsonc b/deno.jsonc index c901ce7..e9b6ac3 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,4 +1,10 @@ { + "name": "@deno-lib/logger", + "version": "1.1.6", + "exports": "./mod.ts", + "tasks": { + "regen": "deno run -A _updateMod.ts" + }, "fmt": { "exclude": ["npm/"] }, @@ -7,5 +13,12 @@ }, "test": { "exclude": ["npm/"] + }, + "publish": { + "include": ["*.ts", "README.md", "LICENSE", "changelog.md", "deno.jsonc"], + "exclude": ["_*.ts"] + }, + "imports": { + "@deno/dnt": "jsr:@deno/dnt@^0.41.1" } } diff --git a/deno.lock b/deno.lock index 7caf9b3..3a508cf 100644 --- a/deno.lock +++ b/deno.lock @@ -1,11 +1,332 @@ { - "version": "2", + "version": "3", + "packages": { + "specifiers": { + "jsr:@deno/cache-dir@^0.8.0": "jsr:@deno/cache-dir@0.8.0", + "jsr:@deno/dnt@^0.41.1": "jsr:@deno/dnt@0.41.1", + "jsr:@std/assert@^0.218.2": "jsr:@std/assert@0.218.2", + "jsr:@std/bytes@^0.218.2": "jsr:@std/bytes@0.218.2", + "jsr:@std/fmt@0.225.1": "jsr:@std/fmt@0.225.1", + "jsr:@std/fmt@^0.218.2": "jsr:@std/fmt@0.218.2", + "jsr:@std/fs@^0.218.2": "jsr:@std/fs@0.218.2", + "jsr:@std/io@0.224.0": "jsr:@std/io@0.224.0", + "jsr:@std/io@^0.213.0": "jsr:@std/io@0.213.1", + "jsr:@std/io@^0.218.2": "jsr:@std/io@0.218.2", + "jsr:@std/path@^0.218.2": "jsr:@std/path@0.218.2", + "jsr:@std/streams@0.213.0": "jsr:@std/streams@0.213.0", + "npm:@ts-morph/bootstrap@0.22": "npm:@ts-morph/bootstrap@0.22.0", + "npm:code-block-writer@^13.0.1": "npm:code-block-writer@13.0.1" + }, + "jsr": { + "@deno/cache-dir@0.8.0": { + "integrity": "e87e80a404958f6350d903e6238b72afb92468378b0b32111f7a1e4916ac7fe7", + "dependencies": [ + "jsr:@std/fs@^0.218.2", + "jsr:@std/io@^0.218.2" + ] + }, + "@deno/dnt@0.41.1": { + "integrity": "8746a773e031ae19ef43d0eece850217b76cf1d0118fdd8e059652d7023d4aff", + "dependencies": [ + "jsr:@deno/cache-dir@^0.8.0", + "jsr:@std/fmt@^0.218.2", + "jsr:@std/fs@^0.218.2", + "jsr:@std/path@^0.218.2", + "npm:@ts-morph/bootstrap@0.22", + "npm:code-block-writer@^13.0.1" + ] + }, + "@std/assert@0.218.2": { + "integrity": "7f0a5a1a8cf86607cd6c2c030584096e1ffad27fc9271429a8cb48cfbdee5eaf" + }, + "@std/bytes@0.218.2": { + "integrity": "91fe54b232dcca73856b79a817247f4a651dbb60d51baafafb6408c137241670" + }, + "@std/fmt@0.218.2": { + "integrity": "99526449d2505aa758b6cbef81e7dd471d8b28ec0dcb1491d122b284c548788a" + }, + "@std/fmt@0.225.1": { + "integrity": "44a8cb375d7344adb3cb0208b85ea0bde7cdc15224c11188c85e733834ffe356" + }, + "@std/fs@0.218.2": { + "integrity": "dd9431453f7282e8c577cc22c9e6d036055a9a980b5549f887d6012969fabcca", + "dependencies": [ + "jsr:@std/assert@^0.218.2", + "jsr:@std/path@^0.218.2" + ] + }, + "@std/io@0.213.1": { + "integrity": "18ee1ab872d43077d9ced51ffae38093ad4e818d2b23c3b18a6683edf5f428ae" + }, + "@std/io@0.218.2": { + "integrity": "c64fbfa087b7c9d4d386c5672f291f607d88cb7d44fc299c20c713e345f2785f", + "dependencies": [ + "jsr:@std/bytes@^0.218.2" + ] + }, + "@std/io@0.224.0": { + "integrity": "0aff885d21d829c050b8a08b1d71b54aed5841aecf227f8d77e99ec529a11e8e" + }, + "@std/path@0.218.2": { + "integrity": "b568fd923d9e53ad76d17c513e7310bda8e755a3e825e6289a0ce536404e2662", + "dependencies": [ + "jsr:@std/assert@^0.218.2" + ] + }, + "@std/streams@0.213.0": { + "integrity": "14519c7ce5f4c88de2e365f4bf1b8371c942a9fe0e1f9a0b9e10a56e3c3e3877", + "dependencies": [ + "jsr:@std/io@^0.213.0" + ] + } + }, + "npm": { + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", + "run-parallel": "run-parallel@1.2.0" + } + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dependencies": {} + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", + "fastq": "fastq@1.17.1" + } + }, + "@ts-morph/bootstrap@0.22.0": { + "integrity": "sha512-MI5q7pid4swAlE2lcHwHRa6rcjoIMyT6fy8uuZm8BGg7DHGi/H5bQ0GMZzbk3N0r/LfStMdOYPkl+3IwvfIQ2g==", + "dependencies": { + "@ts-morph/common": "@ts-morph/common@0.22.0" + } + }, + "@ts-morph/common@0.22.0": { + "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", + "dependencies": { + "fast-glob": "fast-glob@3.3.2", + "minimatch": "minimatch@9.0.4", + "mkdirp": "mkdirp@3.0.1", + "path-browserify": "path-browserify@1.0.1" + } + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dependencies": {} + }, + "brace-expansion@2.0.1": { + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "balanced-match@1.0.2" + } + }, + "braces@3.0.2": { + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "fill-range@7.0.1" + } + }, + "code-block-writer@13.0.1": { + "integrity": "sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==", + "dependencies": {} + }, + "fast-glob@3.3.2": { + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", + "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", + "glob-parent": "glob-parent@5.1.2", + "merge2": "merge2@1.4.1", + "micromatch": "micromatch@4.0.5" + } + }, + "fastq@1.17.1": { + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "reusify@1.0.4" + } + }, + "fill-range@7.0.1": { + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "to-regex-range@5.0.1" + } + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "is-glob@4.0.3" + } + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dependencies": {} + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "is-extglob@2.1.1" + } + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dependencies": {} + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dependencies": {} + }, + "micromatch@4.0.5": { + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "braces@3.0.2", + "picomatch": "picomatch@2.3.1" + } + }, + "minimatch@9.0.4": { + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "brace-expansion@2.0.1" + } + }, + "mkdirp@3.0.1": { + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dependencies": {} + }, + "path-browserify@1.0.1": { + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dependencies": {} + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dependencies": {} + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dependencies": {} + }, + "reusify@1.0.4": { + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dependencies": {} + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": { + "queue-microtask": "queue-microtask@1.2.3" + } + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "is-number@7.0.0" + } + } + } + }, "remote": { + "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", + "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", + "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", + "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", + "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", + "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", + "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", + "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", + "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", + "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", + "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", + "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", + "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", + "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", + "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", + "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.181.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", + "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", + "https://deno.land/std@0.181.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", + "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", + "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", + "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", + "https://deno.land/std@0.181.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.181.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.181.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", + "https://deno.land/std@0.181.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.181.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.181.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", + "https://deno.land/std@0.181.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", + "https://deno.land/std@0.181.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.181.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", "https://deno.land/std@0.189.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", "https://deno.land/std@0.189.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", "https://deno.land/std@0.189.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", "https://deno.land/std@0.189.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", "https://deno.land/std@0.189.0/testing/asserts.ts": "e16d98b4d73ffc4ed498d717307a12500ae4f2cbe668f1a215632d19fcffc22f", - "https://deno.land/std@0.189.0/types.d.ts": "dbaeb2c4d7c526db9828fc8df89d8aecf53b9ced72e0c4568f97ddd8cda616a4" + "https://deno.land/std@0.189.0/types.d.ts": "dbaeb2c4d7c526db9828fc8df89d8aecf53b9ced72e0c4568f97ddd8cda616a4", + "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", + "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", + "https://deno.land/x/deno_cache@0.6.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", + "https://deno.land/x/deno_cache@0.6.2/cache.ts": "58b53c128b742757efcad10af9a3871f23b4e200674cb5b0ddf61164fb9b2fe7", + "https://deno.land/x/deno_cache@0.6.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", + "https://deno.land/x/deno_cache@0.6.2/deps.ts": "12cca94516cf2d3ed42fccd4b721ecd8060679253f077d83057511045b0081aa", + "https://deno.land/x/deno_cache@0.6.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", + "https://deno.land/x/deno_cache@0.6.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", + "https://deno.land/x/deno_cache@0.6.2/file_fetcher.ts": "4f3e4a2c78a5ca1e4812099e5083f815a8525ab20d389b560b3517f6b1161dd6", + "https://deno.land/x/deno_cache@0.6.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", + "https://deno.land/x/deno_cache@0.6.2/lib/deno_cache_dir.generated.js": "59f8defac32e8ebf2a30f7bc77e9d88f0e60098463fb1b75e00b9791a4bbd733", + "https://deno.land/x/deno_cache@0.6.2/lib/snippets/deno_cache_dir-a2aecaa9536c9402/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", + "https://deno.land/x/deno_cache@0.6.2/mod.ts": "b4004287e1c6123d7f07fe9b5b3e94ce6d990c4102949a89c527c68b19627867", + "https://deno.land/x/deno_cache@0.6.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", + "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", + "https://deno.land/x/dnt@0.39.0/lib/compiler.ts": "7f4447531581896348b8a379ab94730856b42ae50d99043f2468328360293cb1", + "https://deno.land/x/dnt@0.39.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", + "https://deno.land/x/dnt@0.39.0/lib/mod.deps.ts": "8d6123c8e1162037e58aa8126686a03d1e2cffb250a8757bf715f80242097597", + "https://deno.land/x/dnt@0.39.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", + "https://deno.land/x/dnt@0.39.0/lib/package_json.ts": "607b0a4f44acad071a4c8533b312a27d6671eac8e6a23625c8350ce29eadb2ba", + "https://deno.land/x/dnt@0.39.0/lib/pkg/dnt_wasm.generated.js": "4f9c59b3ca6c875adabb10df256e273fff1129fca3a1557eb8936bddd7da7b18", + "https://deno.land/x/dnt@0.39.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "aba69a019a6da6f084898a6c7b903b8b583bc0dbd82bfb338449cf0b5bce58fd", + "https://deno.land/x/dnt@0.39.0/lib/shims.ts": "60fd285ad433c6944544595e7b885eab3eab09253252891380654f4cd3addaaa", + "https://deno.land/x/dnt@0.39.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", + "https://deno.land/x/dnt@0.39.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", + "https://deno.land/x/dnt@0.39.0/lib/transform.deps.ts": "2e159661e1c5c650de9a573babe0e319349fe493105157307ec2ad2f6a52c94e", + "https://deno.land/x/dnt@0.39.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", + "https://deno.land/x/dnt@0.39.0/lib/utils.ts": "224f15f33e7226a2fd991e438d0291d7ed8c7889807efa2e1ecb67d2d1db6720", + "https://deno.land/x/dnt@0.39.0/mod.ts": "9df36a862161d9eb376472b699f6cb08ba0ad1704e0826fbe13be766bd3c01da", + "https://deno.land/x/dnt@0.39.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", + "https://deno.land/x/dnt@0.40.0/lib/compiler.ts": "7f4447531581896348b8a379ab94730856b42ae50d99043f2468328360293cb1", + "https://deno.land/x/dnt@0.40.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", + "https://deno.land/x/dnt@0.40.0/lib/mod.deps.ts": "8d6123c8e1162037e58aa8126686a03d1e2cffb250a8757bf715f80242097597", + "https://deno.land/x/dnt@0.40.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", + "https://deno.land/x/dnt@0.40.0/lib/package_json.ts": "607b0a4f44acad071a4c8533b312a27d6671eac8e6a23625c8350ce29eadb2ba", + "https://deno.land/x/dnt@0.40.0/lib/pkg/dnt_wasm.generated.js": "2694546844a50861d6d1610859afbf5130baca4dc6cf304541b7ec2d6d998142", + "https://deno.land/x/dnt@0.40.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "aba69a019a6da6f084898a6c7b903b8b583bc0dbd82bfb338449cf0b5bce58fd", + "https://deno.land/x/dnt@0.40.0/lib/shims.ts": "39e5c141f0315c0faf30b479b53f92b9078d92e1fd67ee34cc60b701d8e68dab", + "https://deno.land/x/dnt@0.40.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", + "https://deno.land/x/dnt@0.40.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", + "https://deno.land/x/dnt@0.40.0/lib/transform.deps.ts": "2e159661e1c5c650de9a573babe0e319349fe493105157307ec2ad2f6a52c94e", + "https://deno.land/x/dnt@0.40.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", + "https://deno.land/x/dnt@0.40.0/lib/utils.ts": "224f15f33e7226a2fd991e438d0291d7ed8c7889807efa2e1ecb67d2d1db6720", + "https://deno.land/x/dnt@0.40.0/mod.ts": "ae1890fbe592e4797e7dd88c1e270f22b8334878e9bf187c4e11ae75746fe778", + "https://deno.land/x/dnt@0.40.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", + "https://deno.land/x/ts_morph@20.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", + "https://deno.land/x/ts_morph@20.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", + "https://deno.land/x/ts_morph@20.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", + "https://deno.land/x/ts_morph@20.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", + "https://deno.land/x/ts_morph@20.0.0/common/ts_morph_common.js": "2325f94f61dc5f3f98a1dab366dc93048d11b1433d718b10cfc6ee5a1cfebe8f", + "https://deno.land/x/ts_morph@20.0.0/common/typescript.js": "b9edf0a451685d13e0467a7ed4351d112b74bd1e256b915a2b941054e31c1736", + "https://deno.land/x/wasmbuild@0.15.1/cache.ts": "9d01b5cb24e7f2a942bbd8d14b093751fa690a6cde8e21709ddc97667e6669ed", + "https://deno.land/x/wasmbuild@0.15.1/loader.ts": "8c2fc10e21678e42f84c5135d8ab6ab7dc92424c3f05d2354896a29ccfd02a63" + }, + "workspace": { + "dependencies": [ + "jsr:@deno/dnt@^0.41.1" + ] } } diff --git a/deps.ts b/deps.ts index 466d34f..932250a 100644 --- a/deps.ts +++ b/deps.ts @@ -1,7 +1,4 @@ -export { - green, - red, - stripColor, - yellow, -} from "https://deno.land/std@0.189.0/fmt/colors.ts"; -export { writeAll } from "https://deno.land/std@0.189.0/streams/write_all.ts"; +export { green, red, stripAnsiCode, yellow } from "jsr:@std/fmt@0.225.1/colors"; + +export { writeAll } from "jsr:@std/io@0.224.0/write-all"; +// "https://deno.land/std@0.189.0/streams/write_all.ts"; diff --git a/dev_deps.ts b/dev_deps.ts index 6f7fe82..3184c86 100644 --- a/dev_deps.ts +++ b/dev_deps.ts @@ -2,4 +2,5 @@ export { assert, assertEquals, assertRejects, -} from "https://deno.land/std@0.189.0/testing/asserts.ts"; +} from "jsr:@std/testing@0.224.0/asserts"; +// "https://deno.land/std@0.189.0/testing/asserts.ts"; diff --git a/eol.ts b/eol.ts index 9e2416f..eda7466 100644 --- a/eol.ts +++ b/eol.ts @@ -1,3 +1,6 @@ const os = Deno.build.os; const eol = os === "windows" ? "\r\n" : "\n"; +/** + * OS specific end of line character + */ export default eol; diff --git a/fs.ts b/fs.ts index 02f16a6..ea9ca85 100644 --- a/fs.ts +++ b/fs.ts @@ -1,5 +1,10 @@ const { lstat } = Deno; +/** + * Async existance check for file return true if file exists + * @param filePath path to file + * @returns Promise + */ export async function exists(filePath: string): Promise { try { await lstat(filePath); diff --git a/interface.ts b/interface.ts index 2f91151..c9717d7 100644 --- a/interface.ts +++ b/interface.ts @@ -1,4 +1,4 @@ -import Types from "./types.ts"; +import type Types from "./types.ts"; export interface WriterConstructor { maxBytes?: number; diff --git a/logger.ts b/logger.ts index be90f1b..4d41647 100644 --- a/logger.ts +++ b/logger.ts @@ -3,13 +3,16 @@ import Writer from "./writer.ts"; import eol from "./eol.ts"; import { exists } from "./fs.ts"; import Dater from "./date.ts"; -import { green, red, stripColor, yellow } from "./deps.ts"; -import { fileLoggerOptions, LoggerWriteOptions } from "./interface.ts"; +import { green, red, stripAnsiCode, yellow } from "./deps.ts"; +import type { fileLoggerOptions, LoggerWriteOptions } from "./interface.ts"; import Types from "./types.ts"; const { inspect } = Deno; const noop = async () => {}; +/** + * Logger class + */ export default class Logger { private stdout = stdout; private encoder = new TextEncoder(); @@ -32,9 +35,13 @@ export default class Logger { // indentLevel: 2 // })).join(''); - return this.encoder.encode(stripColor(msg) + eol); + return this.encoder.encode(stripAnsiCode(msg) + eol); } + /** + * Log message with info level + * @param args data to log + */ async info(...args: unknown[]): Promise { args = [this.getInfo(), ...args]; this.stdout(...args); @@ -47,6 +54,10 @@ export default class Logger { } } + /** + * Log message with warning level + * @param args data to log + */ async warn(...args: unknown[]): Promise { args = [this.getWarn(), ...args]; this.stdout(...args); @@ -59,6 +70,10 @@ export default class Logger { } } + /** + * Log message with error level + * @param args data to log + */ async error(...args: unknown[]): Promise { args = [this.getError(), ...args]; this.stdout(...args); @@ -79,6 +94,11 @@ export default class Logger { return this.writer!.write({ path, msg, type }); } + /** + * init file logger + * @param dir + * @param options + */ async initFileLogger( dir: string, options: fileLoggerOptions = {}, @@ -102,6 +122,10 @@ export default class Logger { }); } + /** + * disable a specific type of logger + * @param type Level of logger to disable + */ disable(type?: "info" | "warn" | "error"): void { if (!type) { this.info = noop; @@ -123,6 +147,10 @@ export default class Logger { } } + /** + * Enable a specific type of logger + * @param type Level of logger to enable + */ enable(type?: "info" | "warn" | "error"): void { if (!type) { this.info = this.#info; @@ -143,18 +171,30 @@ export default class Logger { } } + /** + * Disable console logger + */ disableConsole(): void { this.stdout = noop; } + /** + * Enable console logger + */ enableConsole(): void { this.stdout = stdout; } + /** + * Disable file logger + */ disableFile(): void { this.write = noop; } + /** + * Enable file logger + */ enableFile(): void { this.write = this.#write; } diff --git a/mod.ts b/mod.ts index b52173f..2762497 100644 --- a/mod.ts +++ b/mod.ts @@ -1,6 +1,314 @@ /** - * # logger for deno - * @module +* # deno-logger + +[![NPM Version](https://img.shields.io/npm/v/@denodnt/logger.svg?style=flat)](https://www.npmjs.org/package/@denodnt/logger) +[![JSR Version](https://jsr.io/badges/@deno-lib/logger)](https://jsr.io/@deno-lib/logger) + +Deno / NodeJS colorful logger colorful logger + +For Deno usage refer to [deno-logger doc](https://deno.land/x/logger) + +## Useage + +### console logger + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; + +const logger = new Logger(); + +logger.info("i am from consoleLogger", { name: "zfx" }); +logger.warn("i am from consoleLogger", 1, "any"); +logger.error("i am from consoleLogger", new Error("test")); +``` + +### file and console logger + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; + +const logger = new Logger(); + +// console only +logger.info("i am from consoleLogger", { name: "zfx" }); +logger.warn("i am from consoleLogger", 1, "any"); +logger.error("i am from consoleLogger", new Error("test")); + +await logger.initFileLogger("../log"); + +// file and console +logger.info("i am from fileLogger", { name: "zfx" }); +logger.warn("i am from fileLogger", 1, "any"); +logger.error("i am from fileLogger", new Error("test")); +``` + +### file logger only + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; + +const logger = new Logger(); +await logger.initFileLogger("../log"); +logger.disableConsole(); + +// file only +logger.info(["i am from fileLogger", 1], { name: "zfx" }); +``` + +### file logger optional parameter + +interface + +```ts +interface fileLoggerOptions { + rotate?: boolean; // cut by day + maxBytes?: number; + // Only available if maxBytes is provided, Otherwise you will get an error + maxBackupCount?: number; +} +``` + +example + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; +const logger = new Logger(); + +// cut by day +// filename is [date]_[type].log +// example 2020-05-25_warn.log, 2020-05-25_info.log, 2020-05-25_error.log +await logger.initFileLogger("../log", { + rotate: true, +}); + +// maxBytes +// filename is [type].log.[timestamp] +// example: info.log.1590374415956 +await logger.initFileLogger("../log", { + maxBytes: 10 * 1024, +}); + +// rotate and maxBytes +// filename is [date]_[type].log.[timestamp] +// example: 2020-05-25_info.log.1590374415956 +await logger.initFileLogger("../log", { + rotate: true, + maxBytes: 10 * 1024, +}); + +// maxBytes and maxBackupCount +// filename is [type].log.[n] +// example info.log.1, info.log.2 ... +// when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite +// detail: +// `maxBytes` specifies the maximum size +// in bytes that the log file can grow to before rolling over to a new one. If the +// size of the new log message plus the current log file size exceeds `maxBytes` +// then a roll over is triggered. When a roll over occurs, before the log message +// is written, the log file is renamed and appended with `.1`. If a `.1` version +// already existed, it would have been renamed `.2` first and so on. The maximum +// number of log files to keep is specified by `maxBackupCount`. After the renames +// are complete the log message is written to the original, now blank, file. +// +// Example: Given `log.txt`, `log.txt.1`, `log.txt.2` and `log.txt.3`, a +// `maxBackupCount` of 3 and a new log message which would cause `log.txt` to +// exceed `maxBytes`, then `log.txt.2` would be renamed to `log.txt.3` (thereby +// discarding the original contents of `log.txt.3` since 3 is the maximum number of +// backups to keep), `log.txt.1` would be renamed to `log.txt.2`, `log.txt` would +// be renamed to `log.txt.1` and finally `log.txt` would be created from scratch +// where the new log message would be written. +await logger.initFileLogger("../log", { + maxBytes: 10 * 1024, + maxBackupCount: 10, +}); + +// rotate and maxBytes and maxBackupCount +// filename is [date]_[type].log.[n] +// example 2020-05-25_info.log.1, 2020-05-25_info.log.2 +// when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite +await logger.initFileLogger("../log", { + rotate: true, + maxBytes: 10 * 1024, + maxBackupCount: 10, +}); + +// rotate and maxBackupCount +// maxBackupCount will be ignored +await logger.initFileLogger("../log", { + rotate: true, + maxBackupCount: 10, +}); +``` + +The following conditions will throw an error + +```ts +// maxBackupCount +// get error => maxBackupCount must work with maxBytes +await logger.initFileLogger("../log", { + maxBackupCount: 10, +}); +// rotate and maxBackupCount +// get error => maxBackupCount must work with maxBytes +await logger.initFileLogger("../log", { + rotate: true, + maxBackupCount: 10, +}); +``` + +## disableConsole and enableConsole + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; + +const logger = new Logger(); + +// console +logger.info("console enabled, you can see me"); +logger.disableConsole(); +// no message is logged +logger.info("console disabled"); +logger.enableConsole(); +// console +logger.info("console enabled, you can see me"); +``` + +## disableFile and enableFile + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; + +const logger = new Logger(); +await logger.initFileLogger("../log"); + +logger.disableFile(); +// not log to file +logger.info("file disbaled"); +logger.enableFile(); +// log to file +logger.info("file enabled, you can see me"); +``` + +## disable and enable + +- disable disable write to file and terminal, don't care if it is currently + writing to a file or terminal, but hope to restore the currently configuration + later +- enable restore previous log configuration: file, terminal or both + +example: + +1. fileLogger => disable => enable => fileLogger +2. consoleLogger => disable => enable => consoleLogger +3. fileLogger, consoleLogger => disable => enable => fileLogger, consoleLogger + +```js +import Logger from "jsr:@deno-lib/logger@1.1.6/logger"; + +const logger = new Logger(); +await logger.initFileLogger("../log"); + +logger.disable(); +logger.enable(); +``` + +## test + +```bash +deno test --allow-read --allow-write +``` + +## Dual-Stack / Triple-Stack integration + +A dual-stack project is generaly a npm project that can be import as commonJS +module or as ESM module; So if a project can also be import as a Deno module, +it's a triple-stack one. + +To convert your Deno project to a dual-stack npm project, you should use +[deno/dnt](https://deno.land/x/dnt), then create a `_build_npm.ts` or +`scripts/build_npm.ts` that looks like: + +```ts +import { build, emptyDir } from "@deno/dnt"; + +// grap the next version number as you want +const version: Deno.args[0]; +await emptyDir("./npm"); +await build({ + entryPoints: ["./mod.ts"], + outDir: "./npm", + shims: { + deno: true, + }, + compilerOptions: { + lib: ["dom", "esnext"], + }, + package: { + name: "pkg-name", + version: version, + // ... package stuff + }, + // map your favorite deno logger to its npm port. + mappings: { + "jsr:@deno-lib/logger@1.1.6/logger": { + name: "@denodnt/logger", + version: "1.1.6", + peerDependency: false, + }, + }, +}); +``` + +## Screenshots + +consoleLogger\ +![consoleLogger](https://github.com/deno-library/logger/blob/master/screenshots/consoleLogger.png) + +fileLogger\ +![fileLogger](https://github.com/deno-library/logger/blob/master/screenshots/fileLogger.png) + +cut logs by day\ +![CutByDay](https://github.com/deno-library/logger/blob/master/screenshots/fileLogger.rotate.png) + +More screenshots in the `screenshots` folder. + +## Logger interface + +```ts +interface fileLoggerOptions { + rotate?: boolean; // cut by day + maxBytes?: number, // the maximum size in bytes that the log file can grow to before rolling over to a new one + maxBackupCount?: number // maxBackupCount must work with maxBytes +} + +interface LoggerInerface { + constructor() + + info(...args: unknown[]): void + warn(...args: unknown[]): void + error(...args: unknown[]): void + + async initFileLogger(dir: string, options: fileLoggerOptions = {}): Promise + + disableConsole(): void + enableConsole(): void + + disableFile(): void; + enableFile(): void; + + disable(): void; + enable(): void; +} +``` + +* @module +*/ + +/** + * The Logger class */ export { default as Logger } from "./logger.ts"; +/** + * The Logger class default instance + */ export { default as default } from "./logger.ts"; diff --git a/stdout.ts b/stdout.ts index bfd37da..1a1ff13 100644 --- a/stdout.ts +++ b/stdout.ts @@ -1,15 +1,31 @@ const isTTY = Deno.stdout.isTerminal(); import { writeAll } from "./deps.ts"; +/** + * Deno stdout log function + * @param msg + */ export async function stdout(msg: Uint8Array): Promise { await writeAll(Deno.stdout, msg); } +/** + * default log function + * @param args + */ export default function log(...args: unknown[]): void { console.log(...args); } - +/** + * No operation function + */ function noop(): void {} +/** + * Only output to stdout when the terminal is a TTY + */ export const stdoutOnlyTty = isTTY ? stdout : noop; +/** + * Only output to console when the terminal is a TTY + */ export const logOnlyTty = isTTY ? log : noop; diff --git a/types.ts b/types.ts index 8a08fad..b0027c8 100644 --- a/types.ts +++ b/types.ts @@ -1,3 +1,6 @@ +/** + * Types of messages that can be logged. + */ export const enum Types { INFO = "info", WARN = "warn", diff --git a/writable.ts b/writable.ts index 06ec377..87a509f 100644 --- a/writable.ts +++ b/writable.ts @@ -3,15 +3,25 @@ import { writeAll } from "./deps.ts"; const { open, close, stat } = Deno; type File = Deno.FsFile; +/** + * Writable class + */ export default class Writable { protected file!: File; private path: string; currentSize = 0; + /** + * Writable constructor + * @param path + */ constructor(path: string) { this.path = path; } + /** + * Setup writable file + */ async setup(): Promise { this.file = await open(this.path, { create: true, @@ -21,11 +31,18 @@ export default class Writable { this.currentSize = (await stat(this.path)).size; } + /** + * Write message to file + * @param msg + */ async write(msg: Uint8Array): Promise { await writeAll(this.file, msg); this.currentSize += msg.byteLength; } + /** + * Close file + */ close(): void { // this.file.close(); close(this.file.rid); diff --git a/writer.ts b/writer.ts index 778d9c5..645b5d7 100644 --- a/writer.ts +++ b/writer.ts @@ -1,8 +1,11 @@ import Writable from "./writable.ts"; import { exists } from "./fs.ts"; -import { WriterConstructor, WriterWrite } from "./interface.ts"; +import type { WriterConstructor, WriterWrite } from "./interface.ts"; import Types from "./types.ts"; +/** + * Writer class + */ export default class Writer { private maxBytes?: number; private maxBackupCount?: number; @@ -12,6 +15,11 @@ export default class Writer { private [Types.WARN]: string = ""; private [Types.ERROR]: string = ""; + /** + * Writer constructor + * @param param0 + * @returns + */ constructor({ maxBytes, maxBackupCount }: WriterConstructor) { if (maxBytes !== undefined && maxBytes <= 0) { throw new Error("maxBytes cannot be less than 1"); @@ -35,6 +43,11 @@ export default class Writer { return writer; } + /** + * Write message to file + * @param param0 + * @returns + */ async write({ path, msg, type }: WriterWrite): Promise { const msgByteLength = msg.byteLength; @@ -65,6 +78,10 @@ export default class Writer { await writer.write(msg); } + /** + * Rotate log files + * @param path + */ async rotateLogFiles(path: string): Promise { if (this.maxBackupCount) { for (let i = this.maxBackupCount - 1; i >= 0; i--) {