diff --git a/README.md b/README.md index 867a3a4f..24ba913a 100644 --- a/README.md +++ b/README.md @@ -43,19 +43,17 @@ Every feature has been hardened with a comprehensive test suite - over **5,300 t ## ✨ What's New -### Latest: v3.13.0 (August 2026) +### Latest: v3.13.1 (August 2026) -- **Sync/async-transparent hook dispatch (#264)** — an async `before`/`after` handler now composes on any target: the call promotes per-invocation to an async pipeline instead of refusing (before) or leaking a pending Promise (after), and a promoted synchronous return is a guarded Promise so an unawaited consumer fails loudly with `HOOK_PROMOTED_RESULT_NOT_AWAITED` instead of yielding `NaN` far from the cause. Removing the async hook restores the original synchronous contract. -- **`api.slothlet.api.leaves()` (#266)** — enumerate the api paths a module owns, read from the loader's ownership records rather than by walking the live api object: complete under lazy at any depth, scoped to the caller (module-private members redacted; host-only `{ includePrivate: true }`), with `{ details: true }` tagging each path `function` / `namespace` / `data`. -- **Module-private exports + injectable importer (#269, #267)** — with permissions enabled, `_`/`__`-prefixed exports are enforced as private to their own module (host default-deny, opt-out `permissions.private.host: "allow"`) and reserved-named files/exports are refused at load; separately, `slothlet({ import })` routes leaf loads through a consumer's test runner so leaf execution attributes correctly in coverage. -- [View full v3.13.0 Changelog](./docs/changelog/v3/v3.13.0.md) +- **Dev-environment detection fix (#270)** — `./devcheck` now reads the CLI form `node --conditions=slothlet-dev` from `process.execArgv` (the same channel vitest uses to pass conditions to its workers), and treats a package installed under any `node_modules` path segment as installed. A correctly-configured dev run against `src/` no longer aborts with a false `process.exit(1)`, and a git or tarball install — which ships `src/` without a built `dist/` — no longer self-terminates inside a consuming project. +- [View full v3.13.1 Changelog](./docs/changelog/v3/v3.13.1.md) ### Recent Releases +- **v3.13.0** (August 2026) — Sync/async-transparent hook dispatch, `api.slothlet.api.leaves()` for module-scoped path enumeration, and permission-enforced module-private (`_`/`__`) exports plus an injectable importer that attributes leaf execution in consumer coverage ([Changelog](./docs/changelog/v3/v3.13.0.md)) - **v3.12.3** (August 2026) — Composition & attribution correctness: every read/call attributed to the responsible module (identity survives `await`, per-flow concurrency, redacted enumeration), `apiPath` matches the composed surface, faithful lazy resolution (thenable wrappers, deep chains, file+dir collisions), and collisions follow the documented `api.collision` table ([Changelog](./docs/changelog/v3/v3.12.3.md)) - **v3.12.2** (July 2026) — Type generation types both JS and TS leaves faithfully: generated `.d.ts` carries JSDoc `@param`/`@returns` types instead of `any` and compiles for TS leaves referencing local named types; plus a consumer-coverage testing guide ([Changelog](./docs/changelog/v3/v3.12.2.md)) - **v3.12.1** (July 2026) — Security patch: nested values of `scope({ protect, owners })` context keys are now guarded to depth — `context.auth.userId = …` throws `CONTEXT_KEY_PROTECTED` with the full path — plus the `./devcheck` export now ships the file the npm whitelist never included ([Changelog](./docs/changelog/v3/v3.12.1.md)) -- **v3.12.0** (July 2026) — Security-and-observability: permission enforcement fails closed on an absent/forged caller (opt-out `permissions.failOpenOnAbsentCaller`), inter-module construction + class-instance methods are permission-checked, the engine-internal `handlers/`/`factories/` subpaths leave `exports`, an opt-in control-surface `seal()`, owner-locked/write-protected context keys via `scope({ protect, owners })`, `impl:warning`/`impl:error` diagnostic lifecycle events, and nested `shutdown`/`destroy` leaves no longer dropped ([Changelog](./docs/changelog/v3/v3.12.0.md)) 📚 **For complete version history and detailed release notes, see [docs/changelog/](./docs/changelog/) folder.** diff --git a/devcheck.mjs b/devcheck.mjs index a4edfd1a..44afa1b7 100644 --- a/devcheck.mjs +++ b/devcheck.mjs @@ -34,15 +34,19 @@ const isCI = !!( if (existsSync(srcPath) && !existsSync(distPath) && !isCI) { const nodeEnv = process.env.NODE_ENV?.toLowerCase(); - const nodeOptions = process.env.NODE_OPTIONS || ""; + // Dev resolver conditions arrive either via NODE_OPTIONS (env) or on the CLI, where Node puts + // them in process.execArgv — which is also how vitest passes conditions to its workers. Fold + // both into one haystack so the CLI/worker form is detected, not just the env form. (#270) + const conditionFlags = (process.env.NODE_OPTIONS || "") + " " + process.execArgv.join(" "); - // Check if running from node_modules (parent folder is node_modules) - const parentFolder = path.basename(path.dirname(__dirname)); - const isInstalledPackage = parentFolder === "node_modules"; + // Detect an installed copy by a `node_modules` segment anywhere above this file. Matching only + // basename(dirname(__dirname)) misses a scoped install — node_modules/@cldmv/slothlet, whose + // parent is the `@cldmv` scope dir, not `node_modules`. (#270) + const isInstalledPackage = __dirname.split(path.sep).includes("node_modules"); - // Parse conditions from NODE_OPTIONS - const hasSlothletDev = nodeOptions.indexOf("--conditions=slothlet-dev") !== -1; - const hasGenericDev = nodeOptions.indexOf("--conditions=development") !== -1; + // Parse conditions from NODE_OPTIONS / execArgv + const hasSlothletDev = conditionFlags.includes("slothlet-dev"); + const hasGenericDev = conditionFlags.includes("--conditions=development") || conditionFlags.includes("--conditions development"); const hasDevEnv = nodeEnv === "dev" || nodeEnv === "development"; // Only check if we're in the slothlet repo (not installed in node_modules) diff --git a/docs/changelog/v3/v3.13.1.md b/docs/changelog/v3/v3.13.1.md new file mode 100644 index 00000000..d16d1a80 --- /dev/null +++ b/docs/changelog/v3/v3.13.1.md @@ -0,0 +1,63 @@ +# Slothlet v3.13.1 Changelog + +**Release Date**: August 2026 +**Release Type**: Patch +**Branch**: `release/3.13.1` + +--- + +## Overview + +Version 3.13.1 is a maintenance patch centered on `devcheck.mjs`, the import-time development-environment tripwire that calls `process.exit(1)` when it believes a source checkout is being run without the `slothlet-dev` resolver condition. Two ways the guard misjudged its environment are fixed (#270, merged via PR #281): it read the active resolver conditions only from `process.env.NODE_OPTIONS` and missed the command-line form Node records in `process.execArgv` — the same channel vitest uses to hand conditions to its workers — so a correctly configured developer could hit a false `exit(1)`; and its installed-package guard inspected only the immediate grandparent directory name, which is the scope directory for slothlet's own scoped install, so a git or tarball install (which ships `src/` but no `dist/`) could trip the guard inside a consumer. A spawn-based regression suite accompanies the fix. + +The release also rolls up four routine devDependency bumps and regenerates the committed declaration tree so it matches the source shipped in v3.13.0. No source module changed in this release, and there are no breaking changes. + +--- + +## 🐛 Bug Fixes + +### `devcheck.mjs` misjudged its environment two ways (#270) + +`devcheck.mjs` runs at import time and only acts inside a narrow window — `src/` present, `dist/` absent, and not running under CI — where its job is to catch a slothlet source checkout being run without the dev resolver condition set. Two independent misjudgements inside that window are corrected. + +**Dev-condition detection now reads `execArgv`, not just `NODE_OPTIONS`.** The guard decided whether the `slothlet-dev` condition was opted in by scanning `process.env.NODE_OPTIONS` alone. Node records a condition passed on the command line — `node --conditions=slothlet-dev file.mjs` — in `process.execArgv`, not in `NODE_OPTIONS`, and that CLI form is exactly how vitest forwards conditions to its worker processes. A developer using the CLI or worker form was therefore read as unconfigured, and the guard fired a spurious `process.exit(1)` that killed the run. Detection now folds `process.execArgv` into the same haystack as `NODE_OPTIONS`, so the env form and the CLI/worker form are both recognized. + +**The installed-package guard now detects a `node_modules` segment at any depth.** The check that suppresses the tripwire for a copy installed under `node_modules` — where it must never act — tested `basename(dirname(__dirname)) === "node_modules"`. For slothlet's own scoped install the file sits at `node_modules/@cldmv/slothlet/devcheck.mjs`, whose grandparent is the `@cldmv` scope directory rather than `node_modules`, so the guard never recognized the install and never tripped for the common scoped case (harmless there, since an npm install ships `dist/` and the outer window stays closed). The real hazard is a git or tarball install: it ships `src/` with no built `dist/`, so the outer window is open, and a scoped layout defeated the `node_modules` check — a consumer could take a spurious `exit(1)` at import time. Detection now tests for a `node_modules` path segment anywhere above the file, so scoped and unscoped installs are recognized regardless of nesting depth. + +`devcheck.mjs` lives at the package root and is outside the coverage `include` (`src/**`), so this fix and its tests carry no coverage-gate impact. + +--- + +## 🧪 Tests + +### `devcheck` guard regression suite (#270) + +A new spawn-based suite (`tests/vitests/suites/devcheck/devcheck.test.vitest.mjs`, 6 tests) launches `devcheck.mjs` as a child process under controlled `execArgv` / `NODE_OPTIONS` / working-directory conditions and asserts on its exit code and emitted message: the baseline `exit(1)` when no dev condition is set at all; non-firing when `--conditions=slothlet-dev` arrives via `execArgv` (the CLI/worker form) and the preserved `NODE_OPTIONS` path; the generic-dev redirect message for `--conditions=development`; and non-firing for both a scoped (`node_modules/@cldmv/slothlet`) and an unscoped (`node_modules/slothlet`) install layout. Because `devcheck.mjs` sits outside the coverage `include`, the suite has no effect on the coverage gate. + +--- + +## 📚 Documentation + +- **NEW:** [docs/changelog/v3/v3.13.1.md](./v3.13.1.md) — this changelog. +- README — refreshed **What's New**. + +--- + +## 🔧 Tooling + +- **Declaration tree regenerated to match shipped source.** No source module changed in this release; the committed `.d.mts` files under `types/` are regenerated so they match the source v3.13.0 actually shipped, whose declarations had been generated from earlier source. The visible deltas — `SlothletError`'s `originalError` parameter widened from `Error` to `unknown` and a private `#describeThrown` rendering helper, plus declaration updates for the hook / api / permission / version managers and `slothlet.d.mts` — are that regeneration, not new behavior in 3.13.1. + +### Dependency updates + +- `esbuild` 0.28.1 → 0.28.2 (#276) +- `globals` 17.8.0 → 17.9.0 (#277) +- `@types/node` 26.1.2 → 26.2.0 (#278) +- `eslint` 10.8.0 → 10.8.1 (#279) + +All four are **devDependencies**. The Dependabot bumps updated only the lockfile within the existing caret ranges, so the declared `devDependencies` floors are unchanged and `npm ci` installs the newly resolved (tested) versions. + +--- + +## Upgrade notes + +- **No breaking changes.** `devcheck.mjs` only ever acts in a slothlet source checkout — its guard stays inert once `dist/` is present or the copy is installed under `node_modules` — so this fix removes false positives and requires no consumer action. diff --git a/package-lock.json b/package-lock.json index 0b0a5f9d..8cd73fee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@cldmv/slothlet", - "version": "3.13.0", + "version": "3.13.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@cldmv/slothlet", - "version": "3.13.0", + "version": "3.13.1", "license": "Apache-2.0", "bin": { "slothlet": "bin/slothlet.mjs" @@ -238,9 +238,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -255,9 +255,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -272,9 +272,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -289,9 +289,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -306,9 +306,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -323,9 +323,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -340,9 +340,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -357,9 +357,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -374,9 +374,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -391,9 +391,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -408,9 +408,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -425,9 +425,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -442,9 +442,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -459,9 +459,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -476,9 +476,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -493,9 +493,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -510,9 +510,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -527,9 +527,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -544,9 +544,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -561,9 +561,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -578,9 +578,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -595,9 +595,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -612,9 +612,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -629,9 +629,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -646,9 +646,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -663,9 +663,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -1477,9 +1477,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", - "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", + "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", "dev": true, "license": "MIT", "dependencies": { @@ -2223,9 +2223,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2236,32 +2236,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/escape-string-regexp": { @@ -2278,9 +2278,9 @@ } }, "node_modules/eslint": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", - "integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", + "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -2791,9 +2791,9 @@ } }, "node_modules/globals": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", - "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", + "version": "17.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.9.0.tgz", + "integrity": "sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 736f8e24..1cd84940 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cldmv/slothlet", - "version": "3.13.0", + "version": "3.13.1", "moduleVersions": { "lazy": "3.0.0", "eager": "3.0.0", diff --git a/tests/vitests/suites/devcheck/devcheck.test.vitest.mjs b/tests/vitests/suites/devcheck/devcheck.test.vitest.mjs new file mode 100644 index 00000000..e9058be2 --- /dev/null +++ b/tests/vitests/suites/devcheck/devcheck.test.vitest.mjs @@ -0,0 +1,140 @@ +/** + * @Project: @cldmv/slothlet + * @Filename: /tests/vitests/suites/devcheck/devcheck.test.vitest.mjs + * @Date: 2026-08-14 20:50:00 -07:00 (1786765800) + * @Author: Nate Corcoran + * @Email: + * ----- + * @Last modified by: Nate Corcoran (Shinrai@users.noreply.github.com) + * @Last modified time: 2026-08-14 20:50:00 -07:00 (1786765800) + * ----- + * @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved. + */ + +/** + * @fileoverview Regression tests for the root `devcheck.mjs` dev-environment guard (#270). + * + * `devcheck.mjs` runs at import time and calls `process.exit(1)` when it thinks a dev is + * running against `src/` without slothlet's dev resolver condition. It cannot be imported + * in-process (it would kill the worker), so each case copies the real `devcheck.mjs` into a + * throwaway layout — a sibling `src/` dir and no `dist/`, satisfying the outer + * `existsSync(src) && !existsSync(dist)` guard — and spawns a fresh Node against it with a + * CI-free, per-case environment. The two bugs covered: + * + * 1. Dev-condition detection only read `NODE_OPTIONS`, missing the CLI/worker form where the + * flag lands in `process.execArgv` (`node --conditions=slothlet-dev file.mjs`, and how + * vitest passes conditions to its workers) — so the guard fired a false `exit(1)`. + * 2. The installed-package guard checked `basename(dirname(__dirname)) === "node_modules"`, + * which is `@cldmv` (the scope dir) for slothlet's own scoped install — so it never + * tripped, and a git/tarball install (ships `src/`, no `dist/`) would `exit(1)` inside a + * consumer. + */ +import { describe, it, expect, afterAll } from "vitest"; +import { spawn } from "node:child_process"; +import { mkdtemp, mkdir, copyFile, rm } from "node:fs/promises"; +import path from "node:path"; +import { tmpdir } from "node:os"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = path.resolve(__dirname, "../../../.."); +const DEVCHECK_SRC = path.join(REPO_ROOT, "devcheck.mjs"); + +// Every CI signal devcheck.mjs consults — cleared from the child so the guard is actually +// exercised under CI (otherwise `isCI` short-circuits the whole block and every case exits 0). +const CI_ENV_KEYS = ["CI", "GITHUB_ACTIONS", "TRAVIS", "CIRCLECI", "GITLAB_CI", "BUILDKITE", "JENKINS_URL", "TF_BUILD"]; + +const tempRoots = []; + +/** + * Stage a copy of the real `devcheck.mjs` at `//devcheck.mjs` with a sibling + * `src/` dir and no `dist/`, so the guard's outer condition is satisfied. + * @param {string} subpath - Layout under the temp root (e.g. "slothlet" or "node_modules/@cldmv/slothlet"). + * @returns {Promise} Absolute path to the staged devcheck.mjs. + */ +async function stageDevcheck(subpath) { + const root = await mkdtemp(path.join(tmpdir(), "slothlet-devcheck-")); + tempRoots.push(root); + const dir = path.join(root, subpath); + await mkdir(path.join(dir, "src"), { recursive: true }); + await copyFile(DEVCHECK_SRC, path.join(dir, "devcheck.mjs")); + return path.join(dir, "devcheck.mjs"); +} + +/** + * Spawn `node [execArgs] ` with a CI-free, controlled environment. The runner's own + * `NODE_OPTIONS` / `NODE_ENV` are dropped unless a case sets them, so detection is deterministic. + * @param {string} file - Absolute path to a staged devcheck.mjs. + * @param {{ execArgs?: string[], env?: Record }} [opts] + * @returns {Promise<{ code: number, stdout: string, stderr: string }>} + */ +function runDevcheck(file, { execArgs = [], env = {} } = {}) { + return new Promise((resolve, reject) => { + const childEnv = { ...process.env, ...env }; + for (const key of CI_ENV_KEYS) delete childEnv[key]; + if (!("NODE_OPTIONS" in env)) delete childEnv.NODE_OPTIONS; + if (!("NODE_ENV" in env)) delete childEnv.NODE_ENV; + const child = spawn(process.execPath, [...execArgs, file], { env: childEnv }); + let stdout = ""; + let stderr = ""; + child.stdout.on("data", (chunk) => (stdout += chunk.toString())); + child.stderr.on("data", (chunk) => (stderr += chunk.toString())); + child.on("error", reject); + child.on("close", (code) => resolve({ code: code ?? 0, stdout, stderr })); + }); +} + +describe("devcheck.mjs dev-environment guard (#270)", () => { + afterAll(async () => { + await Promise.allSettled(tempRoots.map((r) => rm(r, { recursive: true, force: true }))); + }); + + describe("guard is active (baseline)", () => { + it("exits 1 with a config message when no dev condition is set at all", async () => { + const file = await stageDevcheck("slothlet"); + const { code, stderr } = await runDevcheck(file); + expect(code).toBe(1); + expect(stderr).toMatch(/not properly configured/); + }); + }); + + describe("dev-condition detection reads execArgv, not just NODE_OPTIONS (bug 1)", () => { + it("does not fire when --conditions=slothlet-dev is passed on the CLI (execArgv)", async () => { + const file = await stageDevcheck("slothlet"); + const { code, stderr } = await runDevcheck(file, { execArgs: ["--conditions=slothlet-dev"] }); + expect(code).toBe(0); + expect(stderr).toBe(""); + }); + + it("still detects slothlet-dev via NODE_OPTIONS (original path preserved)", async () => { + const file = await stageDevcheck("slothlet"); + const { code } = await runDevcheck(file, { env: { NODE_OPTIONS: "--conditions=slothlet-dev" } }); + expect(code).toBe(0); + }); + + it("shows the generic-dev redirect message when --conditions=development is on the CLI", async () => { + const file = await stageDevcheck("slothlet"); + const { code, stderr } = await runDevcheck(file, { + execArgs: ["--conditions=development"], + env: { NODE_ENV: "development" } + }); + expect(code).toBe(1); + expect(stderr).toMatch(/Incorrect development environment detected/); + }); + }); + + describe("installed-package guard detects a node_modules segment anywhere (bug 2)", () => { + it("does not fire for a scoped install under node_modules/@cldmv/slothlet", async () => { + const file = await stageDevcheck(path.join("node_modules", "@cldmv", "slothlet")); + const { code, stderr } = await runDevcheck(file); + expect(code).toBe(0); + expect(stderr).toBe(""); + }); + + it("does not fire for an unscoped install under node_modules/slothlet (original path preserved)", async () => { + const file = await stageDevcheck(path.join("node_modules", "slothlet")); + const { code } = await runDevcheck(file); + expect(code).toBe(0); + }); + }); +}); diff --git a/types/src/lib/builders/api_builder.d.mts.map b/types/src/lib/builders/api_builder.d.mts.map index 9e2e645b..d43af901 100644 --- a/types/src/lib/builders/api_builder.d.mts.map +++ b/types/src/lib/builders/api_builder.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"api_builder.d.mts","sourceRoot":"","sources":["../../../../src/lib/builders/api_builder.mjs"],"names":[],"mappings":"AA6LA;;;;;;;;;;;;;GAaG;AACH;IACC,gCAAuC;IAEvC;;;;;;;OAOG;IACH,sBANW,MAAM,EAQhB;IAED;;;;;OAKG;IACH,8BAJW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CA6G3B;IAED;;;;;;;;;;;OAWG;IACH,gCA88EC;IAED;;;;OAIG;IACH,+BA0BC;IAED;;;;OAIG;IACH,0BAgCC;IAED;;;;OAIG;IACH,4BAkTC;IAED;;;;;OAKG;IACH,8BAuDC;IAED;;;;;OAKG;IACH,uBAgCC;CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAhvG6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"api_builder.d.mts","sourceRoot":"","sources":["../../../../src/lib/builders/api_builder.mjs"],"names":[],"mappings":"AA6LA;;;;;;;;;;;;;GAaG;AACH;IACC,gCAAuC;IAEvC;;;;;;;OAOG;IACH,sBANW,MAAM,EAQhB;IAED;;;;;OAKG;IACH,8BAJW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CA6G3B;IAED;;;;;;;;;;;OAWG;IACH,gCAiuFC;IAED;;;;OAIG;IACH,+BA0BC;IAED;;;;OAIG;IACH,0BAgCC;IAED;;;;OAIG;IACH,4BAkTC;IAED;;;;;OAKG;IACH,8BAuDC;IAED;;;;;OAKG;IACH,uBAgCC;CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAngH6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/errors.d.mts b/types/src/lib/errors.d.mts index 3b5d41a2..764775fb 100644 --- a/types/src/lib/errors.d.mts +++ b/types/src/lib/errors.d.mts @@ -9,19 +9,24 @@ export class SlothletError extends Error { * @param {Object} context - Additional context about the error * @param {boolean} [context.validationError] - Mark as validation error (no originalError needed) * @param {boolean} [context.stub] - Mark as stub error (not-yet-implemented feature) - * @param {Error} [originalError] - The original error that caused this SlothletError + * @param {unknown} [originalError] - What was originally thrown. Not necessarily an `Error`: + * application code may throw a structured payload, a string, or any other value, and all of + * them are rendered into the message and chained via `cause`. Only `null`/`undefined` mean + * "no original". * @param {Object} [options] - Additional options (alternative to embedding flags in context) * @param {boolean} [options.validationError] - Mark as validation error (no originalError needed) * @param {boolean} [options.stub] - Mark as stub error (not-yet-implemented feature) * @public */ - constructor(code: string, context?: { - validationError?: boolean | undefined; - stub?: boolean | undefined; - }, originalError?: Error, options?: { - validationError?: boolean | undefined; - stub?: boolean | undefined; - }); + /** + * Renders a thrown value for message interpolation. + * + * @param {unknown} thrown - Whatever the guarded code threw. + * @returns {string} A human-readable rendering: an Error's message, a string as itself, and + * any other value JSON-serialized (falling back to String() for unserializable values). + */ + static #describeThrown(thrown: unknown): string; + constructor(code: any, context?: {}, originalError?: null, options?: {}); /** * Prevent JSON serialization of context (cleaner error display) * @returns {Object} Simplified error object diff --git a/types/src/lib/errors.d.mts.map b/types/src/lib/errors.d.mts.map index c58e4105..b900390f 100644 --- a/types/src/lib/errors.d.mts.map +++ b/types/src/lib/errors.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"errors.d.mts","sourceRoot":"","sources":["../../../src/lib/errors.mjs"],"names":[],"mappings":"AAqBA;;;GAGG;AACH;IACC;;;;;;;;;;;OAWG;IACH,kBAVW,MAAM,YAEd;QAA0B,eAAe;QACf,IAAI;KAC9B,kBAAQ,KAAK,YAEb;QAA0B,eAAe;QACf,IAAI;KAC9B,EAkEF;IAoCD;;;OAGG;IACH,UAFa,MAAM,CASlB;CACD;AAED;;;GAGG;AACH;IAEC,uBAAqB;IACrB,gCAA+B;IA+C/B;;;OAGG;IACH,oCAEC;IAnDD;;;;;;;;OAQG;IACH,kBAPW,MAAM,YAEd;QAAyB,GAAG;KAG5B,EA4BF;IAlBA,aAA6B;IAC7B,aAAgB;IAChB,qBAAqB;IACrB,SADW,MAAM,CACe;IAChC;;MAAsB;IAgBvB;;;OAGG;IACH,YAFa,MAAM,CAIlB;CASD;AAED;;;GAGG;AACH;IACC;;;;OAIG;IACH,qBAHW,MAAM,EAMhB;IAFA,eAAoB;IACpB,gBAAoC;IAGrC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,iBA1BW,MAAM,YAEd;QAAyB,GAAG;QAIH,OAAO;KAEhC,QAoDF;IAED;;;OAGG;IACH,YAFa,MAAM,CAMlB;CACD"} \ No newline at end of file +{"version":3,"file":"errors.d.mts","sourceRoot":"","sources":["../../../src/lib/errors.mjs"],"names":[],"mappings":"AAqBA;;;GAGG;AACH;IACC;;;;;;;;;;;;;;OAcG;IACH;;;;;;OAMG;IACH,+BAJW,OAAO,GACL,MAAM,CAclB;IAED,yEA2EC;IAoCD;;;OAGG;IACH,UAFa,MAAM,CASlB;CACD;AAED;;;GAGG;AACH;IAEC,uBAAqB;IACrB,gCAA+B;IA+C/B;;;OAGG;IACH,oCAEC;IAnDD;;;;;;;;OAQG;IACH,kBAPW,MAAM,YAEd;QAAyB,GAAG;KAG5B,EA4BF;IAlBA,aAA6B;IAC7B,aAAgB;IAChB,qBAAqB;IACrB,SADW,MAAM,CACe;IAChC;;MAAsB;IAgBvB;;;OAGG;IACH,YAFa,MAAM,CAIlB;CASD;AAED;;;GAGG;AACH;IACC;;;;OAIG;IACH,qBAHW,MAAM,EAMhB;IAFA,eAAoB;IACpB,gBAAoC;IAGrC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,iBA1BW,MAAM,YAEd;QAAyB,GAAG;QAIH,OAAO;KAEhC,QAoDF;IAED;;;OAGG;IACH,YAFa,MAAM,CAMlB;CACD"} \ No newline at end of file diff --git a/types/src/lib/handlers/api-manager.d.mts b/types/src/lib/handlers/api-manager.d.mts index a640f9ed..f71af8b2 100644 --- a/types/src/lib/handlers/api-manager.d.mts +++ b/types/src/lib/handlers/api-manager.d.mts @@ -28,11 +28,12 @@ export class ApiManager extends ComponentBase { * const manager = new ApiManager(slothlet); */ constructor(slothlet: object); - /** @type {{ addHistory: object[], initialConfig: object|null, operationHistory: object[] }} */ + /** @type {{ addHistory: object[], initialConfig: object|null, operationHistory: object[], replaceShadows: Map }} */ state: { addHistory: object[]; initialConfig: object | null; operationHistory: object[]; + replaceShadows: Map; }; /** * Normalize and validate an API path. @@ -195,6 +196,30 @@ export class ApiManager extends ComponentBase { * await this.syncWrapper(existingProxy, nextProxy, this.____config); */ private syncWrapper; + /** + * Record the first module's exclusive members that a cross-module `replace` shadows off the live + * surface, so a later remove of the overriding module can restore the first module's FULL mount. (#3) + * @param {object} existingWrapper - Raw container wrapper being overwritten (still holds the first module's children). + * @param {string[]} existingChildKeys - The container's current child keys. + * @param {string[]} nextChildKeys - The overriding module's child keys. + * @param {string|null} moduleID - The overriding module's id. + * @returns {void} + * @private + * + * @description + * `replace` wholesale-swaps the visible surface: the overriding module's keys win and the first + * module's EXCLUSIVE members (present on the existing container, absent from the incoming one) are + * deleted from the surface. Ownership still records the first module as their owner, but the live + * child wrappers are detached — and a namespace cannot be faithfully rebuilt from the ownership + * value alone (its impl is depleted once its children are adopted). So capture the actual detached + * child wrappers, keyed by the overriding module, and re-attach them on its removal. + * + * Only members owned by a DIFFERENT module are shadowed: a module replacing itself (an explicit + * same-moduleID re-add / reload) genuinely drops the export and must not resurrect it. Runs once + * per API tree (api + boundApi both flow through syncWrapper), capturing each tree's own container + * + child so the re-attach restores both. + */ + private _recordReplaceShadows; /** * Recursively mutate an existing API value to match a new value. * @param {function|object} existingValue - Existing value to mutate. diff --git a/types/src/lib/handlers/api-manager.d.mts.map b/types/src/lib/handlers/api-manager.d.mts.map index 72aff9c5..b9e1dfc5 100644 --- a/types/src/lib/handlers/api-manager.d.mts.map +++ b/types/src/lib/handlers/api-manager.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"api-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/api-manager.mjs"],"names":[],"mappings":"AAyDA;;;;;;;;;;;;;;GAcG;AACH;IACC,gCAAuC;IAEvC;;;;;;;;;;;OAWG;IACH,sBAVW,MAAM,EAoBhB;IARA,+FAA+F;IAC/F,OADW;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,CAO1F;IAGF;;;;;;;;;;;;;;;;;;OAkBG;IACH,yBAuFC;IAED;;;;;;;;;;;;;;OAcG;IACH,oBA4CC;IAED;;;;;;;;;;;;;;OAcG;IACH,0BA4BC;IAED;;;;;;;;;;;;OAYG;IACH,6BAIC;IAED;;;;;;;;;;;;OAYG;IACH,uBASC;IAED;;;;;;;;;;;;;OAaG;IACH,yBAkCC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,iCAbW,MAAM,SACN,OAAO,iBACP,MAAM,GAAC,IAAI,GACT,IAAI,CAgHhB;IAED;;;;;;;;;;;;;OAaG;IACH,uBAEC;IAED;;;;;;;;;;;;;;OAcG;IACH,oBAiNC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,uBAkGC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,uBAgJC;IAED;;;;;;;;;;;;OAYG;IACH,mBAmGC;IACD;;;;;;;;;;;;OAYG;IACH,uBAwEC;IA6CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,wBAhDG;QAAuB,OAAO,EAAtB,MAAM;QACmD,UAAU,EAAnE,MAAM,GAAC,MAAM,EAAE,cAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QACf,OAAO;KAChD,GAAU,OAAO,CAAC,MAAM,GAAC,MAAM,EAAE,CAAC,CAmxBpC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,yEATG;QAAqB,QAAQ,EAArB,MAAM;QACO,aAAa,EAA1B,MAAM;QACO,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAgDzB;IA8BD;;;;;;;;;;;OAWG;IACH,mCAeC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,mCAfW,MAAM,iBACJ,OAAO,CAAC,IAAI,CAAC,CA+czB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,2BAdG;QAAwB,OAAO,EAAtB,MAAM,OAAA;QACS,QAAQ,EAAvB,MAAM,OAAA;KACf,GAAU,OAAO,CAAC,IAAI,CAAC,CAuCzB;IAED;;;;;;;;;;OAUG;IACH,0BAuEC;IAED;;;;;;;;;;;;;;OAcG;IACH,yBAsFC;IAED;;;;;;;;;;;;;OAaG;IACH,4BA0FC;IAED;;;;;;;;OAQG;IACH,iCAuDC;IAED;;;;;OAKG;IACH,iCAeC;IAED;;;;;;;;;;;;;OAaG;IACH,wBAoUC;;CACD;8BAv2G6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"api-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/api-manager.mjs"],"names":[],"mappings":"AAyDA;;;;;;;;;;;;;;GAcG;AACH;IACC,gCAAuC;IAEvC;;;;;;;;;;;OAWG;IACH,sBAVW,MAAM,EAuBhB;IAXA,sIAAsI;IACtI,OADW;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAUjI;IAGF;;;;;;;;;;;;;;;;;;OAkBG;IACH,yBAuFC;IAED;;;;;;;;;;;;;;OAcG;IACH,oBA4CC;IAED;;;;;;;;;;;;;;OAcG;IACH,0BA4BC;IAED;;;;;;;;;;;;OAYG;IACH,6BAIC;IAED;;;;;;;;;;;;OAYG;IACH,uBASC;IAED;;;;;;;;;;;;;OAaG;IACH,yBAkCC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,iCAbW,MAAM,SACN,OAAO,iBACP,MAAM,GAAC,IAAI,GACT,IAAI,CAgHhB;IAED;;;;;;;;;;;;;OAaG;IACH,uBAEC;IAED;;;;;;;;;;;;;;OAcG;IACH,oBAkOC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,8BAiCC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,uBAkGC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,uBAgJC;IAED;;;;;;;;;;;;OAYG;IACH,mBAmGC;IACD;;;;;;;;;;;;OAYG;IACH,uBAwEC;IA6CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,wBAhDG;QAAuB,OAAO,EAAtB,MAAM;QACmD,UAAU,EAAnE,MAAM,GAAC,MAAM,EAAE,cAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QACf,OAAO;KAChD,GAAU,OAAO,CAAC,MAAM,GAAC,MAAM,EAAE,CAAC,CAmxBpC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,yEATG;QAAqB,QAAQ,EAArB,MAAM;QACO,aAAa,EAA1B,MAAM;QACO,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAgDzB;IA8BD;;;;;;;;;;;OAWG;IACH,mCAeC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,mCAfW,MAAM,iBACJ,OAAO,CAAC,IAAI,CAAC,CA+ezB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,2BAdG;QAAwB,OAAO,EAAtB,MAAM,OAAA;QACS,QAAQ,EAAvB,MAAM,OAAA;KACf,GAAU,OAAO,CAAC,IAAI,CAAC,CAuCzB;IAED;;;;;;;;;;OAUG;IACH,0BAuEC;IAED;;;;;;;;;;;;;;OAcG;IACH,yBAsFC;IAED;;;;;;;;;;;;;OAaG;IACH,4BA0FC;IAED;;;;;;;;OAQG;IACH,iCAuDC;IAED;;;;;OAKG;IACH,iCAeC;IAED;;;;;;;;;;;;;OAaG;IACH,wBAoUC;;CACD;8BAr9G6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/handlers/hook-manager.d.mts b/types/src/lib/handlers/hook-manager.d.mts index f05018e3..b4f54b95 100644 --- a/types/src/lib/handlers/hook-manager.d.mts +++ b/types/src/lib/handlers/hook-manager.d.mts @@ -171,6 +171,25 @@ export class HookManager extends ComponentBase { * @public */ public getHooksForPath(type: string, apiPath: string): Array; + /** + * Derive the dispatch strategy for a path from the current hook set. + * + * @param {string} path - API path about to be called + * @returns {{asyncBefore: boolean, asyncAfter: boolean}} Whether any matching transforming + * hook is asynchronous. + * @public + * + * @description + * The strategy is a property of the CALL, derived per invocation from the registration state — + * never baked onto the leaf, so removing an async hook returns the path to synchronous + * dispatch. Only TRANSFORMING hooks (before/after) are consulted: `always` and `error` are + * observers whose return values are never consumed, so they never force promotion. Cached per + * path behind the registry epoch; the hot-path cost is one integer compare. + */ + public getDispatchStrategy(path: string): { + asyncBefore: boolean; + asyncAfter: boolean; + }; /** * Execute before hooks for an API path. * @@ -194,6 +213,41 @@ export class HookManager extends ComponentBase { * @public */ public executeAfterHooks(path: string, result: any, args: any[], api: object, ctx: object): HookExecutionResult; + /** + * Execute before hooks asynchronously — the promoted-pipeline twin of + * {@link executeBeforeHooks}. + * + * @param {string} path - API path being called + * @param {Array} args - Function arguments + * @param {object} api - Bound API object + * @param {object} ctx - User context object + * @returns {Promise} Result object: { args, shortCircuit, value } + * @public + * + * @description + * Same protocol and strict registration order as the sync variant, with one difference: a + * handler's thenable return is AWAITED rather than refused — the caller of a promoted path + * already receives a Promise, so awaiting the chain changes nothing observable. A synchronous + * handler's return is used as-is (no microtask tick is inserted for it). + */ + public executeBeforeHooksAsync(path: string, args: any[], api: object, ctx: object): Promise; + /** + * Execute after hooks asynchronously — the promoted-pipeline twin of + * {@link executeAfterHooks}. + * + * @param {string} path - API path being called + * @param {*} result - Function return value (already settled) + * @param {Array} args - Original function arguments + * @param {object} api - Bound API object + * @param {object} ctx - User context object + * @returns {Promise} Object indicating if result was modified and the final result + * @public + * + * @description + * Same protocol and ordering as the sync variant; a thenable transform is awaited (that is the + * cell this pipeline exists for) and a synchronous transform costs no microtask tick. + */ + public executeAfterHooksAsync(path: string, result: any, args: any[], api: object, ctx: object): Promise; /** * Execute always hooks for an API path. * diff --git a/types/src/lib/handlers/hook-manager.d.mts.map b/types/src/lib/handlers/hook-manager.d.mts.map index e02020af..8697de7d 100644 --- a/types/src/lib/handlers/hook-manager.d.mts.map +++ b/types/src/lib/handlers/hook-manager.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"hook-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/hook-manager.mjs"],"names":[],"mappings":"AA8CA;;;;;;GAMG;AACH;IACC;;;;OAIG;IACH,yBAHU,MAAM,CAGwB;IA0CxC;;;OAGG;IACH,sBAFW,MAAM,EAmChB;IAvBA,iBAAiC;IACjC,uBAAgD;IAChD,wBAAwD;IAMxD,qBAAiC;IAKjC,0BAAgC;IAChC,6BAAgC;IAMhC,qBAAsB;IACtB,0BAA0B;IAC1B,gCAAmC;IAmCpC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,uBAxBW,MAAM,+BAId;QAAyB,EAAE;QACF,QAAQ;QACR,MAAM;QACL,UAAU;KAQpC,GAAU,MAAM,CA0HlB;IAgDD;;;;;;;;;OASG;IACH,uBANG;QAAwB,EAAE;QACF,IAAI;QACJ,OAAO;KAC/B,GAAU,MAAM,CA8ClB;IAED;;;;;;;;;OASG;IACH,uBAPW,MAAM,GAAC,MAAM,GAIX,MAAM,CAalB;IAED;;;;;;;;;OASG;IACH,wBAPW,MAAM,GAAC,MAAM,GAIX,MAAM,CAclB;IAED;;;;;;;;;;;;;;;OAeG;IACH,8BAPW,MAAM,GACJ,MAAM,CAYlB;IAED;;;;;;;;;;;;OAYG;IACH,+BAPW,MAAM,GACJ,MAAM,CAalB;IAED;;;;;;;;;OASG;IACH,6BAHa,IAAI,CAWhB;IAED;;;;;;;;;OASG;IACH,6BAJW,OAAO,GACL,OAAO,CAMnB;IAED;;;;;;;;;;OAUG;IACH,qBARW,MAAM,GAAC,MAAM,GAKX,MAAM,CA8DlB;IAED;;;;;;;;OAQG;IACH,6BALW,MAAM,WACN,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAwEzB;IAED;;;;;;;;;OASG;IACH,gCAPW,MAAM,oBAEN,MAAM,OACN,MAAM,GACJ,MAAM,CA6ClB;IAED;;;;;;;;;;OAUG;IACH,+BARW,MAAM,UACN,GAAC,oBAED,MAAM,OACN,MAAM,GACJ,mBAAmB,CA+C/B;IAED;;;;;;;;;;;OAWG;IACH,gCATW,MAAM,8BAEN,GAAC,YACD,OAAO,sBACP,KAAK,CAAC,KAAK,CAAC,mBACZ,MAAM,OACN,MAAM,QA8BhB;IAED;;;;;;;;;;OAUG;IACH,+BARW,MAAM,SACN,KAAK,UACL,MAAM,oBAEN,MAAM,OACN,MAAM,QA4BhB;IA4GD;;;;;;OAMG;IACH,4CAEC;IA8ID;;;;;;OAMG;IACH,sBAHa,KAAK,CAAC,MAAM,CAAC,CA+BzB;IAED;;;;;;;OAOG;IACH,kCAJW,KAAK,CAAC,MAAM,CAAC,GACX,IAAI,CAehB;IAED;;;OAGG;IACH,iCAUC;;CACD;;;;;;;;cApqCa,OAAO;;;;aACP,GAAC;;8BARe,2BAA2B"} \ No newline at end of file +{"version":3,"file":"hook-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/hook-manager.mjs"],"names":[],"mappings":"AAwDA;;;;;;GAMG;AACH;IACC;;;;OAIG;IACH,yBAHU,MAAM,CAGwB;IA0CxC;;;OAGG;IACH,sBAFW,MAAM,EAmChB;IAvBA,iBAAiC;IACjC,uBAAgD;IAChD,wBAAwD;IAMxD,qBAAiC;IAKjC,0BAAgC;IAChC,6BAAgC;IAMhC,qBAAsB;IACtB,0BAA0B;IAC1B,gCAAmC;IA6DpC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,uBAxBW,MAAM,+BAId;QAAyB,EAAE;QACF,QAAQ;QACR,MAAM;QACL,UAAU;KAQpC,GAAU,MAAM,CA8NlB;IAgDD;;;;;;;;;OASG;IACH,uBANG;QAAwB,EAAE;QACF,IAAI;QACJ,OAAO;KAC/B,GAAU,MAAM,CA6DlB;IAED;;;;;;;;;OASG;IACH,uBAPW,MAAM,GAAC,MAAM,GAIX,MAAM,CAalB;IAED;;;;;;;;;OASG;IACH,wBAPW,MAAM,GAAC,MAAM,GAIX,MAAM,CAclB;IAED;;;;;;;;;;;;;;;OAeG;IACH,8BAPW,MAAM,GACJ,MAAM,CAkBlB;IAED;;;;;;;;;;;;OAYG;IACH,+BAPW,MAAM,GACJ,MAAM,CAkBlB;IAED;;;;;;;;;OASG;IACH,6BAHa,IAAI,CAYhB;IAED;;;;;;;;;OASG;IACH,6BAJW,OAAO,GACL,OAAO,CAMnB;IAED;;;;;;;;;;OAUG;IACH,qBARW,MAAM,GAAC,MAAM,GAKX,MAAM,CA8DlB;IAED;;;;;;;;OAQG;IACH,6BALW,MAAM,WACN,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAqBzB;IAyED;;;;;;;;;;;;;;OAcG;IACH,iCAZW,MAAM,GACJ;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAC,CAsBvD;IAED;;;;;;;;;OASG;IACH,gCAPW,MAAM,oBAEN,MAAM,OACN,MAAM,GACJ,MAAM,CA+ClB;IAED;;;;;;;;;;OAUG;IACH,+BARW,MAAM,UACN,GAAC,oBAED,MAAM,OACN,MAAM,GACJ,mBAAmB,CA+D/B;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,qCAbW,MAAM,oBAEN,MAAM,OACN,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CA+C3B;IAED;;;;;;;;;;;;;;;OAeG;IACH,oCAZW,MAAM,UACN,GAAC,oBAED,MAAM,OACN,MAAM,GACJ,OAAO,CAAC,mBAAmB,CAAC,CA6CxC;IAED;;;;;;;;;;;OAWG;IACH,gCATW,MAAM,8BAEN,GAAC,YACD,OAAO,sBACP,KAAK,CAAC,KAAK,CAAC,mBACZ,MAAM,OACN,MAAM,QA+BhB;IAED;;;;;;;;;;OAUG;IACH,+BARW,MAAM,SACN,KAAK,UACL,MAAM,oBAEN,MAAM,OACN,MAAM,QA6BhB;IA4GD;;;;;;OAMG;IACH,4CAEC;IAwLD;;;;;;OAMG;IACH,sBAHa,KAAK,CAAC,MAAM,CAAC,CAwCzB;IAED;;;;;;;OAOG;IACH,kCAJW,KAAK,CAAC,MAAM,CAAC,GACX,IAAI,CAkBhB;IAED;;;OAGG;IACH,iCAUC;;CACD;;;;;;;;cAjjDa,OAAO;;;;aACP,GAAC;;8BARe,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/handlers/ownership.d.mts.map b/types/src/lib/handlers/ownership.d.mts.map index fdd4ff78..cd43d8ec 100644 --- a/types/src/lib/handlers/ownership.d.mts.map +++ b/types/src/lib/handlers/ownership.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"ownership.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/ownership.mjs"],"names":[],"mappings":"AAqBA;;;;;GAKG;AAEH;;;;;GAKG;AACH;IACC,gCAAsC;IAEtC;;;OAGG;IACH,sBAFW,MAAM,EAQhB;IAJA,4BAA6B;IAC7B,4BAA6B;IAC7B,+BAAqC;IACrC,+BAAgC;IAGjC;;;;;;;;OAQG;IACH,mCALW,MAAM,YACN,MAAM,GACJ,IAAI,CAUhB;IAED;;;;;OAKG;IACH,mCAJW,MAAM,GACJ,MAAM,GAAC,SAAS,CAK5B;IAED;;;;;;;;;;;;OAYG;IACH,uFAVG;QAAwB,QAAQ,EAAxB,MAAM;QACU,OAAO,EAAvB,MAAM;QACK,KAAK,EAAhB,GAAC;QACgB,MAAM;QACN,aAAa;QACb,MAAM;QACN,QAAQ;KACjC,GAAU,MAAM,GAAC,IAAI,CAsFvB;IAED;;;;;;;;;;OAUG;IACH,4BAVW,MAAM,GACJ,gBAAgB,CAuC5B;IAED;;;;;;;;;;;;;OAaG;IACH,2BAbW,MAAM,aACN,MAAM,GAAC,IAAI,GACT;QAAE,MAAM,EAAE,QAAQ,GAAC,MAAM,GAAC,SAAS,CAAC;QAAC,eAAe,EAAE,MAAM,GAAC,IAAI,CAAC;QAC5E,eAAe,EAAE,MAAM,GAAC,IAAI,CAAA;KAAE,CA4ChC;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GACJ,MAAM,GAAC,IAAI,CAOvB;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GACJ,GAAC,CAkBb;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAKzB;IAED;;;;;OAKG;IACH,+BAJW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAKzB;IAED;;;;;;OAMG;IACH,0BALW,MAAM,WACN,MAAM,GACJ,OAAO,CAMnB;IAED;;;;OAIG;IACH,yBAHa,MAAM,CAkBlB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,GACJ,GAAG,CAAC,MAAM,CAAC,GAAC,IAAI,CAS5B;IAED;;;;;;;;;;;;;;;OAeG;IACH,4BAdW,MAAM,YACN,MAAM,QACN,MAAM,2BAEJ,IAAI,CAwDhB;IAED;;;OAGG;IACH,qBAKC;IAED;;;;OAIG;IACH,sBAHa,MAAM,CAQlB;IAED;;;;OAIG;IACH,0BAHW,MAAM,QAgBhB;CACD;;;;;;;;aArca,MAAM,EAAE;;;;gBACR,MAAM,EAAE;;8BAPQ,2BAA2B"} \ No newline at end of file +{"version":3,"file":"ownership.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/ownership.mjs"],"names":[],"mappings":"AAqBA;;;;;GAKG;AAEH;;;;;GAKG;AACH;IACC,gCAAsC;IAEtC;;;OAGG;IACH,sBAFW,MAAM,EAQhB;IAJA,4BAA6B;IAC7B,4BAA6B;IAC7B,+BAAqC;IACrC,+BAAgC;IAGjC;;;;;;;;OAQG;IACH,mCALW,MAAM,YACN,MAAM,GACJ,IAAI,CAUhB;IAED;;;;;OAKG;IACH,mCAJW,MAAM,GACJ,MAAM,GAAC,SAAS,CAK5B;IAED;;;;;;;;;;;;OAYG;IACH,uFAVG;QAAwB,QAAQ,EAAxB,MAAM;QACU,OAAO,EAAvB,MAAM;QACK,KAAK,EAAhB,GAAC;QACgB,MAAM;QACN,aAAa;QACb,MAAM;QACN,QAAQ;KACjC,GAAU,MAAM,GAAC,IAAI,CA6FvB;IAED;;;;;;;;;;OAUG;IACH,4BAVW,MAAM,GACJ,gBAAgB,CAuC5B;IAED;;;;;;;;;;;;;OAaG;IACH,2BAbW,MAAM,aACN,MAAM,GAAC,IAAI,GACT;QAAE,MAAM,EAAE,QAAQ,GAAC,MAAM,GAAC,SAAS,CAAC;QAAC,eAAe,EAAE,MAAM,GAAC,IAAI,CAAC;QAC5E,eAAe,EAAE,MAAM,GAAC,IAAI,CAAA;KAAE,CA4ChC;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GACJ,MAAM,GAAC,IAAI,CAOvB;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GACJ,GAAC,CAkBb;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAKzB;IAED;;;;;OAKG;IACH,+BAJW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAKzB;IAED;;;;;;OAMG;IACH,0BALW,MAAM,WACN,MAAM,GACJ,OAAO,CAMnB;IAED;;;;OAIG;IACH,yBAHa,MAAM,CAkBlB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,GACJ,GAAG,CAAC,MAAM,CAAC,GAAC,IAAI,CAS5B;IAED;;;;;;;;;;;;;;;OAeG;IACH,4BAdW,MAAM,YACN,MAAM,QACN,MAAM,2BAEJ,IAAI,CAwDhB;IAED;;;OAGG;IACH,qBAKC;IAED;;;;OAIG;IACH,sBAHa,MAAM,CAQlB;IAED;;;;OAIG;IACH,0BAHW,MAAM,QAgBhB;CACD;;;;;;;;aA5ca,MAAM,EAAE;;;;gBACR,MAAM,EAAE;;8BAPQ,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/handlers/permission-manager.d.mts b/types/src/lib/handlers/permission-manager.d.mts index b0d847f9..4d96ce76 100644 --- a/types/src/lib/handlers/permission-manager.d.mts +++ b/types/src/lib/handlers/permission-manager.d.mts @@ -228,6 +228,20 @@ export class PermissionManager extends ComponentBase { * if (pm.isCaptureEnabled()) { ... } */ isCaptureEnabled(): boolean; + /** + * Whether an api path targets a module-private (`_`/`__`-prefixed) member (#260). + * + * @param {string|null|undefined} targetPath - Dotted api path of the read/call target. + * @returns {boolean} True when the terminal segment is underscore-prefixed. + * @public + * + * @description + * The wrapper layer consults this at its trusted-root short-circuits: a host-initiated + * read/call normally bypasses enforcement entirely, but a private-named target must still + * route through {@link enforceAccess} so the configured `permissions.private.host` policy + * applies and the denial is audited like any other. + */ + public isPrivateTarget(targetPath: string | null | undefined): boolean; /** * Enable or disable read-level permission gating at runtime. * Unlike {@link enable}/{@link disable}, this does not clear the resolved cache — diff --git a/types/src/lib/handlers/permission-manager.d.mts.map b/types/src/lib/handlers/permission-manager.d.mts.map index eb24f1ef..f694af3c 100644 --- a/types/src/lib/handlers/permission-manager.d.mts.map +++ b/types/src/lib/handlers/permission-manager.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"permission-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/permission-manager.mjs"],"names":[],"mappings":"AAwCA;;;;;;;GAOG;AACH;IACC;;;;OAIG;IACH,yBAHU,MAAM,CAG8B;IA4E9C;;;;;;OAMG;IACH,sBAJW,MAAM,EA+ChB;IAED;;;;;;;;;;;;;OAaG;IACH,cAVG;QAAqB,MAAM,EAAnB,MAAM;QACO,MAAM,EAAnB,MAAM;QACO,MAAM,EAAnB,MAAM;KACd,kBAAQ,MAAM,GAAC,IAAI,WACX,MAAM,GAAC,IAAI,GACT,MAAM,CAuClB;IAED;;;;;;;;;;OAUG;IACH,mBAPW,MAAM,mBACN,MAAM,GAAC,IAAI,GACT,OAAO,CAkCnB;IAED;;;;;;;;;;;;;;;OAeG;IACH,wBAXW,MAAM,cACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,YACX;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAC,IAAI,GAEzB,OAAO,CA0BnB;IAED;;;;;;;;;OASG;IACH,4BANW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAS,CAAC,GAAC,IAAI,GAAC,SAAS,mBACvF,MAAM,GAAC,IAAI,GACT,OAAO,CAQnB;IAuBD;;;;;;;;;;;;;;;OAeG;IACH,0BAXW,MAAM,cACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,GACT,OAAO,CAYnB;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,8BAbW,MAAM,GAAC,IAAI,YAEX,MAAM,YACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,GACT,OAAO,CAenB;IAED;;;;;;;;;;;;;;;OAeG;IACH,4BAZW,MAAM,GAAC,IAAI,YACX,MAAM,YACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBAGX,MAAM,GAAC,IAAI,GACT,OAAO,CAMnB;IAED;;;;;;;OAOG;IACH,4BALW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAazB;IAED;;;;;;;OAOG;IACH,2BALW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAYzB;IAED;;;;;;;;OAQG;IACH,8BALW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAazB;IAED;;;;;;OAMG;IACH,UAJa,IAAI,CAQhB;IAcD;;;;;;;OAOG;IACH,QAJa,IAAI,CAMhB;IAED;;;;;OAKG;IACH,YAJa,OAAO,CAMnB;IAED;;;;;;OAMG;IACH,WAJa,IAAI,CAQhB;IAED;;;;;;OAMG;IACH,aAJa,OAAO,CAMnB;IAED;;;;;;;;OAQG;IACH,uBAJa,OAAO,CAMnB;IAED;;;;;;;;;OASG;IACH,oBAJa,OAAO,CAMnB;IAED;;;;;;;;;;;OAWG;IACH,qBANW,OAAO,GACL,IAAI,CAgBhB;IAED;;;;;;OAMG;IAIH,eAPa,KAAK,CAAC,MAAM,CAAC,CAgBzB;IAED;;;;;;;;OAQG;IACH,2BALW,KAAK,CAAC,MAAM,CAAC,GACX,IAAI,CAShB;IAGD;;;;;;;OAOG;IACH,YAJa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAyeD;;;;;;;OAOG;IACH,cAEC;;CACD;8BApnC6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"permission-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/permission-manager.mjs"],"names":[],"mappings":"AAsFA;;;;;;;GAOG;AACH;IACC;;;;OAIG;IACH,yBAHU,MAAM,CAG8B;IAmF9C;;;;;;OAMG;IACH,sBAJW,MAAM,EAiDhB;IAED;;;;;;;;;;;;;OAaG;IACH,cAVG;QAAqB,MAAM,EAAnB,MAAM;QACO,MAAM,EAAnB,MAAM;QACO,MAAM,EAAnB,MAAM;KACd,kBAAQ,MAAM,GAAC,IAAI,WACX,MAAM,GAAC,IAAI,GACT,MAAM,CAuClB;IAED;;;;;;;;;;OAUG;IACH,mBAPW,MAAM,mBACN,MAAM,GAAC,IAAI,GACT,OAAO,CAkCnB;IAED;;;;;;;;;;;;;;;OAeG;IACH,wBAXW,MAAM,cACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,YACX;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAC,IAAI,GAEzB,OAAO,CA0BnB;IAED;;;;;;;;;OASG;IACH,4BANW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAS,CAAC,GAAC,IAAI,GAAC,SAAS,mBACvF,MAAM,GAAC,IAAI,GACT,OAAO,CAQnB;IAuBD;;;;;;;;;;;;;;;OAeG;IACH,0BAXW,MAAM,cACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,GACT,OAAO,CAYnB;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,8BAbW,MAAM,GAAC,IAAI,YAEX,MAAM,YACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,GACT,OAAO,CAenB;IAED;;;;;;;;;;;;;;;OAeG;IACH,4BAZW,MAAM,GAAC,IAAI,YACX,MAAM,YACN,MAAM,mBACN,MAAM,GAAC,IAAI,mBACX,MAAM,GAAC,IAAI,mBAGX,MAAM,GAAC,IAAI,GACT,OAAO,CAMnB;IAED;;;;;;;OAOG;IACH,4BALW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAazB;IAED;;;;;;;OAOG;IACH,2BALW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAYzB;IAED;;;;;;;;OAQG;IACH,8BALW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAazB;IAED;;;;;;OAMG;IACH,UAJa,IAAI,CAQhB;IAcD;;;;;;;OAOG;IACH,QAJa,IAAI,CAMhB;IAED;;;;;OAKG;IACH,YAJa,OAAO,CAMnB;IAED;;;;;;OAMG;IACH,WAJa,IAAI,CAQhB;IAED;;;;;;OAMG;IACH,aAJa,OAAO,CAMnB;IAED;;;;;;;;OAQG;IACH,uBAJa,OAAO,CAMnB;IAED;;;;;;;;;OASG;IACH,oBAJa,OAAO,CAMnB;IAED;;;;;;;;;;;;OAYG;IACH,mCAVW,MAAM,GAAC,IAAI,GAAC,SAAS,GACnB,OAAO,CAWnB;IAED;;;;;;;;;;;OAWG;IACH,qBANW,OAAO,GACL,IAAI,CAgBhB;IAED;;;;;;OAMG;IAIH,eAPa,KAAK,CAAC,MAAM,CAAC,CAgBzB;IAED;;;;;;;;OAQG;IACH,2BALW,KAAK,CAAC,MAAM,CAAC,GACX,IAAI,CAShB;IAGD;;;;;;;OAOG;IACH,YAJa,OAAO,CAAC,IAAI,CAAC,CAYzB;IA+gBD;;;;;;;OAOG;IACH,cAEC;;CACD;8BAjuC6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/handlers/unified-wrapper.d.mts.map b/types/src/lib/handlers/unified-wrapper.d.mts.map index 1bfcf60e..d240af20 100644 --- a/types/src/lib/handlers/unified-wrapper.d.mts.map +++ b/types/src/lib/handlers/unified-wrapper.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"unified-wrapper.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/unified-wrapper.mjs"],"names":[],"mappings":"AAijBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,4CAhBW,MAAM,GAAC,MAAM,GACX,OAAO,CAkBnB;AAutHD;;;;;;;;;;;GAWG;AACH,sCAPW,OAAO,GACL,cAAc,GAAC,IAAI,CAkB/B;AAhxHD;;;;;;;;GAQG;AACH,iCAHU,GAAG,CAAC,MAAM,CAAC,CAG2F;;;;;AAuEhH;;;;;;;;;;GAUG;AACH;IAyQC;;;;;;;;;;;;;;;;OAgBG;IACH,0BAsCC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,gCAiEC;IA3XD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,sBAxBW,MAAM,sHAEd;QAAwB,IAAI,EAApB,MAAM;QACU,OAAO,EAAvB,MAAM;QACyB,WAAW;QACvB,eAAe;QAChB,UAAU;QACV,mBAAmB;QACpB,QAAQ;QACR,QAAQ;QACR,YAAY;KAErC,EA6KF;IA3MD;;;;;;;;;;;OAWG;IACH,4BAFa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAC,SAAS,CAKzC;IA8LD;;;;;;;;;;OAUG;IACH,uEAHa,GAAC,CA+Bb;IAED;;;;OAIG;IACH,qBAHa,WAAS,MAAM,GAAC,IAAI,CAKhC;IAiJD;;;;;;;;;;;OAWG;IACH,sBAiCC;IAED;;;;;;;;;;;;OAYG;IACH,mBAgDC;IAED;;;;;;;;;OASG;IACH,qBAsDC;IAED;;;;OAIG;IACH,uBA+FC;IAED;;;;;;;;;OASG;IACH,qBAEC;IAED;;;;;;;;;OASG;IACH,sBAiBC;IAED;;;;;;;;;;OAUG;IACH,6BA2bC;IAED;;;;;;;;;;;OAWG;IACH,8BA4IC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,8BAs3BC;IAED;;;;;;OAMG;IACH,uCAg8CC;;CACD;8BAnvI6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"unified-wrapper.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/unified-wrapper.mjs"],"names":[],"mappings":"AA4mBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,4CAhBW,MAAM,GAAC,MAAM,GACX,OAAO,CAkBnB;AAg0HD;;;;;;;;;;;GAWG;AACH,sCAPW,OAAO,GACL,cAAc,GAAC,IAAI,CAkB/B;AAz3HD;;;;;;;;GAQG;AACH,iCAHU,GAAG,CAAC,MAAM,CAAC,CAG2F;;;;;AAuEhH;;;;;;;;;;GAUG;AACH;IAyQC;;;;;;;;;;;;;;;;OAgBG;IACH,0BAsCC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,gCAiEC;IA3XD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,sBAxBW,MAAM,sHAEd;QAAwB,IAAI,EAApB,MAAM;QACU,OAAO,EAAvB,MAAM;QACyB,WAAW;QACvB,eAAe;QAChB,UAAU;QACV,mBAAmB;QACpB,QAAQ;QACR,QAAQ;QACR,YAAY;KAErC,EA6KF;IA3MD;;;;;;;;;;;OAWG;IACH,4BAFa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAC,SAAS,CAKzC;IA8LD;;;;;;;;;;OAUG;IACH,uEAHa,GAAC,CA+Bb;IAED;;;;OAIG;IACH,qBAHa,WAAS,MAAM,GAAC,IAAI,CAKhC;IAiJD;;;;;;;;;;;OAWG;IACH,sBAiCC;IAED;;;;;;;;;;;;OAYG;IACH,mBA6CC;IAED;;;;;;;;;OASG;IACH,qBAsDC;IAED;;;;OAIG;IACH,uBA+FC;IAED;;;;;;;;;OASG;IACH,qBAEC;IAED;;;;;;;;;OASG;IACH,sBAiBC;IAED;;;;;;;;;;OAUG;IACH,6BA2bC;IAED;;;;;;;;;;;OAWG;IACH,8BA4IC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,8BAy3BC;IAED;;;;;;OAMG;IACH,uCAyiDC;;CACD;8BAv5I6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/handlers/version-manager.d.mts b/types/src/lib/handlers/version-manager.d.mts index 15858c3f..50ac0904 100644 --- a/types/src/lib/handlers/version-manager.d.mts +++ b/types/src/lib/handlers/version-manager.d.mts @@ -91,6 +91,17 @@ export class VersionManager extends ComponentBase { * versionManager.setVersionMetadataByPath("auth", "v1", { stable: true }); */ setVersionMetadataByPath(logicalPath: string, versionTag: string, patch: object): void; + /** + * Find the registered logical path that covers a dotted api pattern. + * + * @param {string} path - Dotted api path or hook pattern (e.g. "auth.login"). + * @returns {string | null} The longest registered logical path that is a segment-prefix of + * `path`, or `null` when no registered version covers it. + * @public + * @example + * versionManager.findLogicalPathFor("auth.login"); // "auth" + */ + public findLogicalPathFor(path: string): string | null; /** * Return a snapshot of all registered versions and the default tag for a logical path. * diff --git a/types/src/lib/handlers/version-manager.d.mts.map b/types/src/lib/handlers/version-manager.d.mts.map index 9c53a31c..debd8ba8 100644 --- a/types/src/lib/handlers/version-manager.d.mts.map +++ b/types/src/lib/handlers/version-manager.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"version-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/version-manager.mjs"],"names":[],"mappings":"AA0GA;;;;;;;;;;GAUG;AACH;IACC,gCAA2C;IA8B3C;;;;;;;;;;;OAWG;IACH,6BATW,MAAM,cACN,MAAM,YACN,MAAM,eACN,MAAM,aACN,OAAO,GACL,IAAI,CAyDhB;IAED;;;;;;;;;OASG;IACH,+BANW,MAAM,cACN,MAAM,GACJ,OAAO,CAqCnB;IAED;;;;;;;;OAQG;IACH,iCALW,MAAM,GACJ;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAMnE;IAED;;;;;;;;OAQG;IACH,2BALW,MAAM,GACJ,OAAO,CAMnB;IAED;;;;;;;;OAQG;IACH,6BALW,MAAM,GACJ,MAAM,GAAG,SAAS,CAM9B;IAED;;;;;;;;OAQG;IACH,sCANW,MAAM,cACN,MAAM,GACJ,MAAM,GAAG,SAAS,CAU9B;IAED;;;;;;;;;;;OAWG;IACH,sCARW,MAAM,cACN,MAAM,SACN,MAAM,GACJ,IAAI,CAwBhB;IAED;;;;;;;;OAQG;IACH,kBANW,MAAM,GACJ;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAcpE;IAED;;;;;;;;;;OAUG;IACH,wBAPW,MAAM,cACN,MAAM,GACJ,IAAI,CAwBhB;IAID;;;;;;;;;;;;;OAaG;IACH,+BANW,MAAM,GACJ,MAAM,GAAG,IAAI,CAqCzB;IAID;;;;;;;;;;;;OAYG;IACH,4BAPW,MAAM,eACN,MAAM,UACN,MAAM,GACJ,MAAM,GAAG,IAAI,CAkDzB;IAID;;;;;;;;;;;OAWG;IACH,iCANW,MAAM,GACJ,MAAM,CAmClB;IAED;;;;;;;;;;;OAWG;IACH,8BANW,MAAM,GAAG,IAAI,GAAG,SAAS,GACvB;QAAE,OAAO,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,GAAC,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,GAAC,IAAI,CAAA;KAAE,CAkC3G;IA0DD;;;;;;;;;;;;OAYG;IACH,8BAPW,MAAM,GACJ,MAAM,CA8elB;IAED;;;;;;;;OAQG;IACH,8BALW,MAAM,GACJ,IAAI,CAiChB;IAED;;;;;;;OAOG;IACH,gCALW,MAAM,GACJ,IAAI,CAkBhB;IAID;;;;;;;;OAQG;IACH,kCALW,MAAM,GACJ,IAAI,CAmBhB;IAED;;;;;;;OAOG;IACH,YAJa,IAAI,CAShB;;CACD;8BA3tC6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"version-manager.d.mts","sourceRoot":"","sources":["../../../../src/lib/handlers/version-manager.mjs"],"names":[],"mappings":"AA0GA;;;;;;;;;;GAUG;AACH;IACC,gCAA2C;IA8B3C;;;;;;;;;;;OAWG;IACH,6BATW,MAAM,cACN,MAAM,YACN,MAAM,eACN,MAAM,aACN,OAAO,GACL,IAAI,CAyDhB;IAED;;;;;;;;;OASG;IACH,+BANW,MAAM,cACN,MAAM,GACJ,OAAO,CAqCnB;IAED;;;;;;;;OAQG;IACH,iCALW,MAAM,GACJ;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAMnE;IAED;;;;;;;;OAQG;IACH,2BALW,MAAM,GACJ,OAAO,CAMnB;IAED;;;;;;;;OAQG;IACH,6BALW,MAAM,GACJ,MAAM,GAAG,SAAS,CAM9B;IAED;;;;;;;;OAQG;IACH,sCANW,MAAM,cACN,MAAM,GACJ,MAAM,GAAG,SAAS,CAU9B;IAED;;;;;;;;;;;OAWG;IACH,sCARW,MAAM,cACN,MAAM,SACN,MAAM,GACJ,IAAI,CAwBhB;IAED;;;;;;;;;OASG;IACH,gCAPW,MAAM,GACJ,MAAM,GAAG,IAAI,CAczB;IAED;;;;;;;;OAQG;IACH,kBANW,MAAM,GACJ;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAcpE;IAED;;;;;;;;;;OAUG;IACH,wBAPW,MAAM,cACN,MAAM,GACJ,IAAI,CAwBhB;IAID;;;;;;;;;;;;;OAaG;IACH,+BANW,MAAM,GACJ,MAAM,GAAG,IAAI,CAqCzB;IAID;;;;;;;;;;;;OAYG;IACH,4BAPW,MAAM,eACN,MAAM,UACN,MAAM,GACJ,MAAM,GAAG,IAAI,CAkDzB;IAID;;;;;;;;;;;OAWG;IACH,iCANW,MAAM,GACJ,MAAM,CAmClB;IAED;;;;;;;;;;;OAWG;IACH,8BANW,MAAM,GAAG,IAAI,GAAG,SAAS,GACvB;QAAE,OAAO,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,GAAC,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,GAAC,IAAI,CAAA;KAAE,CAkC3G;IA0DD;;;;;;;;;;;;OAYG;IACH,8BAPW,MAAM,GACJ,MAAM,CA8elB;IAED;;;;;;;;OAQG;IACH,8BALW,MAAM,GACJ,IAAI,CAiChB;IAED;;;;;;;OAOG;IACH,gCALW,MAAM,GACJ,IAAI,CAkBhB;IAID;;;;;;;;OAQG;IACH,kCALW,MAAM,GACJ,IAAI,CAmBhB;IAED;;;;;;;OAOG;IACH,YAJa,IAAI,CAShB;;CACD;8BA/uC6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/helpers/class-instance-wrapper.d.mts.map b/types/src/lib/helpers/class-instance-wrapper.d.mts.map index 62376d4a..f7079944 100644 --- a/types/src/lib/helpers/class-instance-wrapper.d.mts.map +++ b/types/src/lib/helpers/class-instance-wrapper.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"class-instance-wrapper.d.mts","sourceRoot":"","sources":["../../../../src/lib/helpers/class-instance-wrapper.mjs"],"names":[],"mappings":"AAyEA;;;;;;;;;;;;;;GAcG;AACH,gDAZW,GAAC,QACD,MAAM,GAAC,MAAM,GACX,OAAO,CAkBnB;AAED;;;;;;;;;;;;;;GAcG;AACH,6CAZW,GAAC,GACC,OAAO,CA6BnB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,oDArBW,MAAM,kBACN,MAAM,cACN,MAAM,sDAEN,MAAM,oBAiGhB"} \ No newline at end of file +{"version":3,"file":"class-instance-wrapper.d.mts","sourceRoot":"","sources":["../../../../src/lib/helpers/class-instance-wrapper.mjs"],"names":[],"mappings":"AAyEA;;;;;;;;;;;;;;GAcG;AACH,gDAZW,GAAC,QACD,MAAM,GAAC,MAAM,GACX,OAAO,CAkBnB;AAED;;;;;;;;;;;;;;GAcG;AACH,6CAZW,GAAC,GACC,OAAO,CA6BnB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,oDArBW,MAAM,kBACN,MAAM,cACN,MAAM,sDAEN,MAAM,oBAmGhB"} \ No newline at end of file diff --git a/types/src/lib/helpers/config.d.mts.map b/types/src/lib/helpers/config.d.mts.map index 97f14fdb..9fd27f95 100644 --- a/types/src/lib/helpers/config.d.mts.map +++ b/types/src/lib/helpers/config.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"config.d.mts","sourceRoot":"","sources":["../../../../src/lib/helpers/config.mjs"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;;GAiBG;AACH,2CAJW,OAAO,GAAC,MAAM,GAAC,MAAM,GACnB;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,MAAM,GAAC,IAAI,CAAC,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAC,CAqB7F;AAED;;;;;GAKG;AACH;IACC,gCAAmC;IAEnC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,qCAxBW,MAAM,GAAC,MAAM,GACX,MAAM,CAiDlB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,GACJ,MAAM,CAsBlB;IAED;;;;;OAKG;IACH,2BAJW,MAAM,GACJ,MAAM,CAsBlB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,qCAnBW,MAAM,GACJ,MAAM,CAiClB;IAED;;;;;OAKG;IACH,6BAJW,OAAO,GAAC,MAAM,GACZ,MAAM,CAoElB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,oCATW,GAAC,0BACC,SAAS,GAAC,MAAM,CAoB5B;IAED;;;;;;;;;;;;;;OAcG;IACH,4BAJW,OAAO,GAAC,MAAM,GAAC,MAAM,GACnB;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,CAAC,MAAM,GAAC,IAAI,CAAC,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAC,CAK7F;IAED;;;;;;OAMG;IACH,gCALW,MAAM,GACJ,MAAM,CA+MlB;IAED;;;;;;;;;;;OAWG;IACH,6CARW,MAAM,EAAE,GAAC,SAAS,UAClB,OAAO,GACL,GAAG,CAAC,MAAM,CAAC,CA8BvB;IAED;;;;;OAKG;IACH,uCAJW,OAAO,GAAC,MAAM,GAAC,MAAM,GACnB,MAAM,GAAC,IAAI,CAsCvB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,yBArBW,MAAM,GAAC,IAAI,GAAC,SAAS,GAEnB;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAC,IAAI,CA4BtC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,qCAbW,MAAM,GAAC,IAAI,GAAC,SAAS,GACnB,MAAM,GAAC,IAAI,CAqEvB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,mCAvBW,MAAM,GAAC,IAAI,GAiBT,MAAM,GAAC,IAAI,CAmKvB;CACD;8BAp6B6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"config.d.mts","sourceRoot":"","sources":["../../../../src/lib/helpers/config.mjs"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;;GAiBG;AACH,2CAJW,OAAO,GAAC,MAAM,GAAC,MAAM,GACnB;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,MAAM,GAAC,IAAI,CAAC,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAC,CAqB7F;AAED;;;;;GAKG;AACH;IACC,gCAAmC;IAEnC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,qCAxBW,MAAM,GAAC,MAAM,GACX,MAAM,CAiDlB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,GACJ,MAAM,CAsBlB;IAED;;;;;OAKG;IACH,2BAJW,MAAM,GACJ,MAAM,CAsBlB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,qCAnBW,MAAM,GACJ,MAAM,CAiClB;IAED;;;;;OAKG;IACH,6BAJW,OAAO,GAAC,MAAM,GACZ,MAAM,CAoElB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,oCATW,GAAC,0BACC,SAAS,GAAC,MAAM,CAoB5B;IAED;;;;;;;;;;;;;;OAcG;IACH,4BAJW,OAAO,GAAC,MAAM,GAAC,MAAM,GACnB;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,CAAC,MAAM,GAAC,IAAI,CAAC,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAC,CAK7F;IAED;;;;;;OAMG;IACH,gCALW,MAAM,GACJ,MAAM,CA8MlB;IAED;;;;;;;;;;;OAWG;IACH,6CARW,MAAM,EAAE,GAAC,SAAS,UAClB,OAAO,GACL,GAAG,CAAC,MAAM,CAAC,CA8BvB;IAED;;;;;OAKG;IACH,uCAJW,OAAO,GAAC,MAAM,GAAC,MAAM,GACnB,MAAM,GAAC,IAAI,CAsCvB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,yBArBW,MAAM,GAAC,IAAI,GAAC,SAAS,GAEnB;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAC,IAAI,CA4BtC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,qCAbW,MAAM,GAAC,IAAI,GAAC,SAAS,GACnB,MAAM,GAAC,IAAI,CAqEvB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,mCAvBW,MAAM,GAAC,IAAI,GAiBT,MAAM,GAAC,IAAI,CAkNvB;CACD;8BAl9B6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/lib/helpers/platform.d.mts.map b/types/src/lib/helpers/platform.d.mts.map index b3680894..802c4063 100644 --- a/types/src/lib/helpers/platform.d.mts.map +++ b/types/src/lib/helpers/platform.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"platform.d.mts","sourceRoot":"","sources":["../../../../src/lib/helpers/platform.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,6BAAkF;AAElF;;;;;;;;;;;GAWG;AACH,kBAAkB;AAClB,eADW,GAAG,CACA;AACd,kBAAkB;AAClB,gBADW,GAAG,CACC;AACf,kBAAkB;AAClB,iBADW,GAAG,CACE;AAChB,kBAAkB;AAClB,gBADW,GAAG,CACC;AACf,kBAAkB;AAClB,iBADW,GAAG,CACE;AAChB,kBAAkB;AAClB,yBADW,GAAG,CACU;AACxB,kBAAkB;AAClB,8BADW,GAAG,CACe;AAC7B,kBAAkB;AAClB,0BADW,GAAG,CACW;AACzB,kBAAkB;AAClB,0BADW,GAAG,CACW;AAkCzB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,8BAVW,MAAM,GACJ,MAAM,GAAC,IAAI,GAAC,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC,CAwB5C"} \ No newline at end of file +{"version":3,"file":"platform.d.mts","sourceRoot":"","sources":["../../../../src/lib/helpers/platform.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,6BAAkF;AAElF;;;;;;;;;;;GAWG;AACH,kBAAkB;AAClB,eADW,GAAG,CACA;AACd,kBAAkB;AAClB,gBADW,GAAG,CACC;AACf,kBAAkB;AAClB,iBADW,GAAG,CACE;AAChB,kBAAkB;AAClB,gBADW,GAAG,CACC;AACf,kBAAkB;AAClB,iBADW,GAAG,CACE;AAChB,kBAAkB;AAClB,yBADW,GAAG,CACU;AACxB,kBAAkB;AAClB,8BADW,GAAG,CACe;AAC7B,kBAAkB;AAClB,0BADW,GAAG,CACW;AACzB,kBAAkB;AAClB,0BADW,GAAG,CACW;AAyCzB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,8BAVW,MAAM,GACJ,MAAM,GAAC,IAAI,GAAC,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC,CAwB5C"} \ No newline at end of file diff --git a/types/src/lib/processors/loader.d.mts.map b/types/src/lib/processors/loader.d.mts.map index 96ce87f6..445b95c1 100644 --- a/types/src/lib/processors/loader.d.mts.map +++ b/types/src/lib/processors/loader.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"loader.d.mts","sourceRoot":"","sources":["../../../../src/lib/processors/loader.mjs"],"names":[],"mappings":"AA+CA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,sDAjBW,MAAM,6BAEd;IAAqC,MAAM,GAAnC,MAAM,GAAC,SAAS;IACI,YAAY;CAExC,GAAU,OAAO,CAmBnB;AAwCD;;;;;GAKG;AACH;IACC,gCAAmC;IAEnC;;;;OAIG;IACH,sBAHW,MAAM,EAKhB;IAED;;;;;;;;OAQG;IACH,4BAPW,MAAM,eACN,MAAM,aACN,MAAM,cACN,MAAM,GAAC,IAAI,GACT,OAAO,CAAC,MAAM,CAAC,CA0M3B;IAyED;;;;;;;;;;;;;;OAcG;IACH,0BAbW,MAAM,YAEd;QAA0B,UAAU;QACX,YAAY;QACZ,QAAQ;QACD,UAAU;QACM,MAAM;QAE5B,iBAAiB;QAClB,OAAO;KAChC,GAAU,OAAO,CAAC,MAAM,CAAC,CAoI3B;IAoND;;;;;OAKG;IACH,8BAJW,MAAM,GACJ,MAAM,CAuClB;;CACD;8BApxB6B,2BAA2B"} \ No newline at end of file +{"version":3,"file":"loader.d.mts","sourceRoot":"","sources":["../../../../src/lib/processors/loader.mjs"],"names":[],"mappings":"AAgDA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,sDAjBW,MAAM,6BAEd;IAAqC,MAAM,GAAnC,MAAM,GAAC,SAAS;IACI,YAAY;CAExC,GAAU,OAAO,CAmBnB;AAwCD;;;;;GAKG;AACH;IACC,gCAAmC;IAEnC;;;;OAIG;IACH,sBAHW,MAAM,EAKhB;IAED;;;;;;;;OAQG;IACH,4BAPW,MAAM,eACN,MAAM,aACN,MAAM,cACN,MAAM,GAAC,IAAI,GACT,OAAO,CAAC,MAAM,CAAC,CA0M3B;IAyED;;;;;;;;;;;;;;OAcG;IACH,0BAbW,MAAM,YAEd;QAA0B,UAAU;QACX,YAAY;QACZ,QAAQ;QACD,UAAU;QACM,MAAM;QAE5B,iBAAiB;QAClB,OAAO;KAChC,GAAU,OAAO,CAAC,MAAM,CAAC,CAqJ3B;IA4ND;;;;;OAKG;IACH,8BAJW,MAAM,GACJ,MAAM,CA+ClB;;CACD;8BAtzB6B,2BAA2B"} \ No newline at end of file diff --git a/types/src/slothlet.d.mts b/types/src/slothlet.d.mts index edac384a..b96b8d5a 100644 --- a/types/src/slothlet.d.mts +++ b/types/src/slothlet.d.mts @@ -248,6 +248,7 @@ export type SlothletAPI = { add: Function; reload: Function; remove: Function; + leaves: Function; modules: { discover: Function; sort: Function; diff --git a/types/src/slothlet.d.mts.map b/types/src/slothlet.d.mts.map index dc675a0a..bee8819c 100644 --- a/types/src/slothlet.d.mts.map +++ b/types/src/slothlet.d.mts.map @@ -1 +1 @@ -{"version":3,"file":"slothlet.d.mts","sourceRoot":"","sources":["../../src/slothlet.mjs"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"slothlet.d.mts","sourceRoot":"","sources":["../../src/slothlet.mjs"],"names":[],"mappings":"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"} \ No newline at end of file