@neodx/vfs
Version:
Simple virtual file system - working dir context, lazy changes, different modes, integrations and moreover
1 lines • 41.1 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/backend/create-node-fs-backend.ts","../../src/core/context.ts","../../src/backend/shared.ts","../../src/core/scopes.ts","../../src/core/create-base-vfs.ts","../../src/backend/create-readonly-backend.ts","../../src/create-vfs.ts","../../src/create-auto-vfs.ts"],"sourcesContent":["import { readdir } from 'fs/promises';\nimport { ensureFile, exists, isDirectory, isFile, readFile, rm, writeFile } from '@neodx/fs';\nimport type { VfsBackend } from './shared';\n\nexport function createNodeFsBackend() {\n return {\n async read(path) {\n try {\n return await readFile(path);\n } catch {\n return null;\n }\n },\n async write(path, content) {\n await ensureFile(path);\n return await writeFile(path, content);\n },\n async delete(path) {\n return await rm(path, {\n force: true,\n recursive: true\n });\n },\n\n async exists(path) {\n return await exists(path);\n },\n async readDir(path) {\n try {\n const dirents = await readdir(path, {\n withFileTypes: true\n });\n\n return dirents;\n } catch {\n return [];\n }\n },\n\n async isDir(path) {\n return await isDirectory(path);\n },\n async isFile(path) {\n return await isFile(path);\n },\n __: {\n kind: 'node-fs'\n }\n } satisfies VfsBackend;\n}\n","import type { Logger } from '@neodx/log';\nimport { createLogger } from '@neodx/log/node';\nimport { isNull, mapValues, uniqBy } from '@neodx/std';\nimport { normalize, relative, resolve } from 'pathe';\nimport type { VfsBackend } from '../backend';\nimport type { VfsPlugin } from '../create-vfs-plugin';\nimport type { BaseVfs, VfsContentLike, VfsFileMeta, VfsLogger, VfsLogMethod } from './types';\n\nexport interface CreateVfsContextParams {\n log?: VfsLogger;\n logLevel?: VfsLogMethod;\n path: string;\n backend: VfsBackend;\n parent?: VfsContext;\n}\n\nexport const createVfsContext = ({\n parent,\n logLevel,\n log = logLevel ? defaultLogger.fork({ level: logLevel }) : defaultLogger,\n ...params\n}: CreateVfsContextParams): VfsContext => {\n const store = new Map();\n const ctx: VfsContext = {\n log,\n ...params,\n get(path: string) {\n const resolved = ctx.resolve(path);\n\n return ctx.getAllChanges().find(meta => meta.path === resolved) ?? null;\n },\n getAllChanges() {\n return getAndMergeChanges(ctx.__.getAll());\n },\n getAllDirectChanges() {\n return getAndMergeChanges(ctx.__.getScoped());\n },\n getRelativeChanges(path: string) {\n const resolved = trailingSlash(ctx.resolve(path));\n\n return uniqBy(\n ctx.__.getAll()\n .flatMap(ctx => Array.from(ctx.__.getStore().values()))\n .filter(meta => meta.path.startsWith(resolved)),\n meta => meta.path\n );\n },\n registerPath(\n path: string,\n content: VfsContentLike | null = null,\n updatedAfterDelete?: boolean,\n overwrittenDir?: boolean\n ) {\n const resolved = ctx.resolve(path);\n\n updatedAfterDelete ??= Boolean(ctx.get(resolved)?.deleted);\n ctx.__.register(resolved, { deleted: false, content, updatedAfterDelete, overwrittenDir });\n },\n deletePath(path: string) {\n ctx.__.register(ctx.resolve(path), { content: null, deleted: true });\n },\n unregister(path: string) {\n ctx.__.unregister(ctx.resolve(path));\n },\n resolve(...to: string[]) {\n return resolve(ctx.path, ...to);\n },\n relative(path: string): string {\n return relative(ctx.path, resolve(ctx.path, normalize(path)));\n },\n\n backend: mapValues(params.backend, (fn, key) =>\n key === '__'\n ? (fn as any)\n : async (path: string, ...args: any[]) => await (fn as any)(ctx.resolve(path), ...args)\n ),\n __: {\n kind,\n parent,\n plugins: [],\n children: [],\n\n getStore: () => store,\n getAll: () => [...ctx.__.getAncestors(), ctx, ...ctx.__.getDescendants()],\n getScoped: () => [ctx, ...ctx.__.getDescendants()],\n getAncestors: () => getAncestors(ctx),\n getDescendants: () => getDescendants(ctx),\n\n register: (path, overrides) => {\n const currentMeta = ctx.get(path);\n const meta: VfsChangeMeta = {\n ...currentMeta,\n ...overrides,\n path,\n content: isNull(overrides.content) ? overrides.content : Buffer.from(overrides.content),\n relativePath: ctx.relative(path)\n };\n\n ctx.__.getAll().forEach(ctx => ctx.__.getStore().set(path, meta));\n },\n unregister: (path: string) => {\n ctx.__.getAll().forEach(ctx => ctx.__.getStore().delete(path));\n }\n }\n };\n\n if (parent) {\n parent.__.children.push(ctx);\n }\n return ctx;\n};\n\n/**\n * End users should not use context, it's for internal use only.\n * Contains all changes, API for working with them, FS backend, and other useful stuff.\n */\nexport interface VfsContext {\n // path\n\n path: string;\n resolve(...to: string[]): string;\n relative(path: string): string;\n\n // operations\n\n get(path: string): VfsChangeMeta | null;\n\n /**\n * We will sync ALL changes from the current context AND all descendants.\n * Changes from ancestors will be ignored.\n */\n getAllDirectChanges(): VfsChangeMeta[];\n /**\n * We will sync ALL changes from the current context AND all descendants AND all ancestors.\n */\n getAllChanges(): VfsChangeMeta[];\n getRelativeChanges(path: string): VfsChangeMeta[];\n /** Remove file from context. */\n unregister(path: string): void;\n /** Set associated file temporal content and updateAfterDelete flag. */\n registerPath(\n path: string,\n content: VfsContentLike | null,\n updatedAfterDelete?: boolean,\n overwrittenDir?: boolean\n ): void;\n /** Mark path as deleted. */\n deletePath(path: string): void;\n\n // meta\n\n readonly log: Logger<VfsLogMethod>;\n readonly backend: VfsBackend;\n\n /** @internal */\n __: {\n vfs?: BaseVfs;\n kind: typeof kind;\n parent?: VfsContext;\n plugins: VfsPlugin<any>[];\n children: VfsContext[];\n\n getAll: () => VfsContext[];\n getStore: () => Map<string, VfsChangeMeta>;\n getScoped: () => VfsContext[];\n getAncestors: () => VfsContext[];\n getDescendants: () => VfsContext[];\n\n register: (path: string, meta: RegisteredMeta) => void;\n unregister: (path: string) => void;\n };\n}\n\ninterface RegisteredMeta extends Omit<VfsChangeMeta, 'path' | 'relativePath' | 'content'> {\n content: VfsContentLike | null;\n}\n\nexport interface VfsChangeMeta extends VfsFileMeta {\n content: Buffer | null;\n deleted?: boolean;\n /**\n * Indicates that the file or directory was updated after deletion.\n * It could be used to ensure the correct order of operations.\n */\n updatedAfterDelete?: boolean;\n /**\n * The path was originally a directory, but it was overwritten with a file.\n */\n overwrittenDir?: boolean;\n}\n\nexport const isVfsContext = (ctx: any): ctx is VfsContext => ctx?.__?.kind === kind;\n\nconst kind = Symbol('VfsContext');\nconst getAncestors = (ctx: VfsContext): VfsContext[] =>\n ctx.__.parent ? [ctx.__.parent, ...getAncestors(ctx.__.parent)] : [];\nconst getDescendants = (ctx: VfsContext): VfsContext[] =>\n ctx.__.children.flatMap(child => [child, ...getDescendants(child)]);\nconst getAndMergeChanges = (contexts: VfsContext[]): VfsChangeMeta[] =>\n uniqBy(\n contexts.flatMap(ctx => Array.from(ctx.__.getStore().values())),\n meta => meta.path\n );\nconst trailingSlash = (path: string) => (path.endsWith('/') ? path : `${path}/`);\nconst defaultLogger = createLogger({ name: 'vfs', level: 'info' });\n","import type { Asyncable, VfsContentLike } from '../core/types';\n\n/**\n * Implementations for critical base VFS operations.\n * All methods accept absolute paths.\n */\nexport interface VfsBackend {\n /** Read file content or return `null` if file does not exist. */\n read: (path: string) => Asyncable<Buffer | null>;\n /** Write file content. */\n write: (path: string, content: VfsContentLike) => Asyncable<void>;\n /** Check if an entry exists. */\n exists: (path: string) => Asyncable<boolean>;\n /** Delete an entry (recursively if directory). */\n delete: (path: string) => Asyncable<void>;\n /** Read directory entries (non-recursive). */\n readDir: (path: string) => Asyncable<VfsDirent[]>;\n /** Check if an entry is a directory. */\n isDir: (path: string) => Asyncable<boolean>;\n /** Check if an entry is a file. */\n isFile: (path: string) => Asyncable<boolean>;\n\n __?: unknown;\n}\n\n/**\n * A `node:fs.Dirent` compatible interface.\n */\nexport interface VfsDirent {\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n name: string;\n}\n\nexport const getVfsBackendKind = (backend: VfsBackend) =>\n (backend.__ as { kind?: string } | undefined)?.kind ?? 'unknown';\n","import { asyncReduce, fromKeys } from '@neodx/std';\nimport type { VfsPlugin } from '../create-vfs-plugin';\nimport type { VfsContext } from './context';\nimport { createVfsContext } from './context';\nimport { createBaseVfs } from './create-base-vfs';\nimport type { Asyncable, BaseVfs, Pipe, VfsFileAction } from './types';\n\n// Public API\n\nexport type PublicVfs<Vfs extends BaseVfs> = Vfs & PublicVfsApi<Vfs>;\nexport type NonPublicVfs<Vfs extends BaseVfs> = Omit<Vfs, keyof PublicVfsApi<Vfs>>;\nexport interface PublicVfsApi<Vfs extends BaseVfs> {\n /**\n * Creates a new vfs instance under the specified path.\n * All plugins will be inherited.\n * All changes are two-way synced.\n */\n child: (path: string) => PublicVfs<Vfs>;\n /**\n * Immutable extension of the current vfs instance with the specified plugins.\n * You can use it in any order and any number of times.\n * @example\n * const vfs = createHeadlessVfs('/root/path');\n * const enhanced = vfs.pipe(glob(), json());\n * const superEnhanced = vfs.pipe(json()).pipe(glob()).pipe(prettier(), eslint());\n */\n pipe: Pipe<Vfs>;\n}\n\n// Private API\n\nexport type PrivateVfs<Vfs extends BaseVfs> = NonPublicVfs<Vfs> & {\n __: PrivateVfsApi<NonPublicVfs<Vfs>>;\n};\nexport interface PrivateVfsApi<Vfs extends BaseVfs> extends PrivateVfsHookApi<Vfs> {\n context: VfsContext;\n}\nexport interface PrivateVfsHooks<Vfs extends BaseVfs> {\n beforeApplyFile: (action: VfsFileAction, vfs: Vfs) => Asyncable<void>;\n beforeApply: (actions: VfsFileAction[], vfs: Vfs) => Asyncable<void>;\n /**\n * Hook will be called after marking file and all nested files as deleted\n */\n afterDelete: (path: string, vfs: Vfs) => Asyncable<void>;\n}\nexport type PrivateVfsHookName = keyof PrivateVfsHooks<BaseVfs>;\nexport type PrivateVfsHookApi<Vfs extends BaseVfs> = {\n [K in keyof PrivateVfsHooks<Vfs>]: (handler: PrivateVfsHooks<Vfs>[K]) => void;\n};\nexport type PrivateVfsHookRegistry<Vfs extends BaseVfs> = ReturnType<\n typeof createHookRegistry<Vfs>\n>;\n\nexport const createHookRegistry = <Vfs extends BaseVfs>() => {\n const hooks = new Map<PrivateVfsHookName, PrivateVfsHooks<Vfs>[PrivateVfsHookName][]>();\n\n return {\n scope<K extends PrivateVfsHookName>(name: K) {\n const hook = hooks.get(name) ?? [];\n\n hooks.set(name, hook);\n return (handler: PrivateVfsHooks<Vfs>[K]) => hook.push(handler);\n },\n get<K extends PrivateVfsHookName>(name: K) {\n return (hooks.get(name) as PrivateVfsHooks<Vfs>[K][] | null) ?? [];\n },\n async run<K extends PrivateVfsHookName>(\n name: K,\n ...args: Parameters<PrivateVfsHooks<Vfs>[K]>\n ): Promise<void> {\n return asyncReduce(\n this.get(name),\n async (_, handler) => await (handler as any)(...args),\n undefined\n );\n }\n };\n};\n\nexport const toPublicScope = <Vfs extends BaseVfs>(\n vfs: Vfs,\n ctx: VfsContext,\n hooks: PrivateVfsHookRegistry<Vfs>\n): PublicVfs<Vfs> => {\n const privateApi: PrivateVfsApi<Vfs> = {\n context: ctx,\n ...fromKeys(['beforeApply', 'beforeApplyFile', 'afterDelete'], hooks.scope)\n };\n\n return {\n ...vfs,\n __: privateApi,\n child(path: string) {\n const { log, backend } = ctx;\n const childCtx = createVfsContext({\n backend,\n parent: ctx,\n path: ctx.resolve(path),\n log\n });\n\n return pipe(\n createBaseVfs(childCtx),\n childCtx,\n createHookRegistry(),\n ...ctx.__.plugins\n ) as any;\n },\n pipe(...plugins: VfsPlugin<any>[]) {\n return pipe(vfs, ctx, hooks, ...plugins) as any;\n }\n };\n};\n\nconst pipe = <Vfs extends BaseVfs>(\n vfs: Vfs,\n ctx: VfsContext,\n hooks: PrivateVfsHookRegistry<Vfs>,\n ...plugins: VfsPlugin<any>[]\n) => {\n const next = plugins.reduce(\n (next, plugin) =>\n plugin(next, {\n context: ctx,\n ...fromKeys(['beforeApply', 'beforeApplyFile', 'afterDelete'], hooks.scope)\n }),\n vfs\n );\n\n ctx.__.plugins.push(...plugins);\n ctx.__.vfs = next;\n return toPublicScope(next, ctx, hooks);\n};\n","import { colors } from '@neodx/colors';\nimport { createTaskRunner } from '@neodx/internal/tasks';\nimport { concurrently, not, quickPluralize } from '@neodx/std';\nimport { propEq } from '@neodx/std/object';\nimport { dirname } from 'pathe';\nimport { match } from 'ts-pattern';\nimport { getVfsBackendKind } from '../backend/shared';\nimport type { VfsContext } from './context';\nimport {\n deleteVfsPath,\n displayPath,\n existsVfsPath,\n getVfsActions,\n isVfsDir,\n isVfsFile,\n readVfsDir,\n readVfsFile,\n renameVfs,\n tryReadVfsFile,\n writeVfsFile\n} from './operations';\nimport { createHookRegistry, toPublicScope } from './scopes';\nimport type { BaseVfs, VfsFileAction } from './types';\n\nexport function createBaseVfs(ctx: VfsContext) {\n const hooks = createHookRegistry();\n const backendKind = getVfsBackendKind(ctx.backend);\n const { task } = createTaskRunner({ log: ctx.log });\n\n const applyDelete = task(\n 'delete',\n async (action: VfsFileAction) => {\n const reason = match(action)\n .with({ overwrittenDir: true }, () => 'directory overwrite as file')\n .with({ type: 'delete' }, () => 'direct deletion')\n .otherwise(() => 'force deletion for ensure consistency');\n\n ctx.log.info('%s %s (%s)', colors.red('delete'), displayPath(ctx, action.path), reason);\n await ctx.backend.delete(action.path);\n await hooks.run('afterDelete', action.path, getCurrentVfs());\n },\n {\n mapError: (_, action) => `failed to delete \"${action.relativePath}\"`\n }\n );\n\n const applyFile = task(\n 'apply file',\n async (action: Exclude<VfsFileAction, { type: 'delete' }>) => {\n ctx.log.info('%s %s', labels[action.type], displayPath(ctx, action.path));\n\n await hooks.run('beforeApplyFile', action, getCurrentVfs());\n if (action.content) await ctx.backend.write(action.path, action.content);\n ctx.unregister(action.path);\n },\n {\n mapError: (_, action) => `failed to ${action.type} \"${action.relativePath}\"`\n }\n );\n\n const baseVfs: BaseVfs = {\n // @ts-expect-error internal\n [contextSymbol]: ctx,\n\n get log() {\n return ctx.log;\n },\n get path() {\n return ctx.path;\n },\n get dirname() {\n return dirname(ctx.path);\n },\n get virtual() {\n return backendKind === 'in-memory';\n },\n get readonly() {\n return backendKind === 'readonly';\n },\n\n apply: task(\n 'apply',\n async () => {\n const startingChanges = await getVfsActions(ctx);\n\n ctx.log.info(\n 'Applying %d %s...',\n startingChanges.length,\n quickPluralize(startingChanges.length, 'change', 'changes')\n );\n await hooks.run('beforeApply', startingChanges, getCurrentVfs());\n\n const changes = await getVfsActions(ctx);\n const deletions = changes.filter(\n action => action.type === 'delete' || action.updatedAfterDelete || action.overwrittenDir\n );\n\n // First, we need to delete all files and directories that were deleted\n await concurrently(deletions, applyDelete);\n await concurrently(changes.filter(not(propEq('type', 'delete'))), applyFile);\n\n ctx.getAllDirectChanges().forEach(it => ctx.unregister(it.path));\n },\n {\n mapError: () => `failed to apply changes`,\n mapSuccessMessage: () => `applied changes`\n }\n ),\n\n resolve: ctx.resolve,\n relative: ctx.relative,\n\n isDir: path => isVfsDir(ctx, path),\n isFile: path => isVfsFile(ctx, path),\n exists: path => existsVfsPath(ctx, path),\n\n readDir: (async (pathOrParams, params) => {\n const [path, { withFileTypes } = {} as any] =\n typeof pathOrParams === 'string' ? [pathOrParams, params] : [undefined, pathOrParams];\n const entries = await readVfsDir(ctx, path);\n\n return withFileTypes ? entries : entries.map(dirent => dirent.name);\n }) as BaseVfs['readDir'],\n\n read: ((path, encoding) => readVfsFile(ctx, path, encoding)) as BaseVfs['read'],\n write: (path, content) => writeVfsFile(ctx, path, content),\n rename: (from, ...to) => renameVfs(ctx, from, ...to),\n delete: path => deleteVfsPath(ctx, path),\n tryRead: ((path, encoding) => tryReadVfsFile(ctx, path, encoding)) as BaseVfs['tryRead']\n };\n const getCurrentVfs = () => ctx.__.vfs ?? baseVfs;\n\n return toPublicScope(baseVfs, ctx, hooks);\n}\n\nexport const getVfsContext = (vfs: BaseVfs) => (vfs as any)[contextSymbol] as VfsContext;\n\nconst labels = {\n delete: colors.red('delete'),\n create: colors.green('create'),\n update: colors.yellow('update')\n};\nconst contextSymbol = Symbol('context');\n","import { uniqBy } from '@neodx/std';\nimport { resolve } from 'pathe';\nimport { createInMemoryBackend, pathStartsWith } from './create-in-memory-backend';\nimport type { VfsBackend } from './shared';\n\nexport function createReadonlyBackend(backend: VfsBackend) {\n const inMemory = createInMemoryBackend();\n const deleted = (path: string) => {\n const paths = Array.from(inMemory.__.getDeleted());\n\n return (\n paths.includes(path) ||\n paths.some(expectedParentPath => pathStartsWith(path, expectedParentPath))\n );\n };\n\n return {\n read: path => (deleted(path) ? null : inMemory.read(path) ?? backend.read(path)),\n exists: path => !deleted(path) && (inMemory.exists(path) || backend.exists(path)),\n isFile: path => !deleted(path) && (inMemory.isFile(path) || backend.isFile(path)),\n isDir: path => !deleted(path) && (inMemory.isDir(path) || backend.isDir(path)),\n write: inMemory.write,\n delete: inMemory.delete,\n async readDir(path) {\n if (deleted(path)) return [];\n const actual = await backend.readDir(path);\n\n return uniqBy(\n actual.filter(entry => !deleted(resolve(path, entry.name))).concat(inMemory.readDir(path)),\n entry => entry.name\n );\n },\n __: {\n kind: 'readonly'\n }\n } satisfies VfsBackend;\n}\n","import { type AutoLoggerInput } from '@neodx/log';\nimport { createAutoLogger } from '@neodx/log/node';\nimport { isTypeOfBoolean } from '@neodx/std';\nimport type { VfsBackend, VirtualInitializer } from './backend';\nimport { createInMemoryBackend, createNodeFsBackend } from './backend';\nimport { createReadonlyBackend } from './backend/create-readonly-backend';\nimport { createVfsContext } from './core/context';\nimport { createBaseVfs } from './core/create-base-vfs';\nimport type { VfsLogMethod } from './core/types';\nimport { eslint, type EsLintPluginParams } from './plugins/eslint';\nimport { glob } from './plugins/glob.ts';\nimport { json } from './plugins/json.ts';\nimport { packageJson } from './plugins/package-json.ts';\nimport type { PrettierPluginParams } from './plugins/prettier.ts';\nimport { prettier } from './plugins/prettier.ts';\nimport { scan } from './plugins/scan.ts';\n\nexport interface CreateVfsParams extends CreateHeadlessVfsParams {\n /**\n * Params for the `prettier` plugin.\n * Pass `false` or `{ auto: false }` to disable auto formatting.\n * @default true\n */\n prettier?: boolean | PrettierPluginParams;\n /**\n * Params for the `eslint` plugin.\n * Pass `false` or `{ auto: false }` to disable auto fixing.\n * @default true\n */\n eslint?: boolean | EsLintPluginParams;\n}\n\nexport interface CreateHeadlessVfsParams extends CreateDefaultVfsBackendParams {\n /** @see @neodx/log */\n log?: AutoLoggerInput<VfsLogMethod>;\n /** Pass your own vfs backend. */\n backend?: VfsBackend;\n}\n\nexport interface CreateDefaultVfsBackendParams {\n /** If not specified, will use `node:fs` backend. */\n virtual?: boolean | VirtualInitializer;\n /** If true, all operations will be read-only (if you didn't pass your own backend). */\n readonly?: boolean;\n}\n\nexport type Vfs = ReturnType<typeof createVfs>;\n\nexport function createVfs(\n path: string,\n { eslint: eslintParams = true, prettier: prettierParams = true, ...params }: CreateVfsParams = {}\n) {\n return createHeadlessVfs(path, params).pipe(\n json(),\n scan(),\n glob(),\n eslint(isTypeOfBoolean(eslintParams) ? { auto: eslintParams } : eslintParams),\n prettier(isTypeOfBoolean(prettierParams) ? { auto: prettierParams } : prettierParams),\n packageJson()\n );\n}\n\nexport function createHeadlessVfs(\n path: string,\n {\n log = 'error',\n virtual,\n readonly,\n backend = createDefaultVfsBackend(path, { virtual, readonly })\n }: CreateHeadlessVfsParams = {}\n) {\n const context = createVfsContext({\n path,\n log: createAutoLogger(log, { name: 'vfs' }),\n backend\n });\n\n return createBaseVfs(context);\n}\n\nexport function createDefaultVfsBackend(\n path: string,\n { virtual, readonly }: CreateDefaultVfsBackendParams\n) {\n const originalBackend = virtual\n ? createInMemoryBackend(path, virtual === true ? {} : virtual)\n : createNodeFsBackend();\n\n return readonly ? createReadonlyBackend(originalBackend) : originalBackend;\n}\n","import { createVfs, type CreateVfsParams, type Vfs } from './create-vfs.ts';\n\nexport type AutoVfsInput = Vfs | string | (CreateVfsParams & { path: string });\n\nexport function createAutoVfs(input: AutoVfsInput, additionalParams?: CreateVfsParams) {\n if (typeof input === 'string') return createVfs(input, additionalParams);\n if ('path' in input) return createVfs(input.path, { ...additionalParams, ...input });\n return input;\n}\n"],"names":["createNodeFsBackend","read","path","readFile","write","content","ensureFile","writeFile","delete","rm","force","recursive","exists","readDir","dirents","readdir","withFileTypes","isDir","isDirectory","isFile","__","kind","createVfsContext","parent","logLevel","log","defaultLogger","fork","level","params","store","Map","ctx","get","resolved","resolve","getAllChanges","find","meta","getAndMergeChanges","getAll","getAllDirectChanges","getScoped","getRelativeChanges","trailingSlash","uniqBy","flatMap","Array","from","getStore","values","filter","startsWith","registerPath","updatedAfterDelete","overwrittenDir","Boolean","deleted","register","deletePath","unregister","to","relative","normalize","backend","mapValues","fn","key","args","plugins","children","getAncestors","getDescendants","overrides","currentMeta","isNull","Buffer","relativePath","forEach","set","push","Symbol","child","contexts","endsWith","createLogger","name","getVfsBackendKind","createHookRegistry","hooks","scope","hook","handler","run","asyncReduce","_","undefined","toPublicScope","vfs","privateApi","context","fromKeys","childCtx","pipe","createBaseVfs","next","reduce","plugin","backendKind","task","createTaskRunner","applyDelete","action","reason","match","with","type","otherwise","info","colors","red","displayPath","getCurrentVfs","mapError","applyFile","labels","baseVfs","contextSymbol","dirname","virtual","readonly","apply","startingChanges","getVfsActions","length","quickPluralize","changes","deletions","concurrently","not","propEq","it","mapSuccessMessage","isVfsDir","isVfsFile","existsVfsPath","pathOrParams","entries","readVfsDir","map","dirent","encoding","readVfsFile","writeVfsFile","rename","renameVfs","deleteVfsPath","tryRead","tryReadVfsFile","create","green","update","yellow","createReadonlyBackend","inMemory","createInMemoryBackend","paths","getDeleted","includes","some","expectedParentPath","pathStartsWith","actual","entry","concat","createVfs","eslint","eslintParams","prettier","prettierParams","createHeadlessVfs","json","scan","glob","isTypeOfBoolean","auto","packageJson","createDefaultVfsBackend","createAutoLogger","originalBackend","createAutoVfs","input","additionalParams"],"mappings":";;;;;;;;;;;;;;;;;;AAIO,SAASA,mBAAAA,GAAAA;IACd,OAAO;AACL,QAAA,MAAMC,MAAKC,IAAI,EAAA;YACb,IAAI;AACF,gBAAA,OAAO,MAAMC,QAASD,CAAAA,IAAAA,CAAAA,CAAAA;AACxB,aAAA,CAAE,OAAM;gBACN,OAAO,IAAA,CAAA;AACT,aAAA;AACF,SAAA;QACA,MAAME,KAAAA,CAAAA,CAAMF,IAAI,EAAEG,OAAO,EAAA;AACvB,YAAA,MAAMC,UAAWJ,CAAAA,IAAAA,CAAAA,CAAAA;YACjB,OAAO,MAAMK,UAAUL,IAAMG,EAAAA,OAAAA,CAAAA,CAAAA;AAC/B,SAAA;AACA,QAAA,MAAMG,QAAON,IAAI,EAAA;YACf,OAAO,MAAMO,GAAGP,IAAM,EAAA;gBACpBQ,KAAO,EAAA,IAAA;gBACPC,SAAW,EAAA,IAAA;AACb,aAAA,CAAA,CAAA;AACF,SAAA;AAEA,QAAA,MAAMC,QAAOV,IAAI,EAAA;AACf,YAAA,OAAO,MAAMU,MAAOV,CAAAA,IAAAA,CAAAA,CAAAA;AACtB,SAAA;AACA,QAAA,MAAMW,SAAQX,IAAI,EAAA;YAChB,IAAI;gBACF,MAAMY,OAAAA,GAAU,MAAMC,OAAAA,CAAQb,IAAM,EAAA;oBAClCc,aAAe,EAAA,IAAA;AACjB,iBAAA,CAAA,CAAA;gBAEA,OAAOF,OAAAA,CAAAA;AACT,aAAA,CAAE,OAAM;AACN,gBAAA,OAAO,EAAE,CAAA;AACX,aAAA;AACF,SAAA;AAEA,QAAA,MAAMG,OAAMf,IAAI,EAAA;AACd,YAAA,OAAO,MAAMgB,WAAYhB,CAAAA,IAAAA,CAAAA,CAAAA;AAC3B,SAAA;AACA,QAAA,MAAMiB,QAAOjB,IAAI,EAAA;AACf,YAAA,OAAO,MAAMiB,MAAOjB,CAAAA,IAAAA,CAAAA,CAAAA;AACtB,SAAA;QACAkB,EAAI,EAAA;YACFC,IAAM,EAAA,SAAA;AACR,SAAA;AACF,KAAA,CAAA;AACF;;ACjCaC,MAAAA,gBAAAA,GAAmB,CAAC,EAC/BC,MAAM,EACNC,QAAQ,EACRC,GAAMD,GAAAA,QAAAA,GAAWE,aAAcC,CAAAA,IAAI,CAAC;IAAEC,KAAOJ,EAAAA,QAAAA;AAAS,CAAKE,CAAAA,GAAAA,aAAa,EACxE,GAAGG,MACoB,EAAA,GAAA;AACvB,IAAA,MAAMC,QAAQ,IAAIC,GAAAA,EAAAA,CAAAA;AAClB,IAAA,MAAMC,GAAkB,GAAA;AACtBP,QAAAA,GAAAA;AACA,QAAA,GAAGI,MAAM;AACTI,QAAAA,GAAAA,CAAAA,CAAI/B,IAAY,EAAA;YACd,MAAMgC,QAAAA,GAAWF,GAAIG,CAAAA,OAAO,CAACjC,IAAAA,CAAAA,CAAAA;YAE7B,OAAO8B,GAAAA,CAAII,aAAa,EAAA,CAAGC,IAAI,CAACC,CAAAA,IAAQA,GAAAA,IAAAA,CAAKpC,IAAI,KAAKgC,QAAa,CAAA,IAAA,IAAA,CAAA;AACrE,SAAA;AACAE,QAAAA,aAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOG,kBAAmBP,CAAAA,GAAAA,CAAIZ,EAAE,CAACoB,MAAM,EAAA,CAAA,CAAA;AACzC,SAAA;AACAC,QAAAA,mBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOF,kBAAmBP,CAAAA,GAAAA,CAAIZ,EAAE,CAACsB,SAAS,EAAA,CAAA,CAAA;AAC5C,SAAA;AACAC,QAAAA,kBAAAA,CAAAA,CAAmBzC,IAAY,EAAA;AAC7B,YAAA,MAAMgC,QAAWU,GAAAA,aAAAA,CAAcZ,GAAIG,CAAAA,OAAO,CAACjC,IAAAA,CAAAA,CAAAA,CAAAA;AAE3C,YAAA,OAAO2C,MACLb,CAAAA,GAAAA,CAAIZ,EAAE,CAACoB,MAAM,EACVM,CAAAA,OAAO,CAACd,CAAAA,GAAOe,GAAAA,KAAAA,CAAMC,IAAI,CAAChB,IAAIZ,EAAE,CAAC6B,QAAQ,EAAA,CAAGC,MAAM,EAAA,CAAA,CAAA,CAClDC,MAAM,CAACb,CAAAA,IAAQA,GAAAA,IAAAA,CAAKpC,IAAI,CAACkD,UAAU,CAAClB,QAAAA,CAAAA,CAAAA,EACvCI,CAAAA,IAAAA,GAAQA,KAAKpC,IAAI,CAAA,CAAA;AAErB,SAAA;AACAmD,QAAAA,YAAAA,CAAAA,CACEnD,IAAY,EACZG,OAAAA,GAAiC,IAAI,EACrCiD,kBAA4B,EAC5BC,cAAwB,EAAA;YAExB,MAAMrB,QAAAA,GAAWF,GAAIG,CAAAA,OAAO,CAACjC,IAAAA,CAAAA,CAAAA;AAE7BoD,YAAAA,kBAAAA,KAAuBE,OAAQxB,CAAAA,GAAAA,CAAIC,GAAG,CAACC,QAAWuB,CAAAA,EAAAA,OAAAA,CAAAA,CAAAA;AAClDzB,YAAAA,GAAAA,CAAIZ,EAAE,CAACsC,QAAQ,CAACxB,QAAU,EAAA;gBAAEuB,OAAS,EAAA,KAAA;AAAOpD,gBAAAA,OAAAA;AAASiD,gBAAAA,kBAAAA;AAAoBC,gBAAAA,cAAAA;AAAe,aAAA,CAAA,CAAA;AAC1F,SAAA;AACAI,QAAAA,UAAAA,CAAAA,CAAWzD,IAAY,EAAA;AACrB8B,YAAAA,GAAAA,CAAIZ,EAAE,CAACsC,QAAQ,CAAC1B,GAAIG,CAAAA,OAAO,CAACjC,IAAO,CAAA,EAAA;gBAAEG,OAAS,EAAA,IAAA;gBAAMoD,OAAS,EAAA,IAAA;AAAK,aAAA,CAAA,CAAA;AACpE,SAAA;AACAG,QAAAA,UAAAA,CAAAA,CAAW1D,IAAY,EAAA;AACrB8B,YAAAA,GAAAA,CAAIZ,EAAE,CAACwC,UAAU,CAAC5B,GAAAA,CAAIG,OAAO,CAACjC,IAAAA,CAAAA,CAAAA,CAAAA;AAChC,SAAA;AACAiC,QAAAA,OAAAA,CAAAA,CAAQ,GAAG0B,EAAY,EAAA;YACrB,OAAO1B,OAAAA,CAAQH,GAAI9B,CAAAA,IAAI,EAAK2D,GAAAA,EAAAA,CAAAA,CAAAA;AAC9B,SAAA;AACAC,QAAAA,QAAAA,CAAAA,CAAS5D,IAAY,EAAA;YACnB,OAAO4D,QAAAA,CAAS9B,IAAI9B,IAAI,EAAEiC,QAAQH,GAAI9B,CAAAA,IAAI,EAAE6D,SAAU7D,CAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACxD,SAAA;QAEA8D,OAASC,EAAAA,SAAAA,CAAUpC,OAAOmC,OAAO,EAAE,CAACE,EAAIC,EAAAA,GAAAA,GACtCA,QAAQ,IACHD,GAAAA,EAAAA,GACD,OAAOhE,IAAc,EAAA,GAAGkE,OAAgB,MAAOF,GAAWlC,GAAIG,CAAAA,OAAO,CAACjC,IAAUkE,CAAAA,EAAAA,GAAAA,IAAAA,CAAAA,CAAAA;QAEtFhD,EAAI,EAAA;AACFC,YAAAA,IAAAA;AACAE,YAAAA,MAAAA;AACA8C,YAAAA,OAAAA,EAAS,EAAE;AACXC,YAAAA,QAAAA,EAAU,EAAE;AAEZrB,YAAAA,QAAAA,EAAU,IAAMnB,KAAAA;AAChBU,YAAAA,MAAAA,EAAQ,IAAM;uBAAIR,GAAIZ,CAAAA,EAAE,CAACmD,YAAY,EAAA;AAAIvC,oBAAAA,GAAAA;uBAAQA,GAAIZ,CAAAA,EAAE,CAACoD,cAAc,EAAA;AAAG,iBAAA;AACzE9B,YAAAA,SAAAA,EAAW,IAAM;AAACV,oBAAAA,GAAAA;uBAAQA,GAAIZ,CAAAA,EAAE,CAACoD,cAAc,EAAA;AAAG,iBAAA;AAClDD,YAAAA,YAAAA,EAAc,IAAMA,YAAavC,CAAAA,GAAAA,CAAAA;AACjCwC,YAAAA,cAAAA,EAAgB,IAAMA,cAAexC,CAAAA,GAAAA,CAAAA;AAErC0B,YAAAA,QAAAA,EAAU,CAACxD,IAAMuE,EAAAA,SAAAA,GAAAA;gBACf,MAAMC,WAAAA,GAAc1C,GAAIC,CAAAA,GAAG,CAAC/B,IAAAA,CAAAA,CAAAA;AAC5B,gBAAA,MAAMoC,IAAsB,GAAA;AAC1B,oBAAA,GAAGoC,WAAW;AACd,oBAAA,GAAGD,SAAS;AACZvE,oBAAAA,IAAAA;oBACAG,OAASsE,EAAAA,MAAAA,CAAOF,SAAUpE,CAAAA,OAAO,CAAIoE,GAAAA,SAAAA,CAAUpE,OAAO,GAAGuE,MAAO5B,CAAAA,IAAI,CAACyB,SAAAA,CAAUpE,OAAO,CAAA;oBACtFwE,YAAc7C,EAAAA,GAAAA,CAAI8B,QAAQ,CAAC5D,IAAAA,CAAAA;AAC7B,iBAAA,CAAA;AAEA8B,gBAAAA,GAAAA,CAAIZ,EAAE,CAACoB,MAAM,EAAA,CAAGsC,OAAO,CAAC9C,CAAAA,GAAOA,GAAAA,GAAAA,CAAIZ,EAAE,CAAC6B,QAAQ,EAAG8B,CAAAA,GAAG,CAAC7E,IAAMoC,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA;AAC7D,aAAA;AACAsB,YAAAA,UAAAA,EAAY,CAAC1D,IAAAA,GAAAA;AACX8B,gBAAAA,GAAAA,CAAIZ,EAAE,CAACoB,MAAM,EAAA,CAAGsC,OAAO,CAAC9C,CAAAA,GAAOA,GAAAA,GAAAA,CAAIZ,EAAE,CAAC6B,QAAQ,EAAA,CAAGzC,MAAM,CAACN,IAAAA,CAAAA,CAAAA,CAAAA;AAC1D,aAAA;AACF,SAAA;AACF,KAAA,CAAA;AAEA,IAAA,IAAIqB,MAAQ,EAAA;AACVA,QAAAA,MAAAA,CAAOH,EAAE,CAACkD,QAAQ,CAACU,IAAI,CAAChD,GAAAA,CAAAA,CAAAA;AAC1B,KAAA;IACA,OAAOA,GAAAA,CAAAA;AACT,EAAE;AAmFF,MAAMX,OAAO4D,MAAO,CAAA,YAAA,CAAA,CAAA;AACpB,MAAMV,eAAe,CAACvC,GAAAA,GACpBA,IAAIZ,EAAE,CAACG,MAAM,GAAG;QAACS,GAAIZ,CAAAA,EAAE,CAACG,MAAM;WAAKgD,YAAavC,CAAAA,GAAAA,CAAIZ,EAAE,CAACG,MAAM,CAAA;AAAE,KAAA,GAAG,EAAE,CAAA;AACtE,MAAMiD,cAAAA,GAAiB,CAACxC,GAAAA,GACtBA,GAAIZ,CAAAA,EAAE,CAACkD,QAAQ,CAACxB,OAAO,CAACoC,CAAAA,KAAS,GAAA;AAACA,YAAAA,KAAAA;eAAUV,cAAeU,CAAAA,KAAAA,CAAAA;AAAO,SAAA,CAAA,CAAA;AACpE,MAAM3C,kBAAAA,GAAqB,CAAC4C,QAC1BtC,GAAAA,MAAAA,CACEsC,SAASrC,OAAO,CAACd,CAAAA,GAAAA,GAAOe,KAAMC,CAAAA,IAAI,CAAChB,GAAIZ,CAAAA,EAAE,CAAC6B,QAAQ,EAAA,CAAGC,MAAM,EAC3DZ,CAAAA,CAAAA,EAAAA,CAAAA,IAAQA,GAAAA,IAAAA,CAAKpC,IAAI,CAAA,CAAA;AAErB,MAAM0C,aAAgB,GAAA,CAAC1C,IAAkBA,GAAAA,IAAAA,CAAKkF,QAAQ,CAAC,GAAOlF,CAAAA,GAAAA,IAAAA,GAAO,CAAC,EAAEA,IAAK,CAAA,CAAC,CAAC,CAAA;AAC/E,MAAMwB,gBAAgB2D,YAAa,CAAA;IAAEC,IAAM,EAAA,KAAA;IAAO1D,KAAO,EAAA,MAAA;AAAO,CAAA,CAAA;;ACzKzD,MAAM2D,oBAAoB,CAACvB,OAAAA,GAChC,OAAS5C,CAAAA,EAAE,EAAoCC,IAAAA,IAAQ,SAAU;;ACiB5D,MAAMmE,kBAAqB,GAAA,IAAA;AAChC,IAAA,MAAMC,QAAQ,IAAI1D,GAAAA,EAAAA,CAAAA;IAElB,OAAO;AACL2D,QAAAA,KAAAA,CAAAA,CAAoCJ,IAAO,EAAA;AACzC,YAAA,MAAMK,IAAOF,GAAAA,KAAAA,CAAMxD,GAAG,CAACqD,SAAS,EAAE,CAAA;YAElCG,KAAMV,CAAAA,GAAG,CAACO,IAAMK,EAAAA,IAAAA,CAAAA,CAAAA;AAChB,YAAA,OAAO,CAACC,OAAAA,GAAqCD,IAAKX,CAAAA,IAAI,CAACY,OAAAA,CAAAA,CAAAA;AACzD,SAAA;AACA3D,QAAAA,GAAAA,CAAAA,CAAkCqD,IAAO,EAAA;AACvC,YAAA,OAAO,KAACG,CAAMxD,GAAG,CAACqD,SAA8C,EAAE,CAAA;AACpE,SAAA;AACA,QAAA,MAAMO,GACJP,CAAAA,CAAAA,IAAO,EACP,GAAGlB,IAAyC,EAAA;AAE5C,YAAA,OAAO0B,WACL,CAAA,IAAI,CAAC7D,GAAG,CAACqD,IAAAA,CAAAA,EACT,OAAOS,CAAAA,EAAGH,OAAY,GAAA,MAAM,OAACA,CAAAA,GAAmBxB,IAChD4B,CAAAA,EAAAA,SAAAA,CAAAA,CAAAA;AAEJ,SAAA;AACF,KAAA,CAAA;AACF,CAAE,CAAA;AAEK,MAAMC,aAAAA,GAAgB,CAC3BC,GAAAA,EACAlE,GACAyD,EAAAA,KAAAA,GAAAA;AAEA,IAAA,MAAMU,UAAiC,GAAA;QACrCC,OAASpE,EAAAA,GAAAA;AACT,QAAA,GAAGqE,QAAS,CAAA;AAAC,YAAA,aAAA;AAAe,YAAA,iBAAA;AAAmB,YAAA,aAAA;SAAc,EAAEZ,KAAAA,CAAMC,KAAK,CAAC;AAC7E,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,GAAGQ,GAAG;QACN9E,EAAI+E,EAAAA,UAAAA;AACJjB,QAAAA,KAAAA,CAAAA,CAAMhF,IAAY,EAAA;AAChB,YAAA,MAAM,EAAEuB,GAAG,EAAEuC,OAAO,EAAE,GAAGhC,GAAAA,CAAAA;AACzB,YAAA,MAAMsE,WAAWhF,gBAAiB,CAAA;AAChC0C,gBAAAA,OAAAA;gBACAzC,MAAQS,EAAAA,GAAAA;gBACR9B,IAAM8B,EAAAA,GAAAA,CAAIG,OAAO,CAACjC,IAAAA,CAAAA;AAClBuB,gBAAAA,GAAAA;AACF,aAAA,CAAA,CAAA;YAEA,OAAO8E,IAAAA,CACLC,cAAcF,QACdA,CAAAA,EAAAA,QAAAA,EACAd,yBACGxD,GAAIZ,CAAAA,EAAE,CAACiD,OAAO,CAAA,CAAA;AAErB,SAAA;AACAkC,QAAAA,IAAAA,CAAAA,CAAK,GAAGlC,OAAyB,EAAA;YAC/B,OAAOkC,IAAAA,CAAKL,GAAKlE,EAAAA,GAAAA,EAAKyD,KAAUpB,EAAAA,GAAAA,OAAAA,CAAAA,CAAAA;AAClC,SAAA;AACF,KAAA,CAAA;AACF,CAAE,CAAA;AAEF,MAAMkC,IAAO,GAAA,CACXL,GACAlE,EAAAA,GAAAA,EACAyD,OACA,GAAGpB,OAAAA,GAAAA;IAEH,MAAMoC,IAAAA,GAAOpC,QAAQqC,MAAM,CACzB,CAACD,IAAME,EAAAA,MAAAA,GACLA,OAAOF,IAAM,EAAA;YACXL,OAASpE,EAAAA,GAAAA;AACT,YAAA,GAAGqE,QAAS,CAAA;AAAC,gBAAA,aAAA;AAAe,gBAAA,iBAAA;AAAmB,gBAAA,aAAA;aAAc,EAAEZ,KAAAA,CAAMC,KAAK,CAAC;SAE/EQ,CAAAA,EAAAA,GAAAA,CAAAA,CAAAA;AAGFlE,IAAAA,GAAAA,CAAIZ,EAAE,CAACiD,OAAO,CAACW,IAAI,CAAIX,GAAAA,OAAAA,CAAAA,CAAAA;IACvBrC,GAAIZ,CAAAA,EAAE,CAAC8E,GAAG,GAAGO,IAAAA,CAAAA;IACb,OAAOR,aAAAA,CAAcQ,MAAMzE,GAAKyD,EAAAA,KAAAA,CAAAA,CAAAA;AAClC,CAAA;;AC5GO,SAASe,cAAcxE,GAAe,EAAA;AAC3C,IAAA,MAAMyD,KAAQD,GAAAA,kBAAAA,EAAAA,CAAAA;IACd,MAAMoB,WAAAA,GAAcrB,iBAAkBvD,CAAAA,GAAAA,CAAIgC,OAAO,CAAA,CAAA;AACjD,IAAA,MAAM,EAAE6C,IAAI,EAAE,GAAGC,gBAAiB,CAAA;AAAErF,QAAAA,GAAAA,EAAKO,IAAIP,GAAG;AAAC,KAAA,CAAA,CAAA;IAEjD,MAAMsF,WAAAA,GAAcF,IAClB,CAAA,QAAA,EACA,OAAOG,MAAAA,GAAAA;AACL,QAAA,MAAMC,MAASC,GAAAA,KAAAA,CAAMF,MAClBG,CAAAA,CAAAA,IAAI,CAAC;YAAE5D,cAAgB,EAAA,IAAA;SAAQ,EAAA,IAAM,6BACrC4D,CAAAA,CAAAA,IAAI,CAAC;YAAEC,IAAM,EAAA,QAAA;AAAS,SAAA,EAAG,IAAM,iBAAA,CAAA,CAC/BC,SAAS,CAAC,IAAM,uCAAA,CAAA,CAAA;AAEnBrF,QAAAA,GAAAA,CAAIP,GAAG,CAAC6F,IAAI,CAAC,YAAcC,EAAAA,MAAAA,CAAOC,GAAG,CAAC,QAAWC,CAAAA,EAAAA,WAAAA,CAAYzF,GAAKgF,EAAAA,MAAAA,CAAO9G,IAAI,CAAG+G,EAAAA,MAAAA,CAAAA,CAAAA;AAChF,QAAA,MAAMjF,IAAIgC,OAAO,CAACxD,MAAM,CAACwG,OAAO9G,IAAI,CAAA,CAAA;AACpC,QAAA,MAAMuF,MAAMI,GAAG,CAAC,aAAemB,EAAAA,MAAAA,CAAO9G,IAAI,EAAEwH,aAAAA,EAAAA,CAAAA,CAAAA;KAE9C,EAAA;QACEC,QAAU,EAAA,CAAC5B,CAAGiB,EAAAA,MAAAA,GAAW,CAAC,kBAAkB,EAAEA,MAAOnC,CAAAA,YAAY,CAAC,CAAC,CAAC;AACtE,KAAA,CAAA,CAAA;IAGF,MAAM+C,SAAAA,GAAYf,IAChB,CAAA,YAAA,EACA,OAAOG,MAAAA,GAAAA;AACLhF,QAAAA,GAAAA,CAAIP,GAAG,CAAC6F,IAAI,CAAC,SAASO,MAAM,CAACb,MAAOI,CAAAA,IAAI,CAAC,EAAEK,WAAYzF,CAAAA,GAAAA,EAAKgF,OAAO9G,IAAI,CAAA,CAAA,CAAA;AAEvE,QAAA,MAAMuF,KAAMI,CAAAA,GAAG,CAAC,iBAAA,EAAmBmB,MAAQU,EAAAA,aAAAA,EAAAA,CAAAA,CAAAA;AAC3C,QAAA,IAAIV,MAAO3G,CAAAA,OAAO,EAAE,MAAM2B,GAAIgC,CAAAA,OAAO,CAAC5D,KAAK,CAAC4G,MAAAA,CAAO9G,IAAI,EAAE8G,OAAO3G,OAAO,CAAA,CAAA;QACvE2B,GAAI4B,CAAAA,UAAU,CAACoD,MAAAA,CAAO9G,IAAI,CAAA,CAAA;KAE5B,EAAA;AACEyH,QAAAA,QAAAA,EAAU,CAAC5B,CAAAA,EAAGiB,MAAW,GAAA,CAAC,UAAU,EAAEA,MAAAA,CAAOI,IAAI,CAAC,EAAE,EAAEJ,MAAAA,CAAOnC,YAAY,CAAC,CAAC,CAAC;AAC9E,KAAA,CAAA,CAAA;AAGF,IAAA,MAAMiD,OAAmB,GAAA;;AAEvB,QAAA,CAACC,gBAAgB/F,GAAAA;AAEjB,QAAA,IAAIP,GAAM,CAAA,GAAA;AACR,YAAA,OAAOO,IAAIP,GAAG,CAAA;AAChB,SAAA;AACA,QAAA,IAAIvB,IAAO,CAAA,GAAA;AACT,YAAA,OAAO8B,IAAI9B,IAAI,CAAA;AACjB,SAAA;AACA,QAAA,IAAI8H,OAAU,CAAA,GAAA;YACZ,OAAOA,OAAAA,CAAQhG,IAAI9B,IAAI,CAAA,CAAA;AACzB,SAAA;AACA,QAAA,IAAI+H,OAAU,CAAA,GAAA;AACZ,YAAA,OAAOrB,WAAgB,KAAA,WAAA,CAAA;AACzB,SAAA;AACA,QAAA,IAAIsB,QAAW,CAAA,GAAA;AACb,YAAA,OAAOtB,WAAgB,KAAA,UAAA,CAAA;AACzB,SAAA;AAEAuB,QAAAA,KAAAA,EAAOtB,KACL,OACA,EAAA,UAAA;YACE,MAAMuB,eAAAA,GAAkB,MAAMC,aAAcrG,CAAAA,GAAAA,CAAAA,CAAAA;AAE5CA,YAAAA,GAAAA,CAAIP,GAAG,CAAC6F,IAAI,CACV,mBACAc,EAAAA,eAAAA,CAAgBE,MAAM,EACtBC,cAAeH,CAAAA,eAAAA,CAAgBE,MAAM,EAAE,QAAU,EAAA,SAAA,CAAA,CAAA,CAAA;AAEnD,YAAA,MAAM7C,KAAMI,CAAAA,GAAG,CAAC,aAAA,EAAeuC,eAAiBV,EAAAA,aAAAA,EAAAA,CAAAA,CAAAA;YAEhD,MAAMc,OAAAA,GAAU,MAAMH,aAAcrG,CAAAA,GAAAA,CAAAA,CAAAA;AACpC,YAAA,MAAMyG,SAAYD,GAAAA,OAAAA,CAAQrF,MAAM,CAC9B6D,CAAAA,MAAUA,GAAAA,MAAAA,CAAOI,IAAI,KAAK,QAAYJ,IAAAA,MAAAA,CAAO1D,kBAAkB,IAAI0D,OAAOzD,cAAc,CAAA,CAAA;;AAI1F,YAAA,MAAMmF,aAAaD,SAAW1B,EAAAA,WAAAA,CAAAA,CAAAA;AAC9B,YAAA,MAAM2B,aAAaF,OAAQrF,CAAAA,MAAM,CAACwF,GAAIC,CAAAA,MAAAA,CAAO,QAAQ,QAAahB,CAAAA,CAAAA,CAAAA,EAAAA,SAAAA,CAAAA,CAAAA;YAElE5F,GAAIS,CAAAA,mBAAmB,EAAGqC,CAAAA,OAAO,CAAC+D,CAAAA,KAAM7G,GAAI4B,CAAAA,UAAU,CAACiF,EAAAA,CAAG3I,IAAI,CAAA,CAAA,CAAA;SAEhE,EAAA;YACEyH,QAAU,EAAA,IAAM,CAAC,uBAAuB,CAAC;YACzCmB,iBAAmB,EAAA,IAAM,CAAC,eAAe,CAAC;AAC5C,SAAA,CAAA;AAGF3G,QAAAA,OAAAA,EAASH,IAAIG,OAAO;AACpB2B,QAAAA,QAAAA,EAAU9B,IAAI8B,QAAQ;QAEtB7C,KAAOf,EAAAA,CAAAA,IAAQ6I,GAAAA,QAAAA,CAAS/G,GAAK9B,EAAAA,IAAAA,CAAAA;QAC7BiB,MAAQjB,EAAAA,CAAAA,IAAQ8I,GAAAA,SAAAA,CAAUhH,GAAK9B,EAAAA,IAAAA,CAAAA;QAC/BU,MAAQV,EAAAA,CAAAA,IAAQ+I,GAAAA,aAAAA,CAAcjH,GAAK9B,EAAAA,IAAAA,CAAAA;AAEnCW,QAAAA,OAAAA,EAAU,OAAOqI,YAAcrH,EAAAA,MAAAA,GAAAA;AAC7B,YAAA,MAAM,CAAC3B,IAAAA,EAAM,EAAEc,aAAa,EAAE,GAAG,EAAS,CAAC,GACzC,OAAOkI,YAAAA,KAAiB,QAAW,GAAA;AAACA,gBAAAA,YAAAA;AAAcrH,gBAAAA,MAAAA;aAAO,GAAG;AAACmE,gBAAAA,SAAAA;AAAWkD,gBAAAA,YAAAA;AAAa,aAAA,CAAA;YACvF,MAAMC,OAAAA,GAAU,MAAMC,UAAAA,CAAWpH,GAAK9B,EAAAA,IAAAA,CAAAA,CAAAA;YAEtC,OAAOc,aAAAA,GAAgBmI,UAAUA,OAAQE,CAAAA,GAAG,CAACC,CAAAA,MAAAA,GAAUA,OAAOhE,IAAI,CAAA,CAAA;AACpE,SAAA;AAEArF,QAAAA,IAAAA,EAAO,CAACC,IAAAA,EAAMqJ,QAAaC,GAAAA,WAAAA,CAAYxH,KAAK9B,IAAMqJ,EAAAA,QAAAA,CAAAA;AAClDnJ,QAAAA,KAAAA,EAAO,CAACF,IAAAA,EAAMG,OAAYoJ,GAAAA,YAAAA,CAAazH,KAAK9B,IAAMG,EAAAA,OAAAA,CAAAA;AAClDqJ,QAAAA,MAAAA,EAAQ,CAAC1G,IAAM,EAAA,GAAGa,EAAO8F,GAAAA,SAAAA,CAAU3H,KAAKgB,IAASa,EAAAA,GAAAA,EAAAA,CAAAA;QACjDrD,MAAQN,EAAAA,CAAAA,IAAQ0J,GAAAA,aAAAA,CAAc5H,GAAK9B,EAAAA,IAAAA,CAAAA;AACnC2J,QAAAA,OAAAA,EAAU,CAAC3J,IAAAA,EAAMqJ,QAAaO,GAAAA,cAAAA,CAAe9H,KAAK9B,IAAMqJ,EAAAA,QAAAA,CAAAA;AAC1D,KAAA,CAAA;AACA,IAAA,MAAM7B,gBAAgB,IAAM1F,GAAAA,CAAIZ,EAAE,CAAC8E,GAAG,IAAI4B,OAAAA,CAAAA;IAE1C,OAAO7B,aAAAA,CAAc6B,SAAS9F,GAAKyD,EAAAA,KAAAA,CAAAA,CAAAA;AACrC,CAAA;AAIA,MAAMoC,MAAS,GAAA;IACbrH,MAAQ+G,EAAAA,MAAAA,CAAOC,GAAG,CAAC,QAAA,CAAA;IACnBuC,MAAQxC,EAAAA,MAAAA,CAAOyC,KAAK,CAAC,QAAA,CAAA;IACrBC,MAAQ1C,EAAAA,MAAAA,CAAO2C,MAAM,CAAC,QAAA,CAAA;AACxB,CAAA,CAAA;AACA,MAAMnC,gBAAgB9C,MAAO,CAAA,SAAA,CAAA;;ACzItB,SAASkF,sBAAsBnG,OAAmB,EAAA;AACvD,IAAA,MAAMoG,QAAWC,GAAAA,qBAAAA,EAAAA,CAAAA;AACjB,IAAA,MAAM5G,UAAU,CAACvD,IAAAA,GAAAA;AACf,QAAA,MAAMoK,QAAQvH,KAAMC,CAAAA,IAAI,CAACoH,QAAShJ,CAAAA,EAAE,CAACmJ,UAAU,EAAA,CAAA,CAAA;QAE/C,OACED,KAAAA,CAAME,QAAQ,CAACtK,IACfoK,CAAAA,IAAAA,KAAAA,CAAMG,IAAI,CAACC,CAAAA,kBAAsBC,GAAAA,cAAAA,CAAezK,IAAMwK,EAAAA,kBAAAA,CAAAA,CAAAA,CAAAA;AAE1D,KAAA,CAAA;IAEA,OAAO;QACLzK,IAAMC,EAAAA,CAAAA,IAASuD,GAAAA,OAAAA,CAAQvD,IAAQ,CAAA,GAAA,IAAA,GAAOkK,QAASnK,CAAAA,IAAI,CAACC,IAAAA,CAAAA,IAAS8D,OAAQ/D,CAAAA,IAAI,CAACC,IAAAA,CAAAA;AAC1EU,QAAAA,MAAAA,EAAQV,CAAAA,IAAAA,GAAQ,CAACuD,OAAAA,CAAQvD,IAAUkK,CAAAA,KAAAA,QAASxJ,CAAAA,MAAM,CAACV,IAAAA,CAAAA,IAAS8D,OAAQpD,CAAAA,MAAM,CAACV,IAAI,CAAA,CAAA;AAC/EiB,QAAAA,MAAAA,EAAQjB,CAAAA,IAAAA,GAAQ,CAACuD,OAAAA,CAAQvD,IAAUkK,CAAAA,KAAAA,QAASjJ,CAAAA,MAAM,CAACjB,IAAAA,CAAAA,IAAS8D,OAAQ7C,CAAAA,MAAM,CAACjB,IAAI,CAAA,CAAA;AAC/Ee,QAAAA,KAAAA,EAAOf,CAAAA,IAAAA,GAAQ,CAACuD,OAAAA,CAAQvD,IAAUkK,CAAAA,KAAAA,QAASnJ,CAAAA,KAAK,CAACf,IAAAA,CAAAA,IAAS8D,OAAQ/C,CAAAA,KAAK,CAACf,IAAI,CAAA,CAAA;AAC5EE,QAAAA,KAAAA,EAAOgK,SAAShK,KAAK;AACrBI,QAAAA,MAAAA,EAAQ4J,SAAS5J,MAAM;AACvB,QAAA,MAAMK,SAAQX,IAAI,EAAA;YAChB,IAAIuD,OAAAA,CAAQvD,IAAO,CAAA,EAAA,OAAO,EAAE,CAAA;AAC5B,YAAA,MAAM0K,MAAS,GAAA,MAAM5G,OAAQnD,CAAAA,OAAO,CAACX,IAAAA,CAAAA,CAAAA;YAErC,OAAO2C,MAAAA,CACL+H,OAAOzH,MAAM,CAAC0H,CAAAA,KAAS,GAAA,CAACpH,OAAQtB,CAAAA,OAAAA,CAAQjC,IAAM2K,EAAAA,KAAAA,CAAMvF,IAAI,CAAIwF,CAAAA,CAAAA,CAAAA,MAAM,CAACV,QAASvJ,CAAAA,OAAO,CAACX,IACpF2K,CAAAA,CAAAA,EAAAA,CAAAA,KAASA,GAAAA,KAAAA,CAAMvF,IAAI,CAAA,CAAA;AAEvB,SAAA;QACAlE,EAAI,EAAA;YACFC,IAAM,EAAA,UAAA;AACR,SAAA;AACF,KAAA,CAAA;AACF;;ACYO,SAAS0J,SACd7K,CAAAA,IAAY,EACZ,EAAE8K,QAAQC,YAAe,GAAA,IAAI,EAAEC,QAAAA,EAAUC,iBAAiB,IAAI,EAAE,GAAGtJ,MAAyB,EAAA,GAAG,EAAE,EAAA;IAEjG,OAAOuJ,iBAAAA,CAAkBlL,IAAM2B,EAAAA,MAAAA,CAAAA,CAAQ0E,IAAI,CACzC8E,QACAC,IACAC,EAAAA,EAAAA,IAAAA,EAAAA,EACAP,MAAOQ,CAAAA,eAAAA,CAAgBP,YAAgB,CAAA,GAAA;QAAEQ,IAAMR,EAAAA,YAAAA;KAAiBA,GAAAA,YAAAA,CAAAA,EAChEC,QAASM,CAAAA,eAAAA,CAAgBL,cAAkB,CAAA,GAAA;QAAEM,IAAMN,EAAAA,cAAAA;AAAe,KAAA,GAAIA,cACtEO,CAAAA,EAAAA,WAAAA,EAAAA,CAAAA,CAAAA;AAEJ,CAAA;AAEO,SAASN,iBAAAA,CACdlL,IAAY,EACZ,EACEuB,GAAM,GAAA,OAAO,EACbwG,OAAO,EACPC,QAAQ,EACRlE,OAAAA,GAAU2H,wBAAwBzL,IAAM,EAAA;AAAE+H,IAAAA,OAAAA;AAASC,IAAAA,QAAAA;AAAS,CAAE,CAAA,EACtC,GAAG,EAAE,EAAA;AAE/B,IAAA,MAAM9B,UAAU9E,gBAAiB,CAAA;AAC/BpB,QAAAA,IAAAA;AACAuB,QAAAA,GAAAA,EAAKmK,iBAAiBnK,GAAK,EAAA;YAAE6D,IAAM,EAAA,KAAA;AAAM,SAAA,CAAA;AACzCtB,QAAAA,OAAAA;AACF,KAAA,CAAA,CAAA;AAEA,IAAA,OAAOwC,aAAcJ,CAAAA,OAAAA,CAAAA,CAAAA;AACvB,CAAA;AAEO,SAASuF,wBACdzL,IAAY,EACZ,EAAE+H,OAAO,EAAEC,QAAQ,EAAiC,EAAA;IAEpD,MAAM2D,eAAAA,GAAkB5D,UACpBoC,qBAAsBnK,CAAAA,IAAAA,EAAM+H,YAAY,IAAO,GAAA,KAAKA,OACpDjI,CAAAA,GAAAA,mBAAAA,EAAAA,CAAAA;IAEJ,OAAOkI,QAAAA,GAAWiC,sBAAsB0B,eAAmBA,CAAAA,GAAAA,eAAAA,CAAAA;AAC7D;;ACrFO,SAASC,aAAAA,CAAcC,KAAmB,EAAEC,gBAAkC,EAAA;AACnF,IAAA,IAAI,OAAOD,KAAAA,KAAU,QAAU,EAAA,OAAOhB,UAAUgB,KAAOC,EAAAA,gBAAAA,CAAAA,CAAAA;AACvD,IAAA,IAAI,UAAUD,KAAO,EAAA,OAAOhB,SAAUgB,CAAAA,KAAAA,CAAM7L,IAAI,EAAE;AAAE,QAAA,GAAG8L,gBAAgB;AAAE,QAAA,GAAGD,KAAK;AAAC,KAAA,CAAA,CAAA;IAClF,OAAOA,KAAAA,CAAAA;AACT;;;;"}