@void.01/advanced-logger 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. package/ARCHITECTURE.md +342 -342
  2. package/CHANGELOG.md +115 -108
  3. package/LICENSE +21 -0
  4. package/README.md +309 -305
  5. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,108 +1,115 @@
1
- # Changelog
2
-
3
- All notable changes to `@void.01/advanced-logger`. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses [Semantic Versioning](https://semver.org/). While the version is below 1.0.0, a minor release may add options but keeps existing defaults and output unchanged unless noted.
4
-
5
- ## [Unreleased]
6
-
7
- ### Changed
8
-
9
- - **The package is renamed to `@void.01/advanced-logger`.** Versions up to 0.4.0 were published as `@aryan-vashishth/advanced-logger`. To switch, uninstall the old package, install the new one, and change imports to `@void.01/advanced-logger` and `@void.01/advanced-logger/playwright`. The API and output are unchanged.
10
-
11
- ## [0.4.0] - 2026-10-16
12
-
13
- Gives every action its own console color, writes every logged table to CSV and JSON files, and closes three redaction gaps. **Default console colors change**, **`table()` now requires a title in TypeScript**, secrets in message text are now masked by default, and each logged table now also creates two files. Trace files and JSONL have no colors, so only the masking affects them.
14
-
15
- ### Changed
16
-
17
- - **Every action has its own console color.** Before, all 11 interaction actions (`click`, `input`, `text`, ...) shared one color, the same bold white as a plain INFO line. Now each action has a distinct color within a hue family for its kind: interactions in blues, navigation in teals, observation in pinks, verification in gold, data in violets, success in greens, alerts in reds and oranges (`skip` is muted). Plain `log` lines keep their level's color. Every color has at least 4.5:1 contrast on a dark terminal and is clearly distinct from its neighbors; `palette.test.ts` enforces both.
18
- - The ERROR level red (and the `failed` action, which shares it) is brighter: (248,75,75) instead of (210,48,48), which was under 4.5:1 contrast on a dark terminal.
19
- - **Breaking for TypeScript: `table(rows, title)` requires a title**, which is shown above the table and names its files. `info.table(rows)` without one no longer compiles. At runtime it still works (plain JavaScript, older compiled code): the table renders without a title row, its files are named `untitled`, and a one-time warning asks for a title. `info.log(object)` keeps rendering without a title row and names its files `log`; a logged list's tables are `list-item-N`.
20
- - Table headers stand apart from the data: the title row is a dark violet (`TABLE_TITLE_FG`) and the column-name row a muted mid violet (`TABLE_COLUMNS_FG`), both exported, while borders and data rows keep the table color.
21
- - **Structured redaction works at any depth.** `fields('user', { password })` now prints `"password":"***"`; before, a nested object printed in clear. Arrays, Maps and `toJSON()` results are checked too, and the caller's object is never modified.
22
- - `configure((cfg) => ...)` callbacks are now checked like `configure({...})`. An unknown option or wrong-typed value set in the callback prints one warning and is undone. An array assigned to a Set-typed option (`suppressContains`, `suppressMethodPrefixes`, `includeOnlyPrefixes`) becomes a Set.
23
-
24
- ### Added
25
-
26
- - **Table attachments** (`files.tables`, default `true`, env `VOID_LOG_TABLES`): every logged table also gets a CSV and a JSON file, in one folder per parent log: `<logDir>/<date>/attachments/csv/<runId>-<worker>/<NNN>-<title>.csv` and the same under `attachments/json/`. The folder `<runId>-<worker>` matches the trace files (`<kind>-<runId>-<worker>.log`) the table appears in, `<NNN>` keeps log order, and a DEBUG `TABLE FILES` line after each table in debug-trace and full-trace names both files. Cells hold full values (no `tableCellLimit`) and are redacted like the console. CSV is UTF-8 with a BOM, CRLF line ends and RFC 4180 quoting, and text cells that a spreadsheet would run as a formula get a leading `'`. JSON holds the title, time, level, worker, run id, test, columns and rows. `maxRuns` deletes a run's attachment folders with its logs.
27
- - `LogEvent.table` (`TableData`): a rendered table's rows as data, for custom sinks. `tableFilePath()` is exported.
28
- - `redactText` option (default `true`, env `VOID_LOG_REDACT_TEXT`): masks secrets in free text, in `key=value`, `key: value`, `"key":"value"` and `'key': 'value'` forms where the key contains one of `redactKeys`, plus `Bearer` and `Basic` credentials. It runs once before every output, including the Playwright attachment. It is pattern-based, so it can miss a secret with no key next to it and can mask a harmless value whose key contains a sensitive word (`tokens=3`).
29
- - `recentRunMinutes` option (default `60`, env `VOID_LOG_RECENT_RUN_MINUTES`): how recently a run must have been written to for retention to keep it. Before, this was a fixed hour. `0` protects only the current run.
30
- - `ACTION_FG` (the per-action colors) and the `LogAction` type are exported.
31
- - `LogActions.msg()` takes an optional action name, which picks that action's color.
32
-
33
- ### Fixed
34
-
35
- - A blank entry in `redactKeys` (such as `''`) no longer masks every structured value. Blank entries are ignored, as free-text masking already did.
36
- - A table title longer than the table was cut off on the console. The table now widens to fit it.
37
- - A table title no longer ends with a full style reset, which dropped the background for the rest of that line.
38
-
39
- ## [0.3.0] - 2026-10-14
40
-
41
- Makes mixed logs from parallel runs separable, and stops a missing setup step from scattering or deleting logs. Console and file output are unchanged unless you turn on the new options.
42
-
43
- ### Added
44
-
45
- - `maxRuns` option (env `VOID_LOG_MAX_RUNS`): keeps the newest N runs per trace kind, current run included, and deletes older runs whole. A run's age is its newest file's modification time.
46
- - `consoleWorker` option (default `false`): prefixes console lines with the worker, `w<N> │ ` (or `main │ ` outside Playwright), the same prefix trace-file lines already have.
47
- - `consoleTest` option (default `false`): prefixes console lines with the running test's title, cut to 40 characters. Needs the Playwright fixture.
48
- - A one-time stderr warning in a Playwright worker that has no `VOID_RUN_ID`, meaning `initRun()` was never called in `globalSetup`.
49
- - `runIdMissing()` export, true in that situation.
50
- - `setTestContext(test, title?)` takes an optional short title for the console prefix. The Playwright fixture passes the test's own title.
51
- - `LogEvent.testTitle` for custom sinks.
52
- - README sections on redaction scope (only top-level structured keys are masked; free text and nested objects are not) and on `worker_threads` (not supported).
53
-
54
- ### Changed
55
-
56
- - `configure({...})` now checks its patch with the config file's validator. An unknown option or a wrongly typed value prints one stderr warning and is skipped; the rest of the patch still applies. It never throws. Before, any key and value were stored as given. The callback form, `configure((cfg) => ...)`, is not checked.
57
- - Retention (`maxLogFiles` and `maxRuns`) never deletes a run that has a file modified in the last hour, so another runner or CI shard writing to the same folder keeps its files. Neither limit is a hard cap.
58
- - GitHub annotation lines carry the `consoleWorker` / `consoleTest` prefix when those options are on.
59
-
60
- ### Fixed
61
-
62
- - Without `initRun()`, each Playwright worker used its own run id, so with `maxLogFiles` set it could delete a sibling worker's live log files as "older". Retention is now off in such a worker.
63
-
64
- ## [0.2.0] - 2026-10-13
65
-
66
- Adds a project config file, independent color toggles, INFO truncation and log retention. With no config file and no new options set, output is identical to 0.1.0.
67
-
68
- ### Added
69
-
70
- - Project config file: `logger.config.ts`, `.js`, `.cjs` or `.json` in the working directory, or the path in `VOID_LOG_CONFIG`. It is loaded once per process, so every Playwright worker reads it. It default-exports an object or a `(config) => patch` function. `defineConfig()` types it.
71
- - Config precedence, lowest to highest: built-in defaults, config file, environment variables, `configure()` calls.
72
- - Strict config file validation: a file that throws, has the wrong shape, has an unknown option or has a wrongly typed value fails with an error naming the file, on every use until fixed. An explicit `VOID_LOG_CONFIG` that does not exist is an error.
73
- - `fg` and `bg` options (env `VOID_LOG_FG`, `VOID_LOG_BG`) to turn the foreground colors and the theme background on and off independently. Bold, including table titles, follows `fg`.
74
- - `enableFg()`, `disableFg()`, `isFgEnabled()` and the `Bg` equivalents.
75
- - `infoLogsCharLimit` option (env `VOID_LOG_INFO_LOGS_CHAR_LIMIT`): INFO lines longer than the limit print truncated with the total char count, followed by a WARN saying where to raise the limit and a DEBUG line with the full text. Tables are excluded.
76
- - `maxLogFiles` option (env `VOID_LOG_MAX_FILES`): keeps the newest N files per trace kind across date folders. The current run's files are never deleted, and only files named like the logger's own output are touched.
77
- - `ARCHITECTURE.md`, shipped in the package, describing the internals end to end.
78
- - README installation, entry points, quick start and uninstall sections.
79
-
80
- ### Changed
81
-
82
- - Configuration is built lazily on first use, not at import, so an environment variable changed between import and the first log call is now honored.
83
- - With `fg` and `bg` both off, console lines carry no escape codes on the line body, not even a lone reset.
84
- - Environment variables apply only when set and valid. An invalid `VOID_LOG_LEVEL` is ignored instead of overriding a lower layer.
85
-
86
- ## [0.1.0] - 2026-10-05
87
-
88
- First release on npm. A self-contained TypeScript port of the VOID `core.logging` package for Playwright projects, with no runtime dependencies.
89
-
90
- ### Added
91
-
92
- - Level loggers `debug`, `info`, `warn` and `error`, each with intent-based actions such as `click`, `log`, `success`, `failed`, `password` (masked), `table`, `tree` and `row`, plus `fields()` for structured values.
93
- - Console sink with the HIGH_CONTRAST theme. ANSI is auto-detected and controlled by `VOID_LOG_ANSI`, `NO_COLOR` and `FORCE_COLOR`. A caller suffix is shown at `debug` level, optionally colored with `callerColor`.
94
- - Plain-text trace files under `logs/<date>/`: `partial-trace` (console-visible lines), `debug-trace` (every level, caller suffix) and `full-trace` (every level, `[CHAIN]` suffix). They are written synchronously, one file per Playwright worker, with every line prefixed `w<N> │ `.
95
- - Opt-in JSONL sink (`VOID_LOG_JSONL=1`) with one JSON record per call, including `worker` and `test`.
96
- - Secret redaction of structured values by key (`redactKeys`).
97
- - Custom sinks (`addSink`, `removeSink`) and in-memory capture (`captureLogs`).
98
- - Caller and in-project chain resolution, with filters (`suppressContains`, `suppressMethodPrefixes`, `includeOnlyPrefixes`, `projectRoots`).
99
- - Table cell truncation (`tableCellLimit`).
100
- - GitHub Actions `::error::` / `::warning::` annotations.
101
- - Playwright entry (`@aryan-vashishth/advanced-logger/playwright`): a drop-in `test` / `expect` whose auto fixture tags each test, logs `TEST START` / `TEST END` and attaches the test's log to the report (`attach`: `on-failure` by default).
102
- - `initRun()` to share one run id across Playwright workers via `VOID_RUN_ID` / `VOID_RUN_DATE`.
103
- - Environment variables `VOID_LOG_LEVEL`, `VOID_LOG_DIR`, `VOID_LOG_ANSI`, `VOID_LOG_JSONL` and `VOID_RUN_ID`, and `configure()` for code.
104
-
105
- [0.4.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.4.0
106
- [0.3.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.3.0
107
- [0.2.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.2.0
108
- [0.1.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.1.0
1
+ # Changelog
2
+
3
+ All notable changes to `@void.01/advanced-logger`. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses [Semantic Versioning](https://semver.org/). While the version is below 1.0.0, a minor release may add options but keeps existing defaults and output unchanged unless noted.
4
+
5
+ ## [0.4.1] - 2026-10-21
6
+
7
+ First release under the new name, now with an MIT license.
8
+
9
+ ### Changed
10
+
11
+ - **The package is renamed to `@void.01/advanced-logger`.** Versions up to 0.4.0 were published as `@aryan-vashishth/advanced-logger`. To switch, uninstall the old package, install the new one, and change imports to `@void.01/advanced-logger` and `@void.01/advanced-logger/playwright`. The API and output are unchanged.
12
+
13
+ ### Added
14
+
15
+ - MIT license: a `LICENSE` file and `"license": "MIT"` in `package.json`.
16
+
17
+ ## [0.4.0] - 2026-10-16
18
+
19
+ Gives every action its own console color, writes every logged table to CSV and JSON files, and closes three redaction gaps. **Default console colors change**, **`table()` now requires a title in TypeScript**, secrets in message text are now masked by default, and each logged table now also creates two files. Trace files and JSONL have no colors, so only the masking affects them.
20
+
21
+ ### Changed
22
+
23
+ - **Every action has its own console color.** Before, all 11 interaction actions (`click`, `input`, `text`, ...) shared one color, the same bold white as a plain INFO line. Now each action has a distinct color within a hue family for its kind: interactions in blues, navigation in teals, observation in pinks, verification in gold, data in violets, success in greens, alerts in reds and oranges (`skip` is muted). Plain `log` lines keep their level's color. Every color has at least 4.5:1 contrast on a dark terminal and is clearly distinct from its neighbors; `palette.test.ts` enforces both.
24
+ - The ERROR level red (and the `failed` action, which shares it) is brighter: (248,75,75) instead of (210,48,48), which was under 4.5:1 contrast on a dark terminal.
25
+ - **Breaking for TypeScript: `table(rows, title)` requires a title**, which is shown above the table and names its files. `info.table(rows)` without one no longer compiles. At runtime it still works (plain JavaScript, older compiled code): the table renders without a title row, its files are named `untitled`, and a one-time warning asks for a title. `info.log(object)` keeps rendering without a title row and names its files `log`; a logged list's tables are `list-item-N`.
26
+ - Table headers stand apart from the data: the title row is a dark violet (`TABLE_TITLE_FG`) and the column-name row a muted mid violet (`TABLE_COLUMNS_FG`), both exported, while borders and data rows keep the table color.
27
+ - **Structured redaction works at any depth.** `fields('user', { password })` now prints `"password":"***"`; before, a nested object printed in clear. Arrays, Maps and `toJSON()` results are checked too, and the caller's object is never modified.
28
+ - `configure((cfg) => ...)` callbacks are now checked like `configure({...})`. An unknown option or wrong-typed value set in the callback prints one warning and is undone. An array assigned to a Set-typed option (`suppressContains`, `suppressMethodPrefixes`, `includeOnlyPrefixes`) becomes a Set.
29
+
30
+ ### Added
31
+
32
+ - **Table attachments** (`files.tables`, default `true`, env `VOID_LOG_TABLES`): every logged table also gets a CSV and a JSON file, in one folder per parent log: `<logDir>/<date>/attachments/csv/<runId>-<worker>/<NNN>-<title>.csv` and the same under `attachments/json/`. The folder `<runId>-<worker>` matches the trace files (`<kind>-<runId>-<worker>.log`) the table appears in, `<NNN>` keeps log order, and a DEBUG `TABLE FILES` line after each table in debug-trace and full-trace names both files. Cells hold full values (no `tableCellLimit`) and are redacted like the console. CSV is UTF-8 with a BOM, CRLF line ends and RFC 4180 quoting, and text cells that a spreadsheet would run as a formula get a leading `'`. JSON holds the title, time, level, worker, run id, test, columns and rows. `maxRuns` deletes a run's attachment folders with its logs.
33
+ - `LogEvent.table` (`TableData`): a rendered table's rows as data, for custom sinks. `tableFilePath()` is exported.
34
+ - `redactText` option (default `true`, env `VOID_LOG_REDACT_TEXT`): masks secrets in free text, in `key=value`, `key: value`, `"key":"value"` and `'key': 'value'` forms where the key contains one of `redactKeys`, plus `Bearer` and `Basic` credentials. It runs once before every output, including the Playwright attachment. It is pattern-based, so it can miss a secret with no key next to it and can mask a harmless value whose key contains a sensitive word (`tokens=3`).
35
+ - `recentRunMinutes` option (default `60`, env `VOID_LOG_RECENT_RUN_MINUTES`): how recently a run must have been written to for retention to keep it. Before, this was a fixed hour. `0` protects only the current run.
36
+ - `ACTION_FG` (the per-action colors) and the `LogAction` type are exported.
37
+ - `LogActions.msg()` takes an optional action name, which picks that action's color.
38
+
39
+ ### Fixed
40
+
41
+ - A blank entry in `redactKeys` (such as `''`) no longer masks every structured value. Blank entries are ignored, as free-text masking already did.
42
+ - A table title longer than the table was cut off on the console. The table now widens to fit it.
43
+ - A table title no longer ends with a full style reset, which dropped the background for the rest of that line.
44
+
45
+ ## [0.3.0] - 2026-10-14
46
+
47
+ Makes mixed logs from parallel runs separable, and stops a missing setup step from scattering or deleting logs. Console and file output are unchanged unless you turn on the new options.
48
+
49
+ ### Added
50
+
51
+ - `maxRuns` option (env `VOID_LOG_MAX_RUNS`): keeps the newest N runs per trace kind, current run included, and deletes older runs whole. A run's age is its newest file's modification time.
52
+ - `consoleWorker` option (default `false`): prefixes console lines with the worker, `w<N> │ ` (or `main │ ` outside Playwright), the same prefix trace-file lines already have.
53
+ - `consoleTest` option (default `false`): prefixes console lines with the running test's title, cut to 40 characters. Needs the Playwright fixture.
54
+ - A one-time stderr warning in a Playwright worker that has no `VOID_RUN_ID`, meaning `initRun()` was never called in `globalSetup`.
55
+ - `runIdMissing()` export, true in that situation.
56
+ - `setTestContext(test, title?)` takes an optional short title for the console prefix. The Playwright fixture passes the test's own title.
57
+ - `LogEvent.testTitle` for custom sinks.
58
+ - README sections on redaction scope (only top-level structured keys are masked; free text and nested objects are not) and on `worker_threads` (not supported).
59
+
60
+ ### Changed
61
+
62
+ - `configure({...})` now checks its patch with the config file's validator. An unknown option or a wrongly typed value prints one stderr warning and is skipped; the rest of the patch still applies. It never throws. Before, any key and value were stored as given. The callback form, `configure((cfg) => ...)`, is not checked.
63
+ - Retention (`maxLogFiles` and `maxRuns`) never deletes a run that has a file modified in the last hour, so another runner or CI shard writing to the same folder keeps its files. Neither limit is a hard cap.
64
+ - GitHub annotation lines carry the `consoleWorker` / `consoleTest` prefix when those options are on.
65
+
66
+ ### Fixed
67
+
68
+ - Without `initRun()`, each Playwright worker used its own run id, so with `maxLogFiles` set it could delete a sibling worker's live log files as "older". Retention is now off in such a worker.
69
+
70
+ ## [0.2.0] - 2026-10-13
71
+
72
+ Adds a project config file, independent color toggles, INFO truncation and log retention. With no config file and no new options set, output is identical to 0.1.0.
73
+
74
+ ### Added
75
+
76
+ - Project config file: `logger.config.ts`, `.js`, `.cjs` or `.json` in the working directory, or the path in `VOID_LOG_CONFIG`. It is loaded once per process, so every Playwright worker reads it. It default-exports an object or a `(config) => patch` function. `defineConfig()` types it.
77
+ - Config precedence, lowest to highest: built-in defaults, config file, environment variables, `configure()` calls.
78
+ - Strict config file validation: a file that throws, has the wrong shape, has an unknown option or has a wrongly typed value fails with an error naming the file, on every use until fixed. An explicit `VOID_LOG_CONFIG` that does not exist is an error.
79
+ - `fg` and `bg` options (env `VOID_LOG_FG`, `VOID_LOG_BG`) to turn the foreground colors and the theme background on and off independently. Bold, including table titles, follows `fg`.
80
+ - `enableFg()`, `disableFg()`, `isFgEnabled()` and the `Bg` equivalents.
81
+ - `infoLogsCharLimit` option (env `VOID_LOG_INFO_LOGS_CHAR_LIMIT`): INFO lines longer than the limit print truncated with the total char count, followed by a WARN saying where to raise the limit and a DEBUG line with the full text. Tables are excluded.
82
+ - `maxLogFiles` option (env `VOID_LOG_MAX_FILES`): keeps the newest N files per trace kind across date folders. The current run's files are never deleted, and only files named like the logger's own output are touched.
83
+ - `ARCHITECTURE.md`, shipped in the package, describing the internals end to end.
84
+ - README installation, entry points, quick start and uninstall sections.
85
+
86
+ ### Changed
87
+
88
+ - Configuration is built lazily on first use, not at import, so an environment variable changed between import and the first log call is now honored.
89
+ - With `fg` and `bg` both off, console lines carry no escape codes on the line body, not even a lone reset.
90
+ - Environment variables apply only when set and valid. An invalid `VOID_LOG_LEVEL` is ignored instead of overriding a lower layer.
91
+
92
+ ## [0.1.0] - 2026-10-05
93
+
94
+ First release on npm. A self-contained TypeScript port of the VOID `core.logging` package for Playwright projects, with no runtime dependencies.
95
+
96
+ ### Added
97
+
98
+ - Level loggers `debug`, `info`, `warn` and `error`, each with intent-based actions such as `click`, `log`, `success`, `failed`, `password` (masked), `table`, `tree` and `row`, plus `fields()` for structured values.
99
+ - Console sink with the HIGH_CONTRAST theme. ANSI is auto-detected and controlled by `VOID_LOG_ANSI`, `NO_COLOR` and `FORCE_COLOR`. A caller suffix is shown at `debug` level, optionally colored with `callerColor`.
100
+ - Plain-text trace files under `logs/<date>/`: `partial-trace` (console-visible lines), `debug-trace` (every level, caller suffix) and `full-trace` (every level, `[CHAIN]` suffix). They are written synchronously, one file per Playwright worker, with every line prefixed `w<N> │ `.
101
+ - Opt-in JSONL sink (`VOID_LOG_JSONL=1`) with one JSON record per call, including `worker` and `test`.
102
+ - Secret redaction of structured values by key (`redactKeys`).
103
+ - Custom sinks (`addSink`, `removeSink`) and in-memory capture (`captureLogs`).
104
+ - Caller and in-project chain resolution, with filters (`suppressContains`, `suppressMethodPrefixes`, `includeOnlyPrefixes`, `projectRoots`).
105
+ - Table cell truncation (`tableCellLimit`).
106
+ - GitHub Actions `::error::` / `::warning::` annotations.
107
+ - Playwright entry (`@aryan-vashishth/advanced-logger/playwright`): a drop-in `test` / `expect` whose auto fixture tags each test, logs `TEST START` / `TEST END` and attaches the test's log to the report (`attach`: `on-failure` by default).
108
+ - `initRun()` to share one run id across Playwright workers via `VOID_RUN_ID` / `VOID_RUN_DATE`.
109
+ - Environment variables `VOID_LOG_LEVEL`, `VOID_LOG_DIR`, `VOID_LOG_ANSI`, `VOID_LOG_JSONL` and `VOID_RUN_ID`, and `configure()` for code.
110
+
111
+ [0.4.1]: https://www.npmjs.com/package/@void.01/advanced-logger/v/0.4.1
112
+ [0.4.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.4.0
113
+ [0.3.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.3.0
114
+ [0.2.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.2.0
115
+ [0.1.0]: https://www.npmjs.com/package/@aryan-vashishth/advanced-logger/v/0.1.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Aryan Vashishth
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.