{"_id":"@budarin/layered-infra-dev-logger","_rev":"7-7c43ee22ce9907397a23ddcf1eff39fe","name":"@budarin/layered-infra-dev-logger","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.0":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.0","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"license":"MIT","_id":"@budarin/layered-infra-dev-logger@1.0.0","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"dist":{"shasum":"b3996e0122dd3e73cee4b90d209428450b010bed","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.0.tgz","fileCount":7,"integrity":"sha512-/BT/9gM26OtgxKtM2jFpFxmmWaTKeQQ5mU7Q6hH/nKr6vN1+sVvyfej1zs2fNYQUzuxETwNJVwTd/CFTUhl1nw==","signatures":[{"sig":"MEUCIQDS4JFVexwSvULsfeufdJcEGTBFvtXjXAlrlvPWM2VAFQIgYOxS92/1n2sIpkEXU8HyPgdtdFJunTTgbgaybmY/obo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49319},"main":"./dist/index.js","type":"module","_from":"file:budarin-layered-infra-dev-logger-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","type-check":"tsc -b -noEmit","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","upgrade-deps":"sh scripts/upgrade-deps.sh","sync-workspace":"sh scripts/sync-workspace.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"_resolved":"C:\\Users\\Vadim\\AppData\\Local\\Temp\\6f824b9e9fa5b915efd179fcfcfa4bea\\budarin-layered-infra-dev-logger-1.0.0.tgz","_integrity":"sha512-/BT/9gM26OtgxKtM2jFpFxmmWaTKeQQ5mU7Q6hH/nKr6vN1+sVvyfej1zs2fNYQUzuxETwNJVwTd/CFTUhl1nw==","_npmVersion":"11.7.0","description":"Infrastructure-focused dev logger toolkit for layered architectures.","directories":{},"_nodeVersion":"25.4.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/layered-infra-dev-logger_1.0.0_1776439583227_0.5070575558303412","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.1","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"license":"MIT","_id":"@budarin/layered-infra-dev-logger@1.0.1","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"dist":{"shasum":"829d34703a1cd2ce350b7d572491b9ca1fcb1de6","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.1.tgz","fileCount":9,"integrity":"sha512-AkFeBUq/3x5GxgPrw49mLE+ZwNWbQsjM09bi4MOnEfy8UtsVULpcMmVfIxgvxFgRuG1bv62BiR8IDuubmUqugg==","signatures":[{"sig":"MEUCIQCztL0dWDzAYzy38lLCchmRxuIrxJsUYNgAlD8vpItZ4AIgR8BZ/L+xm4rpNauuX1D6TjJUQbVe06mybw1qfpNAf/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58600},"main":"./dist/index.js","type":"module","_from":"file:budarin-layered-infra-dev-logger-1.0.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","type-check":"tsc -b -noEmit","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","upgrade-deps":"sh scripts/upgrade-deps.sh","sync-workspace":"sh scripts/sync-workspace.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"_resolved":"C:\\Users\\Vadim\\AppData\\Local\\Temp\\3a22253cfe40b4e5259600c229d9e7e1\\budarin-layered-infra-dev-logger-1.0.1.tgz","_integrity":"sha512-AkFeBUq/3x5GxgPrw49mLE+ZwNWbQsjM09bi4MOnEfy8UtsVULpcMmVfIxgvxFgRuG1bv62BiR8IDuubmUqugg==","_npmVersion":"11.7.0","description":"Infrastructure-focused dev logger toolkit for layered architectures.","directories":{},"_nodeVersion":"25.4.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/layered-infra-dev-logger_1.0.1_1776444071283_0.7025631943012267","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.2","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"license":"MIT","_id":"@budarin/layered-infra-dev-logger@1.0.2","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"dist":{"shasum":"f15e682adf80531614c72f49c56a4ee3d8814a60","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.2.tgz","fileCount":9,"integrity":"sha512-h8FNmXc19g8m8GroMW+6GUGdt7/djFAzp5km2kvGaIbMGNNHHOg/7H5IEcleizwQgIffceffnz1xa0VfPHNdWQ==","signatures":[{"sig":"MEYCIQDT49sJquyoaX9vKRgTPmT/1mr8oZ1AWNOnH1KUlWFqTQIhANCPJtzUjLEA1eLvph+Vav30O6JpUGm7p2BoAwm4VWp0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59674},"main":"./dist/index.js","type":"module","_from":"file:budarin-layered-infra-dev-logger-1.0.2.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","type-check":"tsc -b -noEmit","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","upgrade-deps":"sh scripts/upgrade-deps.sh","sync-workspace":"sh scripts/sync-workspace.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"_resolved":"C:\\Users\\Vadim\\AppData\\Local\\Temp\\0f8c61c5fc5762bc03b8c6dcdc09dc19\\budarin-layered-infra-dev-logger-1.0.2.tgz","_integrity":"sha512-h8FNmXc19g8m8GroMW+6GUGdt7/djFAzp5km2kvGaIbMGNNHHOg/7H5IEcleizwQgIffceffnz1xa0VfPHNdWQ==","_npmVersion":"11.7.0","description":"Infrastructure-focused dev logger toolkit for layered architectures.","directories":{},"_nodeVersion":"25.4.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/layered-infra-dev-logger_1.0.2_1776446724352_0.765756277760621","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.3","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"license":"MIT","_id":"@budarin/layered-infra-dev-logger@1.0.3","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"dist":{"shasum":"e57135269169aa21a8df047445f3f961b5d555dc","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.3.tgz","fileCount":9,"integrity":"sha512-PEiCnzh4Mhmb/ttP3IgF52Ku0qgWPO5aFM4z7pevGffbQ/PBqIk9aBo5tdQ2izM8ZaZi3hC7K+Y7MmR3yZhEeQ==","signatures":[{"sig":"MEQCIGZFX+FENoSVWProtvroLDyYxtc489mvg6Samz9n7CSwAiAtl4wvcPtamZOl9bWIKPFSXAV98qpexgtqYcF1QLMpqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59429},"main":"./dist/index.js","type":"module","_from":"file:budarin-layered-infra-dev-logger-1.0.3.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","type-check":"tsc -b -noEmit","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","upgrade-deps":"sh scripts/upgrade-deps.sh","sync-workspace":"sh scripts/sync-workspace.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"_resolved":"/private/var/folders/3d/my733tj9449d7jbbq3h3395w0000gn/T/10bd7371c9206796ae9be8d80b9f0c4d/budarin-layered-infra-dev-logger-1.0.3.tgz","_integrity":"sha512-PEiCnzh4Mhmb/ttP3IgF52Ku0qgWPO5aFM4z7pevGffbQ/PBqIk9aBo5tdQ2izM8ZaZi3hC7K+Y7MmR3yZhEeQ==","_npmVersion":"11.8.0","description":"Infrastructure-focused dev logger toolkit for layered architectures.","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/layered-infra-dev-logger_1.0.3_1776515652654_0.33922766616559286","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.4","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"license":"MIT","_id":"@budarin/layered-infra-dev-logger@1.0.4","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"dist":{"shasum":"b73160d2b1da3c2087b83d6554e93c31711afd95","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.4.tgz","fileCount":10,"integrity":"sha512-r/xjFJhEgNtXe+e1bJDQ445YL2j47N8BVIY9forgWS6lasYT+4yS2f8nt8h+HaMLQKs03fVSJR3QxD+OlOWJfw==","signatures":[{"sig":"MEYCIQC0n9H3Y1E8snb6oRtWy3CvVvrfUsZcNCpaB4st2ApRAgIhAIyLIYiD/vINdXqpL1tz9Mzciatu6Z4N3QeiN0zbjDo7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493756},"main":"./dist/index.js","type":"module","_from":"file:budarin-layered-infra-dev-logger-1.0.4.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","type-check":"tsc -b -noEmit","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","upgrade-deps":"sh scripts/upgrade-deps.sh","sync-workspace":"sh scripts/sync-workspace.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"_resolved":"/private/var/folders/3d/my733tj9449d7jbbq3h3395w0000gn/T/90ea88a5a46b94c5bae7c22daddaf64c/budarin-layered-infra-dev-logger-1.0.4.tgz","_integrity":"sha512-r/xjFJhEgNtXe+e1bJDQ445YL2j47N8BVIY9forgWS6lasYT+4yS2f8nt8h+HaMLQKs03fVSJR3QxD+OlOWJfw==","_npmVersion":"11.8.0","description":"Infrastructure-focused dev logger toolkit for layered architectures.","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/layered-infra-dev-logger_1.0.4_1776516046979_0.4336485189676289","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.5","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"license":"MIT","_id":"@budarin/layered-infra-dev-logger@1.0.5","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"dist":{"shasum":"eaeb36cc5d85adfc3c72971290b579ee0f8f4b82","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.5.tgz","fileCount":10,"integrity":"sha512-FQ85Zf3IKzqvwAoM5xQyFIKLWtXYBgUf+tf8vPT5sSVnV88VJbUonBRkJju7IJwGX9tsWPwutz7K3DSMBHsqqg==","signatures":[{"sig":"MEYCIQD/qac3vAVQ+21V79ek60bKJ/4XYXphg+KXQfkI/Rt+yQIhAOpCp9stC3zlH2+GKrN9fZP14gTnu18aQNrbTANjI7E9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493819},"main":"./dist/index.js","type":"module","_from":"file:budarin-layered-infra-dev-logger-1.0.5.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","type-check":"tsc -b -noEmit","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","upgrade-deps":"sh scripts/upgrade-deps.sh","sync-workspace":"sh scripts/sync-workspace.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"_resolved":"/private/var/folders/3d/my733tj9449d7jbbq3h3395w0000gn/T/ec577d7592d76926dfda7cd6f08b3585/budarin-layered-infra-dev-logger-1.0.5.tgz","_integrity":"sha512-FQ85Zf3IKzqvwAoM5xQyFIKLWtXYBgUf+tf8vPT5sSVnV88VJbUonBRkJju7IJwGX9tsWPwutz7K3DSMBHsqqg==","_npmVersion":"11.8.0","description":"Infrastructure-focused dev logger toolkit for layered architectures.","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/layered-infra-dev-logger_1.0.5_1776516261779_0.18242843925050356","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@budarin/layered-infra-dev-logger","version":"1.0.6","description":"Infrastructure-focused dev logger toolkit for layered architectures.","license":"MIT","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"keywords":["logger","devtools","layered-architecture","typescript","debugging"],"devDependencies":{"typescript":"^6.0.3","vitest":"^4.1.4"},"scripts":{"build":"tsc","test":"vitest run","type-check":"tsc -b -noEmit","test:watch":"vitest","clear-caches":"sh scripts/clear-caches.sh","pnpm-install":"pnpm install","sync-workspace":"sh scripts/sync-workspace.sh","upgrade-deps":"sh scripts/upgrade-deps.sh","publish-package":"pnpm build && pnpm publish --access=public"},"_id":"@budarin/layered-infra-dev-logger@1.0.6","_integrity":"sha512-NnKQnvLF9AcaH7iMXX9x7p//aMuSwzktNXFkf/nPXWfKphbhBBnwJ+APK656fa+/GVAvPGr/claDWDg37kImjw==","_resolved":"/private/var/folders/3d/my733tj9449d7jbbq3h3395w0000gn/T/f96085196c4c832a92292935e8727607/budarin-layered-infra-dev-logger-1.0.6.tgz","_from":"file:budarin-layered-infra-dev-logger-1.0.6.tgz","_nodeVersion":"22.12.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-NnKQnvLF9AcaH7iMXX9x7p//aMuSwzktNXFkf/nPXWfKphbhBBnwJ+APK656fa+/GVAvPGr/claDWDg37kImjw==","shasum":"d4e7370ca94ae7162028e6ebcef2f4a729ac0090","tarball":"https://registry.npmjs.org/@budarin/layered-infra-dev-logger/-/layered-infra-dev-logger-1.0.6.tgz","fileCount":10,"unpackedSize":494771,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDucFa2EMh17j2DVPoKBc58WuhAows3qGG0gPmU+zKQzQIhAI4iAhhDtuLXToobvmDiT6Q9bbW46N0DjmFDQZVkbZus"}]},"_npmUser":{"name":"budarin","email":"budarin-vv@yandex.ru"},"directories":{},"maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/layered-infra-dev-logger_1.0.6_1776569162648_0.9231705843709408"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-17T15:26:22.715Z","modified":"2026-04-19T03:26:02.923Z","1.0.0":"2026-04-17T15:26:23.370Z","1.0.1":"2026-04-17T16:41:11.406Z","1.0.2":"2026-04-17T17:25:24.534Z","1.0.3":"2026-04-18T12:34:12.813Z","1.0.4":"2026-04-18T12:40:47.139Z","1.0.5":"2026-04-18T12:44:21.919Z","1.0.6":"2026-04-19T03:26:02.822Z"},"license":"MIT","keywords":["logger","devtools","layered-architecture","typescript","debugging"],"description":"Infrastructure-focused dev logger toolkit for layered architectures.","maintainers":[{"name":"budarin","email":"budarin-vv@yandex.ru"}],"readme":"# @budarin/layered-infra-dev-logger\n\nInfrastructure-focused dev logger toolkit for layered architectures.\n\n## Supported runtimes\n\nThe package is written against **`globalThis`** (with guarded fallbacks to standard intrinsics). It is safe to import and call **`createLayeredLoggerToolkit()`** in:\n\n- **Browser** (document + full Web APIs)\n- **Service worker** (no `window`, often no `localStorage`)\n- **Node.js** (including Vitest / `node:test` and other test runners in the default Node realm)\n\nYou do not need consumer-side shims such as `globalThis.window = globalThis` for this library.\n\n### Global control (`globalControl`)\n\n- By default, control is attached with `Object.defineProperty` on **`globalThis`** (override with `globalControl.target`).\n- Attachment is **best effort**: if `defineProperty` is missing, not callable, or throws (non-configurable property, sealed object, revoked proxy, and similar cases), the failure is swallowed and the rest of the toolkit still works. **`control`** on the returned toolkit is always available.\n- In browsers, when attachment succeeds, DevTools usage matches previous behavior (e.g. `globalThis.logger`).\n\n### Persistence (`persistence`)\n\n- Default persistence looks for **`localStorage`** on `globalThis`. If it is missing or does not expose `getItem` / `setItem` / `removeItem` as functions, persistence is **silently disabled** (no throws).\n- You can pass a custom `persistence.storage` adapter in any environment.\n- Invalid or unreadable stored payloads are cleared **best effort**; errors during read, parse, or cleanup are not propagated to the caller.\n\n### Console output\n\n- Log methods resolve **`globalThis.console`** on each emit. If `console` or a level method is missing, that emit is a no-op (no throw).\n\n## Features\n\n- Colored scope prefixes in console logs (`[ UI ] [ CONTAINER ] ...`).\n- Runtime noise control with rules:\n    - `enable/disable/show/remove/preview/focus/reset/undo`.\n- Selector DSL with scope + level + message + args matching:\n    - `[ scopes ] | levels | message | args`.\n- `glob` and `eq:` matchers for `message` and `args`.\n- Optional persistence via `localStorage` or custom storage adapter.\n- Optional global control attachment (`globalThis.logger` by default).\n\n## Install\n\n```bash\npnpm add @budarin/layered-infra-dev-logger\n```\n\n## Quick Start\n\n```ts\nimport { createLayeredLoggerToolkit } from '@budarin/layered-infra-dev-logger';\n\n// Defaults already enabled:\n// - global control in DevTools console: globalThis.logger\n// - persistence in localStorage\n// - scope normalize: trim spaces + uppercase\nconst toolkit = createLayeredLoggerToolkit();\n\nconst base = toolkit.createLogger();\nconst coreLogger = base.child('CORE').child('USECASE', { color: '#ea580c' });\n\ncoreLogger.debug('sync failed', { code: 'E_TIMEOUT', todoId: '019...' });\n```\n\n## Layered Project Setup (Composition Root)\n\n```ts\nimport { createLayeredLoggerToolkit, createLayeredLoggers } from '@budarin/layered-infra-dev-logger';\n\n// 1) Create one toolkit in bootstrap/composition root.\nconst toolkit = createLayeredLoggerToolkit();\n\n// 2) Describe your layered structure once.\nconst baseLogger = toolkit.createLogger();\nconst {\n    logger,\n    uiLogger,\n    uiContainerLogger,\n    coreLogger,\n    coreUseCaseLogger,\n    coreAdapterLogger,\n    storeLogger,\n    serviceLogger,\n    networkServiceLogger,\n    themeServiceLogger,\n} = createLayeredLoggers(baseLogger, {\n    APP: {\n        alias: 'logger',\n        color: '#b45309',\n        children: {\n            UI: {\n                alias: 'uiLogger',\n                color: '#16a34a',\n                children: {\n                    CONTAINER: { alias: 'uiContainerLogger', color: '#22c55e' },\n                },\n            },\n            CORE: {\n                alias: 'coreLogger',\n                color: '#c2410c',\n                children: {\n                    USECASE: { alias: 'coreUseCaseLogger', color: '#ea580c' },\n                    ADAPTER: { alias: 'coreAdapterLogger', color: '#f59e0b' },\n                },\n            },\n            STORE: { alias: 'storeLogger', color: '#dc2626' },\n            SERVICE: {\n                alias: 'serviceLogger',\n                color: '#2563eb',\n                children: {\n                    NETWORK: { alias: 'networkServiceLogger', color: '#38bdf8' },\n                    THEME: { alias: 'themeServiceLogger' }, // inherits SERVICE color\n                },\n            },\n        },\n    },\n});\n\n// 3) Wire them into your app boundaries/ports.\ninitUiLoggerPort(uiLogger);\ninitUiContainerLoggerPort(uiContainerLogger);\ninitCoreUseCaseLoggerPort(coreUseCaseLogger);\ninitCoreAdapterLoggerPort(coreAdapterLogger);\ninitStoreLoggerPort(storeLogger);\ninitServiceLoggerPort(serviceLogger);\n\n// 4) Use in runtime code.\ncoreUseCaseLogger.debug('create todo start', { todoId: '019...' });\nnetworkServiceLogger.warn('network degraded', { quality: 'slow-2g' });\n\n// 5) Manual variant: same idea via child() chain.\nconst manualCoreUseCaseLogger = baseLogger\n    .child('APP', { color: '#b45309' })\n    .child('CORE', { color: '#c2410c' })\n    .child('USECASE', { color: '#ea580c' });\n\nmanualCoreUseCaseLogger.debug('same logger built manually with child()');\n```\n\n![Colored log output](https://cdn.jsdelivr.net/npm/@budarin/layered-infra-dev-logger/colored-log.png)\n\n### Tree root (`APP` is only one layout)\n\nThe big example above uses **one** top-level key so every branch shares the same first scope tag (`[ APP ] …`). Same API, two other common shapes:\n\n**A — Single root (any name).** One first-level segment for the whole tree; it shows up in every branch’s log prefix.\n\n```ts\ncreateLayeredLoggers(baseLogger, {\n    APP: {\n        alias: 'logger',\n        children: {\n            CORE: { alias: 'coreLogger', children: { USECASE: { alias: 'coreUseCaseLogger' } } },\n        },\n    },\n});\n// → [ APP ] [ CORE ] [ USECASE ] …\n```\n\n**B — Multiple roots (no shared “app” segment).** Several keys at the first level; each branch has its own prefix chain.\n\n```ts\ncreateLayeredLoggers(baseLogger, {\n    UI: {\n        alias: 'uiLogger',\n        children: { CONTAINER: { alias: 'uiContainerLogger' } },\n    },\n    CORE: {\n        alias: 'coreLogger',\n        children: { USECASE: { alias: 'coreUseCaseLogger' } },\n    },\n});\n// → [ UI ] [ CONTAINER ] …\n// → [ CORE ] [ USECASE ] …\n```\n\n### Why this pattern matters\n\n- You keep one source of truth for logger config and rule state.\n- Every layer gets stable scope prefixes and colors.\n- Alias is configured directly on each layer node, so no second `aliases` config is needed.\n- If `color` is omitted on a node, it inherits nearest parent color automatically.\n- Noise-control rules can target architecture boundaries directly:\n    - `[ CORE ][ USECASE ] | debug | * | *`\n    - `[ SERVICE ][ NETWORK ] | warn,error | * | *`\n    - `[ UI ][ CONTAINER ][ * ] | debug | *render* | *`\n\n## DevTools Console Control API\n\n`Control API` is intended for runtime debugging directly in browser console (`globalThis.logger` by default).\n\n```ts\n// mode and rules\nlogger.showMode();\nlogger.show('all');\n\n// disable by selector\nlogger.previewDisable('[ CORE ][ USECASE ] | debug | * | *\"code\":\"E_TIMEOUT\"*');\nlogger.disable('[ CORE ][ USECASE ] | debug | * | *\"code\":\"E_TIMEOUT\"*');\n\n// re-enable\nlogger.enable('[ CORE ][ USECASE ] | debug | * | *\"code\":\"E_TIMEOUT\"*');\n\n// remove by id\nlogger.remove(3);\n\n// remove by selector\nlogger.previewRemove('[ CORE ][ * ]');\nlogger.remove('[ CORE ][ * ]');\n\n// “solo” one selector: baseline becomes all-disabled, rules cleared, one enable rule added\nlogger.focus('[ UI ][ CONTAINER ][ * ] | debug');\n\n// baseline all-enabled again and all rules removed (factory-default filtering)\nlogger.reset();\n\n// revert the last control change (focus/reset/enable/disable/show/remove/clear, …)\nlogger.undo();\n```\n\n**`focus(selector)`** — Show only logs that match this selector: it sets baseline to **all-disabled**, drops every existing rule, then adds a single **enabled** rule for `selector`. Handy in the console when you want one branch (for example UI under `CONTAINER`) without turning off many `disable` rules by hand.\n\n**`reset()`** — Restore the default filter state: baseline **all-enabled** and an empty rule list (nothing explicitly disabled).\n\n**`undo()`** — Pop one entry from the control history and restore the previous baseline + rules. History is recorded for `focus`, `reset`, `enable`, `disable`, `remove`, `clear`, and for baseline flips when `enable`/`disable` is called with the `*` selector.\n\n## Advanced Options (optional)\n\nUse these only if defaults do not fit your project.\n\n```ts\nconst toolkit = createLayeredLoggerToolkit({\n    mode: 'all-disabled',\n    scope: {\n        // default normalize is already \"remove spaces + uppercase\"\n        normalize: (segment) => segment.trim().toLowerCase(),\n    },\n    persistence: {\n        enabled: false, // default is true\n    },\n    globalControl: {\n        enabled: false, // default is true\n        key: 'devLogger',\n    },\n});\n\n// 2b) You can also build loggers manually with child() when needed.\nconst manualCoreUseCaseLogger = baseLogger\n    .child('APP', { color: '#b45309' })\n    .child('CORE', { color: '#c2410c' })\n    .child('USECASE', { color: '#ea580c' });\n\nmanualCoreUseCaseLogger.debug('manual chain logger is also valid');\n```\n\n## Selector DSL\n\n`[ scopes ] | levels | message | args`\n\n- `scopes`: required (`[ CORE ][ USECASE ]`), prefix mode via `[ * ]` tail.\n- `levels`: optional (`debug,warn`), default `*`.\n- `message`: optional (`*retry*`, `eq:Sync failed`), default `*`.\n- `args`: optional (`*\"code\":\"E_TIMEOUT\"*`, `eq:{\"code\":\"E_TIMEOUT\"}`), default `*`.\n\nExamples:\n\n- `[ CORE ][ USECASE ]`\n- `[ CORE ][ USECASE ][ * ] | debug,warn`\n- `[ UI ][ * ] | * | *retry*`\n- `[ CORE ][ USECASE ] | debug | * | *\"code\":\"E_TIMEOUT\"*`\n\n## Notes\n\n- This package is intended for development-time logging and filtering.\n- State persistence is best-effort; invalid or broken storage payload is auto-reset.\n- Built-in globals (`Date`, `JSON`, `Object`, …) are read via `globalThis` when present so the same bundle works across browser, worker, and Node without referencing `window`.\n","readmeFilename":"README.md"}