@hyperfrontend/project-scope 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -1
- package/README.md +3 -4
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/array/index.cjs.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/array/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/console/index.cjs.js +13 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/console/index.esm.js +8 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/date/index.cjs.js +10 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/date/index.esm.js +8 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/error/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/error/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/json/index.cjs.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/json/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/map/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/map/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/math/index.cjs.js +9 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/math/index.esm.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/number/index.cjs.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/number/index.esm.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/object/index.cjs.js +15 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/object/index.esm.js +9 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/set/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/set/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/logging/index.cjs.js +191 -0
- package/_dependencies/@hyperfrontend/logging/index.d.ts +151 -0
- package/_dependencies/@hyperfrontend/logging/index.esm.js +186 -0
- package/_shared/core/cache/index.cjs.js +135 -0
- package/_shared/core/cache/index.esm.js +128 -0
- package/_shared/core/errors/structured-errors/index.cjs.js +28 -0
- package/_shared/core/errors/structured-errors/index.esm.js +23 -0
- package/_shared/core/fs/guard/index.cjs.js +7 -0
- package/_shared/core/fs/guard/index.esm.js +5 -0
- package/_shared/core/fs/stat/index.cjs.js +47 -0
- package/_shared/core/fs/stat/index.esm.js +41 -0
- package/_shared/core/path/confine/index.cjs.js +22 -0
- package/_shared/core/path/confine/index.esm.js +19 -0
- package/_shared/core/path/join/index.cjs.js +13 -0
- package/_shared/core/path/join/index.esm.js +10 -0
- package/_shared/core/path/normalize/index.cjs.js +37 -0
- package/_shared/core/path/normalize/index.esm.js +31 -0
- package/_shared/core/path/resolve/index.cjs.js +47 -0
- package/_shared/core/path/resolve/index.esm.js +41 -0
- package/_shared/core/path/segments/index.cjs.js +38 -0
- package/_shared/core/path/segments/index.esm.js +31 -0
- package/_shared/core/patterns/glob/index.cjs.js +145 -0
- package/_shared/core/patterns/glob/index.esm.js +136 -0
- package/_shared/core/platform/detect/index.cjs.js +103 -0
- package/_shared/core/platform/detect/index.esm.js +95 -0
- package/_shared/core/platform/line-endings/index.cjs.js +52 -0
- package/_shared/core/platform/line-endings/index.esm.js +44 -0
- package/_shared/project/config/patterns/index.cjs.js +172 -0
- package/_shared/project/config/patterns/index.esm.js +169 -0
- package/_shared/tech/monorepo/pnpm-workspaces/index.cjs.js +33 -0
- package/_shared/tech/monorepo/pnpm-workspaces/index.esm.js +31 -0
- package/_shared/tech/shared-utils/detector-helpers/index.cjs.js +48 -0
- package/_shared/tech/shared-utils/detector-helpers/index.esm.js +43 -0
- package/_shared/vfs/types/index.cjs.js +14 -0
- package/_shared/vfs/types/index.esm.js +12 -0
- package/cli/index.cjs.js +1706 -1910
- package/cli/index.d.ts +273 -7
- package/cli/index.d.ts.map +1 -1
- package/cli/index.esm.js +1593 -1797
- package/core/encoding/index.cjs.js +86 -401
- package/core/encoding/index.d.ts +186 -3
- package/core/encoding/index.d.ts.map +1 -1
- package/core/encoding/index.esm.js +78 -392
- package/core/fs/index.cjs.js +243 -583
- package/core/fs/index.d.ts +479 -6
- package/core/fs/index.d.ts.map +1 -1
- package/core/fs/index.esm.js +233 -573
- package/core/index.cjs.js +526 -1746
- package/core/index.d.ts +486 -9
- package/core/index.d.ts.map +1 -1
- package/core/index.esm.js +515 -1732
- package/core/path/index.cjs.js +8 -234
- package/core/path/index.d.ts +327 -5
- package/core/path/index.d.ts.map +1 -1
- package/core/path/index.esm.js +8 -235
- package/core/platform/index.cjs.js +5 -216
- package/core/platform/index.d.ts +185 -3
- package/core/platform/index.d.ts.map +1 -1
- package/core/platform/index.esm.js +3 -212
- package/heuristics/dependencies/index.cjs.js +105 -493
- package/heuristics/dependencies/index.d.ts +99 -2
- package/heuristics/dependencies/index.d.ts.map +1 -1
- package/heuristics/dependencies/index.esm.js +81 -469
- package/heuristics/entry-points/index.cjs.js +93 -796
- package/heuristics/entry-points/index.d.ts +123 -2
- package/heuristics/entry-points/index.d.ts.map +1 -1
- package/heuristics/entry-points/index.esm.js +74 -777
- package/heuristics/framework/index.cjs.js +1483 -1411
- package/heuristics/framework/index.d.ts +104 -2
- package/heuristics/framework/index.d.ts.map +1 -1
- package/heuristics/framework/index.esm.js +1419 -1347
- package/heuristics/index.cjs.js +3220 -3306
- package/heuristics/index.d.ts +4 -5
- package/heuristics/index.d.ts.map +1 -1
- package/heuristics/index.esm.js +3244 -3330
- package/heuristics/project-type/index.cjs.js +1489 -1438
- package/heuristics/project-type/index.d.ts +64 -2
- package/heuristics/project-type/index.d.ts.map +1 -1
- package/heuristics/project-type/index.esm.js +1419 -1368
- package/index.cjs.js +3058 -3532
- package/index.d.ts +44 -10
- package/index.d.ts.map +1 -1
- package/index.esm.js +2914 -3376
- package/models/index.cjs.js +0 -1
- package/models/index.d.ts +20 -14
- package/models/index.d.ts.map +1 -1
- package/models/index.esm.js +0 -1
- package/nx/index.cjs.js +166 -579
- package/nx/index.d.ts +279 -4
- package/nx/index.d.ts.map +1 -1
- package/nx/index.esm.js +148 -556
- package/package.json +13 -12
- package/project/config/index.cjs.js +127 -1063
- package/project/config/index.d.ts +202 -4
- package/project/config/index.d.ts.map +1 -1
- package/project/config/index.esm.js +110 -1044
- package/project/index.cjs.js +328 -1101
- package/project/index.d.ts +4 -5
- package/project/index.d.ts.map +1 -1
- package/project/index.esm.js +307 -1077
- package/project/package/index.cjs.js +196 -473
- package/project/package/index.d.ts +280 -3
- package/project/package/index.d.ts.map +1 -1
- package/project/package/index.esm.js +183 -459
- package/project/root/index.cjs.js +109 -417
- package/project/root/index.d.ts +83 -2
- package/project/root/index.d.ts.map +1 -1
- package/project/root/index.esm.js +98 -406
- package/project/traversal/index.cjs.js +96 -622
- package/project/traversal/index.d.ts +165 -3
- package/project/traversal/index.d.ts.map +1 -1
- package/project/traversal/index.esm.js +82 -608
- package/tech/backend/index.cjs.js +223 -508
- package/tech/backend/index.d.ts +205 -8
- package/tech/backend/index.d.ts.map +1 -1
- package/tech/backend/index.esm.js +202 -487
- package/tech/build/index.cjs.js +350 -636
- package/tech/build/index.d.ts +276 -10
- package/tech/build/index.d.ts.map +1 -1
- package/tech/build/index.esm.js +328 -614
- package/tech/frontend/index.cjs.js +507 -685
- package/tech/frontend/index.d.ts +379 -15
- package/tech/frontend/index.d.ts.map +1 -1
- package/tech/frontend/index.esm.js +483 -661
- package/tech/index.cjs.js +1581 -1420
- package/tech/index.d.ts +55 -32
- package/tech/index.d.ts.map +1 -1
- package/tech/index.esm.js +1515 -1354
- package/tech/legacy/index.cjs.js +99 -449
- package/tech/legacy/index.d.ts +125 -7
- package/tech/legacy/index.d.ts.map +1 -1
- package/tech/legacy/index.esm.js +81 -431
- package/tech/linting/index.cjs.js +138 -523
- package/tech/linting/index.d.ts +129 -7
- package/tech/linting/index.d.ts.map +1 -1
- package/tech/linting/index.esm.js +118 -503
- package/tech/monorepo/index.cjs.js +246 -573
- package/tech/monorepo/index.d.ts +241 -10
- package/tech/monorepo/index.d.ts.map +1 -1
- package/tech/monorepo/index.esm.js +226 -553
- package/tech/testing/index.cjs.js +216 -571
- package/tech/testing/index.d.ts +176 -8
- package/tech/testing/index.d.ts.map +1 -1
- package/tech/testing/index.esm.js +198 -553
- package/tech/types/index.cjs.js +123 -506
- package/tech/types/index.d.ts +120 -2
- package/tech/types/index.d.ts.map +1 -1
- package/tech/types/index.esm.js +101 -484
- package/vfs/index.cjs.js +647 -1142
- package/vfs/index.d.ts +360 -6
- package/vfs/index.d.ts.map +1 -1
- package/vfs/index.esm.js +672 -1167
- package/ARCHITECTURE.md +0 -370
- package/analyze.d.ts +0 -33
- package/analyze.d.ts.map +0 -1
- package/cli/commands/analyze.d.ts +0 -28
- package/cli/commands/analyze.d.ts.map +0 -1
- package/cli/commands/config.d.ts +0 -27
- package/cli/commands/config.d.ts.map +0 -1
- package/cli/commands/deps.d.ts +0 -24
- package/cli/commands/deps.d.ts.map +0 -1
- package/cli/commands/tree.d.ts +0 -36
- package/cli/commands/tree.d.ts.map +0 -1
- package/cli/index.cjs.js.map +0 -1
- package/cli/index.esm.js.map +0 -1
- package/cli/run.d.ts +0 -25
- package/cli/run.d.ts.map +0 -1
- package/cli/types.d.ts +0 -55
- package/cli/types.d.ts.map +0 -1
- package/core/cache.d.ts +0 -158
- package/core/cache.d.ts.map +0 -1
- package/core/encoding/convert.d.ts +0 -32
- package/core/encoding/convert.d.ts.map +0 -1
- package/core/encoding/detect.d.ts +0 -91
- package/core/encoding/detect.d.ts.map +0 -1
- package/core/encoding/index.cjs.js.map +0 -1
- package/core/encoding/index.esm.js.map +0 -1
- package/core/errors/structured-errors.d.ts +0 -66
- package/core/errors/structured-errors.d.ts.map +0 -1
- package/core/fs/directory.d.ts +0 -91
- package/core/fs/directory.d.ts.map +0 -1
- package/core/fs/index.cjs.js.map +0 -1
- package/core/fs/index.esm.js.map +0 -1
- package/core/fs/read.d.ts +0 -94
- package/core/fs/read.d.ts.map +0 -1
- package/core/fs/stat.d.ts +0 -58
- package/core/fs/stat.d.ts.map +0 -1
- package/core/fs/traversal.d.ts +0 -26
- package/core/fs/traversal.d.ts.map +0 -1
- package/core/fs/write.d.ts +0 -75
- package/core/fs/write.d.ts.map +0 -1
- package/core/index.cjs.js.map +0 -1
- package/core/index.esm.js.map +0 -1
- package/core/logger.d.ts +0 -111
- package/core/logger.d.ts.map +0 -1
- package/core/path/index.cjs.js.map +0 -1
- package/core/path/index.esm.js.map +0 -1
- package/core/path/join.d.ts +0 -17
- package/core/path/join.d.ts.map +0 -1
- package/core/path/normalize.d.ts +0 -37
- package/core/path/normalize.d.ts.map +0 -1
- package/core/path/resolve.d.ts +0 -52
- package/core/path/resolve.d.ts.map +0 -1
- package/core/path/segments.d.ts +0 -59
- package/core/path/segments.d.ts.map +0 -1
- package/core/patterns/glob.d.ts +0 -42
- package/core/patterns/glob.d.ts.map +0 -1
- package/core/platform/detect.d.ts +0 -66
- package/core/platform/detect.d.ts.map +0 -1
- package/core/platform/index.cjs.js.map +0 -1
- package/core/platform/index.esm.js.map +0 -1
- package/core/platform/line-endings.d.ts +0 -48
- package/core/platform/line-endings.d.ts.map +0 -1
- package/heuristics/dependencies/analyze.d.ts +0 -77
- package/heuristics/dependencies/analyze.d.ts.map +0 -1
- package/heuristics/dependencies/index.cjs.js.map +0 -1
- package/heuristics/dependencies/index.esm.js.map +0 -1
- package/heuristics/entry-points/discover.d.ts +0 -113
- package/heuristics/entry-points/discover.d.ts.map +0 -1
- package/heuristics/entry-points/index.cjs.js.map +0 -1
- package/heuristics/entry-points/index.esm.js.map +0 -1
- package/heuristics/framework/identify.d.ts +0 -84
- package/heuristics/framework/identify.d.ts.map +0 -1
- package/heuristics/framework/index.cjs.js.map +0 -1
- package/heuristics/framework/index.esm.js.map +0 -1
- package/heuristics/index.cjs.js.map +0 -1
- package/heuristics/index.esm.js.map +0 -1
- package/heuristics/project-type/detect.d.ts +0 -61
- package/heuristics/project-type/detect.d.ts.map +0 -1
- package/heuristics/project-type/index.cjs.js.map +0 -1
- package/heuristics/project-type/index.esm.js.map +0 -1
- package/index.cjs.js.map +0 -1
- package/index.esm.js.map +0 -1
- package/models/index.cjs.js.map +0 -1
- package/models/index.esm.js.map +0 -1
- package/nx/detect.d.ts +0 -105
- package/nx/detect.d.ts.map +0 -1
- package/nx/devkit-loader.d.ts +0 -62
- package/nx/devkit-loader.d.ts.map +0 -1
- package/nx/index.cjs.js.map +0 -1
- package/nx/index.esm.js.map +0 -1
- package/nx/project-config.d.ts +0 -111
- package/nx/project-config.d.ts.map +0 -1
- package/project/config/detect.d.ts +0 -77
- package/project/config/detect.d.ts.map +0 -1
- package/project/config/index.cjs.js.map +0 -1
- package/project/config/index.esm.js.map +0 -1
- package/project/config/parse.d.ts +0 -53
- package/project/config/parse.d.ts.map +0 -1
- package/project/config/patterns.d.ts +0 -31
- package/project/config/patterns.d.ts.map +0 -1
- package/project/index.cjs.js.map +0 -1
- package/project/index.esm.js.map +0 -1
- package/project/package/dependencies.d.ts +0 -101
- package/project/package/dependencies.d.ts.map +0 -1
- package/project/package/index.cjs.js.map +0 -1
- package/project/package/index.esm.js.map +0 -1
- package/project/package/read.d.ts +0 -67
- package/project/package/read.d.ts.map +0 -1
- package/project/root/detect.d.ts +0 -65
- package/project/root/detect.d.ts.map +0 -1
- package/project/root/index.cjs.js.map +0 -1
- package/project/root/index.esm.js.map +0 -1
- package/project/traversal/index.cjs.js.map +0 -1
- package/project/traversal/index.esm.js.map +0 -1
- package/project/traversal/search.d.ts +0 -59
- package/project/traversal/search.d.ts.map +0 -1
- package/project/traversal/walk.d.ts +0 -63
- package/project/traversal/walk.d.ts.map +0 -1
- package/tech/backend/detect-all.d.ts +0 -13
- package/tech/backend/detect-all.d.ts.map +0 -1
- package/tech/backend/express.d.ts +0 -11
- package/tech/backend/express.d.ts.map +0 -1
- package/tech/backend/fastify.d.ts +0 -11
- package/tech/backend/fastify.d.ts.map +0 -1
- package/tech/backend/hono.d.ts +0 -11
- package/tech/backend/hono.d.ts.map +0 -1
- package/tech/backend/index.cjs.js.map +0 -1
- package/tech/backend/index.esm.js.map +0 -1
- package/tech/backend/koa.d.ts +0 -11
- package/tech/backend/koa.d.ts.map +0 -1
- package/tech/backend/nestjs.d.ts +0 -11
- package/tech/backend/nestjs.d.ts.map +0 -1
- package/tech/backend/types.d.ts +0 -31
- package/tech/backend/types.d.ts.map +0 -1
- package/tech/build/babel.d.ts +0 -13
- package/tech/build/babel.d.ts.map +0 -1
- package/tech/build/detect-all.d.ts +0 -13
- package/tech/build/detect-all.d.ts.map +0 -1
- package/tech/build/esbuild.d.ts +0 -11
- package/tech/build/esbuild.d.ts.map +0 -1
- package/tech/build/index.cjs.js.map +0 -1
- package/tech/build/index.esm.js.map +0 -1
- package/tech/build/parcel.d.ts +0 -13
- package/tech/build/parcel.d.ts.map +0 -1
- package/tech/build/rollup.d.ts +0 -13
- package/tech/build/rollup.d.ts.map +0 -1
- package/tech/build/swc.d.ts +0 -13
- package/tech/build/swc.d.ts.map +0 -1
- package/tech/build/types.d.ts +0 -31
- package/tech/build/types.d.ts.map +0 -1
- package/tech/build/vite.d.ts +0 -13
- package/tech/build/vite.d.ts.map +0 -1
- package/tech/build/webpack.d.ts +0 -13
- package/tech/build/webpack.d.ts.map +0 -1
- package/tech/frontend/angular.d.ts +0 -11
- package/tech/frontend/angular.d.ts.map +0 -1
- package/tech/frontend/astro.d.ts +0 -11
- package/tech/frontend/astro.d.ts.map +0 -1
- package/tech/frontend/detect-all.d.ts +0 -13
- package/tech/frontend/detect-all.d.ts.map +0 -1
- package/tech/frontend/gatsby.d.ts +0 -11
- package/tech/frontend/gatsby.d.ts.map +0 -1
- package/tech/frontend/index.cjs.js.map +0 -1
- package/tech/frontend/index.esm.js.map +0 -1
- package/tech/frontend/nextjs.d.ts +0 -11
- package/tech/frontend/nextjs.d.ts.map +0 -1
- package/tech/frontend/nuxt.d.ts +0 -11
- package/tech/frontend/nuxt.d.ts.map +0 -1
- package/tech/frontend/qwik.d.ts +0 -11
- package/tech/frontend/qwik.d.ts.map +0 -1
- package/tech/frontend/react.d.ts +0 -11
- package/tech/frontend/react.d.ts.map +0 -1
- package/tech/frontend/remix.d.ts +0 -11
- package/tech/frontend/remix.d.ts.map +0 -1
- package/tech/frontend/solid.d.ts +0 -11
- package/tech/frontend/solid.d.ts.map +0 -1
- package/tech/frontend/svelte.d.ts +0 -11
- package/tech/frontend/svelte.d.ts.map +0 -1
- package/tech/frontend/sveltekit.d.ts +0 -11
- package/tech/frontend/sveltekit.d.ts.map +0 -1
- package/tech/frontend/types.d.ts +0 -35
- package/tech/frontend/types.d.ts.map +0 -1
- package/tech/frontend/vue.d.ts +0 -11
- package/tech/frontend/vue.d.ts.map +0 -1
- package/tech/index.cjs.js.map +0 -1
- package/tech/index.esm.js.map +0 -1
- package/tech/legacy/angularjs.d.ts +0 -12
- package/tech/legacy/angularjs.d.ts.map +0 -1
- package/tech/legacy/backbone.d.ts +0 -11
- package/tech/legacy/backbone.d.ts.map +0 -1
- package/tech/legacy/detect-all.d.ts +0 -13
- package/tech/legacy/detect-all.d.ts.map +0 -1
- package/tech/legacy/ember.d.ts +0 -11
- package/tech/legacy/ember.d.ts.map +0 -1
- package/tech/legacy/index.cjs.js.map +0 -1
- package/tech/legacy/index.esm.js.map +0 -1
- package/tech/legacy/jquery.d.ts +0 -11
- package/tech/legacy/jquery.d.ts.map +0 -1
- package/tech/legacy/types.d.ts +0 -33
- package/tech/legacy/types.d.ts.map +0 -1
- package/tech/linting/biome.d.ts +0 -11
- package/tech/linting/biome.d.ts.map +0 -1
- package/tech/linting/detect-all.d.ts +0 -13
- package/tech/linting/detect-all.d.ts.map +0 -1
- package/tech/linting/eslint.d.ts +0 -13
- package/tech/linting/eslint.d.ts.map +0 -1
- package/tech/linting/index.cjs.js.map +0 -1
- package/tech/linting/index.esm.js.map +0 -1
- package/tech/linting/prettier.d.ts +0 -13
- package/tech/linting/prettier.d.ts.map +0 -1
- package/tech/linting/stylelint.d.ts +0 -13
- package/tech/linting/stylelint.d.ts.map +0 -1
- package/tech/linting/types.d.ts +0 -31
- package/tech/linting/types.d.ts.map +0 -1
- package/tech/monorepo/detect-all.d.ts +0 -13
- package/tech/monorepo/detect-all.d.ts.map +0 -1
- package/tech/monorepo/index.cjs.js.map +0 -1
- package/tech/monorepo/index.esm.js.map +0 -1
- package/tech/monorepo/lerna.d.ts +0 -11
- package/tech/monorepo/lerna.d.ts.map +0 -1
- package/tech/monorepo/npm-workspaces.d.ts +0 -11
- package/tech/monorepo/npm-workspaces.d.ts.map +0 -1
- package/tech/monorepo/nx.d.ts +0 -11
- package/tech/monorepo/nx.d.ts.map +0 -1
- package/tech/monorepo/pnpm-workspaces.d.ts +0 -9
- package/tech/monorepo/pnpm-workspaces.d.ts.map +0 -1
- package/tech/monorepo/rush.d.ts +0 -11
- package/tech/monorepo/rush.d.ts.map +0 -1
- package/tech/monorepo/turborepo.d.ts +0 -11
- package/tech/monorepo/turborepo.d.ts.map +0 -1
- package/tech/monorepo/types.d.ts +0 -39
- package/tech/monorepo/types.d.ts.map +0 -1
- package/tech/monorepo/yarn-workspaces.d.ts +0 -11
- package/tech/monorepo/yarn-workspaces.d.ts.map +0 -1
- package/tech/shared-utils/detector-helpers.d.ts +0 -52
- package/tech/shared-utils/detector-helpers.d.ts.map +0 -1
- package/tech/shared-utils/types.d.ts +0 -41
- package/tech/shared-utils/types.d.ts.map +0 -1
- package/tech/testing/cypress.d.ts +0 -13
- package/tech/testing/cypress.d.ts.map +0 -1
- package/tech/testing/detect-all.d.ts +0 -13
- package/tech/testing/detect-all.d.ts.map +0 -1
- package/tech/testing/index.cjs.js.map +0 -1
- package/tech/testing/index.esm.js.map +0 -1
- package/tech/testing/jest.d.ts +0 -13
- package/tech/testing/jest.d.ts.map +0 -1
- package/tech/testing/mocha.d.ts +0 -13
- package/tech/testing/mocha.d.ts.map +0 -1
- package/tech/testing/playwright.d.ts +0 -13
- package/tech/testing/playwright.d.ts.map +0 -1
- package/tech/testing/types.d.ts +0 -35
- package/tech/testing/types.d.ts.map +0 -1
- package/tech/testing/vitest.d.ts +0 -13
- package/tech/testing/vitest.d.ts.map +0 -1
- package/tech/types/detectors.d.ts +0 -67
- package/tech/types/detectors.d.ts.map +0 -1
- package/tech/types/index.cjs.js.map +0 -1
- package/tech/types/index.esm.js.map +0 -1
- package/vfs/commit.d.ts +0 -32
- package/vfs/commit.d.ts.map +0 -1
- package/vfs/diff.d.ts +0 -73
- package/vfs/diff.d.ts.map +0 -1
- package/vfs/factory.d.ts +0 -37
- package/vfs/factory.d.ts.map +0 -1
- package/vfs/fs-tree.d.ts +0 -13
- package/vfs/fs-tree.d.ts.map +0 -1
- package/vfs/index.cjs.js.map +0 -1
- package/vfs/index.esm.js.map +0 -1
- package/vfs/types.d.ts +0 -179
- package/vfs/types.d.ts.map +0 -1
package/core/fs/index.cjs.js
CHANGED
|
@@ -1,387 +1,23 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* @module @hyperfrontend/immutable-api-utils/built-in-copy/error
|
|
16
|
-
*/
|
|
17
|
-
const _Error = globalThis.Error;
|
|
18
|
-
const _Reflect$1 = globalThis.Reflect;
|
|
19
|
-
/**
|
|
20
|
-
* (Safe copy) Creates a new Error using the captured Error constructor.
|
|
21
|
-
* Use this instead of `new Error()`.
|
|
22
|
-
*
|
|
23
|
-
* @param message - Optional error message.
|
|
24
|
-
* @param options - Optional error options.
|
|
25
|
-
* @returns A new Error instance.
|
|
26
|
-
*/
|
|
27
|
-
const createError = (message, options) => _Reflect$1.construct(_Error, [message, options]);
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Safe copies of JSON built-in methods.
|
|
31
|
-
*
|
|
32
|
-
* These references are captured at module initialization time to protect against
|
|
33
|
-
* prototype pollution attacks. Import only what you need for tree-shaking.
|
|
34
|
-
*
|
|
35
|
-
* @module @hyperfrontend/immutable-api-utils/built-in-copy/json
|
|
36
|
-
*/
|
|
37
|
-
const _JSON = globalThis.JSON;
|
|
38
|
-
/**
|
|
39
|
-
* (Safe copy) Converts a JavaScript Object Notation (JSON) string into an object.
|
|
40
|
-
*/
|
|
41
|
-
const parse = _JSON.parse;
|
|
42
|
-
/**
|
|
43
|
-
* (Safe copy) Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
|
|
44
|
-
*/
|
|
45
|
-
const stringify = _JSON.stringify;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Safe copies of Object built-in methods.
|
|
49
|
-
*
|
|
50
|
-
* These references are captured at module initialization time to protect against
|
|
51
|
-
* prototype pollution attacks. Import only what you need for tree-shaking.
|
|
52
|
-
*
|
|
53
|
-
* @module @hyperfrontend/immutable-api-utils/built-in-copy/object
|
|
54
|
-
*/
|
|
55
|
-
const _Object = globalThis.Object;
|
|
56
|
-
/**
|
|
57
|
-
* (Safe copy) Prevents modification of existing property attributes and values,
|
|
58
|
-
* and prevents the addition of new properties.
|
|
59
|
-
*/
|
|
60
|
-
const freeze = _Object.freeze;
|
|
61
|
-
/**
|
|
62
|
-
* (Safe copy) Returns the names of the enumerable string properties and methods of an object.
|
|
63
|
-
*/
|
|
64
|
-
const keys = _Object.keys;
|
|
65
|
-
/**
|
|
66
|
-
* (Safe copy) Returns an array of key/values of the enumerable own properties of an object.
|
|
67
|
-
*/
|
|
68
|
-
const entries = _Object.entries;
|
|
69
|
-
/**
|
|
70
|
-
* (Safe copy) Adds one or more properties to an object, and/or modifies attributes of existing properties.
|
|
71
|
-
*/
|
|
72
|
-
const defineProperties = _Object.defineProperties;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Safe copies of Array built-in static methods.
|
|
76
|
-
*
|
|
77
|
-
* These references are captured at module initialization time to protect against
|
|
78
|
-
* prototype pollution attacks. Import only what you need for tree-shaking.
|
|
79
|
-
*
|
|
80
|
-
* @module @hyperfrontend/immutable-api-utils/built-in-copy/array
|
|
81
|
-
*/
|
|
82
|
-
const _Array = globalThis.Array;
|
|
83
|
-
/**
|
|
84
|
-
* (Safe copy) Determines whether the passed value is an Array.
|
|
85
|
-
*/
|
|
86
|
-
const isArray = _Array.isArray;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Safe copies of Console built-in methods.
|
|
90
|
-
*
|
|
91
|
-
* These references are captured at module initialization time to protect against
|
|
92
|
-
* prototype pollution attacks. Import only what you need for tree-shaking.
|
|
93
|
-
*
|
|
94
|
-
* @module @hyperfrontend/immutable-api-utils/built-in-copy/console
|
|
95
|
-
*/
|
|
96
|
-
const _console = globalThis.console;
|
|
97
|
-
/**
|
|
98
|
-
* (Safe copy) Outputs a message to the console.
|
|
99
|
-
*/
|
|
100
|
-
const log = _console.log.bind(_console);
|
|
101
|
-
/**
|
|
102
|
-
* (Safe copy) Outputs a warning message to the console.
|
|
103
|
-
*/
|
|
104
|
-
const warn = _console.warn.bind(_console);
|
|
105
|
-
/**
|
|
106
|
-
* (Safe copy) Outputs an error message to the console.
|
|
107
|
-
*/
|
|
108
|
-
const error = _console.error.bind(_console);
|
|
109
|
-
/**
|
|
110
|
-
* (Safe copy) Outputs an informational message to the console.
|
|
111
|
-
*/
|
|
112
|
-
const info = _console.info.bind(_console);
|
|
113
|
-
/**
|
|
114
|
-
* (Safe copy) Outputs a debug message to the console.
|
|
115
|
-
*/
|
|
116
|
-
const debug = _console.debug.bind(_console);
|
|
117
|
-
/**
|
|
118
|
-
* (Safe copy) Outputs a stack trace to the console.
|
|
119
|
-
*/
|
|
120
|
-
_console.trace.bind(_console);
|
|
121
|
-
/**
|
|
122
|
-
* (Safe copy) Displays an interactive listing of the properties of a specified object.
|
|
123
|
-
*/
|
|
124
|
-
_console.dir.bind(_console);
|
|
125
|
-
/**
|
|
126
|
-
* (Safe copy) Displays tabular data as a table.
|
|
127
|
-
*/
|
|
128
|
-
_console.table.bind(_console);
|
|
129
|
-
/**
|
|
130
|
-
* (Safe copy) Writes an error message to the console if the assertion is false.
|
|
131
|
-
*/
|
|
132
|
-
_console.assert.bind(_console);
|
|
133
|
-
/**
|
|
134
|
-
* (Safe copy) Clears the console.
|
|
135
|
-
*/
|
|
136
|
-
_console.clear.bind(_console);
|
|
137
|
-
/**
|
|
138
|
-
* (Safe copy) Logs the number of times that this particular call to count() has been called.
|
|
139
|
-
*/
|
|
140
|
-
_console.count.bind(_console);
|
|
141
|
-
/**
|
|
142
|
-
* (Safe copy) Resets the counter used with console.count().
|
|
143
|
-
*/
|
|
144
|
-
_console.countReset.bind(_console);
|
|
145
|
-
/**
|
|
146
|
-
* (Safe copy) Creates a new inline group in the console.
|
|
147
|
-
*/
|
|
148
|
-
_console.group.bind(_console);
|
|
149
|
-
/**
|
|
150
|
-
* (Safe copy) Creates a new inline group in the console that is initially collapsed.
|
|
151
|
-
*/
|
|
152
|
-
_console.groupCollapsed.bind(_console);
|
|
153
|
-
/**
|
|
154
|
-
* (Safe copy) Exits the current inline group.
|
|
155
|
-
*/
|
|
156
|
-
_console.groupEnd.bind(_console);
|
|
157
|
-
/**
|
|
158
|
-
* (Safe copy) Starts a timer with a name specified as an input parameter.
|
|
159
|
-
*/
|
|
160
|
-
_console.time.bind(_console);
|
|
161
|
-
/**
|
|
162
|
-
* (Safe copy) Stops a timer that was previously started.
|
|
163
|
-
*/
|
|
164
|
-
_console.timeEnd.bind(_console);
|
|
165
|
-
/**
|
|
166
|
-
* (Safe copy) Logs the current value of a timer that was previously started.
|
|
167
|
-
*/
|
|
168
|
-
_console.timeLog.bind(_console);
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Safe copies of Set built-in via factory function.
|
|
172
|
-
*
|
|
173
|
-
* Since constructors cannot be safely captured via Object.assign, this module
|
|
174
|
-
* provides a factory function that uses Reflect.construct internally.
|
|
175
|
-
*
|
|
176
|
-
* These references are captured at module initialization time to protect against
|
|
177
|
-
* prototype pollution attacks. Import only what you need for tree-shaking.
|
|
178
|
-
*
|
|
179
|
-
* @module @hyperfrontend/immutable-api-utils/built-in-copy/set
|
|
180
|
-
*/
|
|
181
|
-
const _Set = globalThis.Set;
|
|
182
|
-
const _Reflect = globalThis.Reflect;
|
|
183
|
-
/**
|
|
184
|
-
* (Safe copy) Creates a new Set using the captured Set constructor.
|
|
185
|
-
* Use this instead of `new Set()`.
|
|
186
|
-
*
|
|
187
|
-
* @param iterable - Optional iterable of values.
|
|
188
|
-
* @returns A new Set instance.
|
|
189
|
-
*/
|
|
190
|
-
const createSet = (iterable) => _Reflect.construct(_Set, iterable ? [iterable] : []);
|
|
191
|
-
|
|
192
|
-
const registeredClasses = [];
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Returns the data type of the target.
|
|
196
|
-
* Uses native `typeof` operator, however, makes distinction between `null`, `array`, and `object`.
|
|
197
|
-
* Also, when classes are registered via `registerClass`, it checks if objects are instance of any known registered class.
|
|
198
|
-
*
|
|
199
|
-
* @param target - The target to get the data type of.
|
|
200
|
-
* @returns The data type of the target.
|
|
201
|
-
*/
|
|
202
|
-
const getType = (target) => {
|
|
203
|
-
if (target === null)
|
|
204
|
-
return 'null';
|
|
205
|
-
const nativeDataType = typeof target;
|
|
206
|
-
if (nativeDataType === 'object') {
|
|
207
|
-
if (isArray(target))
|
|
208
|
-
return 'array';
|
|
209
|
-
for (const registeredClass of registeredClasses) {
|
|
210
|
-
if (target instanceof registeredClass)
|
|
211
|
-
return registeredClass.name;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return nativeDataType;
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
218
|
-
/**
|
|
219
|
-
* Creates a wrapper function that only executes the wrapped function if the condition function returns true.
|
|
220
|
-
*
|
|
221
|
-
* @param func - The function to be conditionally executed.
|
|
222
|
-
* @param conditionFunc - A function that returns a boolean, determining if `func` should be executed.
|
|
223
|
-
* @returns A wrapped version of `func` that executes conditionally.
|
|
224
|
-
*/
|
|
225
|
-
function createConditionalExecutionFunction(func, conditionFunc) {
|
|
226
|
-
return function (...args) {
|
|
227
|
-
if (conditionFunc()) {
|
|
228
|
-
return func(...args);
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
234
|
-
/**
|
|
235
|
-
* Creates a wrapper function that silently ignores any errors thrown by the wrapped void function.
|
|
236
|
-
* This function is specifically for wrapping functions that do not return a value (void functions).
|
|
237
|
-
* Exceptions are swallowed without any logging or handling.
|
|
238
|
-
*
|
|
239
|
-
* @param func - The void function to be wrapped.
|
|
240
|
-
* @returns A wrapped version of the input function that ignores errors.
|
|
241
|
-
*/
|
|
242
|
-
function createErrorIgnoringFunction(func) {
|
|
243
|
-
return function (...args) {
|
|
244
|
-
try {
|
|
245
|
-
func(...args);
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
// Deliberately swallowing/ignoring the exception
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
254
|
-
/**
|
|
255
|
-
* A no-operation function (noop) that does nothing regardless of the arguments passed.
|
|
256
|
-
* It is designed to be as permissive as possible in its typing without using the `Function` keyword.
|
|
257
|
-
*
|
|
258
|
-
* @param args - Any arguments passed to the function (ignored)
|
|
259
|
-
*/
|
|
260
|
-
const noop = (...args) => {
|
|
261
|
-
// Intentionally does nothing
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
const logLevels = ['none', 'error', 'warn', 'log', 'info', 'debug'];
|
|
265
|
-
const priority = {
|
|
266
|
-
error: 4,
|
|
267
|
-
warn: 3,
|
|
268
|
-
log: 2,
|
|
269
|
-
info: 1,
|
|
270
|
-
debug: 0,
|
|
271
|
-
};
|
|
272
|
-
/**
|
|
273
|
-
* Validates whether a given string is a valid log level.
|
|
274
|
-
*
|
|
275
|
-
* @param level - The log level to validate
|
|
276
|
-
* @returns True if the level is valid, false otherwise
|
|
277
|
-
*/
|
|
278
|
-
function isValidLogLevel(level) {
|
|
279
|
-
return logLevels.includes(level);
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Creates a log level configuration manager for controlling logging behavior.
|
|
283
|
-
* Provides methods to get, set, and evaluate log levels based on priority.
|
|
284
|
-
*
|
|
285
|
-
* @param level - The initial log level (defaults to 'error')
|
|
286
|
-
* @returns A configuration object with log level management methods
|
|
287
|
-
* @throws {Error} When the provided level is not a valid log level
|
|
288
|
-
*/
|
|
289
|
-
function createLogLevelConfig(level = 'error') {
|
|
290
|
-
if (!isValidLogLevel(level)) {
|
|
291
|
-
throw createError('Cannot create log level configuration with a valid default log level');
|
|
292
|
-
}
|
|
293
|
-
const state = { level };
|
|
294
|
-
const getLogLevel = () => state.level;
|
|
295
|
-
const setLogLevel = (level) => {
|
|
296
|
-
if (!isValidLogLevel(level)) {
|
|
297
|
-
throw createError(`Cannot set value '${level}' level. Expected levels are ${logLevels}.`);
|
|
298
|
-
}
|
|
299
|
-
state.level = level;
|
|
300
|
-
};
|
|
301
|
-
const shouldLog = (level) => {
|
|
302
|
-
if (state.level === 'none' || level === 'none' || !isValidLogLevel(level)) {
|
|
303
|
-
return false;
|
|
304
|
-
}
|
|
305
|
-
return priority[level] >= priority[state.level];
|
|
306
|
-
};
|
|
307
|
-
return freeze({
|
|
308
|
-
getLogLevel,
|
|
309
|
-
setLogLevel,
|
|
310
|
-
shouldLog,
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Creates a logger instance with configurable log level filtering.
|
|
316
|
-
* Each log function is wrapped to respect the current log level setting.
|
|
317
|
-
*
|
|
318
|
-
* @param error - Function to handle error-level logs (required)
|
|
319
|
-
* @param warn - Function to handle warning-level logs (optional, defaults to noop)
|
|
320
|
-
* @param log - Function to handle standard logs (optional, defaults to noop)
|
|
321
|
-
* @param info - Function to handle info-level logs (optional, defaults to noop)
|
|
322
|
-
* @param debug - Function to handle debug-level logs (optional, defaults to noop)
|
|
323
|
-
* @returns A frozen logger object with log methods and level control
|
|
324
|
-
* @throws {ErrorLevelFn} When any provided log function is invalid
|
|
325
|
-
*/
|
|
326
|
-
function createLogger(error, warn = noop, log = noop, info = noop, debug = noop) {
|
|
327
|
-
if (notValidLogFn(error)) {
|
|
328
|
-
throw createError(notFnMsg('error'));
|
|
329
|
-
}
|
|
330
|
-
if (notValidLogFn(warn)) {
|
|
331
|
-
throw createError(notFnMsg('warn'));
|
|
332
|
-
}
|
|
333
|
-
if (notValidLogFn(log)) {
|
|
334
|
-
throw createError(notFnMsg('log'));
|
|
335
|
-
}
|
|
336
|
-
if (notValidLogFn(info)) {
|
|
337
|
-
throw createError(notFnMsg('info'));
|
|
338
|
-
}
|
|
339
|
-
if (notValidLogFn(debug)) {
|
|
340
|
-
throw createError(notFnMsg('debug'));
|
|
341
|
-
}
|
|
342
|
-
const { setLogLevel, getLogLevel, shouldLog } = createLogLevelConfig();
|
|
343
|
-
const wrapLogFn = (fn, level) => {
|
|
344
|
-
if (fn === noop)
|
|
345
|
-
return fn;
|
|
346
|
-
const condition = () => shouldLog(level);
|
|
347
|
-
return createConditionalExecutionFunction(createErrorIgnoringFunction(fn), condition);
|
|
348
|
-
};
|
|
349
|
-
return freeze({
|
|
350
|
-
error: wrapLogFn(error, 'error'),
|
|
351
|
-
warn: wrapLogFn(warn, 'warn'),
|
|
352
|
-
log: wrapLogFn(log, 'log'),
|
|
353
|
-
info: wrapLogFn(info, 'info'),
|
|
354
|
-
debug: wrapLogFn(debug, 'debug'),
|
|
355
|
-
setLogLevel,
|
|
356
|
-
getLogLevel,
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Validates whether a given value is a valid log function.
|
|
361
|
-
*
|
|
362
|
-
* @param fn - The value to validate
|
|
363
|
-
* @returns True if the value is not a function (invalid), false if it is valid
|
|
364
|
-
*/
|
|
365
|
-
function notValidLogFn(fn) {
|
|
366
|
-
return getType(fn) !== 'function' && fn !== noop;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Generates an error message for invalid log function parameters.
|
|
370
|
-
*
|
|
371
|
-
* @param label - The name of the log function that failed validation
|
|
372
|
-
* @returns A formatted error message string
|
|
373
|
-
*/
|
|
374
|
-
function notFnMsg(label) {
|
|
375
|
-
return `Cannot create a logger when ${label} is not a function`;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
createLogger(error, warn, log, info, debug);
|
|
3
|
+
const node_fs = require('node:fs');
|
|
4
|
+
const node_path = require('node:path');
|
|
5
|
+
const index_cjs_js$4 = require('../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/array/index.cjs.js');
|
|
6
|
+
const index_cjs_js$3 = require('../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/console/index.cjs.js');
|
|
7
|
+
const index_cjs_js$5 = require('../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/json/index.cjs.js');
|
|
8
|
+
const index_cjs_js$2 = require('../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/object/index.cjs.js');
|
|
9
|
+
const index_cjs_js = require('../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/set/index.cjs.js');
|
|
10
|
+
const index_cjs_js$1 = require('../../_dependencies/@hyperfrontend/logging/index.cjs.js');
|
|
11
|
+
const index_cjs_js$6 = require('../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/error/index.cjs.js');
|
|
12
|
+
const { isSafePath } = require('../../_shared/core/fs/guard/index.cjs.js');
|
|
13
|
+
const { getFileStat, isFile, isDirectory, isSymlink, exists } = require('../../_shared/core/fs/stat/index.cjs.js');
|
|
14
|
+
const { join } = require('../../_shared/core/path/join/index.cjs.js');
|
|
379
15
|
|
|
380
16
|
/**
|
|
381
17
|
* Global log level registry.
|
|
382
18
|
* Tracks all created scoped loggers to allow global log level changes.
|
|
383
19
|
*/
|
|
384
|
-
const loggerRegistry = createSet();
|
|
20
|
+
const loggerRegistry = index_cjs_js.createSet();
|
|
385
21
|
/** Redacted placeholder for sensitive values */
|
|
386
22
|
const REDACTED = '[REDACTED]';
|
|
387
23
|
/**
|
|
@@ -415,17 +51,24 @@ function isSensitiveKey(key) {
|
|
|
415
51
|
*
|
|
416
52
|
* @param obj - Object to sanitize
|
|
417
53
|
* @returns New object with sensitive values redacted
|
|
54
|
+
*
|
|
55
|
+
* @example Sanitizing sensitive data
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const config = { apiKey: 'secret123', endpoint: 'https://api.example.com' }
|
|
58
|
+
* const safe = sanitize(config)
|
|
59
|
+
* // => { apiKey: '[REDACTED]', endpoint: 'https://api.example.com' }
|
|
60
|
+
* ```
|
|
418
61
|
*/
|
|
419
62
|
function sanitize(obj) {
|
|
420
63
|
if (obj === null || obj === undefined) {
|
|
421
64
|
return obj;
|
|
422
65
|
}
|
|
423
|
-
if (isArray(obj)) {
|
|
66
|
+
if (index_cjs_js$4.isArray(obj)) {
|
|
424
67
|
return obj.map((item) => sanitize(item));
|
|
425
68
|
}
|
|
426
69
|
if (typeof obj === 'object') {
|
|
427
70
|
const result = {};
|
|
428
|
-
for (const [key, value] of entries(obj)) {
|
|
71
|
+
for (const [key, value] of index_cjs_js$2.entries(obj)) {
|
|
429
72
|
if (isSensitiveKey(key)) {
|
|
430
73
|
result[key] = REDACTED;
|
|
431
74
|
}
|
|
@@ -450,9 +93,9 @@ function sanitize(obj) {
|
|
|
450
93
|
*/
|
|
451
94
|
function formatMessage(namespace, message, meta) {
|
|
452
95
|
const prefix = `[${namespace}]`;
|
|
453
|
-
if (meta && keys(meta).length > 0) {
|
|
96
|
+
if (meta && index_cjs_js$2.keys(meta).length > 0) {
|
|
454
97
|
const sanitizedMeta = sanitize(meta);
|
|
455
|
-
return `${prefix} ${message} ${stringify(sanitizedMeta)}`;
|
|
98
|
+
return `${prefix} ${message} ${index_cjs_js$5.stringify(sanitizedMeta)}`;
|
|
456
99
|
}
|
|
457
100
|
return `${prefix} ${message}`;
|
|
458
101
|
}
|
|
@@ -465,7 +108,7 @@ function formatMessage(namespace, message, meta) {
|
|
|
465
108
|
* @param options - Logger configuration options
|
|
466
109
|
* @returns A configured scoped logger instance
|
|
467
110
|
*
|
|
468
|
-
* @example
|
|
111
|
+
* @example Creating a scoped logger
|
|
469
112
|
* ```typescript
|
|
470
113
|
* const logger = createScopedLogger('project-scope')
|
|
471
114
|
* logger.setLogLevel('debug')
|
|
@@ -484,9 +127,9 @@ function createScopedLogger(namespace, options = {}) {
|
|
|
484
127
|
const processedMeta = sanitizeSecrets && meta ? sanitize(meta) : meta;
|
|
485
128
|
baseFn(formatMessage(namespace, message, processedMeta));
|
|
486
129
|
};
|
|
487
|
-
const baseLogger = createLogger(createLogFn(error), createLogFn(warn), createLogFn(log), createLogFn(info), createLogFn(debug));
|
|
130
|
+
const baseLogger = index_cjs_js$1.createLogger(createLogFn(index_cjs_js$3.error), createLogFn(index_cjs_js$3.warn), createLogFn(index_cjs_js$3.log), createLogFn(index_cjs_js$3.info), createLogFn(index_cjs_js$3.debug));
|
|
488
131
|
baseLogger.setLogLevel(level);
|
|
489
|
-
const scopedLogger = freeze({
|
|
132
|
+
const scopedLogger = index_cjs_js$2.freeze({
|
|
490
133
|
error: (message, meta) => baseLogger.error(message, meta),
|
|
491
134
|
warn: (message, meta) => baseLogger.warn(message, meta),
|
|
492
135
|
log: (message, meta) => baseLogger.log(message, meta),
|
|
@@ -502,7 +145,7 @@ function createScopedLogger(namespace, options = {}) {
|
|
|
502
145
|
* Default logger instance for the project-scope library.
|
|
503
146
|
* Use this for general logging within the library.
|
|
504
147
|
*
|
|
505
|
-
* @example
|
|
148
|
+
* @example Using the default logger
|
|
506
149
|
* ```typescript
|
|
507
150
|
* import { logger } from '@hyperfrontend/project-scope/core'
|
|
508
151
|
*
|
|
@@ -520,10 +163,19 @@ const fsLogger = createScopedLogger('project-scope:fs');
|
|
|
520
163
|
* @param code - The category code for this type of filesystem failure
|
|
521
164
|
* @param context - Additional context including path, operation, and cause
|
|
522
165
|
* @returns A configured Error object with code and context properties
|
|
166
|
+
*
|
|
167
|
+
* @example Creating a file system error
|
|
168
|
+
* ```typescript
|
|
169
|
+
* throw createFileSystemError(
|
|
170
|
+
* 'Cannot read file',
|
|
171
|
+
* 'FS_READ_ERROR',
|
|
172
|
+
* { path: './missing.txt', operation: 'read' }
|
|
173
|
+
* )
|
|
174
|
+
* ```
|
|
523
175
|
*/
|
|
524
176
|
function createFileSystemError(message, code, context) {
|
|
525
|
-
const error = createError(message);
|
|
526
|
-
defineProperties(error, {
|
|
177
|
+
const error = index_cjs_js$6.createError(message);
|
|
178
|
+
index_cjs_js$2.defineProperties(error, {
|
|
527
179
|
code: { value: code, enumerable: true },
|
|
528
180
|
context: { value: context, enumerable: true },
|
|
529
181
|
});
|
|
@@ -537,7 +189,7 @@ function createFileSystemError(message, code, context) {
|
|
|
537
189
|
* @returns File contents as string
|
|
538
190
|
* @throws {Error} If file doesn't exist or can't be read
|
|
539
191
|
*
|
|
540
|
-
* @example
|
|
192
|
+
* @example Reading file contents
|
|
541
193
|
* ```typescript
|
|
542
194
|
* import { readFileContent } from '@hyperfrontend/project-scope'
|
|
543
195
|
*
|
|
@@ -546,6 +198,9 @@ function createFileSystemError(message, code, context) {
|
|
|
546
198
|
* ```
|
|
547
199
|
*/
|
|
548
200
|
function readFileContent(filePath, encoding = 'utf-8') {
|
|
201
|
+
if (!isSafePath(filePath)) {
|
|
202
|
+
throw createFileSystemError(`Unsafe file path: ${filePath}`, 'FS_READ_ERROR', { path: filePath, operation: 'read' });
|
|
203
|
+
}
|
|
549
204
|
if (!node_fs.existsSync(filePath)) {
|
|
550
205
|
fsLogger.debug('File not found', { path: filePath });
|
|
551
206
|
throw createFileSystemError(`File not found: ${filePath}`, 'FS_NOT_FOUND', { path: filePath, operation: 'read' });
|
|
@@ -564,8 +219,17 @@ function readFileContent(filePath, encoding = 'utf-8') {
|
|
|
564
219
|
* @param filePath - Path to file
|
|
565
220
|
* @returns File contents as Buffer
|
|
566
221
|
* @throws {Error} If file doesn't exist or can't be read
|
|
222
|
+
*
|
|
223
|
+
* @example Reading file as buffer
|
|
224
|
+
* ```typescript
|
|
225
|
+
* const buffer = readFileBuffer('./image.png')
|
|
226
|
+
* console.log(buffer.length) // File size in bytes
|
|
227
|
+
* ```
|
|
567
228
|
*/
|
|
568
229
|
function readFileBuffer(filePath) {
|
|
230
|
+
if (!isSafePath(filePath)) {
|
|
231
|
+
throw createFileSystemError(`Unsafe file path: ${filePath}`, 'FS_READ_ERROR', { path: filePath, operation: 'read' });
|
|
232
|
+
}
|
|
569
233
|
if (!node_fs.existsSync(filePath)) {
|
|
570
234
|
throw createFileSystemError(`File not found: ${filePath}`, 'FS_NOT_FOUND', { path: filePath, operation: 'read' });
|
|
571
235
|
}
|
|
@@ -582,9 +246,17 @@ function readFileBuffer(filePath) {
|
|
|
582
246
|
* @param filePath - Path to file
|
|
583
247
|
* @param encoding - File encoding (default: utf-8)
|
|
584
248
|
* @returns File contents or null if file doesn't exist
|
|
249
|
+
*
|
|
250
|
+
* @example Reading file if it exists
|
|
251
|
+
* ```typescript
|
|
252
|
+
* const content = readFileIfExists('./optional-config.json')
|
|
253
|
+
* if (content) {
|
|
254
|
+
* // File existed, use content
|
|
255
|
+
* }
|
|
256
|
+
* ```
|
|
585
257
|
*/
|
|
586
258
|
function readFileIfExists(filePath, encoding = 'utf-8') {
|
|
587
|
-
if (!node_fs.existsSync(filePath)) {
|
|
259
|
+
if (!isSafePath(filePath) || !node_fs.existsSync(filePath)) {
|
|
588
260
|
return null;
|
|
589
261
|
}
|
|
590
262
|
try {
|
|
@@ -603,7 +275,7 @@ function readFileIfExists(filePath, encoding = 'utf-8') {
|
|
|
603
275
|
* @returns Parsed JSON object
|
|
604
276
|
* @throws {Error} If file doesn't exist (when no default provided) or contains invalid JSON
|
|
605
277
|
*
|
|
606
|
-
* @example
|
|
278
|
+
* @example Reading JSON file
|
|
607
279
|
* ```typescript
|
|
608
280
|
* import { readJsonFile } from '@hyperfrontend/project-scope'
|
|
609
281
|
*
|
|
@@ -616,6 +288,9 @@ function readFileIfExists(filePath, encoding = 'utf-8') {
|
|
|
616
288
|
* ```
|
|
617
289
|
*/
|
|
618
290
|
function readJsonFile(filePath, options) {
|
|
291
|
+
if (!isSafePath(filePath)) {
|
|
292
|
+
throw createFileSystemError(`Unsafe file path: ${filePath}`, 'FS_READ_ERROR', { path: filePath, operation: 'read' });
|
|
293
|
+
}
|
|
619
294
|
if (!node_fs.existsSync(filePath)) {
|
|
620
295
|
if (options && 'default' in options) {
|
|
621
296
|
fsLogger.debug('JSON file not found, using default', { path: filePath });
|
|
@@ -626,7 +301,7 @@ function readJsonFile(filePath, options) {
|
|
|
626
301
|
}
|
|
627
302
|
try {
|
|
628
303
|
const content = node_fs.readFileSync(filePath, { encoding: 'utf-8' });
|
|
629
|
-
return parse(content);
|
|
304
|
+
return index_cjs_js$5.parse(content);
|
|
630
305
|
}
|
|
631
306
|
catch (error) {
|
|
632
307
|
if (error?.code === 'ENOENT') {
|
|
@@ -646,196 +321,26 @@ function readJsonFile(filePath, options) {
|
|
|
646
321
|
*
|
|
647
322
|
* @param filePath - Path to JSON file
|
|
648
323
|
* @returns Parsed JSON object or null if file doesn't exist or is invalid
|
|
649
|
-
*/
|
|
650
|
-
function readJsonFileIfExists(filePath) {
|
|
651
|
-
if (!node_fs.existsSync(filePath)) {
|
|
652
|
-
return null;
|
|
653
|
-
}
|
|
654
|
-
try {
|
|
655
|
-
const content = node_fs.readFileSync(filePath, { encoding: 'utf-8' });
|
|
656
|
-
return parse(content);
|
|
657
|
-
}
|
|
658
|
-
catch {
|
|
659
|
-
return null;
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
const fsWriteLogger = createScopedLogger('project-scope:fs:write');
|
|
664
|
-
/**
|
|
665
|
-
* Ensure directory exists, create recursively if not.
|
|
666
324
|
*
|
|
667
|
-
* @
|
|
668
|
-
*/
|
|
669
|
-
function ensureDir(dirPath) {
|
|
670
|
-
if (!node_fs.existsSync(dirPath)) {
|
|
671
|
-
fsWriteLogger.debug('Creating directory recursively', { path: dirPath });
|
|
672
|
-
node_fs.mkdirSync(dirPath, { recursive: true });
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
/**
|
|
676
|
-
* Write string content to file.
|
|
677
|
-
* Creates parent directories if needed.
|
|
678
|
-
*
|
|
679
|
-
* @param filePath - Absolute or relative path to the target file
|
|
680
|
-
* @param content - String content to write to the file
|
|
681
|
-
* @param options - Optional write configuration (encoding, mode)
|
|
682
|
-
* @throws {Error} If write fails
|
|
683
|
-
*
|
|
684
|
-
* @example
|
|
325
|
+
* @example Reading JSON file if it exists
|
|
685
326
|
* ```typescript
|
|
686
|
-
*
|
|
687
|
-
*
|
|
688
|
-
*
|
|
689
|
-
* writeFileContent('./output/data.txt', 'Hello, World!')
|
|
690
|
-
*
|
|
691
|
-
* // Write with custom encoding
|
|
692
|
-
* writeFileContent('./output/data.txt', 'Content', { encoding: 'utf-8' })
|
|
327
|
+
* interface UserSettings { theme: string }
|
|
328
|
+
* const settings = readJsonFileIfExists<UserSettings>('./user-settings.json')
|
|
329
|
+
* const theme = settings?.theme ?? 'default'
|
|
693
330
|
* ```
|
|
694
331
|
*/
|
|
695
|
-
function
|
|
696
|
-
|
|
697
|
-
fsWriteLogger.debug('Writing file content', { path: filePath, size: content.length, encoding: options?.encoding ?? 'utf-8' });
|
|
698
|
-
ensureDir(node_path.dirname(filePath));
|
|
699
|
-
node_fs.writeFileSync(filePath, content, {
|
|
700
|
-
encoding: options?.encoding ?? 'utf-8',
|
|
701
|
-
mode: options?.mode,
|
|
702
|
-
});
|
|
703
|
-
fsWriteLogger.debug('File written successfully', { path: filePath });
|
|
704
|
-
}
|
|
705
|
-
catch (error) {
|
|
706
|
-
fsWriteLogger.warn('Failed to write file', { path: filePath, error: error instanceof Error ? error.message : String(error) });
|
|
707
|
-
throw createFileSystemError(`Failed to write file: ${filePath}`, 'FS_WRITE_ERROR', { path: filePath, operation: 'write', cause: error });
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
/**
|
|
711
|
-
* Write Buffer to file.
|
|
712
|
-
* Creates parent directories if needed.
|
|
713
|
-
*
|
|
714
|
-
* @param filePath - Absolute or relative path to the target file
|
|
715
|
-
* @param content - Buffer containing binary data to write
|
|
716
|
-
* @param options - Optional write configuration (mode)
|
|
717
|
-
* @throws {Error} If write fails
|
|
718
|
-
*/
|
|
719
|
-
function writeFileBuffer(filePath, content, options) {
|
|
720
|
-
try {
|
|
721
|
-
fsWriteLogger.debug('Writing file buffer', { path: filePath, size: content.length });
|
|
722
|
-
ensureDir(node_path.dirname(filePath));
|
|
723
|
-
node_fs.writeFileSync(filePath, content, { mode: options?.mode });
|
|
724
|
-
fsWriteLogger.debug('Buffer written successfully', { path: filePath });
|
|
725
|
-
}
|
|
726
|
-
catch (error) {
|
|
727
|
-
fsWriteLogger.warn('Failed to write buffer', { path: filePath, error: error instanceof Error ? error.message : String(error) });
|
|
728
|
-
throw createFileSystemError(`Failed to write file: ${filePath}`, 'FS_WRITE_ERROR', { path: filePath, operation: 'write', cause: error });
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
/**
|
|
732
|
-
* Write JSON data to file with formatting.
|
|
733
|
-
* Creates parent directories if needed.
|
|
734
|
-
*
|
|
735
|
-
* @param filePath - Absolute or relative path to the target JSON file
|
|
736
|
-
* @param data - Object or value to serialize as JSON
|
|
737
|
-
* @param options - Optional write configuration (indent, encoding, mode)
|
|
738
|
-
* @throws {Error} If write fails
|
|
739
|
-
*
|
|
740
|
-
* @example
|
|
741
|
-
* ```typescript
|
|
742
|
-
* import { writeJsonFile } from '@hyperfrontend/project-scope'
|
|
743
|
-
*
|
|
744
|
-
* // Write object to JSON file
|
|
745
|
-
* writeJsonFile('./config.json', { port: 3000, debug: true })
|
|
746
|
-
*
|
|
747
|
-
* // Write with custom indentation
|
|
748
|
-
* writeJsonFile('./config.json', data, { indent: 4 })
|
|
749
|
-
* ```
|
|
750
|
-
*/
|
|
751
|
-
function writeJsonFile(filePath, data, options) {
|
|
752
|
-
try {
|
|
753
|
-
fsWriteLogger.debug('Writing JSON file', { path: filePath, indent: options?.indent ?? 2 });
|
|
754
|
-
const indent = options?.indent ?? 2;
|
|
755
|
-
const content = stringify(data, null, indent) + '\n';
|
|
756
|
-
writeFileContent(filePath, content, options);
|
|
757
|
-
fsWriteLogger.debug('JSON file written successfully', { path: filePath });
|
|
758
|
-
}
|
|
759
|
-
catch (error) {
|
|
760
|
-
if (error?.code === 'FS_WRITE_ERROR') {
|
|
761
|
-
throw error;
|
|
762
|
-
}
|
|
763
|
-
fsWriteLogger.warn('Failed to write JSON file', { path: filePath, error: error instanceof Error ? error.message : String(error) });
|
|
764
|
-
throw createFileSystemError(`Failed to write JSON file: ${filePath}`, 'FS_WRITE_ERROR', {
|
|
765
|
-
path: filePath,
|
|
766
|
-
operation: 'write',
|
|
767
|
-
cause: error,
|
|
768
|
-
});
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
/**
|
|
773
|
-
* Get file stats with error handling.
|
|
774
|
-
*
|
|
775
|
-
* @param filePath - Path to file
|
|
776
|
-
* @param followSymlinks - Whether to follow symlinks (default: true)
|
|
777
|
-
* @returns File stats or null if path doesn't exist
|
|
778
|
-
*/
|
|
779
|
-
function getFileStat(filePath, followSymlinks = true) {
|
|
780
|
-
if (!node_fs.existsSync(filePath)) {
|
|
332
|
+
function readJsonFileIfExists(filePath) {
|
|
333
|
+
if (!isSafePath(filePath) || !node_fs.existsSync(filePath)) {
|
|
781
334
|
return null;
|
|
782
335
|
}
|
|
783
336
|
try {
|
|
784
|
-
const
|
|
785
|
-
return
|
|
786
|
-
isFile: stat.isFile(),
|
|
787
|
-
isDirectory: stat.isDirectory(),
|
|
788
|
-
isSymlink: stat.isSymbolicLink(),
|
|
789
|
-
size: stat.size,
|
|
790
|
-
created: stat.birthtime,
|
|
791
|
-
modified: stat.mtime,
|
|
792
|
-
accessed: stat.atime,
|
|
793
|
-
mode: stat.mode,
|
|
794
|
-
};
|
|
337
|
+
const content = node_fs.readFileSync(filePath, { encoding: 'utf-8' });
|
|
338
|
+
return index_cjs_js$5.parse(content);
|
|
795
339
|
}
|
|
796
340
|
catch {
|
|
797
341
|
return null;
|
|
798
342
|
}
|
|
799
343
|
}
|
|
800
|
-
/**
|
|
801
|
-
* Check if path is a file.
|
|
802
|
-
*
|
|
803
|
-
* @param filePath - Path to check
|
|
804
|
-
* @returns True if path is a file
|
|
805
|
-
*/
|
|
806
|
-
function isFile(filePath) {
|
|
807
|
-
const stats = getFileStat(filePath);
|
|
808
|
-
return stats?.isFile ?? false;
|
|
809
|
-
}
|
|
810
|
-
/**
|
|
811
|
-
* Check if path is a directory.
|
|
812
|
-
*
|
|
813
|
-
* @param dirPath - Path to check
|
|
814
|
-
* @returns True if path is a directory
|
|
815
|
-
*/
|
|
816
|
-
function isDirectory(dirPath) {
|
|
817
|
-
const stats = getFileStat(dirPath);
|
|
818
|
-
return stats?.isDirectory ?? false;
|
|
819
|
-
}
|
|
820
|
-
/**
|
|
821
|
-
* Check if path is a symbolic link.
|
|
822
|
-
*
|
|
823
|
-
* @param linkPath - Path to check
|
|
824
|
-
* @returns True if path is a symlink
|
|
825
|
-
*/
|
|
826
|
-
function isSymlink(linkPath) {
|
|
827
|
-
const stats = getFileStat(linkPath, false);
|
|
828
|
-
return stats?.isSymlink ?? false;
|
|
829
|
-
}
|
|
830
|
-
/**
|
|
831
|
-
* Check if path exists.
|
|
832
|
-
*
|
|
833
|
-
* @param filePath - Path to check
|
|
834
|
-
* @returns True if path exists
|
|
835
|
-
*/
|
|
836
|
-
function exists(filePath) {
|
|
837
|
-
return node_fs.existsSync(filePath);
|
|
838
|
-
}
|
|
839
344
|
|
|
840
345
|
const fsDirLogger = createScopedLogger('project-scope:fs:dir');
|
|
841
346
|
/**
|
|
@@ -845,7 +350,7 @@ const fsDirLogger = createScopedLogger('project-scope:fs:dir');
|
|
|
845
350
|
* @returns Array of entries with metadata for each file/directory
|
|
846
351
|
* @throws {Error} If directory doesn't exist or isn't a directory
|
|
847
352
|
*
|
|
848
|
-
* @example
|
|
353
|
+
* @example Listing directory contents
|
|
849
354
|
* ```typescript
|
|
850
355
|
* import { readDirectory } from '@hyperfrontend/project-scope'
|
|
851
356
|
*
|
|
@@ -892,7 +397,7 @@ function readDirectory(dirPath) {
|
|
|
892
397
|
* @param options - Configuration for depth limit, hidden files, and symlinks
|
|
893
398
|
* @returns Flat array of all entries found during traversal
|
|
894
399
|
*
|
|
895
|
-
* @example
|
|
400
|
+
* @example Recursive directory listing with options
|
|
896
401
|
* ```typescript
|
|
897
402
|
* import { readDirectoryRecursive } from '@hyperfrontend/project-scope'
|
|
898
403
|
*
|
|
@@ -953,6 +458,15 @@ function readDirectoryRecursive(dirPath, options) {
|
|
|
953
458
|
* @param dirPath - Path where the directory should be created
|
|
954
459
|
* @param options - Creation options
|
|
955
460
|
* @param options.recursive - Create parent directories if missing (default: true)
|
|
461
|
+
*
|
|
462
|
+
* @example Creating directories
|
|
463
|
+
* ```typescript
|
|
464
|
+
* // Create nested directories
|
|
465
|
+
* createDirectory('./output/reports/2024')
|
|
466
|
+
*
|
|
467
|
+
* // Create single directory without parents
|
|
468
|
+
* createDirectory('./logs', { recursive: false })
|
|
469
|
+
* ```
|
|
956
470
|
*/
|
|
957
471
|
function createDirectory(dirPath, options) {
|
|
958
472
|
const recursive = options?.recursive ?? true;
|
|
@@ -966,6 +480,15 @@ function createDirectory(dirPath, options) {
|
|
|
966
480
|
* @param options - Removal configuration
|
|
967
481
|
* @param options.recursive - Delete directory contents recursively
|
|
968
482
|
* @param options.force - Ignore errors if directory doesn't exist
|
|
483
|
+
*
|
|
484
|
+
* @example Removing directories
|
|
485
|
+
* ```typescript
|
|
486
|
+
* // Remove directory and all contents
|
|
487
|
+
* removeDirectory('./temp', { recursive: true })
|
|
488
|
+
*
|
|
489
|
+
* // Safe removal (no error if missing)
|
|
490
|
+
* removeDirectory('./cache', { recursive: true, force: true })
|
|
491
|
+
* ```
|
|
969
492
|
*/
|
|
970
493
|
function removeDirectory(dirPath, options) {
|
|
971
494
|
fsDirLogger.debug('Removing directory', { path: dirPath, recursive: options?.recursive, force: options?.force });
|
|
@@ -975,17 +498,6 @@ function removeDirectory(dirPath, options) {
|
|
|
975
498
|
});
|
|
976
499
|
}
|
|
977
500
|
|
|
978
|
-
/**
|
|
979
|
-
* Join path segments.
|
|
980
|
-
* Uses platform-specific separators (e.g., / or \).
|
|
981
|
-
*
|
|
982
|
-
* @param paths - Path segments to join
|
|
983
|
-
* @returns Joined path
|
|
984
|
-
*/
|
|
985
|
-
function join(...paths) {
|
|
986
|
-
return node_path.join(...paths);
|
|
987
|
-
}
|
|
988
|
-
|
|
989
501
|
const fsTraversalLogger = createScopedLogger('project-scope:fs:traversal');
|
|
990
502
|
/**
|
|
991
503
|
* Generic upward directory traversal.
|
|
@@ -994,6 +506,15 @@ const fsTraversalLogger = createScopedLogger('project-scope:fs:traversal');
|
|
|
994
506
|
* @param startPath - Starting directory
|
|
995
507
|
* @param predicate - Function to test each directory
|
|
996
508
|
* @returns First matching directory or null
|
|
509
|
+
*
|
|
510
|
+
* @example Finding directory containing README
|
|
511
|
+
* ```typescript
|
|
512
|
+
* // Find first directory containing a README
|
|
513
|
+
* const readmeDir = traverseUpward('./src/utils', (dir) =>
|
|
514
|
+
* existsSync(join(dir, 'README.md'))
|
|
515
|
+
* )
|
|
516
|
+
* // => '/project' or null
|
|
517
|
+
* ```
|
|
997
518
|
*/
|
|
998
519
|
function traverseUpward(startPath, predicate) {
|
|
999
520
|
fsTraversalLogger.debug('Starting upward traversal', { startPath });
|
|
@@ -1019,6 +540,17 @@ function traverseUpward(startPath, predicate) {
|
|
|
1019
540
|
* @param startPath - Starting directory
|
|
1020
541
|
* @param markers - Array of marker file names to search for
|
|
1021
542
|
* @returns First directory containing any marker, or null
|
|
543
|
+
*
|
|
544
|
+
* @example Finding project root by marker files
|
|
545
|
+
* ```typescript
|
|
546
|
+
* // Find project root by looking for common marker files
|
|
547
|
+
* const projectRoot = locateByMarkers('./src/components', [
|
|
548
|
+
* 'package.json',
|
|
549
|
+
* 'nx.json',
|
|
550
|
+
* 'tsconfig.base.json'
|
|
551
|
+
* ])
|
|
552
|
+
* // => '/workspace/my-project'
|
|
553
|
+
* ```
|
|
1022
554
|
*/
|
|
1023
555
|
function locateByMarkers(startPath, markers) {
|
|
1024
556
|
fsTraversalLogger.debug('Locating by markers', { startPath, markers });
|
|
@@ -1034,12 +566,141 @@ function locateByMarkers(startPath, markers) {
|
|
|
1034
566
|
* @param startPath - Starting directory
|
|
1035
567
|
* @param test - Function to test if directory matches criteria
|
|
1036
568
|
* @returns Matching directory path or null
|
|
569
|
+
*
|
|
570
|
+
* @example Finding directory with specific config
|
|
571
|
+
* ```typescript
|
|
572
|
+
* // Find directory with a specific config
|
|
573
|
+
* const configDir = findUpwardWhere('./deep/nested/path', (dir) =>
|
|
574
|
+
* existsSync(join(dir, '.eslintrc.js'))
|
|
575
|
+
* )
|
|
576
|
+
* ```
|
|
1037
577
|
*/
|
|
1038
578
|
function findUpwardWhere(startPath, test) {
|
|
1039
579
|
fsTraversalLogger.debug('Finding upward where condition met', { startPath });
|
|
1040
580
|
return traverseUpward(startPath, test);
|
|
1041
581
|
}
|
|
1042
582
|
|
|
583
|
+
const fsWriteLogger = createScopedLogger('project-scope:fs:write');
|
|
584
|
+
/**
|
|
585
|
+
* Ensure directory exists, create recursively if not.
|
|
586
|
+
*
|
|
587
|
+
* @param dirPath - Directory path to ensure exists
|
|
588
|
+
*
|
|
589
|
+
* @example Ensuring directory exists
|
|
590
|
+
* ```typescript
|
|
591
|
+
* ensureDir('./output/reports')
|
|
592
|
+
* // Directory now exists (created if missing)
|
|
593
|
+
* ```
|
|
594
|
+
*/
|
|
595
|
+
function ensureDir(dirPath) {
|
|
596
|
+
if (!node_fs.existsSync(dirPath)) {
|
|
597
|
+
fsWriteLogger.debug('Creating directory recursively', { path: dirPath });
|
|
598
|
+
node_fs.mkdirSync(dirPath, { recursive: true });
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Write string content to file.
|
|
603
|
+
* Creates parent directories if needed.
|
|
604
|
+
*
|
|
605
|
+
* @param filePath - Absolute or relative path to the target file
|
|
606
|
+
* @param content - String content to write to the file
|
|
607
|
+
* @param options - Optional write configuration (encoding, mode)
|
|
608
|
+
* @throws {Error} If write fails
|
|
609
|
+
*
|
|
610
|
+
* @example Writing text content to file
|
|
611
|
+
* ```typescript
|
|
612
|
+
* import { writeFileContent } from '@hyperfrontend/project-scope'
|
|
613
|
+
*
|
|
614
|
+
* // Write a simple text file
|
|
615
|
+
* writeFileContent('./output/data.txt', 'Hello, World!')
|
|
616
|
+
*
|
|
617
|
+
* // Write with custom encoding
|
|
618
|
+
* writeFileContent('./output/data.txt', 'Content', { encoding: 'utf-8' })
|
|
619
|
+
* ```
|
|
620
|
+
*/
|
|
621
|
+
function writeFileContent(filePath, content, options) {
|
|
622
|
+
try {
|
|
623
|
+
fsWriteLogger.debug('Writing file content', { path: filePath, size: content.length, encoding: options?.encoding ?? 'utf-8' });
|
|
624
|
+
ensureDir(node_path.dirname(filePath));
|
|
625
|
+
node_fs.writeFileSync(filePath, content, {
|
|
626
|
+
encoding: options?.encoding ?? 'utf-8',
|
|
627
|
+
mode: options?.mode,
|
|
628
|
+
});
|
|
629
|
+
fsWriteLogger.debug('File written successfully', { path: filePath });
|
|
630
|
+
}
|
|
631
|
+
catch (error) {
|
|
632
|
+
fsWriteLogger.warn('Failed to write file', { path: filePath, error: error instanceof Error ? error.message : String(error) });
|
|
633
|
+
throw createFileSystemError(`Failed to write file: ${filePath}`, 'FS_WRITE_ERROR', { path: filePath, operation: 'write', cause: error });
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Write Buffer to file.
|
|
638
|
+
* Creates parent directories if needed.
|
|
639
|
+
*
|
|
640
|
+
* @param filePath - Absolute or relative path to the target file
|
|
641
|
+
* @param content - Buffer containing binary data to write
|
|
642
|
+
* @param options - Optional write configuration (mode)
|
|
643
|
+
* @throws {Error} If write fails
|
|
644
|
+
*
|
|
645
|
+
* @example Writing binary buffer to file
|
|
646
|
+
* ```typescript
|
|
647
|
+
* const imageBuffer = Buffer.from([0x89, 0x50, 0x4e, 0x47])
|
|
648
|
+
* writeFileBuffer('./output/image.png', imageBuffer)
|
|
649
|
+
* ```
|
|
650
|
+
*/
|
|
651
|
+
function writeFileBuffer(filePath, content, options) {
|
|
652
|
+
try {
|
|
653
|
+
fsWriteLogger.debug('Writing file buffer', { path: filePath, size: content.length });
|
|
654
|
+
ensureDir(node_path.dirname(filePath));
|
|
655
|
+
node_fs.writeFileSync(filePath, content, { mode: options?.mode });
|
|
656
|
+
fsWriteLogger.debug('Buffer written successfully', { path: filePath });
|
|
657
|
+
}
|
|
658
|
+
catch (error) {
|
|
659
|
+
fsWriteLogger.warn('Failed to write buffer', { path: filePath, error: error instanceof Error ? error.message : String(error) });
|
|
660
|
+
throw createFileSystemError(`Failed to write file: ${filePath}`, 'FS_WRITE_ERROR', { path: filePath, operation: 'write', cause: error });
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Write JSON data to file with formatting.
|
|
665
|
+
* Creates parent directories if needed.
|
|
666
|
+
*
|
|
667
|
+
* @param filePath - Absolute or relative path to the target JSON file
|
|
668
|
+
* @param data - Object or value to serialize as JSON
|
|
669
|
+
* @param options - Optional write configuration (indent, encoding, mode)
|
|
670
|
+
* @throws {Error} If write fails
|
|
671
|
+
*
|
|
672
|
+
* @example Writing JSON data to file
|
|
673
|
+
* ```typescript
|
|
674
|
+
* import { writeJsonFile } from '@hyperfrontend/project-scope'
|
|
675
|
+
*
|
|
676
|
+
* // Write object to JSON file
|
|
677
|
+
* writeJsonFile('./config.json', { port: 3000, debug: true })
|
|
678
|
+
*
|
|
679
|
+
* // Write with custom indentation
|
|
680
|
+
* writeJsonFile('./config.json', data, { indent: 4 })
|
|
681
|
+
* ```
|
|
682
|
+
*/
|
|
683
|
+
function writeJsonFile(filePath, data, options) {
|
|
684
|
+
try {
|
|
685
|
+
fsWriteLogger.debug('Writing JSON file', { path: filePath, indent: options?.indent ?? 2 });
|
|
686
|
+
const indent = options?.indent ?? 2;
|
|
687
|
+
const content = index_cjs_js$5.stringify(data, null, indent) + '\n';
|
|
688
|
+
writeFileContent(filePath, content, options);
|
|
689
|
+
fsWriteLogger.debug('JSON file written successfully', { path: filePath });
|
|
690
|
+
}
|
|
691
|
+
catch (error) {
|
|
692
|
+
if (error?.code === 'FS_WRITE_ERROR') {
|
|
693
|
+
throw error;
|
|
694
|
+
}
|
|
695
|
+
fsWriteLogger.warn('Failed to write JSON file', { path: filePath, error: error instanceof Error ? error.message : String(error) });
|
|
696
|
+
throw createFileSystemError(`Failed to write JSON file: ${filePath}`, 'FS_WRITE_ERROR', {
|
|
697
|
+
path: filePath,
|
|
698
|
+
operation: 'write',
|
|
699
|
+
cause: error,
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
1043
704
|
exports.createDirectory = createDirectory;
|
|
1044
705
|
exports.createFileSystemError = createFileSystemError;
|
|
1045
706
|
exports.ensureDir = ensureDir;
|
|
@@ -1062,4 +723,3 @@ exports.traverseUpward = traverseUpward;
|
|
|
1062
723
|
exports.writeFileBuffer = writeFileBuffer;
|
|
1063
724
|
exports.writeFileContent = writeFileContent;
|
|
1064
725
|
exports.writeJsonFile = writeJsonFile;
|
|
1065
|
-
//# sourceMappingURL=index.cjs.js.map
|