diff --git a/.changeset/free-views-divide.md b/.changeset/free-views-divide.md new file mode 100644 index 0000000..4569792 --- /dev/null +++ b/.changeset/free-views-divide.md @@ -0,0 +1,5 @@ +--- +"@webiny/stdlib": patch +--- + +Add GlobTool to the available tools - replaces fast-glob diff --git a/README.md b/README.md index 82e17b6..a724a48 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ The package is ESM-only and ships three subpath exports. Because each is a separ | `HashFolderTool` / `HashFolderToolFeature` | Deterministic SHA-256 hash of a folder's contents — [docs](src/node/features/HashFolderTool/README.md) | | `ProcessEnvFeature` | `Env` implementation backed by `process.env` — [docs](src/node/features/ProcessEnv/README.md) | | `WorkspaceTool` / `WorkspaceToolFeature` | Discover workspaces from root `package.json` (replaces `get-yarn-workspaces`) — [docs](src/node/features/WorkspaceTool/README.md) | +| `GlobTool` / `GlobToolFeature` | Find files and directories by glob pattern — [docs](src/node/features/GlobTool/README.md) | --- diff --git a/__tests__/node/DirectoryTool.test.ts b/__tests__/node/DirectoryTool.test.ts index 3247f8f..c5e676b 100644 --- a/__tests__/node/DirectoryTool.test.ts +++ b/__tests__/node/DirectoryTool.test.ts @@ -8,6 +8,7 @@ import { DirectoryToolFeature, createDirectoryTool } from "../../src/node/features/DirectoryTool/index.js"; +import { GlobToolFeature } from "../../src/node/features/GlobTool/index.js"; import { PinoLoggerConfig, PinoLoggerFeature } from "../../src/node/features/PinoLogger/index.js"; function makeContainer(): Container { @@ -16,6 +17,7 @@ function makeContainer(): Container { getConfig: () => ({ logLevel: "error" as const, transport: "json" as const }) }); PinoLoggerFeature.register(container); + GlobToolFeature.register(container); DirectoryToolFeature.register(container); return container; } diff --git a/__tests__/node/FileTool.test.ts b/__tests__/node/FileTool.test.ts index b379db7..966fc51 100644 --- a/__tests__/node/FileTool.test.ts +++ b/__tests__/node/FileTool.test.ts @@ -12,6 +12,7 @@ import { DirectoryToolFeature, createDirectoryTool } from "../../src/node/features/DirectoryTool/index.js"; +import { GlobToolFeature } from "../../src/node/features/GlobTool/index.js"; import { PinoLoggerConfig, PinoLoggerFeature } from "../../src/node/features/PinoLogger/index.js"; function makeContainer(): Container { @@ -20,6 +21,7 @@ function makeContainer(): Container { getConfig: () => ({ logLevel: "error" as const, transport: "json" as const }) }); PinoLoggerFeature.register(container); + GlobToolFeature.register(container); DirectoryToolFeature.register(container); FileToolFeature.register(container); return container; diff --git a/__tests__/node/GlobTool.test.ts b/__tests__/node/GlobTool.test.ts new file mode 100644 index 0000000..feaa918 --- /dev/null +++ b/__tests__/node/GlobTool.test.ts @@ -0,0 +1,156 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { mkdirSync, rmSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { tmpdir } from "node:os"; +import { Container } from "@webiny/di"; +import { + GlobTool, + GlobToolFeature, + createGlobTool +} from "../../src/node/features/GlobTool/index.js"; + +function makeContainer(): Container { + const container = new Container(); + GlobToolFeature.register(container); + return container; +} + +describe("GlobTool", () => { + let tmpDir: string; + let tool: GlobTool.Interface; + + beforeEach(() => { + tmpDir = join(tmpdir(), `wby-glob-test-${Date.now()}`); + mkdirSync(tmpDir, { recursive: true }); + tool = makeContainer().resolve(GlobTool); + }); + + afterEach(() => { + rmSync(tmpDir, { recursive: true, force: true }); + }); + + describe("findFiles", () => { + it("returns files matching a pattern", () => { + writeFileSync(join(tmpDir, "a.ts"), ""); + writeFileSync(join(tmpDir, "b.ts"), ""); + writeFileSync(join(tmpDir, "c.json"), "{}"); + + const result = tool.findFiles("**/*.ts", { cwd: tmpDir }); + expect(result.sort()).toEqual(["a.ts", "b.ts"]); + }); + + it("returns empty array when nothing matches", () => { + writeFileSync(join(tmpDir, "a.txt"), ""); + const result = tool.findFiles("**/*.ts", { cwd: tmpDir }); + expect(result).toEqual([]); + }); + + it("supports nested directory patterns", () => { + mkdirSync(join(tmpDir, "src", "lib"), { recursive: true }); + writeFileSync(join(tmpDir, "src", "index.ts"), ""); + writeFileSync(join(tmpDir, "src", "lib", "utils.ts"), ""); + + const result = tool.findFiles("src/**/*.ts", { cwd: tmpDir }); + expect(result.sort()).toEqual(["src/index.ts", "src/lib/utils.ts"]); + }); + + it("respects ignore option", () => { + mkdirSync(join(tmpDir, "node_modules"), { recursive: true }); + writeFileSync(join(tmpDir, "index.ts"), ""); + writeFileSync(join(tmpDir, "node_modules", "dep.ts"), ""); + + const result = tool.findFiles("**/*.ts", { + cwd: tmpDir, + ignore: ["node_modules/**"] + }); + expect(result).toEqual(["index.ts"]); + }); + + it("finds dot files when dot option is set", () => { + writeFileSync(join(tmpDir, ".hidden.ts"), ""); + writeFileSync(join(tmpDir, "visible.ts"), ""); + + const withDot = tool.findFiles("**/*.ts", { cwd: tmpDir, dot: true }); + expect(withDot.sort()).toEqual([".hidden.ts", "visible.ts"]); + + const withoutDot = tool.findFiles("**/*.ts", { cwd: tmpDir, dot: false }); + expect(withoutDot).toEqual(["visible.ts"]); + }); + + it("accepts an array of patterns", () => { + writeFileSync(join(tmpDir, "a.ts"), ""); + writeFileSync(join(tmpDir, "b.json"), "{}"); + writeFileSync(join(tmpDir, "c.txt"), ""); + + const result = tool.findFiles(["**/*.ts", "**/*.json"], { cwd: tmpDir }); + expect(result.sort()).toEqual(["a.ts", "b.json"]); + }); + }); + + describe("findDirectories", () => { + it("returns directories matching a pattern", () => { + mkdirSync(join(tmpDir, "src"), { recursive: true }); + mkdirSync(join(tmpDir, "lib"), { recursive: true }); + writeFileSync(join(tmpDir, "file.ts"), ""); + + const result = tool.findDirectories("*", { cwd: tmpDir }); + expect(result.sort()).toEqual(["lib", "src"]); + }); + + it("returns empty array when no directories match", () => { + writeFileSync(join(tmpDir, "file.ts"), ""); + const result = tool.findDirectories("nonexistent*", { cwd: tmpDir }); + expect(result).toEqual([]); + }); + + it("finds nested directories", () => { + mkdirSync(join(tmpDir, "a", "b", "c"), { recursive: true }); + + const result = tool.findDirectories("**/*", { cwd: tmpDir }); + expect(result.sort()).toEqual(["a", "a/b", "a/b/c"]); + }); + }); + + describe("findAll", () => { + it("returns all matching entries", () => { + writeFileSync(join(tmpDir, "a.ts"), ""); + writeFileSync(join(tmpDir, "b.ts"), ""); + + const result = tool.findAll("**/*.ts", { cwd: tmpDir }); + expect(result.sort()).toEqual(["a.ts", "b.ts"]); + }); + + it("returns empty array when nothing matches", () => { + const result = tool.findAll("nonexistent*", { cwd: tmpDir }); + expect(result).toEqual([]); + }); + + it("can include both files and directories with onlyFiles: false", () => { + mkdirSync(join(tmpDir, "subdir"), { recursive: true }); + writeFileSync(join(tmpDir, "file.ts"), ""); + + const result = tool.findAll("*", { cwd: tmpDir, onlyFiles: false }); + expect(result.sort()).toEqual(["file.ts", "subdir"]); + }); + }); +}); + +describe("createGlobTool", () => { + let tmpDir: string; + + beforeEach(() => { + tmpDir = join(tmpdir(), `wby-glob-factory-test-${Date.now()}`); + mkdirSync(tmpDir, { recursive: true }); + }); + + afterEach(() => { + rmSync(tmpDir, { recursive: true, force: true }); + }); + + it("creates a working tool without DI", () => { + const tool = createGlobTool(); + writeFileSync(join(tmpDir, "test.ts"), ""); + const result = tool.findFiles("**/*.ts", { cwd: tmpDir }); + expect(result).toEqual(["test.ts"]); + }); +}); diff --git a/__tests__/node/JsonFileTool.test.ts b/__tests__/node/JsonFileTool.test.ts index e86077b..879ca52 100644 --- a/__tests__/node/JsonFileTool.test.ts +++ b/__tests__/node/JsonFileTool.test.ts @@ -11,6 +11,7 @@ import { } from "../../src/node/features/JsonFileTool/index.js"; import { FileTool, FileToolFeature } from "../../src/node/features/FileTool/index.js"; import { DirectoryToolFeature } from "../../src/node/features/DirectoryTool/index.js"; +import { GlobToolFeature } from "../../src/node/features/GlobTool/index.js"; import { PinoLoggerConfig, PinoLoggerFeature } from "../../src/node/features/PinoLogger/index.js"; function makeContainer(): Container { @@ -19,6 +20,7 @@ function makeContainer(): Container { getConfig: () => ({ logLevel: "error" as const, transport: "json" as const }) }); PinoLoggerFeature.register(container); + GlobToolFeature.register(container); DirectoryToolFeature.register(container); FileToolFeature.register(container); JsonFileToolFeature.register(container); diff --git a/__tests__/node/PackageJsonFileTool.test.ts b/__tests__/node/PackageJsonFileTool.test.ts index 1acd352..687bf09 100644 --- a/__tests__/node/PackageJsonFileTool.test.ts +++ b/__tests__/node/PackageJsonFileTool.test.ts @@ -11,6 +11,7 @@ import { } from "../../src/node/features/PackageJsonFileTool/index.js"; import { FileToolFeature } from "../../src/node/features/FileTool/index.js"; import { DirectoryToolFeature } from "../../src/node/features/DirectoryTool/index.js"; +import { GlobToolFeature } from "../../src/node/features/GlobTool/index.js"; import { PinoLoggerConfig, PinoLoggerFeature } from "../../src/node/features/PinoLogger/index.js"; function makeContainer(): Container { @@ -19,6 +20,7 @@ function makeContainer(): Container { getConfig: () => ({ logLevel: "error" as const, transport: "json" as const }) }); PinoLoggerFeature.register(container); + GlobToolFeature.register(container); DirectoryToolFeature.register(container); FileToolFeature.register(container); PackageJsonFileToolFeature.register(container); diff --git a/package.json b/package.json index 0e6ee2b..c27cb9a 100644 --- a/package.json +++ b/package.json @@ -40,11 +40,11 @@ "@webiny/di": "^1.0.2", "bson-objectid": "^2.0.4", "dot-prop": "^10.2.0", - "fast-glob": "^3.3.3", "nanoid": "^6.0.0", "nanoid-dictionary": "^5.0.0", "pino": "^10.3.1", "pino-pretty": "^13.1.3", + "tinyglobby": "^0.2.17", "type-fest": "^5.8.0", "zod": "^4.4.3" }, diff --git a/src/common/features/Logger/ConsoleLogger.ts b/src/common/features/Logger/ConsoleLogger.ts index 92a2be2..f40d261 100644 --- a/src/common/features/Logger/ConsoleLogger.ts +++ b/src/common/features/Logger/ConsoleLogger.ts @@ -98,3 +98,7 @@ export const ConsoleLogger = Logger.createImplementation({ implementation: ConsoleLoggerImpl, dependencies: [[ConsoleLoggerConfig, { optional: true }]] }); + +export const createConsoleLogger = (configProvider?: ConsoleLoggerConfig.Interface) => { + return new ConsoleLoggerImpl(configProvider); +}; diff --git a/src/common/features/Logger/index.ts b/src/common/features/Logger/index.ts index ed18d06..0f60669 100644 --- a/src/common/features/Logger/index.ts +++ b/src/common/features/Logger/index.ts @@ -1,4 +1,4 @@ export { Logger } from "./abstractions/Logger.js"; export { ConsoleLoggerConfig } from "./abstractions/ConsoleLoggerConfig.js"; export { ConsoleLoggerFeature } from "./feature.js"; -export { ConsoleLogger } from "./ConsoleLogger.js"; +export { ConsoleLogger, createConsoleLogger } from "./ConsoleLogger.js"; diff --git a/src/node/features/DirectoryTool/DirectoryTool.ts b/src/node/features/DirectoryTool/DirectoryTool.ts index 41e9972..eacffc2 100644 --- a/src/node/features/DirectoryTool/DirectoryTool.ts +++ b/src/node/features/DirectoryTool/DirectoryTool.ts @@ -9,13 +9,16 @@ import { constants } from "node:fs"; import { dirname } from "node:path"; -import fg from "fast-glob"; import { DirectoryTool as DirectoryToolAbstraction } from "./abstractions/DirectoryTool.js"; import type { GlobOptions } from "./abstractions/DirectoryTool.js"; -import { Logger, ConsoleLogger } from "~/common/index.js"; +import { Logger, ConsoleLogger } from "~/common/features/Logger/index.js"; +import { createGlobTool, GlobTool } from "../GlobTool/index.js"; class DirectoryToolImpl implements DirectoryToolAbstraction.Interface { - public constructor(private readonly logger: Logger.Interface) {} + public constructor( + private readonly logger: Logger.Interface, + private readonly globTool: GlobTool.Interface + ) {} public exists(path: string): boolean { return existsSync(path); @@ -77,7 +80,7 @@ class DirectoryToolImpl implements DirectoryToolAbstraction.Interface { if (!existsSync(cwd)) { return []; } - return fg.sync(pattern, { + return this.globTool.findAll(pattern, { cwd, dot: options?.dot, ignore: options?.ignore, @@ -90,15 +93,19 @@ class DirectoryToolImpl implements DirectoryToolAbstraction.Interface { export const DirectoryTool = DirectoryToolAbstraction.createImplementation({ implementation: DirectoryToolImpl, - dependencies: [Logger] + dependencies: [Logger, GlobTool] }); export interface CreateDirectoryToolParams { logger?: Logger.Interface; + glob?: GlobTool.Interface; } export function createDirectoryTool( params?: CreateDirectoryToolParams ): DirectoryToolAbstraction.Interface { - return new DirectoryToolImpl(params?.logger ?? new ConsoleLogger()); + return new DirectoryToolImpl( + params?.logger ?? new ConsoleLogger(), + params?.glob || createGlobTool() + ); } diff --git a/src/node/features/GlobTool/GlobTool.ts b/src/node/features/GlobTool/GlobTool.ts new file mode 100644 index 0000000..082128e --- /dev/null +++ b/src/node/features/GlobTool/GlobTool.ts @@ -0,0 +1,45 @@ +import { GlobTool as Abstraction } from "./abstractions/index.js"; +import { globSync } from "tinyglobby"; + +class GlobToolImpl implements Abstraction.Interface { + public findAll(patterns: string | string[], options?: Abstraction.AllOptions): string[] { + return this.stripTrailingSlashes(globSync(patterns, options)); + } + + public findFiles(patterns: string | string[], options?: Abstraction.FilesOptions): string[] { + return globSync(patterns, { + ...options, + onlyFiles: true + }); + } + + public findDirectories( + patterns: string | string[], + options?: Abstraction.DirectoriesOptions + ): string[] { + return this.stripTrailingSlashes( + globSync(patterns, { + ...options, + onlyDirectories: true + }) + ); + } + + private stripTrailingSlashes(paths: string[]): string[] { + return paths.map(function (p) { + if (p.at(-1) !== "/") { + return p; + } + return p.slice(0, -1); + }); + } +} + +export const GlobTool = Abstraction.createImplementation({ + implementation: GlobToolImpl, + dependencies: [] +}); + +export const createGlobTool = (): Abstraction.Interface => { + return new GlobToolImpl(); +}; diff --git a/src/node/features/GlobTool/README.md b/src/node/features/GlobTool/README.md new file mode 100644 index 0000000..75df463 --- /dev/null +++ b/src/node/features/GlobTool/README.md @@ -0,0 +1,47 @@ +--- +name: glob-tool +description: Find files and directories by glob pattern using tinyglobby. +context: node +--- + +# GlobTool + +Finds files and directories matching glob patterns using [tinyglobby](https://github.com/SuperchilliDev/tinyglobby). Three methods: `findAll` returns everything matching the pattern, `findFiles` returns only files, and `findDirectories` returns only directories. + +## Interface + +```ts +interface IGlobTool { + /** Finds all items matching the pattern. Pass GlobOptions to control behavior. */ + findAll(patterns: string | string[], options?: GlobOptions): string[]; + /** Finds only files matching the pattern. */ + findFiles(patterns: string | string[], options?: FilesOptions): string[]; + /** Finds only directories matching the pattern. */ + findDirectories(patterns: string | string[], options?: DirectoriesOptions): string[]; +} +``` + +## Usage + +### With DI + +```ts +import { Container } from "@webiny/di"; +import { GlobTool, GlobToolFeature } from "@webiny/stdlib/node"; + +const container = new Container(); +GlobToolFeature.register(container); + +const glob = container.resolve(GlobTool); +const files = glob.findFiles("**/*.ts", { cwd: "/my/project" }); +``` + +### Without DI + +```ts +import { createGlobTool } from "@webiny/stdlib/node"; + +const glob = createGlobTool(); +const files = glob.findFiles("**/*.ts", { cwd: "/my/project" }); +const dirs = glob.findDirectories("*", { cwd: "/my/project" }); +``` diff --git a/src/node/features/GlobTool/abstractions/GlobTool.ts b/src/node/features/GlobTool/abstractions/GlobTool.ts new file mode 100644 index 0000000..fe811f0 --- /dev/null +++ b/src/node/features/GlobTool/abstractions/GlobTool.ts @@ -0,0 +1,21 @@ +import { createAbstraction } from "~/common/index.js"; +import type { GlobOptions } from "tinyglobby"; + +export type IGlobToolAllOptions = GlobOptions; +export type IGlobToolDirectoriesOptions = Omit; +export type IGlobToolFilesOptions = Omit; + +export interface IGlobTool { + findAll(patterns: string | string[], options?: IGlobToolAllOptions): string[]; + findFiles(patterns: string | string[], options?: IGlobToolFilesOptions): string[]; + findDirectories(patterns: string | string[], options?: IGlobToolDirectoriesOptions): string[]; +} + +export const GlobTool = createAbstraction("Core/GlobTool"); + +export namespace GlobTool { + export type Interface = IGlobTool; + export type AllOptions = IGlobToolAllOptions; + export type FilesOptions = IGlobToolFilesOptions; + export type DirectoriesOptions = IGlobToolDirectoriesOptions; +} diff --git a/src/node/features/GlobTool/abstractions/index.ts b/src/node/features/GlobTool/abstractions/index.ts new file mode 100644 index 0000000..ec051b4 --- /dev/null +++ b/src/node/features/GlobTool/abstractions/index.ts @@ -0,0 +1 @@ +export { GlobTool } from "./GlobTool.js"; diff --git a/src/node/features/GlobTool/feature.ts b/src/node/features/GlobTool/feature.ts new file mode 100644 index 0000000..c8bb3a4 --- /dev/null +++ b/src/node/features/GlobTool/feature.ts @@ -0,0 +1,9 @@ +import { createFeature } from "~/common/index.js"; +import { GlobTool } from "./GlobTool.js"; + +export const GlobToolFeature = createFeature({ + name: "Core/GlobToolFeature", + register(container) { + container.register(GlobTool).inSingletonScope(); + } +}); diff --git a/src/node/features/GlobTool/index.ts b/src/node/features/GlobTool/index.ts new file mode 100644 index 0000000..73612cf --- /dev/null +++ b/src/node/features/GlobTool/index.ts @@ -0,0 +1,3 @@ +export { GlobTool } from "./abstractions/index.js"; +export { GlobToolFeature } from "./feature.js"; +export { createGlobTool } from "./GlobTool.js"; diff --git a/src/node/features/WorkspaceTool/WorkspaceTool.ts b/src/node/features/WorkspaceTool/WorkspaceTool.ts index 552dc2e..764355b 100644 --- a/src/node/features/WorkspaceTool/WorkspaceTool.ts +++ b/src/node/features/WorkspaceTool/WorkspaceTool.ts @@ -1,12 +1,12 @@ import { existsSync, readFileSync } from "node:fs"; import { basename, dirname, join, resolve } from "node:path"; -import fg from "fast-glob"; import { WorkspaceTool as WorkspaceToolAbstraction, type ListWorkspacesParams, type WorkspaceInfo } from "./abstractions/WorkspaceTool.js"; import { WorkspaceRootNotFoundError } from "./abstractions/errors.js"; +import { createGlobTool } from "~/node/features/GlobTool/index.js"; function getWorkspacePatterns(workspaces: unknown): string[] | null { if (Array.isArray(workspaces)) { @@ -65,14 +65,19 @@ function readWorkspaceName(dir: string): string { } class WorkspaceToolImpl implements WorkspaceToolAbstraction.Interface { + private readonly glob; + + public constructor() { + this.glob = createGlobTool(); + } + public list(params?: ListWorkspacesParams): WorkspaceInfo[] { const cwd = params?.cwd ?? process.cwd(); const { root, patterns } = findWorkspaceRoot(cwd); const globPatterns = patterns.map(p => p.replace(/\\/g, "/")); - const matched = fg.sync(globPatterns, { + const matched = this.glob.findDirectories(globPatterns, { cwd: root, - onlyDirectories: true, absolute: true }); diff --git a/src/node/index.ts b/src/node/index.ts index 8417b68..2ef982a 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,9 +1,3 @@ -export { - FileTool, - FileToolFeature, - createFileTool, - type CreateFileToolParams -} from "./features/FileTool/index.js"; export { DirectoryTool, DirectoryToolFeature, @@ -11,6 +5,13 @@ export { type CreateDirectoryToolParams, type GlobOptions } from "./features/DirectoryTool/index.js"; +export { + FileTool, + FileToolFeature, + createFileTool, + type CreateFileToolParams +} from "./features/FileTool/index.js"; +export { GlobTool, createGlobTool, GlobToolFeature } from "./features/GlobTool/index.js"; export { JsonFileTool, JsonFileToolFeature, diff --git a/yarn.lock b/yarn.lock index f9841bf..3a3ef11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -318,16 +318,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:2.0.0-alpha.3": - version: 2.0.0-alpha.3 - resolution: "@emnapi/core@npm:2.0.0-alpha.3" - dependencies: - "@emnapi/wasi-threads": "npm:2.0.1" - tslib: "npm:^2.4.0" - checksum: 10c0/dfc26f53eb40dab0e316206cabe01e6e98d21ef8a0b820f81ce7e0fa7b4307c94f2a9599c11e6c601ad7bd77e8efb9b7cb9f86dbc3b6237f799405e0cb60c587 - languageName: node - linkType: hard - "@emnapi/runtime@npm:1.10.0": version: 1.10.0 resolution: "@emnapi/runtime@npm:1.10.0" @@ -337,15 +327,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:2.0.0-alpha.3": - version: 2.0.0-alpha.3 - resolution: "@emnapi/runtime@npm:2.0.0-alpha.3" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/c8f6e0ad2f9c0ced8bc156a7ec3ab5fbbd2d3b7147b6a37537f6892131844b969d3aa450749807fc238160b5db61d6160b8066abfce4b2c40acfb1941bb31dd1 - languageName: node - linkType: hard - "@emnapi/wasi-threads@npm:1.2.1": version: 1.2.1 resolution: "@emnapi/wasi-threads@npm:1.2.1" @@ -355,15 +336,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/wasi-threads@npm:2.0.1": - version: 2.0.1 - resolution: "@emnapi/wasi-threads@npm:2.0.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/5f7bf4cc4f6a1c31ec2084c9321d054f3b3b6c7e89430bb23fc3487d55e7be40f1ff31b2cb9a51721b444d4e8ac1f065b8749606771f6e4e7ccb32bbb709a303 - languageName: node - linkType: hard - "@hono/node-server@npm:^1.19.9 || ^2.0.5": version: 2.0.12 resolution: "@hono/node-server@npm:2.0.12" @@ -480,7 +452,7 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.4, @napi-rs/wasm-runtime@npm:^1.2.0": +"@napi-rs/wasm-runtime@npm:^1.1.4": version: 1.2.2 resolution: "@napi-rs/wasm-runtime@npm:1.2.2" dependencies: @@ -950,111 +922,100 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-android-arm64@npm:1.2.1" +"@rolldown/binding-android-arm64@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-android-arm64@npm:1.2.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-darwin-arm64@npm:1.2.1" +"@rolldown/binding-darwin-arm64@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-darwin-arm64@npm:1.2.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-x64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-darwin-x64@npm:1.2.1" +"@rolldown/binding-darwin-x64@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-darwin-x64@npm:1.2.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-freebsd-x64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-freebsd-x64@npm:1.2.1" +"@rolldown/binding-freebsd-x64@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-freebsd-x64@npm:1.2.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-linux-arm-gnueabihf@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.2.1" +"@rolldown/binding-linux-arm-gnueabihf@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.2.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rolldown/binding-linux-arm64-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.2.1" +"@rolldown/binding-linux-arm64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.2.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-arm64-musl@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.2.1" +"@rolldown/binding-linux-arm64-musl@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.2.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-linux-ppc64-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.2.1" +"@rolldown/binding-linux-ppc64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.2.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-s390x-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.2.1" +"@rolldown/binding-linux-s390x-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.2.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.2.1" +"@rolldown/binding-linux-x64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.2.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-musl@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.2.1" +"@rolldown/binding-linux-x64-musl@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.2.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-openharmony-arm64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.2.1" +"@rolldown/binding-openharmony-arm64@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.2.2" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-wasm32-wasi@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.2.1" - dependencies: - "@emnapi/core": "npm:2.0.0-alpha.3" - "@emnapi/runtime": "npm:2.0.0-alpha.3" - "@napi-rs/wasm-runtime": "npm:^1.2.0" - checksum: 10c0/e5bbfad1862187c60cd9cab802af22c71b2496f89fe73a161931f04594f9db1e09ad7a503a2f980f55a2f6d5a4d2013ad1d17260970ac170a1aa6b9286a41738 - languageName: node - linkType: hard - -"@rolldown/binding-win32-arm64-msvc@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.2.1" +"@rolldown/binding-win32-arm64-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.2.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-win32-x64-msvc@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.2.1" +"@rolldown/binding-win32-x64-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.2.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1406,7 +1367,6 @@ __metadata: adio: "npm:^3.0.1" bson-objectid: "npm:^2.0.4" dot-prop: "npm:^10.2.0" - fast-glob: "npm:^3.3.3" happy-dom: "npm:^20.11.1" nanoid: "npm:^6.0.0" nanoid-dictionary: "npm:^5.0.0" @@ -1414,6 +1374,7 @@ __metadata: oxlint: "npm:^1.76.0" pino: "npm:^10.3.1" pino-pretty: "npm:^13.1.3" + tinyglobby: "npm:^0.2.17" type-fest: "npm:^5.8.0" typescript: "npm:^7.0.2" vitest: "npm:^4.1.10" @@ -2068,7 +2029,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.3": +"fast-glob@npm:^3.2.9": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -2916,11 +2877,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.16": - version: 3.3.16 - resolution: "nanoid@npm:3.3.16" + version: 3.3.17 + resolution: "nanoid@npm:3.3.17" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/bbf2dcffe22d2b62d16de2711752070b539c0f644c7916f823ad6521986b2078cbe524f2d6240f58c46e9141ea0c7b87a029e100c0f7f175228cacaf30e41bba + checksum: 10c0/06f7949c7cce5c92c6aea66022f29a1eae7f56e05acbfddf1e049e819b4bf234c44a765cc44da7163482b111677948514012e27acdfa56f95309295768bdae32 languageName: node linkType: hard @@ -3631,25 +3592,24 @@ __metadata: linkType: hard "rolldown@npm:~1.2.0": - version: 1.2.1 - resolution: "rolldown@npm:1.2.1" + version: 1.2.2 + resolution: "rolldown@npm:1.2.2" dependencies: "@oxc-project/types": "npm:=0.142.0" - "@rolldown/binding-android-arm64": "npm:1.2.1" - "@rolldown/binding-darwin-arm64": "npm:1.2.1" - "@rolldown/binding-darwin-x64": "npm:1.2.1" - "@rolldown/binding-freebsd-x64": "npm:1.2.1" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.2.1" - "@rolldown/binding-linux-arm64-gnu": "npm:1.2.1" - "@rolldown/binding-linux-arm64-musl": "npm:1.2.1" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.2.1" - "@rolldown/binding-linux-s390x-gnu": "npm:1.2.1" - "@rolldown/binding-linux-x64-gnu": "npm:1.2.1" - "@rolldown/binding-linux-x64-musl": "npm:1.2.1" - "@rolldown/binding-openharmony-arm64": "npm:1.2.1" - "@rolldown/binding-wasm32-wasi": "npm:1.2.1" - "@rolldown/binding-win32-arm64-msvc": "npm:1.2.1" - "@rolldown/binding-win32-x64-msvc": "npm:1.2.1" + "@rolldown/binding-android-arm64": "npm:1.2.2" + "@rolldown/binding-darwin-arm64": "npm:1.2.2" + "@rolldown/binding-darwin-x64": "npm:1.2.2" + "@rolldown/binding-freebsd-x64": "npm:1.2.2" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.2.2" + "@rolldown/binding-linux-arm64-gnu": "npm:1.2.2" + "@rolldown/binding-linux-arm64-musl": "npm:1.2.2" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.2.2" + "@rolldown/binding-linux-s390x-gnu": "npm:1.2.2" + "@rolldown/binding-linux-x64-gnu": "npm:1.2.2" + "@rolldown/binding-linux-x64-musl": "npm:1.2.2" + "@rolldown/binding-openharmony-arm64": "npm:1.2.2" + "@rolldown/binding-win32-arm64-msvc": "npm:1.2.2" + "@rolldown/binding-win32-x64-msvc": "npm:1.2.2" "@rolldown/pluginutils": "npm:^1.0.0" dependenciesMeta: "@rolldown/binding-android-arm64": @@ -3676,15 +3636,13 @@ __metadata: optional: true "@rolldown/binding-openharmony-arm64": optional: true - "@rolldown/binding-wasm32-wasi": - optional: true "@rolldown/binding-win32-arm64-msvc": optional: true "@rolldown/binding-win32-x64-msvc": optional: true bin: rolldown: ./bin/cli.mjs - checksum: 10c0/d22c80c70d71a36abde7dca7217f66d94cdb5d0c03185205de808d368ab1b8fd5e78ff4db10efc69c5f68a5f9d03d59c8ace848f1f85c4aab79330162a10b3e7 + checksum: 10c0/78a804b9d0947d0569aac5f78ae789b107d097ef94df2ee04b0d89621ca0b62f5336037e6fc1e24209ece2f1d7cbf0d66b27db10b8022684eaf5bea89b9aa97e languageName: node linkType: hard