@vryzel/file-next 0.5.2 → 0.6.0
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/README.md +2 -1
- package/dist/{filesystem-Djiiu6YU.d.ts → filesystem-CF4TFF58.d.ts} +18 -122
- package/dist/{filesystem-C0vVDtg4.d.cts → filesystem-CFRC-gky.d.cts} +18 -122
- package/dist/index.cjs +52 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +52 -35
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +186 -78
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +34 -110
- package/dist/server/index.d.ts +34 -110
- package/dist/server/index.js +186 -78
- package/dist/server/index.js.map +1 -1
- package/dist/sync/index.cjs +33 -10
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.js +33 -10
- package/dist/sync/index.js.map +1 -1
- package/dist/{with-auth-OZNiZGga.d.ts → with-auth-BvFHyioA.d.ts} +1 -1
- package/dist/{with-auth-Dtn57B_S.d.cts → with-auth-UBz99KZJ.d.cts} +1 -1
- package/package.json +5 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/result.ts","../src/errors/mappers.ts","../src/errors/index.ts","../src/types/branded.ts","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/class-group-utils.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/lru-cache.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/parse-class-name.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/config-utils.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/merge-classlist.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/tw-join.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/from-theme.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/validators.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/default-config.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/cn.ts","../src/storage/s3-adapter/list.ts","../src/storage/s3-adapter/read.ts","../src/storage/s3-adapter/stat.ts","../src/storage/s3-adapter/get-metadata.ts","../src/storage/s3-adapter/multipart.ts","../src/storage/s3-adapter/write.ts","../src/storage/s3-adapter/delete.ts","../src/storage/s3-adapter/exists.ts","../src/storage/s3-adapter/copy.ts","../src/storage/s3-adapter/move.ts","../src/storage/s3-adapter/set-metadata.ts","../src/storage/content-disposition.ts","../src/storage/s3-adapter/presigned.ts","../src/storage/s3-adapter/get-public-url.ts","../src/storage/s3-adapter/client.ts","../src/storage/s3-adapter/index.ts","../src/storage/memory-adapter/index.ts","../src/storage/config.ts","../src/storage/prefix-adapter.ts","../src/storage/factory.ts","../src/auth/with-auth.ts","../src/storage/singleton.ts","../src/metadata/node-name.ts","../src/metadata/cursor.ts","../src/metadata/memory-store.ts","../src/metadata/sanitize.ts","../src/metadata/sqlite-store.ts","../src/metadata/postgres-store.ts"],"names":["r","fallback","err","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","has","set","func","classGroupEntries","map","prefixedClassGroup","fromEntries","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","isArbitraryVariant","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","getNumberWithAutoAndArbitrary","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","span","row","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","text","font","tracking","leading","list","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","repeat","from","via","to","rounded","border","divide","outline","ring","shadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","twMerge","ListObjectsV2Command","GetObjectCommand","HeadObjectCommand","CreateMultipartUploadCommand","UploadPartCommand","CompleteMultipartUploadCommand","AbortMultipartUploadCommand","PutObjectCommand","DeleteObjectCommand","CopyObjectCommand","getSignedUrl","S3Client","createMultipartUpload","uploadPart","completeMultipartUpload","abortMultipartUpload","getMetadata","setMetadata","createPresignedUploadUrl","createPresignedDownloadUrl","getPublicUrl","randomUUID","pathToFileURL","createRequire","rowToPendingOrphan","rowToFileNode","SCHEMA_VERSION","MIGRATION_SQL","runMigrations","buildInner"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Discriminated `Result<T, E>` for typed error returns.\n *\n * Why Result over throw at boundaries:\n * - No `any` at the call site (vs try/catch which loses the type).\n * - `switch (r.ok)` narrows the type in consumer code.\n * - The wire shape `{ ok, value | error }` is JSON-serializable,\n * so it survives the RSC boundary without an extra DTO.\n * - Helpers (`map`, `andThen`, `unwrap`) make the common shapes\n * (chain, bail-out, recover) terse and exhaustive.\n *\n * The default error type is `FileSystemError` (see `@/errors`).\n * Consumers can specialize: `Result<User, ZodError>`.\n *\n * All helpers are pure functions; they do NOT allocate closures in\n * hot paths beyond what the spec demands (no `try`/`catch` wrapping).\n */\n\nimport { FileSystemError } from \"@/errors\";\n\nexport type Result<T, E = FileSystemError> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: E };\n\nexport const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });\n\nexport const err = <E>(error: E): Result<never, E> => ({ ok: false, error });\n\nexport const map = <T, U, E>(\n r: Result<T, E>,\n f: (t: T) => U,\n): Result<U, E> => (r.ok ? ok(f(r.value)) : r);\n\nexport const mapErr = <T, E, F>(\n r: Result<T, E>,\n f: (e: E) => F,\n): Result<T, F> => (r.ok ? r : err(f(r.error)));\n\nexport const andThen = <T, U, E>(\n r: Result<T, E>,\n f: (t: T) => Result<U, E>,\n): Result<U, E> => (r.ok ? f(r.value) : r);\n\nexport const unwrap = <T, E>(r: Result<T, E>): T => {\n if (r.ok) return r.value;\n throw r.error;\n};\n\nexport const unwrapOr = <T, E>(r: Result<T, E>, fallback: T): T =>\n r.ok ? r.value : fallback;\n","/**\n * Upstream error mappers for FileSystemError.\n *\n * Each mapper is a pure function `(*unknown) -> FileSystemError`.\n * The class re-exposes them as static methods (FileSystemError.fromAws\n * etc.) so callers can pick the import style that fits.\n *\n * Mapping strategy:\n * 1. If the input is already a FileSystemError, return it as-is\n * (we never re-wrap our own errors).\n * 2. Try the most specific signal first: S3 `name`, Postgres\n * SQLSTATE, SQLite extended code.\n * 3. Fall back to the HTTP status code (AWS SDK v3 exposes\n * `$metadata.httpStatusCode`).\n * 4. Last resort: InternalError, retryable, with the original\n * payload in `cause`.\n *\n * Provider-specific codes are preserved on `cause.code` (e.g. S3\n * \"NoSuchKey\", Postgres \"23505\") so callers can still branch on\n * them while the top-level `code` stays in the 11-code spec catalog.\n *\n * Mapping notes (post-C' merge, see\n * `sdd/file-next/decisions/error-codes-deviation`):\n * - S3 `SlowDown` -> QuotaExceeded (broader than RateLimited;\n * SlowDown means reduce request rate, which\n * is conceptually quota pressure, not\n * throttling of a single call).\n * - S3 `BadDigest` -> ChecksumMismatch (checksum verified by\n * S3 on upload did not match the client).\n * - HTTP 429 -> RateLimited (was QuotaExceeded in the\n * pre-C' catalog; RateLimited is the more\n * specific code for throttling responses).\n * - HTTP 408 -> NetworkError (transient transport error).\n * - HTTP 400 / Postgres 23514 / S3 InvalidRequest\n * -> fall through to the 4xx branch (no\n * top-level 400 code in the C' catalog;\n * these inputs are usually caught by the\n * name/SQLSTATE mapping first anyway).\n */\n\nimport { FileSystemError, type FileSystemErrorCode } from \"./index\";\n\n/* ---------------------------------------------------------------- *\n * Mapping tables (private) *\n * ---------------------------------------------------------------- */\n\ninterface CodeMapping {\n code: FileSystemErrorCode;\n retryable: boolean;\n}\n\nconst HTTP_STATUS_TO_CODE: Readonly<Record<number, CodeMapping>> = {\n 401: { code: \"Unauthorized\", retryable: false },\n 403: { code: \"Forbidden\", retryable: false },\n 404: { code: \"NotFound\", retryable: false },\n 408: { code: \"NetworkError\", retryable: true },\n 409: { code: \"Conflict\", retryable: false },\n 413: { code: \"PayloadTooLarge\", retryable: false },\n 415: { code: \"UnsupportedMediaType\", retryable: false },\n 429: { code: \"RateLimited\", retryable: true },\n};\n\nconst AWS_NAME_TO_CODE: Readonly<Record<string, CodeMapping>> = {\n NoSuchKey: { code: \"NotFound\", retryable: false },\n NoSuchBucket: { code: \"NotFound\", retryable: false },\n // v0.2 multipart: unknown/aborted/expired uploadId.\n NoSuchUpload: { code: \"NotFound\", retryable: false },\n AccessDenied: { code: \"Forbidden\", retryable: false },\n SlowDown: { code: \"QuotaExceeded\", retryable: true },\n BadDigest: { code: \"ChecksumMismatch\", retryable: true },\n XAmzContentSHA256Mismatch: { code: \"ChecksumMismatch\", retryable: true },\n NetworkingError: { code: \"NetworkError\", retryable: true },\n TimeoutError: { code: \"NetworkError\", retryable: true },\n};\n\nconst PG_SQLSTATE_TO_CODE: Readonly<Record<string, CodeMapping>> = {\n \"23505\": { code: \"Conflict\", retryable: false },\n};\n\nconst SQLITE_CODE_TO_CODE: Readonly<Record<string, CodeMapping>> = {\n SQLITE_CONSTRAINT_UNIQUE: { code: \"Conflict\", retryable: false },\n SQLITE_CONSTRAINT_PRIMARYKEY: { code: \"Conflict\", retryable: false },\n};\n\n/* ---------------------------------------------------------------- *\n * Public mappers *\n * ---------------------------------------------------------------- */\n\nconst toCause = (code: string, message: string, extra?: Record<string, unknown>) => ({\n code,\n message,\n ...(extra ?? {}),\n});\n\nconst fallback = (err: unknown): FileSystemError =>\n new FileSystemError({\n code: \"InternalError\",\n message: err instanceof Error ? err.message : String(err),\n retryable: true,\n cause: toCause(\n \"Unknown\",\n err instanceof Error ? err.message : String(err),\n ),\n });\n\nexport const fromAws = (err: unknown): FileSystemError => {\n if (err instanceof FileSystemError) return err;\n\n if (typeof err !== \"object\" || err === null) return fallback(err);\n\n const awsErr = err as {\n name?: unknown;\n message?: unknown;\n $metadata?: { httpStatusCode?: unknown };\n };\n const name = typeof awsErr.name === \"string\" ? awsErr.name : undefined;\n const message =\n typeof awsErr.message === \"string\" ? awsErr.message : `AWS error: ${name ?? \"unknown\"}`;\n const status =\n typeof awsErr.$metadata?.httpStatusCode === \"number\"\n ? awsErr.$metadata.httpStatusCode\n : undefined;\n\n const cause = toCause(\n name ?? (status !== undefined ? String(status) : \"Unknown\"),\n message,\n status !== undefined ? { httpStatusCode: status } : undefined,\n );\n\n // 1) name-based mapping wins (more specific than HTTP status)\n if (name && name in AWS_NAME_TO_CODE) {\n const m = AWS_NAME_TO_CODE[name]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n // 2) HTTP status mapping\n if (status !== undefined && status in HTTP_STATUS_TO_CODE) {\n const m = HTTP_STATUS_TO_CODE[status]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n // 3) 5xx bucket\n if (status !== undefined && status >= 500 && status < 600) {\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n }\n\n // 4) anything else 4xx-shaped\n if (status !== undefined && status >= 400 && status < 500) {\n return new FileSystemError({ code: \"Forbidden\", message, retryable: false, cause });\n }\n\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n};\n\nexport const fromPg = (err: unknown): FileSystemError => {\n if (err instanceof FileSystemError) return err;\n\n if (typeof err !== \"object\" || err === null) return fallback(err);\n\n const pgErr = err as { code?: unknown; message?: unknown };\n const sqlstate = typeof pgErr.code === \"string\" ? pgErr.code : undefined;\n const message =\n typeof pgErr.message === \"string\" ? pgErr.message : `Postgres error: ${sqlstate ?? \"unknown\"}`;\n const cause = toCause(sqlstate ?? \"Unknown\", message);\n\n if (sqlstate && sqlstate in PG_SQLSTATE_TO_CODE) {\n const m = PG_SQLSTATE_TO_CODE[sqlstate]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n};\n\nexport const fromSqlite = (err: unknown): FileSystemError => {\n if (err instanceof FileSystemError) return err;\n\n if (typeof err !== \"object\" || err === null) return fallback(err);\n\n const sqlErr = err as { code?: unknown; message?: unknown };\n const code = typeof sqlErr.code === \"string\" ? sqlErr.code : undefined;\n const message =\n typeof sqlErr.message === \"string\" ? sqlErr.message : `SQLite error: ${code ?? \"unknown\"}`;\n const cause = toCause(code ?? \"Unknown\", message);\n\n if (code && code in SQLITE_CODE_TO_CODE) {\n const m = SQLITE_CODE_TO_CODE[code]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n};\n","/**\n * FileSystemError — the single error class every adapter, store,\n * server action, and route handler in `file-next` returns or throws.\n *\n * Spec reference: requirement \"FileSystemError discriminated union\"\n * in `sdd/file-next/spec`. The 11 codes are the CLOSED set; any\n * provider-specific code (e.g. S3 `NoSuchKey`, Postgres `23505`) is\n * preserved on `cause.code` so callers can still distinguish upstream\n * reasons while the top-level `code` stays in the catalog.\n *\n * The catalog is a merge of spec + impl: the 6 fixed codes\n * (NotFound, Forbidden, Conflict, QuotaExceeded, NetworkError,\n * InternalError) are non-negotiable; the remaining 5 keep the wire\n * aligned with both the HTTP boundary (route handlers map the\n * top-level `code` to a status directly) and the storage boundary\n * (`RateLimited` and `ChecksumMismatch` carry semantics that have\n * no natural HTTP equivalent). See\n * `sdd/file-next/decisions/error-codes-deviation` for the\n * deviation log and rationale.\n *\n * Retryability table is the design's `error-mapping` excerpt; see\n * `sdd/file-next/design` §C. Any future code MUST add an entry in\n * `RETRYABLE_BY_CODE` (the catalog test enforces this).\n *\n * The placeholder from T-006 is replaced by this file in T-007a.\n * The upstream mappers (fromAws / fromPg / fromSqlite) land in T-007b\n * in `mappers.ts`.\n */\n\nexport const FILE_SYSTEM_ERROR_CODES = [\n \"NotFound\",\n \"Forbidden\",\n \"Conflict\",\n \"QuotaExceeded\",\n \"NetworkError\",\n \"InternalError\",\n \"Unauthorized\",\n \"PayloadTooLarge\",\n \"UnsupportedMediaType\",\n \"RateLimited\",\n \"ChecksumMismatch\",\n] as const satisfies readonly string[];\n\nexport type FileSystemErrorCode = (typeof FILE_SYSTEM_ERROR_CODES)[number];\n\nexport const RETRYABLE_BY_CODE: Readonly<Record<FileSystemErrorCode, boolean>> = {\n NotFound: false,\n Forbidden: false,\n Conflict: false,\n QuotaExceeded: true,\n NetworkError: true,\n InternalError: true,\n Unauthorized: false,\n PayloadTooLarge: false,\n UnsupportedMediaType: false,\n RateLimited: true,\n ChecksumMismatch: true,\n};\n\nexport interface FileSystemErrorOptions {\n code: FileSystemErrorCode;\n message: string;\n retryable: boolean;\n cause?: { code: string; message: string; [k: string]: unknown };\n}\n\nexport interface FileSystemErrorJson {\n name: string;\n code: FileSystemErrorCode;\n message: string;\n retryable: boolean;\n cause?: { code: string; message: string; [k: string]: unknown };\n}\n\nexport class FileSystemError extends Error {\n readonly code: FileSystemErrorCode;\n readonly retryable: boolean;\n override readonly cause?: { code: string; message: string; [k: string]: unknown };\n\n constructor(opts: FileSystemErrorOptions) {\n super(opts.message);\n this.name = \"FileSystemError\";\n this.code = opts.code;\n this.retryable = opts.retryable;\n if (opts.cause !== undefined) {\n this.cause = opts.cause;\n }\n }\n\n /**\n * Stable JSON shape for RSC pass-through. Error.prototype.message\n * is non-enumerable, so plain `JSON.stringify(err)` would emit `{}`\n * and lose the message + code + retryable flag. `cause` is omitted\n * entirely (not set to undefined) when absent so the shape stays\n * stable for hash-based caches.\n */\n toJSON(): FileSystemErrorJson {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n ...(this.cause !== undefined ? { cause: this.cause } : {}),\n };\n }\n\n /**\n * Mappers from upstream error shapes (AWS SDK v3, node-postgres,\n * better-sqlite3) to FileSystemError. See `./mappers.ts` for the\n * mapping tables. Re-exposed as static methods so callers can pick\n * the import style that fits; the free functions are the canonical\n * implementation.\n */\n static fromAws(err: unknown): FileSystemError {\n // Lazy import via the runtime binding avoids the static-field\n // circular-dep trap in ESM. The mapper file imports this class\n // for instanceof checks; we look up the function at call time.\n return _fromAws(err);\n }\n\n static fromPg(err: unknown): FileSystemError {\n return _fromPg(err);\n }\n\n static fromSqlite(err: unknown): FileSystemError {\n return _fromSqlite(err);\n }\n}\n\n// Imported here as bindings (not values) so the static methods above\n// can resolve them lazily. The actual implementation lives in mappers.ts.\nimport { fromAws as _fromAws, fromPg as _fromPg, fromSqlite as _fromSqlite } from \"./mappers\";\nexport { fromAws, fromPg, fromSqlite } from \"./mappers\";\n","/**\n * Branded string types and their constructors/guards.\n *\n * Brands are TypeScript-only fictions: a `Path` and an `S3Key` are\n * both strings at runtime, but the type system treats them as\n * distinct nominal types so the compiler catches accidental\n * cross-assignment (e.g. passing an S3Key where a TenantId is\n * expected).\n *\n * Conventions:\n * - `as*` is a zero-cost cast: trust the caller, brand the value.\n * Use it at trust boundaries you have already validated.\n * - `assert*` is a runtime guard: throws TypeError on invalid\n * input. Use it at the edge (parsing user/env input).\n *\n * Validation rules are intentionally minimal in v0.1 and can be\n * tightened as the spec evolves. None of them touch the network or\n * allocate; they are safe in hot paths.\n */\n\nexport type Path = string & { readonly __brand: \"Path\" };\nexport type Prefix = string & { readonly __brand: \"Prefix\" };\nexport type S3Key = string & { readonly __brand: \"S3Key\" };\nexport type TenantId = string & { readonly __brand: \"TenantId\" };\nexport type UserId = string & { readonly __brand: \"UserId\" };\n\n/**\n * POSIX file path. Non-empty, '/' is allowed as the root.\n */\nexport const asPath = (s: string): Path => s as Path;\nexport const assertPath = (s: string): Path => {\n if (s.length === 0) {\n throw new TypeError(\"Path must be a non-empty string\");\n }\n return s as Path;\n};\n\n/**\n * S3 prefix. Empty string is the root prefix. Non-empty prefixes\n * MUST end with '/' so concatenation with a key never produces\n * 'usersfile.jpg' by accident.\n */\nexport const asPrefix = (s: string): Prefix => s as Prefix;\nexport const assertPrefix = (s: string): Prefix => {\n if (s.length > 0 && !s.endsWith(\"/\")) {\n throw new TypeError(\n `Prefix must end with \"/\" or be empty: ${JSON.stringify(s)}`,\n );\n }\n return s as Prefix;\n};\n\n/**\n * S3 object key. No leading slash, no empty segments, no '..' hops.\n */\nexport const asS3Key = (s: string): S3Key => s as S3Key;\nexport const assertS3Key = (s: string): S3Key => {\n if (s.length === 0) {\n throw new TypeError(\"S3Key must be a non-empty string\");\n }\n if (s.startsWith(\"/\")) {\n throw new TypeError(\n `S3Key must not start with a slash: ${JSON.stringify(s)}`,\n );\n }\n if (s.includes(\"..\")) {\n throw new TypeError(\n `S3Key must not contain '..' segments: ${JSON.stringify(s)}`,\n );\n }\n return s as S3Key;\n};\n\n/**\n * Tenant identifier. Alphanumerics, dashes, underscores only.\n */\nexport const asTenantId = (s: string): TenantId => s as TenantId;\nexport const assertTenantId = (s: string): TenantId => {\n if (s.length === 0 || !/^[a-zA-Z0-9_-]+$/.test(s)) {\n throw new TypeError(`Invalid TenantId: ${JSON.stringify(s)}`);\n }\n return s as TenantId;\n};\n\n/**\n * Opaque user identifier. Non-empty; the format is provider-defined.\n */\nexport const asUserId = (s: string): UserId => s as UserId;\nexport const assertUserId = (s: string): UserId => {\n if (s.length === 0) {\n throw new TypeError(\"UserId must be a non-empty string\");\n }\n return s as UserId;\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix,\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n\nconst getPrefixedClassGroupEntries = (\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]>,\n prefix: string | undefined,\n): Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]> => {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]),\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { separator, experimentalParseClassName } = config\n const isSeparatorSingleCharacter = separator.length === 1\n const firstSeparatorCharacter = separator[0]\n const separatorLength = separator.length\n\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = (className: string) => {\n const modifiers = []\n\n let bracketDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0) {\n if (\n currentCharacter === firstSeparatorCharacter &&\n (isSeparatorSingleCharacter ||\n className.slice(index, index + separatorLength) === separator)\n ) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + separatorLength\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const hasImportantModifier =\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const baseClassName = hasImportantModifier\n ? baseClassNameWithImportantModifier.substring(1)\n : baseClassNameWithImportantModifier\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (experimentalParseClassName) {\n return (className: string) => experimentalParseClassName({ className, parseClassName })\n }\n\n return parseClassName\n}\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isArbitraryVariant = modifier[0] === '['\n\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER, sortModifiers } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const { modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } =\n parseClassName(originalClassName)\n\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition)\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst stringLengths = new Set(['px', 'full', 'screen'])\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isLength = (value: string) =>\n isNumber(value) || stringLengths.has(value) || fractionRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, 'length', isLengthOnly)\n\nexport const isNumber = (value: string) => Boolean(value) && !Number.isNaN(Number(value))\n\nexport const isArbitraryNumber = (value: string) => getIsArbitraryValue(value, 'number', isNumber)\n\nexport const isInteger = (value: string) => Boolean(value) && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nconst sizeLabels = new Set(['length', 'size', 'percentage'])\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, sizeLabels, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, 'position', isNever)\n\nconst imageLabels = new Set(['image', 'url'])\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, imageLabels, isImage)\n\nexport const isArbitraryShadow = (value: string) => getIsArbitraryValue(value, '', isShadow)\n\nexport const isAny = () => true\n\nconst getIsArbitraryValue = (\n value: string,\n label: string | Set<string>,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n const colors = fromTheme('colors')\n const spacing = fromTheme('spacing')\n const blur = fromTheme('blur')\n const brightness = fromTheme('brightness')\n const borderColor = fromTheme('borderColor')\n const borderRadius = fromTheme('borderRadius')\n const borderSpacing = fromTheme('borderSpacing')\n const borderWidth = fromTheme('borderWidth')\n const contrast = fromTheme('contrast')\n const grayscale = fromTheme('grayscale')\n const hueRotate = fromTheme('hueRotate')\n const invert = fromTheme('invert')\n const gap = fromTheme('gap')\n const gradientColorStops = fromTheme('gradientColorStops')\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions')\n const inset = fromTheme('inset')\n const margin = fromTheme('margin')\n const opacity = fromTheme('opacity')\n const padding = fromTheme('padding')\n const saturate = fromTheme('saturate')\n const scale = fromTheme('scale')\n const sepia = fromTheme('sepia')\n const skew = fromTheme('skew')\n const space = fromTheme('space')\n const translate = fromTheme('translate')\n\n const getOverscroll = () => ['auto', 'contain', 'none'] as const\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing] as const\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing] as const\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength] as const\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue] as const\n const getPositions = () =>\n [\n 'bottom',\n 'center',\n 'left',\n 'left-bottom',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-top',\n 'top',\n ] as const\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'] as const\n const getBlendModes = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const getAlign = () =>\n ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'] as const\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue] as const\n const getBreaks = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue]\n\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary(),\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{ aspect: ['auto', 'square', 'video', isArbitraryValue] }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{ columns: [isTshirtSize] }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': getBreaks() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': getBreaks() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: [...getPositions(), isArbitraryValue] }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: getOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': getOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': getOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: getOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': getOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': getOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: [inset] }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': [inset] }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': [inset] }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: [inset] }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: [inset] }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: [inset] }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: [inset] }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: [inset] }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: [inset] }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: ['auto', isInteger, isArbitraryValue] }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{ basis: getSpacingWithAutoAndArbitrary() }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['wrap', 'wrap-reverse', 'nowrap'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: ['1', 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: getZeroAndEmpty() }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: getZeroAndEmpty() }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{ order: ['first', 'last', 'none', isInteger, isArbitraryValue] }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': [isAny] }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [\n {\n col: [\n 'auto',\n { span: ['full', isInteger, isArbitraryValue] },\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': [isAny] }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [\n { row: ['auto', { span: [isInteger, isArbitraryValue] }, isArbitraryValue] },\n ],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: [gap] }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': [gap] }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': [gap] }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: ['normal', ...getAlign()] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': ['start', 'end', 'center', 'stretch'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...getAlign(), 'baseline'] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{ self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline'] }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': [...getAlign(), 'baseline'] }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: [padding] }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: [padding] }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: [padding] }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: [padding] }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: [padding] }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: [padding] }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: [padding] }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: [padding] }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: [padding] }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: [margin] }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: [margin] }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: [margin] }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: [margin] }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: [margin] }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: [margin] }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: [margin] }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: [margin] }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: [margin] }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{ 'space-x': [space] }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{ 'space-y': [space] }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [\n {\n w: [\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svw',\n 'lvw',\n 'dvw',\n isArbitraryValue,\n spacing,\n ],\n },\n ],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{ 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit'] }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n isArbitraryValue,\n spacing,\n 'none',\n 'full',\n 'min',\n 'max',\n 'fit',\n 'prose',\n { screen: [isTshirtSize] },\n isTshirtSize,\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [\n {\n h: [\n isArbitraryValue,\n spacing,\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svh',\n 'lvh',\n 'dvh',\n ],\n },\n ],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [\n { 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [\n { 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{ size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit'] }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{ text: ['base', isTshirtSize, isArbitraryLength] }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isAny] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [\n {\n tracking: [\n 'tighter',\n 'tight',\n 'normal',\n 'wide',\n 'wider',\n 'widest',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{ 'line-clamp': ['none', isNumber, isArbitraryNumber] }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n 'none',\n 'tight',\n 'snug',\n 'normal',\n 'relaxed',\n 'loose',\n isLength,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryValue] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{ list: ['none', 'disc', 'decimal', isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: [colors] }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{ 'placeholder-opacity': [opacity] }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: [colors] }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{ 'text-opacity': [opacity] }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...getLineStyles(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n { decoration: ['auto', 'from-font', isLength, isArbitraryLength] },\n ],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{ 'underline-offset': ['auto', isLength, isArbitraryValue] }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: [colors] }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: getSpacingWithArbitrary() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryValue] }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{ 'bg-opacity': [opacity] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: [...getPositions(), isArbitraryPosition] }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: ['no-repeat', { repeat: ['', 'x', 'y', 'round', 'space'] }] }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: ['auto', 'cover', 'contain', isArbitrarySize] }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n { 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: [colors] }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: [gradientColorStops] }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: [gradientColorStops] }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: [gradientColorStops] }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: [borderRadius] }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': [borderRadius] }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': [borderRadius] }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': [borderRadius] }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': [borderRadius] }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': [borderRadius] }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': [borderRadius] }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': [borderRadius] }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': [borderRadius] }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': [borderRadius] }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': [borderRadius] }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': [borderRadius] }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': [borderRadius] }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': [borderRadius] }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': [borderRadius] }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: [borderWidth] }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': [borderWidth] }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': [borderWidth] }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': [borderWidth] }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': [borderWidth] }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': [borderWidth] }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': [borderWidth] }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': [borderWidth] }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': [borderWidth] }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{ 'border-opacity': [opacity] }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...getLineStyles(), 'hidden'] }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{ 'divide-x': [borderWidth] }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{ 'divide-y': [borderWidth] }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{ 'divide-opacity': [opacity] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{ divide: getLineStyles() }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: [borderColor] }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': [borderColor] }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': [borderColor] }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': [borderColor] }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': [borderColor] }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': [borderColor] }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': [borderColor] }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': [borderColor] }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': [borderColor] }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: [borderColor] }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: ['', ...getLineStyles()] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{ 'outline-offset': [isLength, isArbitraryValue] }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{ outline: [isLength, isArbitraryLength] }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: [colors] }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{ ring: getLengthWithEmptyAndArbitrary() }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{ ring: [colors] }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{ 'ring-opacity': [opacity] }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{ 'ring-offset': [isLength, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{ 'ring-offset': [colors] }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{ shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow] }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{ shadow: [isAny] }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [opacity] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': getBlendModes() }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{ filter: ['', 'none'] }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: [blur] }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [brightness] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [contrast] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{ 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue] }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: [grayscale] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [hueRotate] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: [invert] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [saturate] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: [sepia] }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{ 'backdrop-filter': ['', 'none'] }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': [blur] }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{ 'backdrop-brightness': [brightness] }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{ 'backdrop-contrast': [contrast] }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{ 'backdrop-grayscale': [grayscale] }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{ 'backdrop-hue-rotate': [hueRotate] }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{ 'backdrop-invert': [invert] }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{ 'backdrop-opacity': [opacity] }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{ 'backdrop-saturate': [saturate] }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{ 'backdrop-sepia': [sepia] }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': [borderSpacing] }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': [borderSpacing] }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': [borderSpacing] }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n 'none',\n 'all',\n '',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: getNumberAndArbitrary() }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{ ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue] }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: getNumberAndArbitrary() }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue] }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{ transform: ['', 'gpu', 'none'] }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: [scale] }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': [scale] }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': [scale] }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: [isInteger, isArbitraryValue] }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': [translate] }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': [translate] }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': [skew] }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': [skew] }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [\n {\n origin: [\n 'center',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'top-left',\n isArbitraryValue,\n ],\n },\n ],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: ['auto', colors] }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: [colors] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['none', 'auto'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', 'y', 'x', ''] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': getSpacingWithArbitrary() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [\n {\n touch: ['auto', 'none', 'manipulation'],\n },\n ],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [\n {\n 'touch-pan': ['x', 'left', 'right'],\n },\n ],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [\n {\n 'touch-pan': ['y', 'up', 'down'],\n },\n ],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n { 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue] },\n ],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: [colors, 'none'] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{ stroke: [isLength, isArbitraryLength, isArbitraryNumber] }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: [colors, 'none'] }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n Merge Tailwind CSS classes with conflict resolution.\n Mirrors shadcn/ui's `cn` utility so consumers get a familiar DX.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * `list` — the S3-compatible adapter method that lists objects\n * under a prefix with optional `delimiter` (for \"folder\" emulation)\n * and paginated `continuationToken` support.\n *\n * The wire is the S3 `ListObjectsV2` command, which all S3-compatible\n * providers (AWS S3, Cloudflare R2, Backblaze B2, MinIO) implement\n * with the same shape. The only thing that differs between providers\n * is the `S3Client` config (endpoint, forcePathStyle) — handled by\n * the `client.ts` helper, not here.\n *\n * Error mapping:\n * - `NoSuchBucket` -> NotFound (the bucket itself is gone)\n * - network/timeout -> NetworkError (retryable: true)\n * - everything else -> fromAws (uses the catalog mappers; preserves\n * the upstream `cause.code` for debugging)\n */\nimport { ListObjectsV2Command, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport { asS3Key, asPrefix } from \"@/types/branded\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { ListInput, ListOutput } from \"../adapter\";\n\nexport const listObjects = async (\n client: S3Client,\n config: FileSystemConfig,\n input: ListInput,\n): Promise<Result<ListOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: input.prefix,\n ContinuationToken: input.continuationToken,\n MaxKeys: input.limit,\n Delimiter: input.delimiter,\n }),\n );\n return ok({\n items: (res.Contents ?? []).map((c) => ({\n key: asS3Key(c.Key ?? \"\"),\n size: c.Size ?? 0,\n lastModified: c.LastModified ?? new Date(0),\n })),\n prefixes: (res.CommonPrefixes ?? []).map((p) => asPrefix(p.Prefix ?? \"\")),\n nextContinuationToken: res.NextContinuationToken,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `read` — fetch an object's body as a `Uint8Array`.\n *\n * Uses `GetObjectCommand` (a body-bearing S3 call). The wire\n * response has a `Body` field that is an SDK-readable stream;\n * we collect it into a single `Uint8Array` for the consumer\n * (small-to-medium objects only; v0.1 does NOT support range\n * reads into a streaming consumer — that lands when the headless\n * `useUploader`/`useDownloadProgress` hooks need it for\n * progress reporting).\n *\n * Provider-agnostic: any S3-compatible client works.\n */\nimport { GetObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { ReadInput, ReadOutput } from \"../adapter\";\n\n/** Collect an SDK stream body into a single Uint8Array. */\nconst streamToBytes = async (body: unknown): Promise<Uint8Array> => {\n // The SDK returns a web ReadableStream-shaped object that ALSO\n // implements AsyncIterable (it's a Readable.from(Buffer)). The\n // safest cross-runtime path is to drain it via async iteration.\n const chunks: Uint8Array[] = [];\n // The SDK body is a \"SdkStream\" which is AsyncIterable<Uint8Array>.\n // node:stream Readable is also async-iterable.\n for await (const chunk of body as AsyncIterable<Uint8Array>) {\n chunks.push(chunk);\n }\n const total = chunks.reduce((n, c) => n + c.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n};\n\nexport const readObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: ReadInput,\n): Promise<Result<ReadOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new GetObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n Range: input.range,\n }),\n );\n if (!res.Body) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"S3 returned a GetObject response with no body\",\n retryable: false,\n }),\n );\n }\n const body = await streamToBytes(res.Body);\n return ok({\n body,\n contentType: res.ContentType,\n metadata: res.Metadata,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `stat` — cheap metadata fetch via `HeadObjectCommand`.\n *\n * Returns the full HEAD response (size, etag, contentType,\n * lastModified, user metadata) in one typed object. Distinct\n * from `getMetadata` (which returns just the user-metadata\n * subset) so callers can choose between the cheap-and-typed\n * shape they need.\n */\nimport { HeadObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { StatInput, StatOutput } from \"../adapter\";\n\nexport const statObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: StatInput,\n): Promise<Result<StatOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok({\n key: input.key,\n size: res.ContentLength ?? 0,\n etag: res.ETag ?? \"\",\n contentType: res.ContentType ?? \"application/octet-stream\",\n lastModified: res.LastModified ?? new Date(0),\n metadata: res.Metadata ?? {},\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `getMetadata` — fetch just the user-defined metadata.\n *\n * S3's `HeadObject` returns size, etag, contentType, lastModified,\n * AND user metadata in one call. `getMetadata` runs the same HEAD\n * and returns only the user-metadata subset so callers that only\n * care about application-level tags don't have to thread the rest\n * of the HEAD shape through their code.\n *\n * For callers that need the full HEAD shape, use `stat` instead.\n */\nimport { HeadObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { GetMetadataInput, GetMetadataOutput } from \"../adapter\";\n\nexport const getMetadata = async (\n client: S3Client,\n config: FileSystemConfig,\n input: GetMetadataInput,\n): Promise<Result<GetMetadataOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok(res.Metadata ?? {});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * Multipart upload primitives (v0.2) — `createMultipartUpload`,\n * `uploadPart`, `completeMultipartUpload`, `abortMultipartUpload`.\n *\n * S3's chunked upload protocol is a four-step dance:\n * 1. `CreateMultipartUpload` returns an opaque `UploadId`.\n * 2. `UploadPart` (one or more) returns an `ETag` per chunk.\n * 3. `CompleteMultipartUpload` finalises the object by listing\n * the parts in the caller's chosen order (S3 honours the\n * caller's order; we do NOT pre-sort).\n * 4. On any failure, `AbortMultipartUpload` cleans up the\n * unfinished state on the server (parts are billed until\n * either complete or abort runs).\n *\n * Each helper is a thin pass-through to the corresponding AWS SDK\n * v3 command, with the standard `fromAws` error mapping (which\n * already covers `NoSuchUpload -> NotFound`, see\n * `src/errors/mappers.ts`).\n *\n * These four primitives are exposed individually so the higher-\n * level `write` method can compose them for bodies larger than one\n * part, but they are also public so server actions or stream-\n * multiplexers can drive the protocol themselves.\n */\nimport {\n CreateMultipartUploadCommand,\n UploadPartCommand,\n CompleteMultipartUploadCommand,\n AbortMultipartUploadCommand,\n type S3Client,\n} from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type {\n CreateMultipartUploadInput,\n CreateMultipartUploadOutput,\n UploadPartInput,\n UploadPartOutput,\n CompleteMultipartUploadInput,\n CompleteMultipartUploadOutput,\n AbortMultipartUploadInput,\n AbortMultipartUploadOutput,\n} from \"../adapter\";\n\nexport const createMultipartUpload = async (\n client: S3Client,\n config: FileSystemConfig,\n input: CreateMultipartUploadInput,\n): Promise<Result<CreateMultipartUploadOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new CreateMultipartUploadCommand({\n Bucket: config.bucket,\n Key: input.key,\n ContentType: input.contentType,\n Metadata: input.metadata,\n }),\n );\n return ok({\n uploadId: res.UploadId ?? \"\",\n key: input.key,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const uploadPart = async (\n client: S3Client,\n config: FileSystemConfig,\n input: UploadPartInput,\n): Promise<Result<UploadPartOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new UploadPartCommand({\n Bucket: config.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n PartNumber: input.partNumber,\n Body: input.body,\n }),\n );\n return ok({\n etag: res.ETag ?? \"\",\n partNumber: input.partNumber,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const completeMultipartUpload = async (\n client: S3Client,\n config: FileSystemConfig,\n input: CompleteMultipartUploadInput,\n): Promise<Result<CompleteMultipartUploadOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new CompleteMultipartUploadCommand({\n Bucket: config.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n MultipartUpload: {\n Parts: input.parts.map((p) => ({\n PartNumber: p.partNumber,\n ETag: p.etag,\n })),\n },\n }),\n );\n return ok({\n etag: res.ETag,\n versionId: res.VersionId,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const abortMultipartUpload = async (\n client: S3Client,\n config: FileSystemConfig,\n input: AbortMultipartUploadInput,\n): Promise<Result<AbortMultipartUploadOutput, FileSystemError>> => {\n try {\n await client.send(\n new AbortMultipartUploadCommand({\n Bucket: config.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `write` — single-PUT upload via `PutObjectCommand` (small bodies)\n * OR multipart upload via the v0.2 primitives (large bodies).\n *\n * Auto-switch (v0.2):\n * - `data.byteLength <= MULTIPART_PART_SIZE` -> single-PUT path\n * (unchanged from v0.1). Streams are always single-PUT.\n * - `data.byteLength > MULTIPART_PART_SIZE` -> multipart via\n * `createMultipartUpload` / `uploadPart` loop /\n * `completeMultipartUpload`, slicing the body into\n * `MULTIPART_PART_SIZE` chunks with a smaller final part.\n *\n * Compensation (v0.2): if any of the three multipart steps fails\n * (create / a part upload / complete), we MUST `abortMultipartUpload`\n * before returning the error — otherwise the in-flight parts stay\n * on the server and continue to bill against the bucket. The latch\n * is a `try/finally` with `uploadId` captured after create succeeds\n * and `completed` flipped to true after complete succeeds; the\n * finally block aborts when an uploadId exists and complete hasn't\n * finished.\n *\n * The 5 GB v0.1 cap is REMOVED. v0.2 multipart lifts the\n * single-PUT ceiling; the only hard limit now is S3's 10,000-part\n * / 5 TiB-per-object maximum, which is well outside any realistic\n * server-action payload.\n */\nimport { PutObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { WriteInput, WriteOutput } from \"../adapter\";\nimport {\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n} from \"./multipart\";\n\n/** Multipart part size. 8 MiB — S3 minimum is 5 MiB; 8 MiB amortises request overhead and keeps the part count well under 10,000 for any realistic object. */\nexport const MULTIPART_PART_SIZE = 8 * 1024 * 1024;\n\n/** S3 single-PUT hard limit (kept for callers that want to know the boundary; `write` no longer enforces it). */\nexport const MAX_SINGLE_PUT_SIZE = 5 * 1024 * 1024 * 1024;\n\nexport const writeObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: WriteInput,\n): Promise<Result<WriteOutput, FileSystemError>> => {\n // Auto-switch only triggers for Uint8Array bodies. Stream bodies\n // are sent as-is via single-PUT — the SDK will surface its own\n // error if the stream is too big.\n if (\n input.body instanceof Uint8Array &&\n input.body.byteLength > MULTIPART_PART_SIZE\n ) {\n return writeMultipart(client, config, input);\n }\n return writeSinglePut(client, config, input);\n};\n\nconst writeSinglePut = async (\n client: S3Client,\n config: FileSystemConfig,\n input: WriteInput,\n): Promise<Result<WriteOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n Body: input.body,\n ContentType: input.contentType,\n Metadata: input.metadata,\n }),\n );\n return ok({\n etag: res.ETag ?? \"\",\n versionId: res.VersionId,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nconst writeMultipart = async (\n client: S3Client,\n config: FileSystemConfig,\n input: WriteInput,\n): Promise<Result<WriteOutput, FileSystemError>> => {\n // The auto-switch guard guarantees this is a Uint8Array.\n const body = input.body as Uint8Array;\n const totalSize = body.byteLength;\n const chunkCount = Math.ceil(totalSize / MULTIPART_PART_SIZE);\n\n let uploadId: string | undefined;\n let completed = false;\n try {\n const create = await createMultipartUpload(client, config, {\n key: input.key,\n contentType: input.contentType,\n metadata: input.metadata,\n });\n if (!create.ok) return err(create.error);\n uploadId = create.value.uploadId;\n\n const parts: Array<{ partNumber: number; etag: string }> = [];\n for (let i = 0; i < chunkCount; i++) {\n const start = i * MULTIPART_PART_SIZE;\n const end = Math.min(start + MULTIPART_PART_SIZE, totalSize);\n // .slice() copies the bytes into a fresh Uint8Array; the\n // stored part is never aliased to the caller's buffer.\n const chunk = body.slice(start, end);\n const up = await uploadPart(client, config, {\n key: input.key,\n uploadId,\n partNumber: i + 1,\n body: chunk,\n });\n if (!up.ok) return err(up.error);\n parts.push({ partNumber: i + 1, etag: up.value.etag });\n }\n\n const complete = await completeMultipartUpload(client, config, {\n key: input.key,\n uploadId,\n parts,\n });\n if (!complete.ok) return err(complete.error);\n completed = true;\n return ok({\n etag: complete.value.etag ?? \"\",\n versionId: complete.value.versionId,\n });\n } finally {\n // Compensate: if create succeeded (uploadId set) but complete\n // did not, abort so the server-side parts stop billing. Abort\n // failures are swallowed — the caller already has the original\n // error and an abort-failed error would only mask it.\n if (uploadId !== undefined && !completed) {\n await abortMultipartUpload(client, config, {\n key: input.key,\n uploadId,\n });\n }\n }\n};\n","/**\n * `delete` — remove an object from the bucket.\n *\n * Missing keys are idempotent: S3 returns success even if the\n * key did not exist, so we don't need to special-case the 404.\n * That means a \"delete that found nothing\" still returns ok\n * (caller's intent was \"make sure this key is gone\" — and it is).\n */\nimport { DeleteObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { DeleteInput, DeleteOutput } from \"../adapter\";\n\nexport const deleteObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: DeleteInput,\n): Promise<Result<DeleteOutput, FileSystemError>> => {\n try {\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `exists` — boolean presence check via `HeadObjectCommand`.\n *\n * This is the ONE method where \"key not found\" is NOT an error.\n * A missing key returns `ok({ exists: false })`; other S3\n * failures (AccessDenied, networking, ...) still return\n * `err(FileSystemError)`. The special-case 404 handling is\n * centralized here so the rest of the codebase can treat\n * `exists` as a pure boolean query.\n */\nimport { HeadObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { ExistsInput, ExistsOutput } from \"../adapter\";\n\nexport const existsObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: ExistsInput,\n): Promise<Result<ExistsOutput, FileSystemError>> => {\n try {\n await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok({ exists: true });\n } catch (e) {\n // Special case: a 404 on HEAD is a boolean \"no\", not an error.\n const err_ = fromAws(e);\n if (err_.code === \"NotFound\") {\n return ok({ exists: false });\n }\n return err(err_);\n }\n};\n","/**\n * `copy` — server-side copy via `CopyObjectCommand`.\n *\n * The `CopySource` field is `${bucket}/${key}` per S3's wire\n * format. We construct it from the parsed config's bucket so\n * cross-bucket copies can be added later (v0.2) by accepting a\n * `destinationBucket` field on the input.\n */\nimport { CopyObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { CopyInput, CopyOutput } from \"../adapter\";\n\nexport const copyObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: CopyInput,\n): Promise<Result<CopyOutput, FileSystemError>> => {\n try {\n await client.send(\n new CopyObjectCommand({\n Bucket: config.bucket,\n Key: input.destinationKey,\n CopySource: `${config.bucket}/${input.sourceKey}`,\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `move` — implemented as `CopyObjectCommand` followed by\n * `DeleteObjectCommand`.\n *\n * S3 has no native rename primitive. The two-call dance is the\n * standard workaround. The order matters: copy FIRST, delete\n * ONLY if the copy succeeded. A copy failure leaves the source\n * intact (caller can retry); a delete failure after a successful\n * copy surfaces as a FileSystemError so the caller can clean up\n * the orphan destination themselves.\n *\n * v0.2 may add a true atomic move (e.g. via S3 Object Versioning\n * + lifecycle rules) for cases where the copy/delete window\n * is unacceptable.\n */\nimport type { S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport { copyObject } from \"./copy\";\nimport { deleteObject } from \"./delete\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { MoveInput, MoveOutput } from \"../adapter\";\n\nexport const moveObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: MoveInput,\n): Promise<Result<MoveOutput, FileSystemError>> => {\n const copy = await copyObject(client, config, {\n sourceKey: input.sourceKey,\n destinationKey: input.destinationKey,\n });\n if (!copy.ok) {\n return err(copy.error);\n }\n\n const del = await deleteObject(client, config, { key: input.sourceKey });\n if (!del.ok) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: `Move succeeded the copy step but failed to delete the source (${input.sourceKey}). Destination (${input.destinationKey}) is now an orphan.`,\n retryable: false,\n cause: { code: del.error.code, message: del.error.message },\n }),\n );\n }\n\n return ok({});\n};\n","/**\n * `setMetadata` — replace or merge user-defined metadata.\n *\n * Merge reads current metadata, unions in JS, then REPLACE.\n * COPY would ignore the new map.\n */\nimport { CopyObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { fromAws, type FileSystemError } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { SetMetadataInput, SetMetadataOutput } from \"../adapter\";\nimport { getMetadata } from \"./get-metadata\";\n\nexport const setMetadata = async (\n client: S3Client,\n config: FileSystemConfig,\n input: SetMetadataInput,\n): Promise<Result<SetMetadataOutput, FileSystemError>> => {\n try {\n let metadata = input.metadata;\n if (input.replace !== true) {\n const current = await getMetadata(client, config, { key: input.key });\n if (!current.ok) return current;\n metadata = { ...(current.value as Record<string, string>), ...input.metadata };\n }\n await client.send(\n new CopyObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n CopySource: `${config.bucket}/${input.key}`,\n Metadata: metadata,\n MetadataDirective: \"REPLACE\",\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * A signed GET opened in a tab must not render as a page.\n * `inline` is kept only for types the preview can show without executing script.\n */\nconst NEVER_INLINE = new Set([\"text/html\", \"application/xhtml+xml\", \"image/svg+xml\"]);\n\nexport function signedContentDisposition(\n requested: \"attachment\" | \"inline\" | undefined,\n contentType?: string,\n): \"attachment\" | \"inline\" {\n if (requested !== \"inline\") return \"attachment\";\n const mime = (contentType ?? \"\").split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n if (!mime || NEVER_INLINE.has(mime)) return \"attachment\";\n if (\n mime === \"application/pdf\" ||\n mime === \"text/plain\" ||\n mime === \"text/csv\" ||\n mime === \"text/markdown\" ||\n mime.startsWith(\"image/\") ||\n mime.startsWith(\"video/\") ||\n mime.startsWith(\"audio/\")\n ) {\n return \"inline\";\n }\n return \"attachment\";\n}\n","/**\n * `createPresignedUploadUrl` + `createPresignedDownloadUrl` —\n * sign a URL the client can use to PUT/GET the object directly,\n * bypassing the Next.js server entirely.\n *\n * Why this exists: large file uploads (> 1MB Server Action body\n * limit, often > 100MB in practice) MUST go directly from the\n * browser to the storage provider. The server signs the URL,\n * returns it to the client, the client does the PUT itself, and\n * then the server action confirms the upload via the metadata\n * store.\n *\n * NOTE: this adapter method does NOT cap \\`expiresIn\\`. The 7-day\n * S3 SigV4 cap is enforced at the route-handler-factory level\n * (PR 7b) so the adapter stays a low-level pass-through and\n * library consumers who need the cap have a single chokepoint\n * to configure. See\n * \\`sdd/file-next/design/decision/expiresin-cap-timing\\`.\n */\nimport { PutObjectCommand, GetObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type {\n PresignedUploadInput,\n PresignedUploadOutput,\n PresignedDownloadInput,\n PresignedDownloadOutput,\n} from \"../adapter\";\nimport { signedContentDisposition } from \"../content-disposition\";\n\nexport const createPresignedUploadUrl = async (\n client: S3Client,\n config: FileSystemConfig,\n input: PresignedUploadInput,\n): Promise<Result<PresignedUploadOutput, FileSystemError>> => {\n try {\n const cmd = new PutObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n ContentType: input.contentType,\n });\n const url = await getSignedUrl(client, cmd, { expiresIn: input.expiresIn ?? 900 });\n return ok({ url, method: \"PUT\" });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const createPresignedDownloadUrl = async (\n client: S3Client,\n config: FileSystemConfig,\n input: PresignedDownloadInput,\n): Promise<Result<PresignedDownloadOutput, FileSystemError>> => {\n try {\n const cmd = new GetObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n ResponseContentDisposition: signedContentDisposition(input.disposition, input.contentType),\n });\n const url = await getSignedUrl(client, cmd, { expiresIn: input.expiresIn ?? 900 });\n return ok({ url });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `getPublicUrl` — build the public URL for an object in the bucket.\n *\n * No HTTP call. The URL is constructed from the bucket name +\n * key + (endpoint OR region) per S3's addressing rules.\n *\n * Provider-specific shapes:\n * - **S3 (virtual-hosted, the default)**: `https://{bucket}.s3.{region}.amazonaws.com/{key}`\n * - **S3 (path-style, when `forcePathStyle: true`)**: `https://{endpoint}/{bucket}/{key}` if an endpoint is set, else `https://s3.{region}.amazonaws.com/{bucket}/{key}`\n * - **R2 (always path-style)**: `https://{endpoint}/{bucket}/{key}` (the `endpoint` is the R2 account endpoint)\n *\n * v0.1 does not support a per-bucket `customDomain` override\n * (the R2 custom-domain feature). Adding it is a one-line\n * schema change in `config.ts` + a branch in the URL builder\n * here; deferred to v0.2 per the spec.\n */\nimport type { S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, type Result } from \"@/types/result\";\nimport type { FileSystemError } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { GetPublicUrlInput, GetPublicUrlOutput } from \"../adapter\";\n\nexport const getPublicUrl = async (\n _client: S3Client,\n config: FileSystemConfig,\n input: GetPublicUrlInput,\n): Promise<Result<GetPublicUrlOutput, FileSystemError>> => {\n const key = input.key;\n\n if (config.provider === \"r2\") {\n // R2: always path-style, always uses the account endpoint.\n return ok({ url: `${stripTrailingSlash(config.endpoint)}/${config.bucket}/${key}` });\n }\n\n if (config.forcePathStyle && config.endpoint) {\n return ok({ url: `${stripTrailingSlash(config.endpoint)}/${config.bucket}/${key}` });\n }\n\n if (config.forcePathStyle) {\n return ok({ url: `https://s3.${config.region}.amazonaws.com/${config.bucket}/${key}` });\n }\n\n // Default: S3 virtual-hosted style.\n return ok({ url: `https://${config.bucket}.s3.${config.region}.amazonaws.com/${key}` });\n};\n\nconst stripTrailingSlash = (s: string): string =>\n s.endsWith(\"/\") ? s.slice(0, -1) : s;\n","/**\n * `createS3Client` — turn a validated `FileSystemConfig` into a\n * configured `@aws-sdk/client-s3` `S3Client`.\n *\n * This is the ONLY place that knows the provider-specific knobs\n * (endpoint, forcePathStyle, region) for the client construction.\n * The adapter methods themselves are provider-agnostic; they\n * just call `client.send(command)` and the client handles routing.\n *\n * Provider-specific notes:\n * - **S3**: `region` is the AWS region. `endpoint` is optional\n * and only set for S3-compatible providers (MinIO,\n * LocalStack). `forcePathStyle` defaults to false (virtual-\n * hosted) but can be flipped to true for MinIO compatibility.\n * - **R2**: the SDK requires a `region` value but R2 ignores\n * it; we use the conventional \"auto\". `endpoint` is the\n * account-specific Cloudflare R2 endpoint (required). R2\n * ONLY supports path-style addressing; the `R2ConfigSchema`\n * type enforces `forcePathStyle: true` at the type level.\n */\nimport { S3Client } from \"@aws-sdk/client-s3\";\nimport type { FileSystemConfig, S3Config, R2Config } from \"../config\";\n\nexport const createS3Client = (config: FileSystemConfig): S3Client => {\n if (config.provider === \"r2\") {\n return buildClient({\n region: \"auto\",\n endpoint: config.endpoint,\n credentials: config.credentials,\n forcePathStyle: true,\n });\n }\n return buildClient({\n region: config.region,\n endpoint: config.endpoint,\n credentials: config.credentials,\n forcePathStyle: config.forcePathStyle,\n });\n};\n\nconst buildClient = (opts: {\n region: string;\n endpoint: string | undefined;\n credentials: { accessKeyId: string; secretAccessKey: string };\n forcePathStyle: boolean;\n}): S3Client => {\n return new S3Client({\n region: opts.region,\n endpoint: opts.endpoint,\n credentials: opts.credentials,\n forcePathStyle: opts.forcePathStyle,\n });\n};\n\n// Re-export the config types so adapter consumers can type-narrow\n// without a second import.\nexport type { S3Config, R2Config };\n","/**\n * `createS3Adapter` — the factory that turns a validated\n * `FileSystemConfig` into a fully-shaped `S3CompatibleAdapter`.\n *\n * The 17 methods are wired as thin delegations to the per-method\n * helpers in the same directory. Each helper is independently\n * testable (one test file per method) and shares the S3Client\n * + the error-mapping via `fromAws`.\n *\n * The factory is consumed by `createFileSystem` (in\n * `../factory.ts`) which also owns the `forTenant` namespacing\n * and the (future) MetadataStore wiring. This file is\n * intentionally pure: it only knows about the adapter surface,\n * not the higher-level `FileSystem` container.\n */\nimport type { S3Client } from \"@aws-sdk/client-s3\";\nimport type {\n S3CompatibleAdapter,\n} from \"../adapter\";\nimport type { FileSystemConfig } from \"../config\";\nimport { listObjects } from \"./list\";\nimport { readObject } from \"./read\";\nimport { statObject } from \"./stat\";\nimport { getMetadata } from \"./get-metadata\";\nimport { writeObject, MAX_SINGLE_PUT_SIZE } from \"./write\";\nimport { deleteObject } from \"./delete\";\nimport { existsObject } from \"./exists\";\nimport { copyObject } from \"./copy\";\nimport { moveObject } from \"./move\";\nimport { setMetadata } from \"./set-metadata\";\nimport {\n createPresignedUploadUrl,\n createPresignedDownloadUrl,\n} from \"./presigned\";\nimport { getPublicUrl } from \"./get-public-url\";\nimport {\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n} from \"./multipart\";\n\nexport { MAX_SINGLE_PUT_SIZE };\nexport { MULTIPART_PART_SIZE } from \"./write\";\n\n/**\n * Build a `S3CompatibleAdapter` from a `FileSystemConfig`. The\n * `client` is the underlying `@aws-sdk/client-s3` S3Client; pass\n * the result of `createS3Client(config)` here.\n */\nexport const createS3Adapter = (\n client: S3Client,\n config: FileSystemConfig,\n): S3CompatibleAdapter => ({\n list: (input) => listObjects(client, config, input),\n read: (input) => readObject(client, config, input),\n write: (input) => writeObject(client, config, input),\n delete: (input) => deleteObject(client, config, input),\n move: (input) => moveObject(client, config, input),\n copy: (input) => copyObject(client, config, input),\n stat: (input) => statObject(client, config, input),\n exists: (input) => existsObject(client, config, input),\n getMetadata: (input) => getMetadata(client, config, input),\n setMetadata: (input) => setMetadata(client, config, input),\n createPresignedUploadUrl: (input) => createPresignedUploadUrl(client, config, input),\n createPresignedDownloadUrl: (input) => createPresignedDownloadUrl(client, config, input),\n getPublicUrl: (input) => getPublicUrl(client, config, input),\n createMultipartUpload: (input) => createMultipartUpload(client, config, input),\n uploadPart: (input) => uploadPart(client, config, input),\n completeMultipartUpload: (input) => completeMultipartUpload(client, config, input),\n abortMultipartUpload: (input) => abortMultipartUpload(client, config, input),\n});\n\n// Re-exports for tests and downstream consumers who want to call\n// the helpers directly (e.g. the server actions layer in PR 7).\nexport { listObjects } from \"./list\";\nexport { readObject } from \"./read\";\nexport { statObject } from \"./stat\";\nexport { getMetadata } from \"./get-metadata\";\nexport { writeObject } from \"./write\";\nexport { deleteObject } from \"./delete\";\nexport { existsObject } from \"./exists\";\nexport { copyObject } from \"./copy\";\nexport { moveObject } from \"./move\";\nexport { setMetadata } from \"./set-metadata\";\nexport {\n createPresignedUploadUrl,\n createPresignedDownloadUrl,\n} from \"./presigned\";\nexport { getPublicUrl } from \"./get-public-url\";\nexport {\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n} from \"./multipart\";\nexport { createS3Client } from \"./client\";\n","/**\n * In-memory implementation of the 17-method `S3CompatibleAdapter` contract.\n *\n * Why this exists:\n * - **Demo / try-it-now experience**: lets the consumer run the\n * demo app without provisioning AWS S3 or MinIO. The whole\n * library (server actions, route handlers, headless hooks) works\n * end-to-end against this adapter.\n * - **Test utility**: integration tests and example apps can wire\n * a deterministic in-process backend instead of relying on\n * `aws-sdk-client-mock`. The state is observable (you can\n * inspect `store()` to assert on the bytes that were written).\n * - **Spec compliance**: every method returns the same\n * `Result<T, FileSystemError>` shape, enforces the same input\n * validation (5 GB single-PUT cap, mime-type default, etc.),\n * and emits the same error codes for the same conditions as the\n * S3 adapter. A consumer can swap adapters without changing\n * any application code.\n *\n * Limitations (intentional, all documented):\n * - **`createPresignedUploadUrl` / `createPresignedDownloadUrl`**\n * return `in-memory://` URLs that are only resolvable by the\n * in-memory adapter's own getter functions. The real S3 adapter\n * returns real SigV4 URLs.\n * - **`getPublicUrl`** returns a fake `https://in-memory.local/...`\n * URL. Useful for shape parity, not for serving real assets.\n * - State is per-process; it does NOT survive a server restart.\n * For persistence, use the S3 or R2 adapter.\n * - Not optimized for large blobs — the in-memory `Map` holds\n * every byte in RAM. A 5 GB PUT occupies 5 GB of heap.\n *\n * The 17-method count is enforced by the S3 adapter's contract test\n * (`packages/core/tests/storage/adapter.test.ts`); adding/removing\n * a method here must be reflected there too.\n */\nimport { randomUUID } from \"node:crypto\";\nimport type { Result } from \"@/types/result\";\nimport { FileSystemError, RETRYABLE_BY_CODE } from \"@/errors\";\nimport { asS3Key, asPrefix, type S3Key, type Prefix } from \"@/types/branded\";\nimport type {\n S3CompatibleAdapter,\n ListInput,\n ListOutput,\n ReadInput,\n ReadOutput,\n WriteInput,\n WriteOutput,\n DeleteInput,\n DeleteOutput,\n MoveInput,\n MoveOutput,\n CopyInput,\n CopyOutput,\n StatInput,\n StatOutput,\n ExistsInput,\n ExistsOutput,\n GetMetadataInput,\n GetMetadataOutput,\n SetMetadataInput,\n SetMetadataOutput,\n PresignedUploadInput,\n PresignedUploadOutput,\n PresignedDownloadInput,\n PresignedDownloadOutput,\n GetPublicUrlInput,\n GetPublicUrlOutput,\n CreateMultipartUploadInput,\n CreateMultipartUploadOutput,\n UploadPartInput,\n UploadPartOutput,\n CompleteMultipartUploadInput,\n CompleteMultipartUploadOutput,\n AbortMultipartUploadInput,\n AbortMultipartUploadOutput,\n} from \"../adapter\";\nimport { MAX_SINGLE_PUT_SIZE, MULTIPART_PART_SIZE } from \"../s3-adapter\";\n\n/** A single object stored in the in-memory backend. */\ninterface MemoryObject {\n readonly body: Uint8Array;\n readonly contentType: string;\n readonly userMetadata: Readonly<Record<string, string>>;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n}\n\n/** Public snapshot of the store. Tests use this to assert on state. */\nexport interface MemoryStoreSnapshot {\n /** Map from S3 key to the stored object. */\n readonly objects: ReadonlyMap<S3Key, MemoryObject>;\n /** Monotonic counter used to fabricate fake etags. */\n readonly etagCounter: number;\n}\n\n/** Options for `createMemoryAdapter`. */\nexport interface MemoryAdapterOptions {\n /** Default content type when the caller doesn't supply one. Default: `application/octet-stream`. */\n readonly defaultContentType?: string;\n /** Whether to validate the single-PUT size cap. Default: true. */\n readonly enforceSizeLimit?: boolean;\n /**\n * Override the single-PUT size cap. Default: `MAX_SINGLE_PUT_SIZE`\n * (5 GB). Lower this in tests so you don't need to allocate 5+ GB\n * of memory just to assert the cap.\n */\n readonly maxSinglePutSize?: number;\n /**\n * Optional bucket name for `getPublicUrl` fabrication. The\n * default `\"in-memory\"` keeps the URLs short and obviously fake.\n */\n readonly bucket?: string;\n}\n\nconst DEFAULT_CONTENT_TYPE = \"application/octet-stream\";\n\n/**\n * Compute a fake etag from the byte length + a counter so that\n * successive writes to the same key produce different etags.\n */\nfunction fakeEtag(bodyLength: number, counter: number): string {\n return `\"mem-${counter.toString(16)}-${bodyLength.toString(16)}\"`;\n}\n\n/**\n * Create a fresh in-memory adapter. The returned adapter is a\n * closure over a private `Map`; you can read the current state\n * via the `.store()` method.\n */\nexport function createMemoryAdapter(\n options: MemoryAdapterOptions = {},\n): S3CompatibleAdapter & { readonly store: () => MemoryStoreSnapshot } {\n const defaultContentType = options.defaultContentType ?? DEFAULT_CONTENT_TYPE;\n const enforceSizeLimit = options.enforceSizeLimit ?? true;\n const maxSinglePutSize = options.maxSinglePutSize ?? MAX_SINGLE_PUT_SIZE;\n const bucket = options.bucket ?? \"in-memory\";\n\n const objects = new Map<S3Key, MemoryObject>();\n let etagCounter = 0;\n\n /**\n * In-flight multipart upload sessions. Keyed by `${key}::${uploadId}`\n * so two parallel sessions on the same key don't collide. The\n * `aborted` flag is what `abortMultipartUpload` flips and what\n * subsequent `uploadPart` / `completeMultipartUpload` calls check\n * to return `NotFound` (S3 semantics: an aborted session is gone).\n */\n interface MultipartSession {\n readonly key: S3Key;\n readonly contentType: string;\n readonly metadata: Record<string, string>;\n readonly parts: Map<number, Uint8Array>;\n aborted: boolean;\n }\n const sessions = new Map<string, MultipartSession>();\n const sessionKey = (key: S3Key, uploadId: string): string => `${key}::${uploadId}`;\n\n /** Return a deep-copied snapshot (callers can't mutate the map). */\n const store = (): MemoryStoreSnapshot => {\n // Return a plain object (not a real Map) so JSON.stringify works\n // in dev-tools / log lines. Iterating a Map preserves insertion order.\n const plain: Record<string, MemoryObject> = {};\n for (const [k, v] of objects) plain[k as string] = v;\n return {\n objects: new Map(Object.entries(plain).map(([k, v]) => [asS3Key(k), v])) as ReadonlyMap<S3Key, MemoryObject>,\n etagCounter,\n };\n };\n\n // ---------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------\n\n /** Default content type when the caller didn't supply one. */\n const resolveContentType = (input: { contentType?: string }): string =>\n input.contentType ?? defaultContentType;\n\n /** Convert bytes to a Buffer for stable byteLength access. */\n /**\n * Coerce the body to a Uint8Array. We use duck-typing on\n * `ArrayBuffer.isView` and a numeric `byteLength` instead of\n * `instanceof Uint8Array` because vitest runs tests in worker\n * threads with separate realms, and `instanceof` fails across\n * realms (the source's `Uint8Array` and the test's `Uint8Array`\n * are different constructors even though the values are\n * structurally identical). See session memory\n * `sdd/file-next/v0.2-inmemory-adapter-cross-realm`.\n *\n * We always COPY the bytes into a fresh Uint8Array — even when\n * the input is already a Uint8Array in the same realm — so the\n * stored object is never aliased to the caller's buffer (a\n * caller mutating their input after a write() would otherwise\n * silently mutate the stored object too).\n */\n const toBytes = (data: WriteInput[\"body\"]): Uint8Array => {\n if (data == null) {\n throw new TypeError(\"WriteInput.body is required\");\n }\n // string → encode\n if (typeof data === \"string\") {\n return new TextEncoder().encode(data);\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return new Uint8Array(data.size);\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n // Duck-type: any TypedArray view (Uint8Array, Buffer, Int8Array,\n // etc.) has a numeric byteLength and ArrayBuffer.isView() === true.\n // This branch handles cross-realm Uint8Arrays where\n // `data instanceof Uint8Array` returns false but the value IS\n // structurally a Uint8Array.\n if (\n typeof data === \"object\" &&\n data !== null &&\n typeof (data as { byteLength?: unknown }).byteLength === \"number\" &&\n ArrayBuffer.isView(data)\n ) {\n const view = data as unknown as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n throw new TypeError(\n `WriteInput.body must be a string, Blob, ArrayBuffer, or TypedArray. Got: ${typeof data}`,\n );\n };\n\n /** Single source of truth for \"key not found\" results. */\n const notFound = (key: string): FileSystemError =>\n new FileSystemError({\n code: \"NotFound\",\n retryable: false,\n message: `Object not found: ${key}`,\n });\n\n /** Validate the single-PUT size cap (matches s3-adapter/write.ts). */\n const validateWriteSize = (\n body: Uint8Array,\n ): FileSystemError | null => {\n if (!enforceSizeLimit) return null;\n if (body.byteLength <= maxSinglePutSize) return null;\n return new FileSystemError({\n code: \"PayloadTooLarge\",\n retryable: false,\n message: `Object size ${body.byteLength} exceeds single-PUT limit ${maxSinglePutSize}`,\n });\n };\n\n // ---------------------------------------------------------------------\n // 17 methods\n // ---------------------------------------------------------------------\n\n const list = async (input: ListInput): Promise<Result<ListOutput, FileSystemError>> => {\n const prefixStr = (input.prefix ?? \"\") as string;\n const limit = input.limit ?? 1000;\n const items: Array<{ key: S3Key; size: number; lastModified: Date }> = [];\n const seenFolders = new Set<string>();\n for (const [key, obj] of objects) {\n const keyStr = key as string;\n if (!keyStr.startsWith(prefixStr)) continue;\n const remainder = keyStr.slice(prefixStr.length);\n // Group nested keys into a synthetic \"folder\" entry.\n const slashIdx = remainder.indexOf(\"/\");\n if (slashIdx > 0) {\n const folder = prefixStr + remainder.slice(0, slashIdx + 1);\n if (!seenFolders.has(folder)) {\n seenFolders.add(folder);\n items.push({ key: asS3Key(folder), size: 0, lastModified: obj.updatedAt });\n }\n continue;\n }\n items.push({\n key,\n size: obj.body.byteLength,\n lastModified: obj.updatedAt,\n });\n if (items.length >= limit) break;\n }\n return { ok: true, value: { items, prefixes: [] } };\n };\n\n const read = async (input: ReadInput): Promise<Result<ReadOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n return { ok: true, value: { body: obj.body, contentType: obj.contentType } };\n };\n\n const write = async (input: WriteInput): Promise<Result<WriteOutput, FileSystemError>> => {\n const body = toBytes(input.body);\n // Auto-switch to multipart for large Uint8Array bodies. The\n // byte-length check mirrors the S3 adapter's switch condition\n // so the two adapters behave identically. Stream / Blob /\n // ArrayBuffer inputs skip the switch (they go single-PUT after\n // `toBytes` reduces them to a Uint8Array).\n if (input.body instanceof Uint8Array && body.byteLength > MULTIPART_PART_SIZE) {\n return writeMultipartMemory(input, body);\n }\n const sizeErr = validateWriteSize(body);\n if (sizeErr) return { ok: false, error: sizeErr };\n etagCounter += 1;\n const now = new Date();\n const existing = objects.get(asS3Key(input.key));\n objects.set(asS3Key(input.key), {\n body,\n contentType: resolveContentType(input),\n userMetadata: { ...(input.metadata ?? {}) },\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n return {\n ok: true,\n value: {\n etag: fakeEtag(body.byteLength, etagCounter),\n },\n };\n };\n\n /**\n * Multipart write path for the in-memory adapter. Drives the\n * same four primitives as the S3 adapter and shares the\n * create → loop → complete → compensate structure. The\n * in-memory primitives never fail mid-flight for in-process\n * callers (the only failure mode is a missing session, which\n * can't happen if we always pass the uploadId we just got from\n * create), so the compensation never fires in practice — but\n * the structure is preserved so the adapter stays symmetric\n * with the S3 path.\n */\n const writeMultipartMemory = async (\n input: WriteInput,\n body: Uint8Array,\n ): Promise<Result<WriteOutput, FileSystemError>> => {\n const totalSize = body.byteLength;\n const chunkCount = Math.ceil(totalSize / MULTIPART_PART_SIZE);\n\n let uploadId: string | undefined;\n let completed = false;\n try {\n const create = await createMultipartUpload({\n key: input.key,\n contentType: input.contentType,\n metadata: input.metadata,\n });\n if (!create.ok) return { ok: false, error: create.error };\n uploadId = create.value.uploadId;\n\n const parts: Array<{ partNumber: number; etag: string }> = [];\n for (let i = 0; i < chunkCount; i++) {\n const start = i * MULTIPART_PART_SIZE;\n const end = Math.min(start + MULTIPART_PART_SIZE, totalSize);\n const chunk = body.slice(start, end);\n const up = await uploadPart({\n key: input.key,\n uploadId,\n partNumber: i + 1,\n body: chunk,\n });\n if (!up.ok) return { ok: false, error: up.error };\n parts.push({ partNumber: i + 1, etag: up.value.etag });\n }\n\n const complete = await completeMultipartUpload({\n key: input.key,\n uploadId,\n parts,\n });\n if (!complete.ok) return { ok: false, error: complete.error };\n completed = true;\n return {\n ok: true,\n value: { etag: complete.value.etag ?? fakeEtag(totalSize, ++etagCounter) },\n };\n } finally {\n if (uploadId !== undefined && !completed) {\n await abortMultipartUpload({ key: input.key, uploadId });\n }\n }\n };\n\n const del = async (input: DeleteInput): Promise<Result<DeleteOutput, FileSystemError>> => {\n const existed = objects.delete(asS3Key(input.key));\n return { ok: true, value: { existed } };\n };\n\n const move = async (input: MoveInput): Promise<Result<MoveOutput, FileSystemError>> => {\n const src = objects.get(asS3Key(input.sourceKey));\n if (!src) return { ok: false, error: notFound(input.sourceKey) };\n etagCounter += 1;\n const now = new Date();\n const existing = objects.get(asS3Key(input.destinationKey));\n objects.set(asS3Key(input.destinationKey), {\n ...src,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n if (input.sourceKey !== input.destinationKey) {\n objects.delete(asS3Key(input.sourceKey));\n }\n return { ok: true, value: { key: input.destinationKey } };\n };\n\n const copy = async (input: CopyInput): Promise<Result<CopyOutput, FileSystemError>> => {\n const src = objects.get(asS3Key(input.sourceKey));\n if (!src) return { ok: false, error: notFound(input.sourceKey) };\n etagCounter += 1;\n const now = new Date();\n objects.set(asS3Key(input.destinationKey), {\n body: new Uint8Array(src.body), // defensive copy\n contentType: src.contentType,\n userMetadata: { ...src.userMetadata },\n createdAt: now,\n updatedAt: now,\n });\n return { ok: true, value: { key: input.destinationKey } };\n };\n\n const stat = async (input: StatInput): Promise<Result<StatOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n return {\n ok: true,\n value: {\n key: input.key,\n size: obj.body.byteLength,\n etag: fakeEtag(obj.body.byteLength, etagCounter),\n contentType: obj.contentType,\n lastModified: obj.updatedAt,\n metadata: { ...obj.userMetadata },\n },\n };\n };\n\n const exists = async (\n input: ExistsInput,\n ): Promise<Result<ExistsOutput, FileSystemError>> => {\n return { ok: true, value: { exists: objects.has(asS3Key(input.key)) } };\n };\n\n const getMetadata = async (\n input: GetMetadataInput,\n ): Promise<Result<GetMetadataOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n return { ok: true, value: { key: input.key, metadata: obj.userMetadata } };\n };\n\n const setMetadata = async (\n input: SetMetadataInput,\n ): Promise<Result<SetMetadataOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n const next = input.replace\n ? { ...(input.metadata ?? {}) }\n : { ...obj.userMetadata, ...(input.metadata ?? {}) };\n objects.set(asS3Key(input.key), {\n ...obj,\n userMetadata: next,\n updatedAt: new Date(),\n });\n return { ok: true, value: {} };\n };\n\n const createPresignedUploadUrl = async (\n input: PresignedUploadInput,\n ): Promise<Result<PresignedUploadOutput, FileSystemError>> => {\n // Fake URL — only resolvable by the in-memory adapter's\n // own test helper (not exposed in the public adapter).\n const expiresIn = input.expiresIn ?? 900;\n return {\n ok: true,\n value: {\n url: `in-memory://${bucket}/${input.key}?expiresIn=${expiresIn}`,\n method: \"PUT\",\n },\n };\n };\n\n const createPresignedDownloadUrl = async (\n input: PresignedDownloadInput,\n ): Promise<Result<PresignedDownloadOutput, FileSystemError>> => {\n if (!objects.has(asS3Key(input.key))) {\n return { ok: false, error: notFound(input.key) };\n }\n const expiresIn = input.expiresIn ?? 900;\n return {\n ok: true,\n value: {\n url: `in-memory://${bucket}/${input.key}?expiresIn=${expiresIn}`,\n },\n };\n };\n\n const getPublicUrl = async (\n input: GetPublicUrlInput,\n ): Promise<Result<GetPublicUrlOutput, FileSystemError>> => {\n return {\n ok: true,\n value: { url: `https://${bucket}.local/${input.key}` },\n };\n };\n\n // ---------------------------------------------------------------------\n // Multipart upload primitives (v0.2).\n //\n // The in-memory adapter mirrors S3's session semantics: each\n // `createMultipartUpload` returns an opaque `uploadId`; subsequent\n // `uploadPart` calls accumulate per-part bytes keyed by\n // `partNumber`; `completeMultipartUpload` assembles the bytes in\n // the caller's part order and writes them into the objects Map\n // (so a subsequent `read` returns the assembled body); and\n // `abortMultipartUpload` flips a flag that makes any later\n // reference to the same uploadId return `NotFound` (matching the\n // S3 behaviour where an aborted session is gone from the\n // server's perspective).\n // ---------------------------------------------------------------------\n\n const createMultipartUpload = async (\n input: CreateMultipartUploadInput,\n ): Promise<Result<CreateMultipartUploadOutput, FileSystemError>> => {\n const uploadId = randomUUID();\n sessions.set(sessionKey(input.key, uploadId), {\n key: input.key,\n contentType: resolveContentType(input),\n metadata: { ...(input.metadata ?? {}) },\n parts: new Map(),\n aborted: false,\n });\n return {\n ok: true,\n value: { uploadId, key: input.key },\n };\n };\n\n const uploadPart = async (\n input: UploadPartInput,\n ): Promise<Result<UploadPartOutput, FileSystemError>> => {\n const session = sessions.get(sessionKey(input.key, input.uploadId));\n if (!session || session.aborted) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n session.parts.set(input.partNumber, input.body);\n return {\n ok: true,\n value: { etag: randomUUID(), partNumber: input.partNumber },\n };\n };\n\n const completeMultipartUpload = async (\n input: CompleteMultipartUploadInput,\n ): Promise<Result<CompleteMultipartUploadOutput, FileSystemError>> => {\n const session = sessions.get(sessionKey(input.key, input.uploadId));\n if (!session || session.aborted) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n // S3 semantics: every partNumber in the caller's list must\n // have been uploaded. Otherwise the complete fails.\n for (const { partNumber } of input.parts) {\n if (!session.parts.has(partNumber)) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n }\n // Assemble in the caller's order (S3 honours the part list\n // order; we do NOT sort).\n const totalLen = input.parts.reduce(\n (sum, p) => sum + (session.parts.get(p.partNumber)?.byteLength ?? 0),\n 0,\n );\n const assembled = new Uint8Array(totalLen);\n let offset = 0;\n for (const { partNumber } of input.parts) {\n const chunk = session.parts.get(partNumber)!;\n assembled.set(chunk, offset);\n offset += chunk.byteLength;\n }\n etagCounter += 1;\n const now = new Date();\n objects.set(asS3Key(input.key), {\n body: assembled,\n contentType: session.contentType,\n userMetadata: { ...session.metadata },\n createdAt: now,\n updatedAt: now,\n });\n sessions.delete(sessionKey(input.key, input.uploadId));\n return { ok: true, value: { etag: fakeEtag(assembled.byteLength, etagCounter) } };\n };\n\n const abortMultipartUpload = async (\n input: AbortMultipartUploadInput,\n ): Promise<Result<AbortMultipartUploadOutput, FileSystemError>> => {\n const session = sessions.get(sessionKey(input.key, input.uploadId));\n if (!session) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n session.aborted = true;\n sessions.delete(sessionKey(input.key, input.uploadId));\n return { ok: true, value: {} };\n };\n\n return {\n list,\n read,\n write,\n delete: del,\n move,\n copy,\n stat,\n exists,\n getMetadata,\n setMetadata,\n createPresignedUploadUrl,\n createPresignedDownloadUrl,\n getPublicUrl,\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n store,\n } as S3CompatibleAdapter & { readonly store: () => MemoryStoreSnapshot };\n}\n\n// Avoid unused-export warning for the asPrefix import in some configs.\nvoid asPrefix;\n\n// Keep RETRYABLE_BY_CODE imported to make adapter-side error code\n// choice explicit (e.g. NotFound is non-retryable, NetworkError is).\nvoid RETRYABLE_BY_CODE;\n","/**\n * `FileSystemConfig` — the discriminated union of provider configs\n * and its Zod-driven parser.\n *\n * The Zod schema is the single source of truth for both the\n * runtime shape AND the TypeScript type (`z.infer<...>`). Adding a\n * new field is a one-line change in the schema; the inferred type\n * updates automatically and every consumer gets the new field\n * without a separate type definition to keep in sync.\n *\n * Provider-specific shape notes:\n * - **S3**: `region` is required (AWS regional endpoints). An\n * optional `endpoint` is allowed for S3-compatible providers\n * (MinIO, LocalStack, etc.).\n * - **R2**: `endpoint` is required (Cloudflare R2 has no region\n * model — you talk to your account's endpoint). `forcePathStyle`\n * is ALWAYS `true` (R2 requires path-style addressing; the\n * literal type catches accidental overrides at parse time).\n *\n * `parseFileSystemConfig` is the trust boundary. Callers receive a\n * `Result<FileSystemConfig, FileSystemError>` — a parse failure is\n * an `InternalError` (retryable: false) with the original Zod\n * issues preserved on `cause` for debugging.\n */\nimport { z } from \"zod\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\n\n// ---------------------------------------------------------------------------\n// Shared credentials schema\n// ---------------------------------------------------------------------------\n\nconst CredentialsSchema = z.object({\n accessKeyId: z.string().min(1, \"accessKeyId is required\"),\n secretAccessKey: z.string().min(1, \"secretAccessKey is required\"),\n});\n\nexport type Credentials = z.infer<typeof CredentialsSchema>;\n\n// ---------------------------------------------------------------------------\n// Per-provider schemas\n// ---------------------------------------------------------------------------\n\nexport const S3ConfigSchema = z.object({\n provider: z.literal(\"s3\"),\n bucket: z.string().min(1, \"bucket is required\"),\n region: z.string().min(1, \"region is required\"),\n /** Optional S3-compatible endpoint (MinIO, LocalStack, ...). */\n endpoint: z.string().url().optional(),\n credentials: CredentialsSchema,\n /** Default false; some S3-compatible providers need path-style. */\n forcePathStyle: z.boolean().default(false),\n});\n\nexport const R2ConfigSchema = z.object({\n provider: z.literal(\"r2\"),\n bucket: z.string().min(1, \"bucket is required\"),\n endpoint: z.string().url(\"R2 requires an endpoint URL\"),\n credentials: CredentialsSchema,\n /** R2 ONLY supports path-style; the literal-true type makes that explicit. */\n forcePathStyle: z.literal(true),\n});\n\nexport const FileSystemConfigSchema = z.discriminatedUnion(\"provider\", [\n S3ConfigSchema,\n R2ConfigSchema,\n]);\n\nexport type S3Config = z.infer<typeof S3ConfigSchema>;\nexport type R2Config = z.infer<typeof R2ConfigSchema>;\nexport type FileSystemConfig = z.infer<typeof FileSystemConfigSchema>;\n\n// ---------------------------------------------------------------------------\n// Parser — the single trust boundary for env-derived config\n// ---------------------------------------------------------------------------\n\n/**\n * Parse an unknown value (typically the env object) into a typed\n * `FileSystemConfig`. Returns a `Result` so the call site can\n * branch on parse failure without try/catch.\n *\n * Mapping strategy:\n * - On success: `ok(config)`.\n * - On Zod failure: `err(FileSystemError(InternalError, retryable: false))`\n * with the original issues preserved on `cause` (as a synthetic\n * `{ code: \"ZodError\", message, issues }` shape so the\n * FileSystemError contract is honored).\n */\nexport const parseFileSystemConfig = (\n input: unknown,\n): Result<FileSystemConfig, FileSystemError> => {\n const parsed = FileSystemConfigSchema.safeParse(input);\n if (parsed.success) {\n return ok(parsed.data);\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Invalid FileSystemConfig\",\n retryable: false,\n cause: {\n code: \"ZodError\",\n message: parsed.error.message,\n issues: parsed.error.issues,\n },\n }),\n );\n};\n","/**\n * Tenant prefix wrapper — rewrites every key/prefix so one bucket\n * can hold many tenants without the rest of the library knowing.\n *\n * Metadata stores the tenant-relative key (usually the node UUID).\n * The wrapper prepends `t/{tenantId}/` on the way in and strips it\n * on the way out.\n */\nimport { ok, type Result } from \"@/types/result\";\nimport type { FileSystemError } from \"@/errors\";\nimport { asS3Key, asPrefix, type S3Key, type Prefix } from \"@/types/branded\";\nimport type { S3CompatibleAdapter } from \"./adapter\";\n\nexport const tenantPrefix = (tenantId: string): string => `t/${tenantId}/`;\n\nexport const prefixAdapter = (\n adapter: S3CompatibleAdapter,\n prefix: string,\n): S3CompatibleAdapter => {\n const strip = (key: string): string =>\n key.startsWith(prefix) ? key.slice(prefix.length) : key;\n const pk = (key: string): S3Key => asS3Key(`${prefix}${strip(key)}`);\n const pp = (p?: Prefix): Prefix => asPrefix(`${prefix}${p ?? \"\"}`);\n\n return {\n list: async (input) => {\n const r = await adapter.list({ ...input, prefix: pp(input.prefix) });\n if (!r.ok) return r;\n return ok({\n ...r.value,\n items: r.value.items.map((item) => ({\n ...item,\n key: asS3Key(strip(item.key)),\n })),\n prefixes: r.value.prefixes.map((p) => asPrefix(strip(p))),\n });\n },\n read: (input) => adapter.read({ ...input, key: pk(input.key) }),\n write: (input) => adapter.write({ ...input, key: pk(input.key) }),\n delete: (input) => adapter.delete({ ...input, key: pk(input.key) }),\n move: (input) =>\n adapter.move({\n sourceKey: pk(input.sourceKey),\n destinationKey: pk(input.destinationKey),\n }),\n copy: (input) =>\n adapter.copy({\n sourceKey: pk(input.sourceKey),\n destinationKey: pk(input.destinationKey),\n }),\n stat: async (input) => {\n const r = await adapter.stat({ key: pk(input.key) });\n if (!r.ok) return r;\n return ok({ ...r.value, key: asS3Key(strip(r.value.key)) });\n },\n exists: (input) => adapter.exists({ key: pk(input.key) }),\n getMetadata: (input) => adapter.getMetadata({ key: pk(input.key) }),\n setMetadata: (input) =>\n adapter.setMetadata({ ...input, key: pk(input.key) }),\n createPresignedUploadUrl: (input) =>\n adapter.createPresignedUploadUrl({ ...input, key: pk(input.key) }),\n createPresignedDownloadUrl: (input) =>\n adapter.createPresignedDownloadUrl({ ...input, key: pk(input.key) }),\n getPublicUrl: (input) => adapter.getPublicUrl({ key: pk(input.key) }),\n createMultipartUpload: async (input) => {\n const r = await adapter.createMultipartUpload({\n ...input,\n key: pk(input.key),\n });\n if (!r.ok) return r;\n return ok({ ...r.value, key: asS3Key(strip(r.value.key)) });\n },\n uploadPart: (input) =>\n adapter.uploadPart({ ...input, key: pk(input.key) }),\n completeMultipartUpload: (input) =>\n adapter.completeMultipartUpload({ ...input, key: pk(input.key) }),\n abortMultipartUpload: (input) =>\n adapter.abortMultipartUpload({ ...input, key: pk(input.key) }),\n };\n};\n\nexport type { Result, FileSystemError };\n","/**\n * `createFileSystem(config, options?)` — the only place that decides\n * which concrete adapter to instantiate and how tenant scoping works.\n */\nimport { createS3Adapter, createS3Client } from \"./s3-adapter\";\nimport { createMemoryAdapter } from \"./memory-adapter\";\nimport { parseFileSystemConfig, type FileSystemConfig } from \"./config\";\nimport type { FileSystem, CreateFileSystemOptions } from \"./filesystem\";\nimport { prefixAdapter, tenantPrefix } from \"./prefix-adapter\";\n\nconst MEMORY_CONFIG: FileSystemConfig = {\n provider: \"s3\",\n bucket: \"in-memory\",\n region: \"us-east-1\",\n credentials: {\n accessKeyId: \"in-memory\",\n secretAccessKey: \"in-memory\",\n },\n forcePathStyle: false,\n};\n\nconst assemble = (\n adapter: FileSystem[\"adapter\"],\n config: FileSystemConfig,\n options: CreateFileSystemOptions | undefined,\n): FileSystem => {\n const prefixKeys = options?.prefixTenantKeys !== false;\n const forTenant = (tenantId: string): FileSystem => ({\n adapter: prefixKeys ? prefixAdapter(adapter, tenantPrefix(tenantId)) : adapter,\n config,\n metadata: options?.store,\n tenantId,\n quotaBytes: options?.quotaBytes,\n forTenant,\n });\n\n return {\n adapter,\n config,\n metadata: options?.store,\n quotaBytes: options?.quotaBytes,\n forTenant,\n };\n};\n\nexport const createFileSystem = (\n config: FileSystemConfig,\n options?: CreateFileSystemOptions,\n): FileSystem => {\n const parsed = parseFileSystemConfig(config);\n if (!parsed.ok) {\n throw parsed.error;\n }\n const client = createS3Client(parsed.value);\n const adapter = createS3Adapter(client, parsed.value);\n return assemble(adapter, parsed.value, options);\n};\n\nexport const createMemoryFileSystem = (\n options?: CreateFileSystemOptions,\n): FileSystem => assemble(createMemoryAdapter(), MEMORY_CONFIG, options);\n","/**\n * withAuth — opt-in request wrapper. Resolves the caller; 401 if null.\n * Server actions use getAuth() instead (no Request in the RSC path).\n */\nimport type { TenantId, UserId } from \"@/types/branded\";\n\nexport interface AuthContext {\n readonly tenantId: TenantId;\n readonly userId: UserId;\n}\n\nexport const withAuth = <C extends AuthContext, R = Response>(\n resolve: (req: Request) => Promise<C | null>,\n handler: (ctx: C, req: Request) => Promise<R>,\n): ((req: Request) => Promise<R | Response>) => {\n return async (req: Request): Promise<R | Response> => {\n const ctx = await resolve(req);\n if (ctx === null) {\n return Response.json(\n {\n ok: false,\n error: { code: \"Unauthorized\", message: \"Not authenticated\" },\n },\n { status: 401 },\n );\n }\n return handler(ctx, req);\n };\n};\n","/**\n * `getFileSystem()` — the env-driven singleton that returns a\n * memoized `FileSystem` for the lifetime of the Node process.\n *\n * Usage:\n * - Server-side code (route handlers, server actions) imports\n * `getFileSystem` and calls it; the first call reads\n * `FILE_NEXT_*` env vars, parses them, and caches the result.\n * - Subsequent calls return the same instance — no per-request\n * re-parsing, no accidental config drift.\n *\n * Env vars (all `FILE_NEXT_` prefixed):\n * - FILE_NEXT_PROVIDER (required, \"s3\" | \"r2\")\n * - FILE_NEXT_BUCKET (required)\n * - FILE_NEXT_REGION (required for s3)\n * - FILE_NEXT_ENDPOINT (required for r2)\n * - FILE_NEXT_ACCESS_KEY_ID (required)\n * - FILE_NEXT_SECRET_ACCESS_KEY (required)\n * - FILE_NEXT_FORCE_PATH_STYLE (optional, default \"false\")\n *\n * Failure mode: a missing or malformed env throws\n * `FileSystemError(InternalError, retryable: false)` with the\n * original Zod issues on `cause`. This is a startup-time failure\n * (the process cannot function without a storage backend), so\n * throwing is the right contract — the caller (server bootstrap)\n * fails the process and the operator sees the issue in the logs.\n *\n * Test escape hatch: `_resetFileSystemForTests` clears the\n * memoized instance. The naming is intentionally ugly so a casual\n * reader can tell it should never be called from production code.\n */\nimport { createFileSystem } from \"./factory\";\nimport { parseFileSystemConfig, type FileSystemConfig } from \"./config\";\nimport { FileSystemError } from \"@/errors\";\nimport type { FileSystem } from \"./filesystem\";\n\n/** Cached FileSystem instance (null until first call). */\nlet cached: FileSystem | null = null;\n\n/**\n * Read `FILE_NEXT_*` env vars and return a typed `FileSystemConfig`\n * object. Throws `FileSystemError(InternalError)` on missing or\n * malformed env, with the original Zod issues on `cause`.\n */\nconst readConfigFromEnv = (): FileSystemConfig => {\n const provider = process.env.FILE_NEXT_PROVIDER;\n const bucket = process.env.FILE_NEXT_BUCKET;\n const region = process.env.FILE_NEXT_REGION;\n const endpoint = process.env.FILE_NEXT_ENDPOINT;\n const accessKeyId = process.env.FILE_NEXT_ACCESS_KEY_ID;\n const secretAccessKey = process.env.FILE_NEXT_SECRET_ACCESS_KEY;\n const forcePathStyleRaw = process.env.FILE_NEXT_FORCE_PATH_STYLE;\n\n // Build a draft object that the Zod schema can validate. Provider-\n // specific required fields (region for s3, endpoint for r2) are\n // surfaced as parse errors if missing, so we don't need to branch\n // here.\n const draft: Record<string, unknown> = {\n provider,\n bucket,\n region,\n endpoint,\n credentials:\n accessKeyId !== undefined && secretAccessKey !== undefined\n ? { accessKeyId, secretAccessKey }\n : undefined,\n };\n // R2 always uses path-style addressing (the Zod schema enforces\n // `forcePathStyle: literal(true)` for the r2 branch), so seed it\n // unconditionally. S3 honors the env var; default false.\n if (provider === \"r2\") {\n draft.forcePathStyle = true;\n } else if (forcePathStyleRaw !== undefined) {\n draft.forcePathStyle = forcePathStyleRaw === \"true\";\n }\n\n const parsed = parseFileSystemConfig(draft);\n if (!parsed.ok) {\n // Wrap the Zod error in a \"not configured\" InternalError so the\n // message reads as a startup failure, not a malformed-shape\n // failure. The original issues stay on `cause` for debugging.\n throw new FileSystemError({\n code: \"InternalError\",\n message: \"file-next storage is not configured: missing or invalid FILE_NEXT_* env vars\",\n retryable: false,\n cause: parsed.error.cause,\n });\n }\n return parsed.value;\n};\n\n/**\n * Return the memoized `FileSystem` for the current process, building\n * it from `FILE_NEXT_*` env vars on first call.\n */\nexport const getFileSystem = (): FileSystem => {\n if (cached !== null) return cached;\n const config = readConfigFromEnv();\n cached = createFileSystem(config);\n return cached;\n};\n\n/**\n * Test-only helper: clear the memoized `FileSystem` so the next\n * `getFileSystem()` call re-reads env vars. Production code MUST\n * NOT call this — the leading underscore is the contract.\n */\nexport const _resetFileSystemForTests = (): void => {\n cached = null;\n};\n","/**\n * Display-name rules for files and folders.\n *\n * Metadata `path` is `parentPath + \"/\" + name`. A raw `/` in `name`\n * would split the tree. S3 keys are UUIDs, so the bucket is unaffected;\n * the store still has to keep names as a single path segment.\n *\n * 255 matches the common POSIX/Windows filename cap.\n */\nimport { err, ok, type Result } from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\n\nexport const NODE_NAME_MAX_LENGTH = 255;\n\nexport function normalizeNodeName(\n raw: string,\n): Result<string, FileSystemError> {\n let name = raw.replace(/[\\u0000-\\u001F]/g, \"\").replace(/[/\\\\]/g, \"-\").trim();\n if (name === \"\" || name === \".\" || name === \"..\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Invalid node name\",\n retryable: false,\n }),\n );\n }\n if (name.length > NODE_NAME_MAX_LENGTH) {\n name = truncateNodeName(name, NODE_NAME_MAX_LENGTH);\n }\n return ok(name);\n}\n\nfunction truncateNodeName(name: string, max: number): string {\n const dot = name.lastIndexOf(\".\");\n const ext =\n dot > 0 && /^[a-zA-Z0-9]{1,8}$/.test(name.slice(dot + 1))\n ? name.slice(dot)\n : \"\";\n const stemMax = max - ext.length;\n if (stemMax < 1) return name.slice(0, max);\n return name.slice(0, stemMax) + ext;\n}\n\nexport function numberedDuplicateName(original: string, n: number): string {\n if (n <= 0) return original;\n const dot = original.lastIndexOf(\".\");\n const ext =\n dot > 0 && /^[a-zA-Z0-9]{1,8}$/.test(original.slice(dot + 1))\n ? original.slice(dot)\n : \"\";\n const stem = ext ? original.slice(0, -ext.length) : original;\n const suffix = ` (${n})`;\n const stemMax = NODE_NAME_MAX_LENGTH - suffix.length - ext.length;\n return (stemMax > 0 ? stem.slice(0, stemMax) : \"\") + suffix + ext;\n}\n","/**\n * Opaque keyset cursor for listChildren / search / trash.\n * Shape: base64url({ n: name, i: id }).\n */\nexport interface NameCursor {\n readonly n: string;\n readonly i: string;\n}\n\nexport const encodeCursor = (cursor: NameCursor): string =>\n Buffer.from(JSON.stringify(cursor), \"utf8\").toString(\"base64url\");\n\nexport const decodeCursor = (raw: string | undefined): NameCursor | null => {\n if (!raw) return null;\n try {\n const value = JSON.parse(\n Buffer.from(raw, \"base64url\").toString(\"utf8\"),\n ) as Partial<NameCursor>;\n if (typeof value.n === \"string\" && typeof value.i === \"string\") {\n return { n: value.n, i: value.i };\n }\n return null;\n } catch {\n return null;\n }\n};\n\nexport const pageCursor = <T extends { name: string; id: string }>(\n items: ReadonlyArray<T>,\n limit: number,\n): string | undefined => {\n if (items.length < limit || items.length === 0) return undefined;\n const last = items[items.length - 1];\n if (!last) return undefined;\n return encodeCursor({ n: last.name, i: last.id });\n};\n","/**\n * `createMemoryStore` — a Map-backed in-memory MetadataStore.\n *\n * Intended for:\n * - Unit tests of code that depends on a MetadataStore (no DB\n * setup needed).\n * - Single-process Next.js apps where the consumer is fine\n * losing the file tree on restart (rare; SQLite is usually\n * a better fit).\n * - Demos and quickstarts.\n *\n * NOT for production multi-process deployments: state lives in\n * the Node.js heap and is not shared across instances.\n *\n * Tenant isolation: enforced in app code. Every method filters\n * by `tenantId` before reading or writing; cross-tenant reads\n * return ok(null) (not an error, per the interface contract).\n *\n * The 9-method contract is fully implemented including:\n * - createNode (with name-uniqueness check within a parent)\n * - getNode (returns null for not-found)\n * - listChildren (paginated, sorted by name)\n * - moveNode (cascades path updates to descendants)\n * - deleteNode (soft-delete, recursive for folders)\n * - updateMetadata (merge or replace)\n * - search (case-insensitive name CONTAINS — v0.2 stays naive:\n * in-process Map doesn't need an FTS index. The SQLite\n * adapter uses FTS5 + sanitization and the Postgres\n * adapter uses pg_trgm + ILIKE; the memory store's\n * substring match is the cheapest correct answer for\n * the use case. Don't \"optimize\" this without thinking\n * about the contract test that pins the behavior.)\n * - getPath (walk up via parentId)\n * - reconcile (no-op: no external source to compare against)\n */\nimport {\n err,\n ok,\n type Result,\n} from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\nimport { asTenantId, asUserId } from \"@/types/branded\";\nimport type { S3Key, TenantId } from \"@/types/branded\";\nimport { decodeCursor, pageCursor } from \"./cursor\";\nimport { normalizeNodeName } from \"./node-name\";\nimport type {\n CreateNodeInput,\n DeleteNodeInput,\n FileNode,\n GetNodeInput,\n GetPathInput,\n ListChildrenInput,\n ListChildrenOutput,\n MetadataStore,\n MoveNodeInput,\n ReconcileResult,\n SearchInput,\n UpdateMetadataInput,\n} from \"./store\";\n\ninterface PendingOrphan {\n readonly id: string;\n readonly tenantId: TenantId;\n readonly s3Key: S3Key;\n readonly metadataId: string | null;\n readonly reason: string;\n readonly createdAt: Date;\n}\n\nexport const createMemoryStore = (): MetadataStore => {\n const nodes = new Map<string, FileNode>();\n const pendingOrphans = new Map<string, PendingOrphan>();\n const shares = new Map<\n string,\n { tenantId: TenantId; nodeId: string; expiresAt: Date | null }\n >();\n // Index: tenantId + parentId -> ordered child ids. Rebuilt on\n // createNode / moveNode / deleteNode. Keeps listChildren O(k)\n // for the k children of a folder, not O(n) over the whole store.\n const children = new Map<string, Set<string>>();\n\n const tenantKey = (tenantId: string, parentId: string | null): string =>\n `${tenantId}::${parentId ?? \"<root>\"}`;\n\n const makeId = (): string => {\n // crypto.randomUUID is available in Node.js 19+ and modern browsers.\n // Fall back to a Math.random-based id for older runtimes.\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `mem-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n };\n\n const addToChildrenIndex = (node: FileNode): void => {\n const key = tenantKey(node.tenantId, node.parentId);\n let set = children.get(key);\n if (!set) {\n set = new Set();\n children.set(key, set);\n }\n set.add(node.id);\n };\n\n const removeFromChildrenIndex = (node: FileNode): void => {\n const key = tenantKey(node.tenantId, node.parentId);\n children.get(key)?.delete(node.id);\n };\n\n const computePath = (\n tenantId: string,\n parentId: string | null,\n name: string,\n ): string => {\n if (parentId === null) return `/${name}`;\n const parent = nodes.get(parentId);\n if (!parent || parent.tenantId !== tenantId) {\n // Defensive: the caller should have validated the parent\n // exists. A bad call returns the leaf path so the consumer\n // sees something rather than a hard error here.\n return `/${name}`;\n }\n return `${parent.path === \"/\" ? \"\" : parent.path}/${name}`;\n };\n\n const ensureNameAvailable = (\n tenantId: string,\n parentId: string | null,\n name: string,\n ): Result<void, FileSystemError> => {\n const set = children.get(tenantKey(tenantId, parentId));\n if (!set) return ok(undefined);\n for (const id of set) {\n const n = nodes.get(id);\n if (n && n.name === name && n.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n }\n return ok(undefined);\n };\n\n return {\n async createNode(input: CreateNodeInput): Promise<Result<FileNode, FileSystemError>> {\n const normalized = normalizeNodeName(input.name);\n if (!normalized.ok) return normalized;\n const name = normalized.value;\n const nameOk = ensureNameAvailable(input.tenantId, input.parentId, name);\n if (!nameOk.ok) return nameOk;\n\n const id = input.id ?? makeId();\n if (nodes.has(id)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Node ${id} already exists`,\n retryable: false,\n }),\n );\n }\n const now = new Date();\n const path = computePath(input.tenantId, input.parentId, name);\n const node: FileNode = {\n id,\n tenantId: input.tenantId,\n parentId: input.parentId,\n name,\n path,\n kind: input.kind,\n size: input.kind === \"folder\" ? 0 : input.size,\n mimeType: input.kind === \"folder\" ? \"\" : input.mimeType,\n s3Key: input.kind === \"folder\" ? \"\" : input.s3Key,\n ownerId: input.ownerId,\n metadata: input.metadata ?? {},\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n };\n nodes.set(id, node);\n addToChildrenIndex(node);\n return ok(node);\n },\n\n async getNode(input: GetNodeInput): Promise<Result<FileNode | null, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n) return ok(null);\n if (n.tenantId !== input.tenantId) return ok(null);\n if (n.deletedAt !== null) return ok(null);\n return ok(n);\n },\n\n async listChildren(input: ListChildrenInput): Promise<Result<ListChildrenOutput, FileSystemError>> {\n const set = children.get(tenantKey(input.tenantId, input.parentId));\n if (!set) return ok({ items: [] });\n const items: FileNode[] = [];\n for (const id of set) {\n const n = nodes.get(id);\n if (n && n.deletedAt === null) {\n items.push(n);\n }\n }\n items.sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));\n const cursor = decodeCursor(input.cursor);\n const after = cursor\n ? items.filter(\n (n) =>\n n.name.localeCompare(cursor.n) > 0 ||\n (n.name === cursor.n && n.id.localeCompare(cursor.i) > 0),\n )\n : items;\n const limit = input.limit ?? after.length;\n const page = after.slice(0, limit);\n return ok({\n items: page,\n nextCursor: pageCursor(page, limit),\n });\n },\n\n async moveNode(input: MoveNodeInput): Promise<Result<FileNode, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const normalized = normalizeNodeName(input.newName ?? n.name);\n if (!normalized.ok) return normalized;\n const newName = normalized.value;\n\n // Cycle check: the new parent must not be a descendant of n.\n let cursor: string | null = input.newParentId;\n while (cursor !== null) {\n if (cursor === n.id) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into its own descendant\",\n retryable: false,\n }),\n );\n }\n const p = nodes.get(cursor);\n cursor = p ? p.parentId : null;\n }\n\n // Name uniqueness in the new parent (excluding self).\n const set = children.get(tenantKey(input.tenantId, input.newParentId));\n if (set) {\n for (const id of set) {\n if (id === n.id) continue;\n const sibling = nodes.get(id);\n if (sibling && sibling.name === newName && sibling.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${newName}' already exists in the destination folder`,\n retryable: false,\n }),\n );\n }\n }\n }\n\n // Update: remove from old parent's index, add to new parent's index.\n removeFromChildrenIndex(n);\n const newPath = computePath(input.tenantId, input.newParentId, newName);\n const updated: FileNode = {\n ...n,\n parentId: input.newParentId,\n name: newName,\n path: newPath,\n updatedAt: new Date(),\n };\n nodes.set(updated.id, updated);\n addToChildrenIndex(updated);\n\n // Cascade path updates to descendants.\n const cascade = (parent: FileNode): void => {\n const childSet = children.get(tenantKey(parent.tenantId, parent.id));\n if (!childSet) return;\n for (const childId of childSet) {\n const child = nodes.get(childId);\n if (!child || child.deletedAt !== null) continue;\n const childPath = `${parent.path === \"/\" ? \"\" : parent.path}/${child.name}`;\n const cascaded: FileNode = { ...child, path: childPath, updatedAt: new Date() };\n nodes.set(childId, cascaded);\n cascade(cascaded);\n }\n };\n cascade(updated);\n\n return ok(updated);\n },\n\n async deleteNode(input: DeleteNodeInput): Promise<Result<void, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n\n // Collect the subtree to tombstone.\n const toDelete: string[] = [n.id];\n const walk = (id: string): void => {\n const childSet = children.get(tenantKey(input.tenantId, id));\n if (!childSet) return;\n for (const childId of childSet) {\n toDelete.push(childId);\n walk(childId);\n }\n };\n if (input.recursive || n.kind === \"file\") {\n walk(n.id);\n } else {\n // Non-recursive on a non-empty folder: check if it has\n // live children, and if so, return Conflict.\n const childSet = children.get(tenantKey(input.tenantId, n.id));\n let hasLiveChild = false;\n if (childSet) {\n for (const childId of childSet) {\n const child = nodes.get(childId);\n if (child && child.deletedAt === null) {\n hasLiveChild = true;\n break;\n }\n }\n }\n if (hasLiveChild) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Folder '${n.name}' is not empty; pass recursive: true to delete the subtree`,\n retryable: false,\n }),\n );\n }\n // No live children: fall through and just tombstone the\n // folder itself (the recursive walk is a no-op anyway).\n }\n\n const now = new Date();\n for (const id of toDelete) {\n const target = nodes.get(id);\n if (!target) continue;\n nodes.set(id, { ...target, deletedAt: now, updatedAt: now });\n }\n return ok(undefined);\n },\n\n async purgeNode(input) {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Trashed node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const prefix = `${n.path}/`;\n const s3Keys: string[] = [];\n const ids: string[] = [];\n for (const node of nodes.values()) {\n if (node.tenantId !== input.tenantId || node.deletedAt === null) continue;\n if (node.id !== n.id && !node.path.startsWith(prefix)) continue;\n ids.push(node.id);\n if (node.kind === \"file\" && node.s3Key) s3Keys.push(node.s3Key);\n }\n for (const id of ids) {\n const node = nodes.get(id);\n if (node) removeFromChildrenIndex(node);\n nodes.delete(id);\n }\n for (const [token, share] of shares) {\n if (ids.includes(share.nodeId)) shares.delete(token);\n }\n return ok({ s3Keys });\n },\n\n async updateMetadata(input: UpdateMetadataInput): Promise<Result<FileNode, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const metadata = input.replace\n ? { ...input.metadata }\n : { ...n.metadata, ...input.metadata };\n const updated: FileNode = { ...n, metadata, updatedAt: new Date() };\n nodes.set(n.id, updated);\n return ok(updated);\n },\n\n async search(input: SearchInput): Promise<Result<ListChildrenOutput, FileSystemError>> {\n // Empty query → no results (v0.2 contract). Without this,\n // `String.includes(\"\")` would match every node.\n if (input.query.length === 0) {\n return ok({ items: [], nextCursor: undefined });\n }\n\n const query = input.query.toLowerCase();\n\n // Determine the scope: the parent folder's subtree, or the\n // whole tenant tree if parentId is omitted.\n const collect = (parentId: string | null, out: FileNode[]): void => {\n const set = children.get(tenantKey(input.tenantId, parentId));\n if (!set) return;\n for (const id of set) {\n const n = nodes.get(id);\n if (!n || n.deletedAt !== null) continue;\n if (n.name.toLowerCase().includes(query)) out.push(n);\n if (n.kind === \"folder\") collect(n.id, out);\n }\n };\n const matches: FileNode[] = [];\n collect(input.parentId ?? null, matches);\n // Stable sort by name for deterministic test output.\n matches.sort((a, b) => a.name.localeCompare(b.name));\n\n const limit = input.limit ?? matches.length;\n return ok({\n items: matches.slice(0, limit),\n nextCursor: matches.length > limit ? matches[limit]?.id : undefined,\n });\n },\n\n async getPath(input: GetPathInput): Promise<Result<{ segments: FileNode[] }, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n // Walk up to root.\n const segments: FileNode[] = [];\n let cursor: FileNode | undefined = n;\n while (cursor) {\n segments.unshift(cursor);\n if (cursor.parentId === null) break;\n cursor = nodes.get(cursor.parentId);\n }\n return ok({ segments });\n },\n\n async enqueueOrphan(input): Promise<Result<{ id: string }, FileSystemError>> {\n const id = makeId();\n pendingOrphans.set(id, {\n id,\n tenantId: input.tenantId,\n s3Key: input.s3Key,\n metadataId: input.metadataId ?? null,\n reason: input.reason,\n createdAt: new Date(),\n });\n return ok({ id });\n },\n\n async listPendingOrphans(input): Promise<Result<PendingOrphan[], FileSystemError>> {\n return ok(\n [...pendingOrphans.values()].filter(\n (orphan) => orphan.tenantId === input.tenantId,\n ),\n );\n },\n\n async deleteOrphan(input): Promise<Result<void, FileSystemError>> {\n const orphan = pendingOrphans.get(input.id);\n if (!orphan || orphan.tenantId !== input.tenantId) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Orphan ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n pendingOrphans.delete(input.id);\n return ok(undefined);\n },\n\n async reconcile(): Promise<Result<ReconcileResult, FileSystemError>> {\n return ok({ orphansInStore: [], orphansInS3: [], scanned: nodes.size });\n },\n\n async restoreNode(input) {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Deleted node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const available = ensureNameAvailable(n.tenantId, n.parentId, n.name);\n if (!available.ok) return available;\n const restored: FileNode = { ...n, deletedAt: null, updatedAt: new Date() };\n nodes.set(n.id, restored);\n return ok(restored);\n },\n\n async listTrash(input) {\n const items = [...nodes.values()]\n .filter((n) => n.tenantId === input.tenantId && n.deletedAt !== null)\n .sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));\n const cursor = decodeCursor(input.cursor);\n const after = cursor\n ? items.filter(\n (n) =>\n n.name.localeCompare(cursor.n) > 0 ||\n (n.name === cursor.n && n.id.localeCompare(cursor.i) > 0),\n )\n : items;\n const limit = input.limit ?? after.length;\n const page = after.slice(0, limit);\n return ok({ items: page, nextCursor: pageCursor(page, limit) });\n },\n\n async scanFileKeys(input) {\n return ok(\n [...nodes.values()]\n .filter(\n (n) =>\n n.tenantId === input.tenantId &&\n n.deletedAt === null &&\n n.kind === \"file\" &&\n n.s3Key !== \"\",\n )\n .map((n) => ({ id: n.id, s3Key: n.s3Key })),\n );\n },\n\n async sumSize(input) {\n let total = 0;\n for (const n of nodes.values()) {\n if (n.tenantId === input.tenantId && n.deletedAt === null && n.kind === \"file\") {\n total += n.size;\n }\n }\n return ok(total);\n },\n\n async findByS3Key(input) {\n for (const n of nodes.values()) {\n if (\n n.tenantId === input.tenantId &&\n n.s3Key === input.s3Key &&\n n.deletedAt === null\n ) {\n return ok(n);\n }\n }\n return ok(null);\n },\n\n async createShare(input) {\n const n = nodes.get(input.nodeId);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.nodeId} not found`,\n retryable: false,\n }),\n );\n }\n const token = makeId();\n shares.set(token, {\n tenantId: input.tenantId,\n nodeId: input.nodeId,\n expiresAt: input.expiresAt ?? null,\n });\n return ok({ token });\n },\n\n async resolveShare(input) {\n const share = shares.get(input.token);\n if (!share) return ok(null);\n if (share.expiresAt && share.expiresAt.getTime() < Date.now()) return ok(null);\n const n = nodes.get(share.nodeId);\n if (!n || n.deletedAt !== null) return ok(null);\n return ok(n);\n },\n\n async revokeShare(input) {\n const share = shares.get(input.token);\n if (!share || share.tenantId !== input.tenantId) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Share ${input.token} not found`,\n retryable: false,\n }),\n );\n }\n shares.delete(input.token);\n return ok(undefined);\n },\n };\n};\n\n// Re-export the types and helpers that consumers may want to use\n// when constructing inputs to the memory store.\nexport { asTenantId, asUserId };\n","/**\n * Query sanitizers for the SQL `MetadataStore.search()` adapters.\n *\n * FTS5 (SQLite MATCH) and SQL LIKE (Postgres `ILIKE`) both treat\n * user input as syntax. Without sanitization, a query like\n *\n * `name:foo` → FTS5 column-filter (literal `name` column only)\n * `foo AND bar` → FTS5 boolean AND\n * `(foo OR bar)` → FTS5 grouping\n * `*foo*` → FTS5 wildcard\n * `100%` → LIKE wildcard\n * `under_score` → LIKE single-char wildcard\n *\n * Either crashes the query (FTS5 syntax error) or returns wrong\n * rows (LIKE wildcard bypass). Each sanitizer is one-way: we wrap\n * user input in the syntax that makes it literal, never the other\n * way around.\n *\n * The FTS5 strategy is phrase-wrapping: put the query inside a\n * double-quoted phrase so every special character (including\n * reserved keywords) is treated as part of the literal string.\n * Embedded `\"` are doubled per FTS5 phrase-escape rules.\n *\n * The LIKE strategy is character-escaping: backslash-escape `%`,\n * `_`, and `\\` so they match literally under `ESCAPE '\\'`.\n */\n\n// ---------------------------------------------------------------------------\n// FTS5 (SQLite MATCH)\n// ---------------------------------------------------------------------------\n\n/**\n * Wrap a user query as an FTS5 phrase so every metacharacter and\n * reserved keyword (`\"`, `*`, `(`, `)`, `:`, `AND`, `OR`, `NOT`,\n * `NEAR`) is treated as literal text. Embedded `\"` are doubled\n * per FTS5 phrase-escape syntax. Empty input becomes an empty\n * phrase (`\"\"`) which is valid MATCH syntax and matches nothing.\n */\nexport function sanitizeFts5Query(query: string): string {\n return `\"${query.replace(/\"/g, `\"\"`)}\"`;\n}\n\n// ---------------------------------------------------------------------------\n// SQL LIKE (Postgres ILIKE)\n// ---------------------------------------------------------------------------\n\n/**\n * Escape `%`, `_`, and `\\` in a user query so it matches literally\n * inside a `LIKE` pattern that uses `ESCAPE '\\'`. Order matters:\n * the backslash must be escaped first so we don't double-escape\n * the escapes we add for `%` and `_`.\n */\nexport function sanitizeLikePattern(query: string): string {\n return query\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/%/g, \"\\\\%\")\n .replace(/_/g, \"\\\\_\");\n}\n","/**\n * `createSqliteStore` — a SQLite-backed `MetadataStore`.\n *\n * Built on `better-sqlite3` (sync native binding). Every public\n * method returns a Promise to satisfy the `MetadataStore`\n * interface, but the actual SQL work is synchronous — there is\n * no I/O between calls.\n *\n * Schema (one table):\n *\n * nodes(\n * id TEXT PRIMARY KEY, -- UUID v4\n * tenant_id TEXT NOT NULL,\n * parent_id TEXT NOT NULL DEFAULT '', -- '' = root (SQLite treats NULL\n * -- as distinct in unique indexes,\n * -- so we use '' to enforce\n * -- uniqueness at root level)\n * name TEXT NOT NULL,\n * path TEXT NOT NULL, -- materialized \"/a/b/c\"\n * kind TEXT NOT NULL CHECK (kind IN ('file','folder')),\n * size INTEGER NOT NULL DEFAULT 0,\n * mime_type TEXT NOT NULL DEFAULT '',\n * s3_key TEXT NOT NULL DEFAULT '',\n * owner_id TEXT NOT NULL,\n * metadata TEXT NOT NULL DEFAULT '{}', -- JSON\n * created_at TEXT NOT NULL, -- ISO 8601\n * updated_at TEXT NOT NULL,\n * deleted_at TEXT -- ISO 8601 or NULL\n * )\n *\n * Partial unique index on (tenant_id, parent_id, name)\n * WHERE deleted_at IS NULL → name uniqueness only for live\n * rows. Soft-deleted rows free the name.\n *\n * Indexes for hot paths:\n * nodes_path_prefix → LIKE 'path/%' for moveNode cascade\n * nodes_tenant_root → list root children\n * nodes_tenant_parent → list children of any folder\n * nodes_name_nocase → search by name COLLATE NOCASE\n *\n * Full-text search:\n * nodes_fts FTS5 virtual table mirroring nodes.name\n * (tokenizer: unicode61 remove_diacritics 2\n * — ASCII case folding + diacritic strip).\n * Kept in sync with `nodes` via triggers\n * (insert / update / delete). Tombstoned\n * rows (deleted_at NOT NULL) are excluded\n * from the FTS index so search results\n * never include deleted nodes.\n *\n * Tenant isolation is enforced in app code (filter by tenant_id\n * in every query). Same posture as the memory store.\n *\n * The `reconcile()` method is a no-op — the real reconcile that\n * walks the S3 bucket needs the adapter injected, which would\n * change the MetadataStore interface. Tracked for v0.3.\n */\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Database as BetterSqliteDatabase } from \"better-sqlite3\";\n\n/**\n * The native `better-sqlite3` binding is loaded lazily. A top-level\n * `import Database from \"better-sqlite3\"` pulls the native module\n * into every consumer's dependency graph, and bundlers like Next.js\n * webpack/turbopack walk the native require chain at build time and\n * fail with \"Can't resolve 'fs'\" — even when createSqliteStore is\n * never called. Loading inside `buildInner` (the real factory body)\n * keeps the native binding out of the consumer's bundle until\n * createSqliteStore is actually invoked.\n *\n * We use `createRequire(import.meta.url)` to make webpack/turbopack\n * emit a runtime `require()` call. Vitest resolves the require at\n * runtime too (no static analysis).\n */\ntype BetterSqlite3Module = typeof import(\"better-sqlite3\");\ntype DatabaseCtor = new (path: string) => BetterSqliteDatabase;\nconst extractDatabase = (mod: BetterSqlite3Module): DatabaseCtor => {\n const m = mod as unknown as { default?: DatabaseCtor };\n return (m.default ?? (mod as unknown as DatabaseCtor));\n};\nimport {\n err,\n ok,\n type Result,\n} from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\nimport { asS3Key, asTenantId, asUserId } from \"@/types/branded\";\nimport type { TenantId } from \"@/types/branded\";\nimport { sanitizeFts5Query } from \"./sanitize\";\nimport { normalizeNodeName } from \"./node-name\";\nimport { decodeCursor, pageCursor } from \"./cursor\";\nimport type {\n CreateNodeInput,\n DeleteNodeInput,\n FileNode,\n GetNodeInput,\n GetPathInput,\n ListChildrenInput,\n ListChildrenOutput,\n MetadataStore,\n MoveNodeInput,\n ReconcileResult,\n SearchInput,\n UpdateMetadataInput,\n} from \"./store\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface SqliteStoreOptions {\n /**\n * SQLite file path, or \":memory:\" for a private in-memory\n * database. Use \":memory:\" in tests; a real path in apps so\n * the file tree survives restarts.\n */\n readonly path: string;\n /**\n * Run schema migrations on construction. Default: true.\n * Set false when sharing a DB across multiple stores (each\n * instance would otherwise re-run the idempotent CREATE).\n */\n readonly runMigrations?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Row → FileNode\n// ---------------------------------------------------------------------------\n\ninterface NodeRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly parent_id: string | null;\n readonly name: string;\n readonly path: string;\n readonly kind: \"file\" | \"folder\";\n readonly size: number;\n readonly mime_type: string;\n readonly s3_key: string;\n readonly owner_id: string;\n readonly metadata: string;\n readonly created_at: string;\n readonly updated_at: string;\n readonly deleted_at: string | null;\n}\n\ninterface OrphanRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly s3_key: string;\n readonly metadata_id: string | null;\n readonly reason: string;\n readonly created_at: string;\n}\n\nconst rowToPendingOrphan = (row: OrphanRow) => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n s3Key: asS3Key(row.s3_key),\n metadataId: row.metadata_id,\n reason: row.reason,\n createdAt: new Date(row.created_at),\n});\n\nconst rowToFileNode = (row: NodeRow): FileNode => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n // SQLite stores '' for \"no parent\" (NULL doesn't work in\n // unique indexes — see the schema comment).\n parentId: row.parent_id === \"\" ? null : row.parent_id,\n name: row.name,\n path: row.path,\n kind: row.kind,\n size: row.size,\n mimeType: row.mime_type,\n s3Key: row.s3_key,\n ownerId: asUserId(row.owner_id),\n metadata: JSON.parse(row.metadata) as Record<string, string>,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n deletedAt: row.deleted_at === null ? null : new Date(row.deleted_at),\n});\n\n// ---------------------------------------------------------------------------\n// Migrations\n// ---------------------------------------------------------------------------\n\nconst SCHEMA_VERSION = 4;\n\nconst MIGRATION_SQL = `\nCREATE TABLE IF NOT EXISTS schema_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n parent_id TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK (kind IN ('file', 'folder')),\n size INTEGER NOT NULL DEFAULT 0,\n mime_type TEXT NOT NULL DEFAULT '',\n s3_key TEXT NOT NULL DEFAULT '',\n owner_id TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS pending_orphans (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n s3_key TEXT NOT NULL,\n metadata_id TEXT,\n reason TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS pending_orphans_tenant_created\n ON pending_orphans(tenant_id, created_at);\n\nCREATE TABLE IF NOT EXISTS shares (\n token TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n node_id TEXT NOT NULL,\n expires_at TEXT,\n created_at TEXT NOT NULL\n);\n\n-- Name uniqueness for LIVE rows only. NULL deleted_at lets two\n-- deleted rows share a name; a new live row then claims the slot.\nCREATE UNIQUE INDEX IF NOT EXISTS nodes_unique_live_name\n ON nodes(tenant_id, parent_id, name)\n WHERE deleted_at IS NULL;\n\nCREATE INDEX IF NOT EXISTS nodes_path_prefix\n ON nodes(path);\nCREATE INDEX IF NOT EXISTS nodes_tenant_parent\n ON nodes(tenant_id, parent_id);\nCREATE INDEX IF NOT EXISTS nodes_name_nocase\n ON nodes(name COLLATE NOCASE);\n\n-- FTS5 virtual table for search. content='nodes' + content_rowid='rowid'\n-- makes FTS5 read row metadata from the source table; triggers below\n-- are still responsible for keeping the FTS index in sync (FTS5 does\n-- NOT auto-track the content table when you mutate the source).\n--\n-- Tokenizer: unicode61 remove_diacritics 2\n-- - ASCII case folding (Hello → hello)\n-- - Latin script case folding\n-- - Diacritic stripping (café → cafe)\n-- This matches the \"case-insensitive matching\" contract.\nCREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(\n name,\n content='nodes',\n content_rowid='rowid',\n tokenize='unicode61 remove_diacritics 2'\n);\n\n-- Sync triggers. Tombstoned rows (deleted_at NOT NULL) are NOT in\n-- the FTS index — the UPDATE trigger re-inserts only when the new\n-- row is live. This means search() never has to filter on deleted_at\n-- (the index already excludes them), but we keep the filter as a\n-- safety net in case the triggers ever diverge.\nCREATE TRIGGER IF NOT EXISTS nodes_fts_ai AFTER INSERT ON nodes\nWHEN new.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(rowid, name) VALUES (new.rowid, new.name);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS nodes_fts_ad AFTER DELETE ON nodes\nWHEN old.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS nodes_fts_au AFTER UPDATE ON nodes BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\n INSERT INTO nodes_fts(rowid, name)\n SELECT new.rowid, new.name WHERE new.deleted_at IS NULL;\nEND;\n`;\n\nconst FTS_REBUILD_SQL = `\nDROP TRIGGER IF EXISTS nodes_fts_ai;\nDROP TRIGGER IF EXISTS nodes_fts_ad;\nDROP TRIGGER IF EXISTS nodes_fts_au;\nDROP TABLE IF EXISTS nodes_fts;\nCREATE VIRTUAL TABLE nodes_fts USING fts5(\n name,\n content='nodes',\n content_rowid='rowid',\n tokenize='unicode61 remove_diacritics 2'\n);\nCREATE TRIGGER nodes_fts_ai AFTER INSERT ON nodes\nWHEN new.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(rowid, name) VALUES (new.rowid, new.name);\nEND;\nCREATE TRIGGER nodes_fts_ad AFTER DELETE ON nodes\nWHEN old.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\nEND;\nCREATE TRIGGER nodes_fts_au AFTER UPDATE ON nodes BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\n INSERT INTO nodes_fts(rowid, name)\n SELECT new.rowid, new.name WHERE new.deleted_at IS NULL;\nEND;\nINSERT INTO nodes_fts(rowid, name) SELECT rowid, name FROM nodes WHERE deleted_at IS NULL;\n`;\n\nconst runMigrations = (db: BetterSqliteDatabase): void => {\n db.exec(MIGRATION_SQL);\n const row = db\n .prepare(\"SELECT value FROM schema_meta WHERE key = 'version'\")\n .get() as { value: string } | undefined;\n const version = row ? Number(row.value) : 0;\n if (!Number.isFinite(version) || version < 4) {\n db.exec(FTS_REBUILD_SQL);\n }\n db.prepare(\n \"INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('version', ?)\",\n ).run(String(SCHEMA_VERSION));\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nconst loadBetterSqlite = (): BetterSqlite3Module => {\n const origins = [import.meta.url, pathToFileURL(join(process.cwd(), \"package.json\")).href];\n const errors: string[] = [];\n for (const origin of origins) {\n try {\n return createRequire(origin)(\"better-sqlite3\") as BetterSqlite3Module;\n } catch (error) {\n errors.push(`${origin}: ${(error as Error).message}`);\n }\n }\n throw new FileSystemError({\n code: \"InternalError\",\n message: `better-sqlite3 is not installed or its native binding is missing. ${errors.join(\" | \")}`,\n retryable: false,\n });\n};\n\nexport const createSqliteStore = (\n options: SqliteStoreOptions,\n): MetadataStore => {\n // The consumer-facing factory is sync (matches the MetadataStore\n // contract). The real work is built lazily — we return an object\n // that delegates every method through `ensureReady()`, which\n // resolves once and caches. First method call pays the import\n // cost; the rest are direct.\n let inner: MetadataStore | null = null;\n let pending: Promise<MetadataStore> | null = null;\n\n const ensureReady = async (): Promise<MetadataStore> => {\n if (inner) return inner;\n if (!pending) {\n pending = (async () => {\n // createRequire gives us a real require() call that\n // webpack/turbopack leave alone (treated as a runtime call).\n const mod = loadBetterSqlite();\n inner = buildInner(extractDatabase(mod), options);\n return inner;\n })();\n }\n return pending;\n };\n\n const wrap = <A extends unknown[], R>(\n method: (store: MetadataStore, ...args: A) => Promise<R>,\n ): ((...args: A) => Promise<R>) =>\n async (...args: A): Promise<R> => {\n const s = await ensureReady();\n return method(s, ...args);\n };\n\n return {\n createNode: wrap((s, i) => s.createNode(i)),\n getNode: wrap((s, i) => s.getNode(i)),\n listChildren: wrap((s, i) => s.listChildren(i)),\n moveNode: wrap((s, i) => s.moveNode(i)),\n deleteNode: wrap((s, i) => s.deleteNode(i)),\n purgeNode: wrap((s, i) => s.purgeNode(i)),\n updateMetadata: wrap((s, i) => s.updateMetadata(i)),\n search: wrap((s, i) => s.search(i)),\n getPath: wrap((s, i) => s.getPath(i)),\n reconcile: wrap((s) => s.reconcile()),\n enqueueOrphan: wrap((s, i) => s.enqueueOrphan(i)),\n listPendingOrphans: wrap((s, i) => s.listPendingOrphans(i)),\n deleteOrphan: wrap((s, i) => s.deleteOrphan(i)),\n restoreNode: wrap((s, i) => s.restoreNode(i)),\n listTrash: wrap((s, i) => s.listTrash(i)),\n scanFileKeys: wrap((s, i) => s.scanFileKeys(i)),\n sumSize: wrap((s, i) => s.sumSize(i)),\n findByS3Key: wrap((s, i) => s.findByS3Key(i)),\n createShare: wrap((s, i) => s.createShare(i)),\n resolveShare: wrap((s, i) => s.resolveShare(i)),\n revokeShare: wrap((s, i) => s.revokeShare(i)),\n };\n};\n\n/**\n * The real factory — receives the loaded Database constructor and\n * options, builds the prepared statements and the 9-method store.\n * Defined below as a closure that captures `Database` at call\n * time (after the lazy import resolves).\n */\nconst buildInner = (\n Database: DatabaseCtor,\n options: SqliteStoreOptions,\n): MetadataStore => {\n const db = new Database(options.path);\n // WAL gives us better concurrent read performance for little\n // extra cost (we're not heavily contended; still, cheap).\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n\n if (options.runMigrations !== false) {\n runMigrations(db);\n }\n\n // -------------------------------------------------------------------------\n // Prepared statements\n // -------------------------------------------------------------------------\n\n const stmtInsert = db.prepare(`\n INSERT INTO nodes (\n id, tenant_id, parent_id, name, path, kind, size, mime_type,\n s3_key, owner_id, metadata, created_at, updated_at, deleted_at\n ) VALUES (\n @id, @tenant_id, @parent_id, @name, @path, @kind, @size, @mime_type,\n @s3_key, @owner_id, @metadata, @created_at, @updated_at, NULL\n )\n `);\n\n const stmtGetById = db.prepare(`\n SELECT * FROM nodes\n WHERE id = ? AND tenant_id = ? AND deleted_at IS NULL\n `);\n\n // For getPath chain walking — include tombstoned ancestors so\n // the path mirrors the memory-store behavior (no gaps even if a\n // mid-chain parent is soft-deleted).\n const stmtGetByIdAny = db.prepare(`\n SELECT * FROM nodes\n WHERE id = ? AND tenant_id = ?\n `);\n\n // parent_id is stored as '' (empty string) for \"no parent\"\n // because SQLite treats NULL as distinct in unique indexes.\n // All queries that compare parent_id use `=` with '' bound.\n const stmtListChildren = db.prepare(`\n SELECT * FROM nodes\n WHERE tenant_id = ? AND parent_id = ?\n AND deleted_at IS NULL\n ORDER BY name COLLATE NOCASE ASC\n LIMIT ?\n `);\n\n const stmtCountChildren = db.prepare(`\n SELECT COUNT(*) AS c FROM nodes\n WHERE tenant_id = ? AND parent_id = ? AND deleted_at IS NULL\n `);\n\n const stmtUpdateSelfMove = db.prepare(`\n UPDATE nodes\n SET parent_id = ?, name = ?, path = ?, updated_at = ?\n WHERE id = ?\n `);\n\n // Prefix-only replace: SUBSTR strips the leading oldPath and\n // we prepend newPath. Avoids accidentally rewriting nested\n // segments that happen to share the moved name (e.g. moving\n // \"/foo\" to \"/bar\" must turn \"/foo/sub/foo\" into \"/bar/sub/foo\",\n // not \"/bar/sub/bar\").\n const stmtCascadeDescendants = db.prepare(`\n UPDATE nodes\n SET path = ? || SUBSTR(path, LENGTH(?) + 1), updated_at = ?\n WHERE path LIKE ? || '/%'\n `);\n\n const stmtTombstone = db.prepare(`\n UPDATE nodes\n SET deleted_at = ?, updated_at = ?\n WHERE id = ?\n `);\n\n const stmtTombstoneSubtree = db.prepare(`\n UPDATE nodes\n SET deleted_at = ?, updated_at = ?\n WHERE (id = ? OR path LIKE ? || '/%')\n AND deleted_at IS NULL\n `);\n\n const stmtHasLiveChild = db.prepare(`\n SELECT 1 FROM nodes\n WHERE tenant_id = ? AND parent_id = ? AND deleted_at IS NULL\n LIMIT 1\n `);\n\n const stmtUpdateMetadata = db.prepare(`\n UPDATE nodes\n SET metadata = ?, updated_at = ?\n WHERE id = ? AND tenant_id = ? AND deleted_at IS NULL\n `);\n\n const stmtSearchGlobal = db.prepare(`\n SELECT n.* FROM nodes n\n JOIN nodes_fts ON n.rowid = nodes_fts.rowid\n WHERE nodes_fts MATCH ?\n AND n.tenant_id = ?\n AND n.deleted_at IS NULL\n ORDER BY bm25(nodes_fts)\n LIMIT ?\n `);\n\n const stmtSearchInFolder = db.prepare(`\n SELECT n.* FROM nodes n\n JOIN nodes_fts ON n.rowid = nodes_fts.rowid\n WHERE nodes_fts MATCH ?\n AND n.tenant_id = ?\n AND n.deleted_at IS NULL\n AND (n.id = ? OR n.path LIKE ? || '/%')\n ORDER BY bm25(nodes_fts)\n LIMIT ?\n `);\n\n const stmtEnqueueOrphan = db.prepare(`\n INSERT INTO pending_orphans (\n id, tenant_id, s3_key, metadata_id, reason, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const stmtListPendingOrphans = db.prepare(`\n SELECT * FROM pending_orphans\n WHERE tenant_id = ?\n ORDER BY created_at ASC, id ASC\n `);\n\n const stmtDeleteOrphan = db.prepare(`\n DELETE FROM pending_orphans\n WHERE tenant_id = ? AND id = ?\n `);\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n const makeId = (): string => {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `sql-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n };\n\n const nowIso = (): string => new Date().toISOString();\n\n // Boundary translation: FileNode.parentId is null | string,\n // but the SQLite column is NOT NULL with '' for root. Map at\n // every bind site so the rest of the code can compare with =.\n const dbParent = (id: string | null): string => id ?? \"\";\n\n const computePath = (\n parentPath: string | null,\n name: string,\n ): string => {\n if (parentPath === null) return `/${name}`;\n return `${parentPath}/${name}`;\n };\n\n const notFound = (id: string): Result<never, FileSystemError> =>\n err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${id} not found`,\n retryable: false,\n }),\n );\n\n const escapeLike = (s: string): string =>\n s.replace(/\\\\/g, \"\\\\\\\\\").replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n\n // -------------------------------------------------------------------------\n // 9-method contract\n // -------------------------------------------------------------------------\n\n return {\n async createNode(\n input: CreateNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n const normalized = normalizeNodeName(input.name);\n if (!normalized.ok) return normalized;\n const name = normalized.value;\n const now = nowIso();\n const id = input.id ?? makeId();\n\n // Look up parent (if any) to compute the path. We require\n // a LIVE parent; tombstoned parents can't have new children.\n // `!= null` (not `!== null`) so that BOTH null and\n // undefined skip the lookup.\n let parentPath: string | null = null;\n if (input.parentId != null) {\n const parent = stmtGetById.get(input.parentId, input.tenantId) as\n | NodeRow\n | undefined;\n if (!parent) return notFound(input.parentId);\n if (parent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Parent ${input.parentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n parentPath = parent.path;\n }\n\n const path = computePath(parentPath, name);\n\n try {\n stmtInsert.run({\n id,\n tenant_id: input.tenantId,\n parent_id: dbParent(input.parentId),\n name,\n path,\n kind: input.kind,\n size: input.kind === \"folder\" ? 0 : input.size,\n mime_type: input.kind === \"folder\" ? \"\" : input.mimeType,\n s3_key: input.kind === \"folder\" ? \"\" : input.s3Key,\n owner_id: input.ownerId,\n metadata: JSON.stringify(input.metadata ?? {}),\n created_at: now,\n updated_at: now,\n });\n } catch (e) {\n // SQLite UNIQUE violation on nodes_unique_live_name.\n if (e instanceof Error && /UNIQUE constraint failed/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: `createNode failed: ${(e as Error).message}`,\n retryable: false,\n }),\n );\n }\n\n const created = stmtGetById.get(id, input.tenantId) as NodeRow | undefined;\n if (!created) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Row missing immediately after insert\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(created));\n },\n\n async getNode(\n input: GetNodeInput,\n ): Promise<Result<FileNode | null, FileSystemError>> {\n const row = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n return ok(row ? rowToFileNode(row) : null);\n },\n\n async listChildren(\n input: ListChildrenInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n const limit = input.limit ?? 1000;\n const parentId = dbParent(input.parentId);\n const cursor = decodeCursor(input.cursor);\n const rows = (\n cursor\n ? db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND parent_id = ?\n AND deleted_at IS NULL\n AND (name COLLATE NOCASE > ? COLLATE NOCASE\n OR (name COLLATE NOCASE = ? COLLATE NOCASE AND id > ?))\n ORDER BY name COLLATE NOCASE ASC, id ASC\n LIMIT ?`,\n )\n .all(input.tenantId, parentId, cursor.n, cursor.n, cursor.i, limit)\n : stmtListChildren.all(input.tenantId, parentId, limit)\n ) as ReadonlyArray<NodeRow>;\n const items = rows.map(rowToFileNode);\n return ok({\n items,\n nextCursor: pageCursor(items, limit),\n });\n },\n\n async moveNode(\n input: MoveNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n const current = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!current) return notFound(input.id);\n\n const normalized = normalizeNodeName(input.newName ?? current.name);\n if (!normalized.ok) return normalized;\n const newName = normalized.value;\n\n // Validate the new parent (if any) and check for cycles.\n // `!= null` (not `!== null`) so that BOTH null and\n // undefined skip the validation. (undefined !== null is\n // TRUE in JS — the footgun that hid this for an hour.)\n let newParentPath: string | null = null;\n if (input.newParentId != null) {\n if (input.newParentId === current.id) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into itself\",\n retryable: false,\n }),\n );\n }\n const newParent = stmtGetById.get(input.newParentId, input.tenantId) as\n | NodeRow\n | undefined;\n if (!newParent) return notFound(input.newParentId);\n if (newParent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Destination ${input.newParentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n // Cycle: newParent must not be a descendant of current.\n if (newParent.path === current.path || newParent.path.startsWith(`${current.path}/`)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into its own descendant\",\n retryable: false,\n }),\n );\n }\n newParentPath = newParent.path;\n }\n\n const newPath = computePath(newParentPath, newName);\n\n try {\n const tx = db.transaction(() => {\n stmtUpdateSelfMove.run(\n dbParent(input.newParentId),\n newName,\n newPath,\n nowIso(),\n input.id,\n );\n if (current.path !== newPath) {\n // Params: newPath, oldPath, now, oldPath (for LIKE).\n stmtCascadeDescendants.run(\n newPath,\n current.path,\n nowIso(),\n current.path,\n );\n }\n });\n tx();\n } catch (e) {\n if (e instanceof Error && /UNIQUE constraint failed/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${newName}' already exists in the destination folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: `moveNode failed: ${(e as Error).message}`,\n retryable: false,\n }),\n );\n }\n\n const updated = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!updated) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Node missing after move\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(updated));\n },\n\n async deleteNode(\n input: DeleteNodeInput,\n ): Promise<Result<void, FileSystemError>> {\n const node = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!node) return notFound(input.id);\n\n if (node.kind === \"folder\" && !input.recursive) {\n const hasChild = stmtHasLiveChild.get(input.tenantId, input.id);\n if (hasChild) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Folder '${node.name}' is not empty; pass recursive: true to delete the subtree`,\n retryable: false,\n }),\n );\n }\n }\n\n const now = nowIso();\n if (input.recursive || node.kind === \"file\") {\n stmtTombstoneSubtree.run(now, now, input.id, node.path);\n } else {\n stmtTombstone.run(now, now, input.id);\n }\n return ok(undefined);\n },\n\n async purgeNode(input: {\n tenantId: TenantId;\n id: string;\n }): Promise<Result<{ s3Keys: ReadonlyArray<string> }, FileSystemError>> {\n const node = db\n .prepare(\n `SELECT id, path FROM nodes WHERE id = ? AND tenant_id = ? AND deleted_at IS NOT NULL`,\n )\n .get(input.id, input.tenantId) as { id: string; path: string } | undefined;\n if (!node) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Trashed node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const like = `${node.path}/%`;\n const files = db\n .prepare(\n `SELECT s3_key FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NOT NULL AND kind = 'file' AND s3_key != ''\n AND (id = ? OR path LIKE ?)`,\n )\n .all(input.tenantId, input.id, like) as Array<{ s3_key: string }>;\n db.prepare(\n `DELETE FROM shares WHERE tenant_id = ? AND node_id IN (\n SELECT id FROM nodes WHERE tenant_id = ? AND deleted_at IS NOT NULL AND (id = ? OR path LIKE ?)\n )`,\n ).run(input.tenantId, input.tenantId, input.id, like);\n db.prepare(\n `DELETE FROM nodes WHERE tenant_id = ? AND deleted_at IS NOT NULL AND (id = ? OR path LIKE ?)`,\n ).run(input.tenantId, input.id, like);\n return ok({ s3Keys: files.map((row) => row.s3_key) });\n },\n\n async updateMetadata(\n input: UpdateMetadataInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n const node = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!node) return notFound(input.id);\n\n const next = input.replace\n ? { ...input.metadata }\n : { ...(JSON.parse(node.metadata) as Record<string, string>), ...input.metadata };\n\n const result = stmtUpdateMetadata.run(\n JSON.stringify(next),\n nowIso(),\n input.id,\n input.tenantId,\n );\n if (result.changes === 0) {\n return notFound(input.id);\n }\n const updated = stmtGetById.get(input.id, input.tenantId) as NodeRow;\n return ok(rowToFileNode(updated));\n },\n\n async search(\n input: SearchInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n const limit = input.limit ?? 100;\n\n // Empty query → no results (preserves existing contract).\n if (input.query.length === 0) {\n return ok({ items: [], nextCursor: undefined });\n }\n\n // Sanitize for FTS5 MATCH. The sanitizer wraps the query in a\n // phrase so every metacharacter and reserved keyword is\n // treated as literal text. Without it, `name:foo` would be\n // parsed as a column-filter, `foo AND bar` would become a\n // boolean AND, etc.\n const ftsQuery = sanitizeFts5Query(input.query);\n\n let rows: ReadonlyArray<NodeRow>;\n try {\n if (input.parentId === undefined) {\n rows = stmtSearchGlobal.all(ftsQuery, input.tenantId, limit) as ReadonlyArray<NodeRow>;\n } else {\n const parent = stmtGetById.get(input.parentId, input.tenantId) as\n | NodeRow\n | undefined;\n if (!parent) return notFound(input.parentId);\n if (parent.path === \"/\") {\n // Root's subtree is the whole tenant — use the global\n // query (avoids the root path's \"LIKE '//%'\" no-op).\n rows = stmtSearchGlobal.all(ftsQuery, input.tenantId, limit) as ReadonlyArray<NodeRow>;\n } else {\n rows = stmtSearchInFolder.all(\n ftsQuery,\n input.tenantId,\n input.parentId,\n parent.path,\n limit,\n ) as ReadonlyArray<NodeRow>;\n }\n }\n } catch (e) {\n // Defensive: a sanitized phrase query should never raise a\n // syntax error, but if FTS5 ever does, return empty rather\n // than crash. The empty-results-on-bad-pattern behavior\n // is the documented contract.\n return ok({ items: [], nextCursor: undefined });\n }\n\n return ok({\n items: rows.map(rowToFileNode),\n nextCursor: rows.length === limit ? String(limit) : undefined,\n });\n },\n\n async getPath(\n input: GetPathInput,\n ): Promise<Result<{ segments: FileNode[] }, FileSystemError>> {\n const start = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!start) return notFound(input.id);\n\n const segments: FileNode[] = [];\n let cursor: NodeRow | undefined = start;\n while (cursor) {\n segments.unshift(rowToFileNode(cursor));\n // parent_id is stored as '' for root; treat '' as the\n // termination condition.\n if (cursor.parent_id === \"\") break;\n // Include tombstoned ancestors — mirrors memory-store and\n // gives the consumer a complete breadcrumb even if a\n // mid-chain parent was soft-deleted.\n cursor = stmtGetByIdAny.get(cursor.parent_id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!cursor) break;\n }\n return ok({ segments });\n },\n\n async enqueueOrphan(input) {\n const id = makeId();\n try {\n stmtEnqueueOrphan.run(\n id,\n input.tenantId,\n input.s3Key,\n input.metadataId ?? null,\n input.reason,\n nowIso(),\n );\n return ok({ id });\n } catch (error) {\n return err(FileSystemError.fromSqlite(error));\n }\n },\n\n async listPendingOrphans(input) {\n try {\n const rows = stmtListPendingOrphans.all(\n input.tenantId,\n ) as ReadonlyArray<OrphanRow>;\n return ok(rows.map(rowToPendingOrphan));\n } catch (error) {\n return err(FileSystemError.fromSqlite(error));\n }\n },\n\n async deleteOrphan(input) {\n try {\n const result = stmtDeleteOrphan.run(input.tenantId, input.id);\n if (result.changes === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Orphan ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n } catch (error) {\n return err(FileSystemError.fromSqlite(error));\n }\n },\n\n async reconcile(): Promise<Result<ReconcileResult, FileSystemError>> {\n const row = db\n .prepare(\"SELECT COUNT(*) AS c FROM nodes WHERE deleted_at IS NULL\")\n .get() as { c: number };\n return ok({\n orphansInStore: [],\n orphansInS3: [],\n scanned: row.c,\n });\n },\n\n async restoreNode(input) {\n const row = stmtGetByIdAny.get(input.id, input.tenantId) as NodeRow | undefined;\n if (!row || row.deleted_at === null) return notFound(input.id);\n try {\n db.prepare(\n `UPDATE nodes SET deleted_at = NULL, updated_at = ? WHERE id = ? AND tenant_id = ?`,\n ).run(nowIso(), input.id, input.tenantId);\n } catch (e) {\n if (e instanceof Error && /UNIQUE constraint failed/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A live node named '${row.name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n return err(FileSystemError.fromSqlite(e));\n }\n const restored = stmtGetById.get(input.id, input.tenantId) as NodeRow | undefined;\n if (!restored) return notFound(input.id);\n return ok(rowToFileNode(restored));\n },\n\n async listTrash(input) {\n const limit = input.limit ?? 1000;\n const cursor = decodeCursor(input.cursor);\n const rows = (\n cursor\n ? db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NOT NULL\n AND (name COLLATE NOCASE > ? COLLATE NOCASE\n OR (name COLLATE NOCASE = ? COLLATE NOCASE AND id > ?))\n ORDER BY name COLLATE NOCASE ASC, id ASC\n LIMIT ?`,\n )\n .all(input.tenantId, cursor.n, cursor.n, cursor.i, limit)\n : db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NOT NULL\n ORDER BY name COLLATE NOCASE ASC, id ASC\n LIMIT ?`,\n )\n .all(input.tenantId, limit)\n ) as ReadonlyArray<NodeRow>;\n const items = rows.map(rowToFileNode);\n return ok({ items, nextCursor: pageCursor(items, limit) });\n },\n\n async scanFileKeys(input) {\n const rows = db\n .prepare(\n `SELECT id, s3_key FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NULL AND kind = 'file' AND s3_key != ''`,\n )\n .all(input.tenantId) as Array<{ id: string; s3_key: string }>;\n return ok(rows.map((r) => ({ id: r.id, s3Key: r.s3_key })));\n },\n\n async sumSize(input) {\n const row = db\n .prepare(\n `SELECT COALESCE(SUM(size), 0) AS c FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NULL AND kind = 'file'`,\n )\n .get(input.tenantId) as { c: number };\n return ok(row.c);\n },\n\n async findByS3Key(input) {\n const row = db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND s3_key = ? AND deleted_at IS NULL\n LIMIT 1`,\n )\n .get(input.tenantId, input.s3Key) as NodeRow | undefined;\n return ok(row ? rowToFileNode(row) : null);\n },\n\n async createShare(input) {\n const node = stmtGetById.get(input.nodeId, input.tenantId) as NodeRow | undefined;\n if (!node) return notFound(input.nodeId);\n const token = makeId();\n db.prepare(\n `INSERT INTO shares (token, tenant_id, node_id, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n ).run(\n token,\n input.tenantId,\n input.nodeId,\n input.expiresAt?.toISOString() ?? null,\n nowIso(),\n );\n return ok({ token });\n },\n\n async resolveShare(input) {\n const share = db\n .prepare(`SELECT * FROM shares WHERE token = ?`)\n .get(input.token) as\n | { tenant_id: string; node_id: string; expires_at: string | null }\n | undefined;\n if (!share) return ok(null);\n if (share.expires_at && Date.parse(share.expires_at) < Date.now()) return ok(null);\n const node = stmtGetById.get(share.node_id, share.tenant_id) as NodeRow | undefined;\n return ok(node ? rowToFileNode(node) : null);\n },\n\n async revokeShare(input) {\n const result = db\n .prepare(`DELETE FROM shares WHERE token = ? AND tenant_id = ?`)\n .run(input.token, input.tenantId);\n if (result.changes === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Share ${input.token} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n },\n };\n};\n\nexport { asTenantId, asUserId };\n","/**\n * `createPostgresStore` — a Postgres-backed `MetadataStore`.\n *\n * Built on `pg` (node-postgres). Public methods are async (the\n * interface requires it); the actual SQL runs against a `Pool`\n * whose connections are managed internally.\n *\n * Schema (one table):\n *\n * nodes(\n * id UUID PRIMARY KEY, -- generated by the app\n * tenant_id TEXT NOT NULL,\n * parent_id UUID, -- NULL = root\n * name TEXT NOT NULL,\n * path TEXT NOT NULL, -- materialized \"/a/b/c\"\n * kind TEXT NOT NULL CHECK (kind IN ('file','folder')),\n * size BIGINT NOT NULL DEFAULT 0,\n * mime_type TEXT NOT NULL DEFAULT '',\n * s3_key TEXT NOT NULL DEFAULT '',\n * owner_id TEXT NOT NULL,\n * metadata JSONB NOT NULL DEFAULT '{}'::jsonb,\n * created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n * updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n * deleted_at TIMESTAMPTZ\n * )\n *\n * Two partial unique indexes for name uniqueness (Postgres treats\n * NULL as distinct in UNIQUE indexes, same footgun as SQLite):\n *\n * - (tenant_id, parent_id, name) WHERE deleted_at IS NULL\n * AND parent_id IS NOT NULL → non-root siblings\n * - (tenant_id, name) WHERE deleted_at IS NULL\n * AND parent_id IS NULL → root children\n *\n * Indexes for hot paths:\n * nodes_path_prefix → LIKE 'path/%' for moveNode cascade\n * nodes_tenant_parent → listChildren\n * nodes_name_lower → btree on lower(name); used for exact-match\n * LIKE/ILIKE plans (no leading wildcard)\n * nodes_name_trgm_idx → GIN trigram on lower(name); used for\n * ILIKE '%x%' plans (leading wildcard).\n * Requires CREATE EXTENSION pg_trgm.\n *\n * Tenant isolation is enforced in app code (every query filters\n * by tenant_id). For a stricter setup, RLS policies + a per-query\n * `SET LOCAL app.current_tenant` would close the gap at the DB.\n * Tracked for a follow-up.\n *\n * The `reconcile()` method is a no-op scan — same as the memory\n * and SQLite stores. Real bucket-walking reconcile would need\n * the S3 adapter injected into the store, which would change the\n * interface. Deferred to a follow-up.\n */\nimport { createRequire } from \"node:module\";\nimport type { Pool, PoolClient, QueryResultRow } from \"pg\";\n\n/**\n * Lazy-load `pg` (node-postgres). The native modules (pg's optional\n * native bindings) and connection management shouldn't enter\n * every consumer's bundle. Same pattern as `sqlite-store.ts`.\n */\ntype PgModule = typeof import(\"pg\");\ntype PgTypes = {\n Pool: new (opts: { connectionString: string; max?: number }) => Pool;\n PoolClient: new (...args: never[]) => PoolClient;\n QueryResultRow: QueryResultRow;\n};\nconst extractPg = (mod: PgModule): PgTypes => {\n const m = mod as unknown as { default?: PgTypes };\n return m.default ?? (mod as unknown as PgTypes);\n};\nimport {\n err,\n ok,\n type Result,\n} from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\nimport { asS3Key, asTenantId, asUserId } from \"@/types/branded\";\nimport type { TenantId } from \"@/types/branded\";\nimport { sanitizeLikePattern } from \"./sanitize\";\nimport { decodeCursor, pageCursor } from \"./cursor\";\nimport { normalizeNodeName } from \"./node-name\";\nimport type {\n CreateNodeInput,\n DeleteNodeInput,\n FileNode,\n GetNodeInput,\n GetPathInput,\n ListChildrenInput,\n ListChildrenOutput,\n MetadataStore,\n MoveNodeInput,\n ReconcileResult,\n SearchInput,\n UpdateMetadataInput,\n} from \"./store\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface PostgresStoreOptions {\n /**\n * A libpq connection string. Example:\n * postgres://user:pass@localhost:5432/dbname\n */\n readonly connectionString: string;\n /**\n * Postgres schema (namespace). Defaults to \"public\".\n * Use a dedicated schema per tenant in shared clusters.\n */\n readonly schema?: string;\n /**\n * Run schema migrations on construction. Default: true.\n */\n readonly runMigrations?: boolean;\n /**\n * Max pool size. Defaults to 10.\n */\n readonly maxPoolSize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Row → FileNode\n// ---------------------------------------------------------------------------\n\ninterface NodeRow extends QueryResultRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly parent_id: string | null;\n readonly name: string;\n readonly path: string;\n readonly kind: \"file\" | \"folder\";\n readonly size: string | number;\n readonly mime_type: string;\n readonly s3_key: string;\n readonly owner_id: string;\n readonly metadata: Record<string, string>;\n readonly created_at: Date;\n readonly updated_at: Date;\n readonly deleted_at: Date | null;\n}\n\ninterface OrphanRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly s3_key: string;\n readonly metadata_id: string | null;\n readonly reason: string;\n readonly created_at: Date;\n}\n\nconst rowToPendingOrphan = (row: OrphanRow) => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n s3Key: asS3Key(row.s3_key),\n metadataId: row.metadata_id,\n reason: row.reason,\n createdAt: row.created_at,\n});\n\nconst rowToFileNode = (row: NodeRow): FileNode => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n parentId: row.parent_id,\n name: row.name,\n path: row.path,\n kind: row.kind,\n // pg returns BIGINT as string by default to avoid precision loss\n // on JS numbers > 2^53. Cast back; file sizes fit comfortably.\n size: typeof row.size === \"string\" ? Number.parseInt(row.size, 10) : row.size,\n mimeType: row.mime_type,\n s3Key: row.s3_key,\n ownerId: asUserId(row.owner_id),\n metadata: row.metadata,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: row.deleted_at,\n});\n\n// ---------------------------------------------------------------------------\n// Migrations\n// ---------------------------------------------------------------------------\n\nconst SCHEMA_VERSION = 3;\n\nconst MIGRATION_SQL = (schema: string): string => `\n-- pg_trgm provides the gin_trgm_ops operator class so we can build\n-- a GIN trigram index on lower(name). Without the extension,\n-- CREATE INDEX … USING GIN (lower(name) gin_trgm_ops) fails.\n-- The extension is shared across the cluster (no schema), so it\n-- only needs to be installed once per database. IF NOT EXISTS\n-- makes the call a no-op on subsequent migrations.\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\n\nCREATE SCHEMA IF NOT EXISTS \"${schema}\";\n\n-- Tables are schema-qualified (they have to be, to live in\n-- the schema). Index NAMES must NOT be schema-qualified —\n-- Postgres syntax error otherwise. The index inherits the\n-- schema from its table, so search_path isn't required.\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".schema_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".nodes (\n id UUID PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n parent_id UUID,\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK (kind IN ('file', 'folder')),\n size BIGINT NOT NULL DEFAULT 0,\n mime_type TEXT NOT NULL DEFAULT '',\n s3_key TEXT NOT NULL DEFAULT '',\n owner_id TEXT NOT NULL,\n metadata JSONB NOT NULL DEFAULT '{}'::jsonb,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".pending_orphans (\n id UUID PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n s3_key TEXT NOT NULL,\n metadata_id TEXT,\n reason TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE INDEX IF NOT EXISTS pending_orphans_tenant_created\n ON \"${schema}\".pending_orphans (tenant_id, created_at);\n\n-- Name uniqueness for non-root siblings.\nCREATE UNIQUE INDEX IF NOT EXISTS nodes_unique_live_nonroot_name\n ON \"${schema}\".nodes (tenant_id, parent_id, name)\n WHERE deleted_at IS NULL AND parent_id IS NOT NULL;\n\n-- Name uniqueness for root children (NULL parent_id).\nCREATE UNIQUE INDEX IF NOT EXISTS nodes_unique_live_root_name\n ON \"${schema}\".nodes (tenant_id, name)\n WHERE deleted_at IS NULL AND parent_id IS NULL;\n\nCREATE INDEX IF NOT EXISTS nodes_path_prefix\n ON \"${schema}\".nodes (path text_pattern_ops);\nCREATE INDEX IF NOT EXISTS nodes_tenant_parent\n ON \"${schema}\".nodes (tenant_id, parent_id);\nCREATE INDEX IF NOT EXISTS nodes_name_lower\n ON \"${schema}\".nodes (lower(name));\n\n-- GIN trigram index lets ILIKE '%foo%' on lower(name) use an\n-- index plan instead of a seq scan. Cheap to maintain (~3x the\n-- row size), but search is O(matches) instead of O(rows) — a\n-- real win past a few thousand rows.\nCREATE INDEX IF NOT EXISTS nodes_name_trgm_idx\n ON \"${schema}\".nodes USING GIN (lower(name) gin_trgm_ops);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".shares (\n token TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n node_id UUID NOT NULL,\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nALTER TABLE \"${schema}\".nodes ENABLE ROW LEVEL SECURITY;\nALTER TABLE \"${schema}\".nodes FORCE ROW LEVEL SECURITY;\nDROP POLICY IF EXISTS tenant_isolation ON \"${schema}\".nodes;\nCREATE POLICY tenant_isolation ON \"${schema}\".nodes\n USING (tenant_id = current_setting('app.current_tenant', true))\n WITH CHECK (tenant_id = current_setting('app.current_tenant', true));\n\nALTER TABLE \"${schema}\".pending_orphans ENABLE ROW LEVEL SECURITY;\nALTER TABLE \"${schema}\".pending_orphans FORCE ROW LEVEL SECURITY;\nDROP POLICY IF EXISTS orphan_tenant_isolation ON \"${schema}\".pending_orphans;\nCREATE POLICY orphan_tenant_isolation ON \"${schema}\".pending_orphans\n USING (tenant_id = current_setting('app.current_tenant', true))\n WITH CHECK (tenant_id = current_setting('app.current_tenant', true));\n`;\n\nconst runMigrations = async (\n pool: Pool,\n schema: string,\n): Promise<void> => {\n const client = await pool.connect();\n try {\n await client.query(MIGRATION_SQL(schema));\n await client.query(\n `INSERT INTO \"${schema}\".schema_meta (key, value) VALUES ('version', $1)\n ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,\n [String(SCHEMA_VERSION)],\n );\n } finally {\n client.release();\n }\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport const createPostgresStore = (\n options: PostgresStoreOptions,\n): MetadataStore => {\n // Public factory is sync; the real work builds lazily on first\n // method call. See the matching comment in sqlite-store.ts.\n let inner: MetadataStore | null = null;\n let pending: Promise<MetadataStore> | null = null;\n\n const ensureReady = async (): Promise<MetadataStore> => {\n if (inner) return inner;\n if (!pending) {\n pending = (async () => {\n const req = createRequire(import.meta.url);\n const mod = req(\"pg\") as PgModule;\n inner = buildInner(extractPg(mod), options);\n return inner;\n })();\n }\n return pending;\n };\n\n const wrap = <A extends unknown[], R>(\n method: (store: MetadataStore, ...args: A) => Promise<R>,\n ): ((...args: A) => Promise<R>) =>\n async (...args: A): Promise<R> => {\n const s = await ensureReady();\n return method(s, ...args);\n };\n\n return {\n createNode: wrap((s, i) => s.createNode(i)),\n getNode: wrap((s, i) => s.getNode(i)),\n listChildren: wrap((s, i) => s.listChildren(i)),\n moveNode: wrap((s, i) => s.moveNode(i)),\n deleteNode: wrap((s, i) => s.deleteNode(i)),\n purgeNode: wrap((s, i) => s.purgeNode(i)),\n updateMetadata: wrap((s, i) => s.updateMetadata(i)),\n search: wrap((s, i) => s.search(i)),\n getPath: wrap((s, i) => s.getPath(i)),\n reconcile: wrap((s) => s.reconcile()),\n enqueueOrphan: wrap((s, i) => s.enqueueOrphan(i)),\n listPendingOrphans: wrap((s, i) => s.listPendingOrphans(i)),\n deleteOrphan: wrap((s, i) => s.deleteOrphan(i)),\n restoreNode: wrap((s, i) => s.restoreNode(i)),\n listTrash: wrap((s, i) => s.listTrash(i)),\n scanFileKeys: wrap((s, i) => s.scanFileKeys(i)),\n sumSize: wrap((s, i) => s.sumSize(i)),\n findByS3Key: wrap((s, i) => s.findByS3Key(i)),\n createShare: wrap((s, i) => s.createShare(i)),\n resolveShare: wrap((s, i) => s.resolveShare(i)),\n revokeShare: wrap((s, i) => s.revokeShare(i)),\n };\n};\n\n/**\n * Real factory — builds the prepared-query store using the loaded\n * pg module.\n */\nconst buildInner = (pg: PgTypes, options: PostgresStoreOptions): MetadataStore => {\n const pool = new pg.Pool({\n connectionString: options.connectionString,\n max: options.maxPoolSize ?? 10,\n });\n const schema = options.schema ?? \"public\";\n\n // Lazy migrations on first method call — keeps the factory\n // synchronous (the MetadataStore contract is async per method).\n let initPromise: Promise<void> | null = null;\n const ensureInitialized = async (): Promise<void> => {\n if (!initPromise) {\n initPromise =\n options.runMigrations === false\n ? Promise.resolve()\n : runMigrations(pool, schema);\n }\n return initPromise;\n };\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n const makeId = (): string => {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `pg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n };\n\n const notFound = (id: string): Result<never, FileSystemError> =>\n err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${id} not found`,\n retryable: false,\n }),\n );\n\n // LIKE escape helper kept for any future ad-hoc LIKE; the\n // sanitizer in `./sanitize` is the canonical version (it has\n // unit tests and is shared with the SQLite adapter's intent\n // for FTS5).\n const escapeLike = sanitizeLikePattern;\n\n // Wrap a query in a transaction. Caller provides the work as an\n // async function; on success the tx commits, on throw it rolls back.\n const withTenant = async <T>(\n tenantId: string,\n fn: (c: PoolClient) => Promise<T>,\n ): Promise<T> => {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n await client.query(`SELECT set_config('app.current_tenant', $1, true)`, [\n tenantId,\n ]);\n const result = await fn(client);\n await client.query(\"COMMIT\");\n return result;\n } catch (e) {\n await client.query(\"ROLLBACK\").catch(() => {\n // Ignore rollback errors — the original error is more useful.\n });\n throw e;\n } finally {\n client.release();\n }\n };\n\n const q = <T extends QueryResultRow>(\n tenantId: string,\n text: string,\n params: unknown[] = [],\n ) => withTenant(tenantId, (c) => c.query<T>(text, params));\n\n const withTx = async <T>(\n tenantId: string,\n fn: (c: PoolClient) => Promise<T>,\n ): Promise<T> => withTenant(tenantId, fn);\n\n // -------------------------------------------------------------------------\n // 9-method contract\n // -------------------------------------------------------------------------\n\n return {\n async createNode(\n input: CreateNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n await ensureInitialized();\n const normalized = normalizeNodeName(input.name);\n if (!normalized.ok) return normalized;\n const name = normalized.value;\n // Look up parent (if any) to compute the path. We require\n // a LIVE parent; tombstoned parents can't have new children.\n // `!= null` so BOTH null and undefined skip the lookup.\n let parentPath: string | null = null;\n if (input.parentId != null) {\n const parentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.parentId, input.tenantId],\n );\n const parent = parentRes.rows[0];\n if (!parent) return notFound(input.parentId);\n if (parent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Parent ${input.parentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n parentPath = parent.path;\n }\n\n const id = input.id ?? makeId();\n const path = parentPath === null ? `/${name}` : `${parentPath}/${name}`;\n\n try {\n await q(input.tenantId,\n `INSERT INTO \"${schema}\".nodes (\n id, tenant_id, parent_id, name, path, kind, size, mime_type,\n s3_key, owner_id, metadata\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11::jsonb)`,\n [\n id,\n input.tenantId,\n input.parentId,\n name,\n path,\n input.kind,\n input.kind === \"folder\" ? 0 : input.size,\n input.kind === \"folder\" ? \"\" : input.mimeType,\n input.kind === \"folder\" ? \"\" : input.s3Key,\n input.ownerId,\n JSON.stringify(input.metadata ?? {}),\n ],\n );\n } catch (e) {\n if (e instanceof Error && /nodes_unique_live/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: `createNode failed: ${(e as Error).message}`,\n retryable: false,\n }),\n );\n }\n\n const created = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes WHERE id = $1 AND tenant_id = $2`,\n [id, input.tenantId],\n );\n if (created.rows.length === 0) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Row missing immediately after insert\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(created.rows[0]!));\n },\n\n async getNode(\n input: GetNodeInput,\n ): Promise<Result<FileNode | null, FileSystemError>> {\n await ensureInitialized();\n const res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n return ok(res.rows[0] ? rowToFileNode(res.rows[0]) : null);\n },\n\n async listChildren(\n input: ListChildrenInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n await ensureInitialized();\n const limit = input.limit ?? 1000;\n const cursor = decodeCursor(input.cursor);\n const res = cursor\n ? await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND parent_id IS NOT DISTINCT FROM $2\n AND deleted_at IS NULL\n AND (lower(name) > lower($3) OR (lower(name) = lower($3) AND id::text > $4))\n ORDER BY lower(name) ASC, id ASC\n LIMIT $5`,\n [input.tenantId, input.parentId, cursor.n, cursor.i, limit],\n )\n : await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND parent_id IS NOT DISTINCT FROM $2\n AND deleted_at IS NULL\n ORDER BY lower(name) ASC, id ASC\n LIMIT $3`,\n [input.tenantId, input.parentId, limit],\n );\n const items = res.rows.map(rowToFileNode);\n return ok({\n items,\n nextCursor: pageCursor(items, limit),\n });\n },\n\n async moveNode(\n input: MoveNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n await ensureInitialized();\n const currentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n const current = currentRes.rows[0];\n if (!current) return notFound(input.id);\n\n const normalized = normalizeNodeName(input.newName ?? current.name);\n if (!normalized.ok) return normalized;\n const newName = normalized.value;\n\n // Validate the new parent (if any). `!= null` (NOT `!== null`)\n // so both null and undefined skip the block.\n let newParentPath: string | null = null;\n if (input.newParentId != null) {\n if (input.newParentId === current.id) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into itself\",\n retryable: false,\n }),\n );\n }\n const newParentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.newParentId, input.tenantId],\n );\n const newParent = newParentRes.rows[0];\n if (!newParent) return notFound(input.newParentId);\n if (newParent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Destination ${input.newParentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n // Cycle: newParent must not be a descendant of current.\n if (\n newParent.path === current.path ||\n newParent.path.startsWith(`${current.path}/`)\n ) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into its own descendant\",\n retryable: false,\n }),\n );\n }\n newParentPath = newParent.path;\n }\n\n const newPath =\n newParentPath === null ? `/${newName}` : `${newParentPath}/${newName}`;\n\n try {\n await withTx(input.tenantId, async (client) => {\n await client.query(\n `UPDATE \"${schema}\".nodes\n SET parent_id = $1, name = $2, path = $3, updated_at = now()\n WHERE id = $4`,\n [input.newParentId, newName, newPath, input.id],\n );\n if (current.path !== newPath) {\n // Prefix-only replace via substring — same trick as\n // the SQLite store, but using Postgres substring()\n // (1-indexed). SUBSTR's LENGTH on the old path + 1\n // gives the position of the leading '/' in the\n // descendant path.\n await client.query(\n `UPDATE \"${schema}\".nodes\n SET path = $1 || substring(path FROM length($2) + 1),\n updated_at = now()\n WHERE path LIKE $2 || '/%'`,\n [newPath, current.path],\n );\n }\n });\n } catch (e) {\n if (e instanceof Error && /nodes_unique_live/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${newName}' already exists in the destination folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: `moveNode failed: ${(e as Error).message}`,\n retryable: false,\n }),\n );\n }\n\n const updated = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n if (updated.rows.length === 0) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Node missing after move\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(updated.rows[0]!));\n },\n\n async deleteNode(\n input: DeleteNodeInput,\n ): Promise<Result<void, FileSystemError>> {\n await ensureInitialized();\n const nodeRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n const node = nodeRes.rows[0];\n if (!node) return notFound(input.id);\n\n if (node.kind === \"folder\" && !input.recursive) {\n const childRes = await q(input.tenantId,\n `SELECT 1 FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND parent_id = $2 AND deleted_at IS NULL\n LIMIT 1`,\n [input.tenantId, input.id],\n );\n if (childRes.rows.length > 0) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Folder '${node.name}' is not empty; pass recursive: true to delete the subtree`,\n retryable: false,\n }),\n );\n }\n }\n\n if (input.recursive || node.kind === \"file\") {\n await q(input.tenantId,\n `UPDATE \"${schema}\".nodes\n SET deleted_at = now(), updated_at = now()\n WHERE (id = $1 OR path LIKE $2 || '/%')\n AND deleted_at IS NULL`,\n [input.id, node.path],\n );\n } else {\n await q(input.tenantId,\n `UPDATE \"${schema}\".nodes\n SET deleted_at = now(), updated_at = now()\n WHERE id = $1`,\n [input.id],\n );\n }\n return ok(undefined);\n },\n\n async purgeNode(input: {\n tenantId: TenantId;\n id: string;\n }): Promise<Result<{ s3Keys: ReadonlyArray<string> }, FileSystemError>> {\n await ensureInitialized();\n const nodeRes = await q<{ id: string; path: string }>(input.tenantId,\n `SELECT id, path FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NOT NULL`,\n [input.id, input.tenantId],\n );\n const node = nodeRes.rows[0];\n if (!node) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Trashed node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const like = `${node.path}/%`;\n const files = await q<{ s3_key: string }>(input.tenantId,\n `SELECT s3_key FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL AND kind = 'file' AND s3_key <> ''\n AND (id = $2 OR path LIKE $3)`,\n [input.tenantId, input.id, like],\n );\n await q(input.tenantId,\n `DELETE FROM \"${schema}\".shares WHERE tenant_id = $1 AND node_id IN (\n SELECT id FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL AND (id = $2 OR path LIKE $3)\n )`,\n [input.tenantId, input.id, like],\n );\n await q(input.tenantId,\n `DELETE FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL AND (id = $2 OR path LIKE $3)`,\n [input.tenantId, input.id, like],\n );\n return ok({ s3Keys: files.rows.map((row) => row.s3_key) });\n },\n\n async updateMetadata(\n input: UpdateMetadataInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n await ensureInitialized();\n const exists = await q(input.tenantId,\n `SELECT 1 FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n if (exists.rows.length === 0) return notFound(input.id);\n\n // Replace or merge via JSONB concat. The `||` operator\n // merges with right-hand keys winning on conflict.\n const sql = input.replace\n ? `UPDATE \"${schema}\".nodes\n SET metadata = $1::jsonb, updated_at = now()\n WHERE id = $2 AND tenant_id = $3`\n : `UPDATE \"${schema}\".nodes\n SET metadata = metadata || $1::jsonb, updated_at = now()\n WHERE id = $2 AND tenant_id = $3`;\n await q(input.tenantId, sql, [\n JSON.stringify(input.metadata),\n input.id,\n input.tenantId,\n ]);\n\n const updated = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes WHERE id = $1 AND tenant_id = $2`,\n [input.id, input.tenantId],\n );\n if (updated.rows.length === 0) return notFound(input.id);\n return ok(rowToFileNode(updated.rows[0]!));\n },\n\n async search(\n input: SearchInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n await ensureInitialized();\n const limit = input.limit ?? 100;\n\n // Empty query → no results (v0.2 contract). Without this,\n // `ILIKE '%%'` would match every node in the tenant.\n if (input.query.length === 0) {\n return ok({ items: [], nextCursor: undefined });\n }\n\n const pattern = `%${escapeLike(input.query)}%`;\n\n let res;\n if (input.parentId === undefined) {\n // No scope: search the whole tenant.\n res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL\n AND name ILIKE $2 ESCAPE '\\\\'\n ORDER BY lower(name) ASC\n LIMIT $3`,\n [input.tenantId, pattern, limit],\n );\n } else {\n const parentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.parentId, input.tenantId],\n );\n const parent = parentRes.rows[0];\n if (!parent) return notFound(input.parentId);\n // Root's subtree is the whole tenant — use the unscoped query.\n if (parent.path === \"/\") {\n res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL\n AND name ILIKE $2 ESCAPE '\\\\'\n ORDER BY lower(name) ASC\n LIMIT $3`,\n [input.tenantId, pattern, limit],\n );\n } else {\n res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL\n AND (id = $2 OR path LIKE $3 || '/%')\n AND name ILIKE $4 ESCAPE '\\\\'\n ORDER BY lower(name) ASC\n LIMIT $5`,\n [input.tenantId, input.parentId, parent.path, pattern, limit],\n );\n }\n }\n return ok({\n items: res.rows.map(rowToFileNode),\n nextCursor: res.rows.length === limit ? String(limit) : undefined,\n });\n },\n\n async getPath(\n input: GetPathInput,\n ): Promise<Result<{ segments: FileNode[] }, FileSystemError>> {\n await ensureInitialized();\n // Recursive CTE walks up the parent chain in one query.\n // Includes tombstoned ancestors to match the memory/SQLite\n // behavior (no gaps even if a mid-chain parent is deleted).\n const res = await q<NodeRow>(input.tenantId,\n `WITH RECURSIVE chain AS (\n SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2\n UNION ALL\n SELECT n.* FROM \"${schema}\".nodes n\n JOIN chain c ON n.id = c.parent_id\n WHERE n.tenant_id = $2\n )\n SELECT * FROM chain ORDER BY path ASC`,\n [input.id, input.tenantId],\n );\n if (res.rows.length === 0) return notFound(input.id);\n return ok({ segments: res.rows.map(rowToFileNode) });\n },\n\n async enqueueOrphan(input) {\n await ensureInitialized();\n const id = makeId();\n try {\n await q(input.tenantId,\n `INSERT INTO \"${schema}\".pending_orphans (\n id, tenant_id, s3_key, metadata_id, reason\n ) VALUES ($1, $2, $3, $4, $5)`,\n [\n id,\n input.tenantId,\n input.s3Key,\n input.metadataId ?? null,\n input.reason,\n ],\n );\n return ok({ id });\n } catch (error) {\n return err(FileSystemError.fromPg(error));\n }\n },\n\n async listPendingOrphans(input) {\n await ensureInitialized();\n try {\n const result = await q<OrphanRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".pending_orphans\n WHERE tenant_id = $1\n ORDER BY created_at ASC, id ASC`,\n [input.tenantId],\n );\n return ok(result.rows.map(rowToPendingOrphan));\n } catch (error) {\n return err(FileSystemError.fromPg(error));\n }\n },\n\n async deleteOrphan(input) {\n await ensureInitialized();\n try {\n const result = await q(input.tenantId,\n `DELETE FROM \"${schema}\".pending_orphans\n WHERE tenant_id = $1 AND id = $2`,\n [input.tenantId, input.id],\n );\n if (result.rowCount === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Orphan ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n } catch (error) {\n return err(FileSystemError.fromPg(error));\n }\n },\n\n async reconcile(): Promise<Result<ReconcileResult, FileSystemError>> {\n await ensureInitialized();\n return ok({ orphansInStore: [], orphansInS3: [], scanned: 0 });\n },\n\n async restoreNode(input) {\n await ensureInitialized();\n try {\n const res = await q<NodeRow>(\n input.tenantId,\n `UPDATE \"${schema}\".nodes\n SET deleted_at = NULL, updated_at = now()\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NOT NULL\n RETURNING *`,\n [input.id, input.tenantId],\n );\n if (!res.rows[0]) return notFound(input.id);\n return ok(rowToFileNode(res.rows[0]));\n } catch (e) {\n if (e instanceof Error && /nodes_unique_live/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"A live node with this name already exists in the folder\",\n retryable: false,\n }),\n );\n }\n return err(FileSystemError.fromPg(e));\n }\n },\n\n async listTrash(input) {\n await ensureInitialized();\n const limit = input.limit ?? 1000;\n const cursor = decodeCursor(input.cursor);\n const res = cursor\n ? await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL\n AND (lower(name) > lower($2) OR (lower(name) = lower($2) AND id::text > $3))\n ORDER BY lower(name) ASC, id ASC\n LIMIT $4`,\n [input.tenantId, cursor.n, cursor.i, limit],\n )\n : await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL\n ORDER BY lower(name) ASC, id ASC\n LIMIT $2`,\n [input.tenantId, limit],\n );\n const items = res.rows.map(rowToFileNode);\n return ok({ items, nextCursor: pageCursor(items, limit) });\n },\n\n async scanFileKeys(input) {\n await ensureInitialized();\n const res = await q<{ id: string; s3_key: string }>(\n input.tenantId,\n `SELECT id, s3_key FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL AND kind = 'file' AND s3_key <> ''`,\n [input.tenantId],\n );\n return ok(res.rows.map((r) => ({ id: r.id, s3Key: r.s3_key })));\n },\n\n async sumSize(input) {\n await ensureInitialized();\n const res = await q<{ c: string }>(\n input.tenantId,\n `SELECT COALESCE(SUM(size), 0)::text AS c FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL AND kind = 'file'`,\n [input.tenantId],\n );\n return ok(Number.parseInt(res.rows[0]?.c ?? \"0\", 10));\n },\n\n async findByS3Key(input) {\n await ensureInitialized();\n const res = await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND s3_key = $2 AND deleted_at IS NULL\n LIMIT 1`,\n [input.tenantId, input.s3Key],\n );\n return ok(res.rows[0] ? rowToFileNode(res.rows[0]) : null);\n },\n\n async createShare(input) {\n await ensureInitialized();\n const node = await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.nodeId, input.tenantId],\n );\n if (!node.rows[0]) return notFound(input.nodeId);\n const token = makeId();\n await q(\n input.tenantId,\n `INSERT INTO \"${schema}\".shares (token, tenant_id, node_id, expires_at)\n VALUES ($1, $2, $3, $4)`,\n [token, input.tenantId, input.nodeId, input.expiresAt ?? null],\n );\n return ok({ token });\n },\n\n async resolveShare(input) {\n await ensureInitialized();\n const share = await pool.query<{\n tenant_id: string;\n node_id: string;\n expires_at: Date | null;\n }>(\n `SELECT tenant_id, node_id, expires_at FROM \"${schema}\".shares WHERE token = $1`,\n [input.token],\n );\n const row = share.rows[0];\n if (!row) return ok(null);\n if (row.expires_at && row.expires_at.getTime() < Date.now()) return ok(null);\n const node = await q<NodeRow>(\n row.tenant_id,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [row.node_id, row.tenant_id],\n );\n return ok(node.rows[0] ? rowToFileNode(node.rows[0]) : null);\n },\n\n async revokeShare(input) {\n await ensureInitialized();\n const result = await pool.query(\n `DELETE FROM \"${schema}\".shares WHERE token = $1 AND tenant_id = $2`,\n [input.token, input.tenantId],\n );\n if (result.rowCount === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Share ${input.token} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n },\n };\n};\n\nexport { asTenantId, asUserId };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/result.ts","../src/errors/mappers.ts","../src/errors/index.ts","../src/types/branded.ts","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/class-group-utils.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/lru-cache.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/parse-class-name.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/config-utils.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/merge-classlist.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/tw-join.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/from-theme.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/validators.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/default-config.ts","../../../node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/cn.ts","../src/storage/s3-adapter/list.ts","../src/storage/s3-adapter/read.ts","../src/storage/s3-adapter/stat.ts","../src/storage/s3-adapter/get-metadata.ts","../src/storage/s3-adapter/multipart.ts","../src/storage/s3-adapter/write.ts","../src/storage/s3-adapter/delete.ts","../src/storage/s3-adapter/exists.ts","../src/storage/s3-adapter/copy.ts","../src/storage/s3-adapter/move.ts","../src/storage/s3-adapter/set-metadata.ts","../src/storage/content-disposition.ts","../src/storage/s3-adapter/presigned.ts","../src/storage/s3-adapter/get-public-url.ts","../src/storage/s3-adapter/client.ts","../src/storage/s3-adapter/index.ts","../src/storage/memory-adapter/index.ts","../src/storage/config.ts","../src/storage/prefix-adapter.ts","../src/storage/factory.ts","../src/auth/with-auth.ts","../src/storage/singleton.ts","../src/metadata/node-name.ts","../src/metadata/cursor.ts","../src/metadata/memory-store.ts","../src/metadata/sanitize.ts","../src/metadata/sqlite-store.ts","../src/metadata/postgres-store.ts"],"names":["r","fallback","err","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","has","set","func","classGroupEntries","map","prefixedClassGroup","fromEntries","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","isArbitraryVariant","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","getNumberWithAutoAndArbitrary","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","span","row","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","text","font","tracking","leading","list","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","repeat","from","via","to","rounded","border","divide","outline","ring","shadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","twMerge","ListObjectsV2Command","GetObjectCommand","HeadObjectCommand","CreateMultipartUploadCommand","UploadPartCommand","CompleteMultipartUploadCommand","AbortMultipartUploadCommand","PutObjectCommand","DeleteObjectCommand","CopyObjectCommand","getSignedUrl","S3Client","createMultipartUpload","uploadPart","completeMultipartUpload","abortMultipartUpload","getMetadata","setMetadata","createPresignedUploadUrl","createPresignedDownloadUrl","getPublicUrl","randomUUID","pathToFileURL","createRequire","rowToPendingOrphan","rowToFileNode","SCHEMA_VERSION","MIGRATION_SQL","runMigrations","buildInner"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Discriminated `Result<T, E>` for typed error returns.\n *\n * Why Result over throw at boundaries:\n * - No `any` at the call site (vs try/catch which loses the type).\n * - `switch (r.ok)` narrows the type in consumer code.\n * - The wire shape `{ ok, value | error }` is JSON-serializable,\n * so it survives the RSC boundary without an extra DTO.\n * - Helpers (`map`, `andThen`, `unwrap`) make the common shapes\n * (chain, bail-out, recover) terse and exhaustive.\n *\n * The default error type is `FileSystemError` (see `@/errors`).\n * Consumers can specialize: `Result<User, ZodError>`.\n *\n * All helpers are pure functions; they do NOT allocate closures in\n * hot paths beyond what the spec demands (no `try`/`catch` wrapping).\n */\n\nimport { FileSystemError } from \"@/errors\";\n\nexport type Result<T, E = FileSystemError> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: E };\n\nexport const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });\n\nexport const err = <E>(error: E): Result<never, E> => ({ ok: false, error });\n\nexport const map = <T, U, E>(\n r: Result<T, E>,\n f: (t: T) => U,\n): Result<U, E> => (r.ok ? ok(f(r.value)) : r);\n\nexport const mapErr = <T, E, F>(\n r: Result<T, E>,\n f: (e: E) => F,\n): Result<T, F> => (r.ok ? r : err(f(r.error)));\n\nexport const andThen = <T, U, E>(\n r: Result<T, E>,\n f: (t: T) => Result<U, E>,\n): Result<U, E> => (r.ok ? f(r.value) : r);\n\nexport const unwrap = <T, E>(r: Result<T, E>): T => {\n if (r.ok) return r.value;\n throw r.error;\n};\n\nexport const unwrapOr = <T, E>(r: Result<T, E>, fallback: T): T =>\n r.ok ? r.value : fallback;\n","/**\n * Upstream error mappers for FileSystemError.\n *\n * Each mapper is a pure function `(*unknown) -> FileSystemError`.\n * The class re-exposes them as static methods (FileSystemError.fromAws\n * etc.) so callers can pick the import style that fits.\n *\n * Mapping strategy:\n * 1. If the input is already a FileSystemError, return it as-is\n * (we never re-wrap our own errors).\n * 2. Try the most specific signal first: S3 `name`, Postgres\n * SQLSTATE, SQLite extended code.\n * 3. Fall back to the HTTP status code (AWS SDK v3 exposes\n * `$metadata.httpStatusCode`).\n * 4. Last resort: InternalError, retryable, with the original\n * payload in `cause`.\n *\n * Provider-specific codes are preserved on `cause.code` (e.g. S3\n * \"NoSuchKey\", Postgres \"23505\") so callers can still branch on\n * them while the top-level `code` stays in the 11-code spec catalog.\n *\n * Mapping notes (post-C' merge, see\n * `sdd/file-next/decisions/error-codes-deviation`):\n * - S3 `SlowDown` -> QuotaExceeded (broader than RateLimited;\n * SlowDown means reduce request rate, which\n * is conceptually quota pressure, not\n * throttling of a single call).\n * - S3 `BadDigest` -> ChecksumMismatch (checksum verified by\n * S3 on upload did not match the client).\n * - HTTP 429 -> RateLimited (was QuotaExceeded in the\n * pre-C' catalog; RateLimited is the more\n * specific code for throttling responses).\n * - HTTP 408 -> NetworkError (transient transport error).\n * - HTTP 400 / Postgres 23514 / S3 InvalidRequest\n * -> fall through to the 4xx branch (no\n * top-level 400 code in the C' catalog;\n * these inputs are usually caught by the\n * name/SQLSTATE mapping first anyway).\n */\n\nimport { FileSystemError, type FileSystemErrorCode } from \"./index\";\n\n/* ---------------------------------------------------------------- *\n * Mapping tables (private) *\n * ---------------------------------------------------------------- */\n\ninterface CodeMapping {\n code: FileSystemErrorCode;\n retryable: boolean;\n}\n\nconst HTTP_STATUS_TO_CODE: Readonly<Record<number, CodeMapping>> = {\n 401: { code: \"Unauthorized\", retryable: false },\n 403: { code: \"Forbidden\", retryable: false },\n 404: { code: \"NotFound\", retryable: false },\n 408: { code: \"NetworkError\", retryable: true },\n 409: { code: \"Conflict\", retryable: false },\n 413: { code: \"PayloadTooLarge\", retryable: false },\n 415: { code: \"UnsupportedMediaType\", retryable: false },\n 429: { code: \"RateLimited\", retryable: true },\n};\n\nconst AWS_NAME_TO_CODE: Readonly<Record<string, CodeMapping>> = {\n NoSuchKey: { code: \"NotFound\", retryable: false },\n NoSuchBucket: { code: \"NotFound\", retryable: false },\n // v0.2 multipart: unknown/aborted/expired uploadId.\n NoSuchUpload: { code: \"NotFound\", retryable: false },\n AccessDenied: { code: \"Forbidden\", retryable: false },\n SlowDown: { code: \"QuotaExceeded\", retryable: true },\n BadDigest: { code: \"ChecksumMismatch\", retryable: true },\n XAmzContentSHA256Mismatch: { code: \"ChecksumMismatch\", retryable: true },\n NetworkingError: { code: \"NetworkError\", retryable: true },\n TimeoutError: { code: \"NetworkError\", retryable: true },\n};\n\nconst PG_SQLSTATE_TO_CODE: Readonly<Record<string, CodeMapping>> = {\n \"23505\": { code: \"Conflict\", retryable: false },\n};\n\nconst SQLITE_CODE_TO_CODE: Readonly<Record<string, CodeMapping>> = {\n SQLITE_CONSTRAINT_UNIQUE: { code: \"Conflict\", retryable: false },\n SQLITE_CONSTRAINT_PRIMARYKEY: { code: \"Conflict\", retryable: false },\n};\n\n/* ---------------------------------------------------------------- *\n * Public mappers *\n * ---------------------------------------------------------------- */\n\nconst toCause = (code: string, message: string, extra?: Record<string, unknown>) => ({\n code,\n message,\n ...(extra ?? {}),\n});\n\nconst fallback = (err: unknown): FileSystemError =>\n new FileSystemError({\n code: \"InternalError\",\n message: err instanceof Error ? err.message : String(err),\n retryable: true,\n cause: toCause(\n \"Unknown\",\n err instanceof Error ? err.message : String(err),\n ),\n });\n\nexport const fromAws = (err: unknown): FileSystemError => {\n if (err instanceof FileSystemError) return err;\n\n if (typeof err !== \"object\" || err === null) return fallback(err);\n\n const awsErr = err as {\n name?: unknown;\n message?: unknown;\n $metadata?: { httpStatusCode?: unknown };\n };\n const name = typeof awsErr.name === \"string\" ? awsErr.name : undefined;\n const message =\n typeof awsErr.message === \"string\" ? awsErr.message : `AWS error: ${name ?? \"unknown\"}`;\n const status =\n typeof awsErr.$metadata?.httpStatusCode === \"number\"\n ? awsErr.$metadata.httpStatusCode\n : undefined;\n\n const cause = toCause(\n name ?? (status !== undefined ? String(status) : \"Unknown\"),\n message,\n status !== undefined ? { httpStatusCode: status } : undefined,\n );\n\n // 1) name-based mapping wins (more specific than HTTP status)\n if (name && name in AWS_NAME_TO_CODE) {\n const m = AWS_NAME_TO_CODE[name]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n // 2) HTTP status mapping\n if (status !== undefined && status in HTTP_STATUS_TO_CODE) {\n const m = HTTP_STATUS_TO_CODE[status]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n // 3) 5xx bucket\n if (status !== undefined && status >= 500 && status < 600) {\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n }\n\n // 4) anything else 4xx-shaped\n if (status !== undefined && status >= 400 && status < 500) {\n return new FileSystemError({ code: \"Forbidden\", message, retryable: false, cause });\n }\n\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n};\n\nexport const fromPg = (err: unknown): FileSystemError => {\n if (err instanceof FileSystemError) return err;\n\n if (typeof err !== \"object\" || err === null) return fallback(err);\n\n const pgErr = err as { code?: unknown; message?: unknown };\n const sqlstate = typeof pgErr.code === \"string\" ? pgErr.code : undefined;\n const message =\n typeof pgErr.message === \"string\" ? pgErr.message : `Postgres error: ${sqlstate ?? \"unknown\"}`;\n const cause = toCause(sqlstate ?? \"Unknown\", message);\n\n if (sqlstate && sqlstate in PG_SQLSTATE_TO_CODE) {\n const m = PG_SQLSTATE_TO_CODE[sqlstate]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n};\n\nexport const fromSqlite = (err: unknown): FileSystemError => {\n if (err instanceof FileSystemError) return err;\n\n if (typeof err !== \"object\" || err === null) return fallback(err);\n\n const sqlErr = err as { code?: unknown; message?: unknown };\n const code = typeof sqlErr.code === \"string\" ? sqlErr.code : undefined;\n const message =\n typeof sqlErr.message === \"string\" ? sqlErr.message : `SQLite error: ${code ?? \"unknown\"}`;\n const cause = toCause(code ?? \"Unknown\", message);\n\n if (code && code in SQLITE_CODE_TO_CODE) {\n const m = SQLITE_CODE_TO_CODE[code]!;\n return new FileSystemError({ code: m.code, message, retryable: m.retryable, cause });\n }\n\n return new FileSystemError({ code: \"InternalError\", message, retryable: true, cause });\n};\n","/**\n * FileSystemError — the single error class every adapter, store,\n * server action, and route handler in `file-next` returns or throws.\n *\n * Spec reference: requirement \"FileSystemError discriminated union\"\n * in `sdd/file-next/spec`. The 11 codes are the CLOSED set; any\n * provider-specific code (e.g. S3 `NoSuchKey`, Postgres `23505`) is\n * preserved on `cause.code` so callers can still distinguish upstream\n * reasons while the top-level `code` stays in the catalog.\n *\n * The catalog is a merge of spec + impl: the 6 fixed codes\n * (NotFound, Forbidden, Conflict, QuotaExceeded, NetworkError,\n * InternalError) are non-negotiable; the remaining 5 keep the wire\n * aligned with both the HTTP boundary (route handlers map the\n * top-level `code` to a status directly) and the storage boundary\n * (`RateLimited` and `ChecksumMismatch` carry semantics that have\n * no natural HTTP equivalent). See\n * `sdd/file-next/decisions/error-codes-deviation` for the\n * deviation log and rationale.\n *\n * Retryability table is the design's `error-mapping` excerpt; see\n * `sdd/file-next/design` §C. Any future code MUST add an entry in\n * `RETRYABLE_BY_CODE` (the catalog test enforces this).\n *\n * The placeholder from T-006 is replaced by this file in T-007a.\n * The upstream mappers (fromAws / fromPg / fromSqlite) land in T-007b\n * in `mappers.ts`.\n */\n\nexport const FILE_SYSTEM_ERROR_CODES = [\n \"NotFound\",\n \"Forbidden\",\n \"Conflict\",\n \"QuotaExceeded\",\n \"NetworkError\",\n \"InternalError\",\n \"Unauthorized\",\n \"PayloadTooLarge\",\n \"UnsupportedMediaType\",\n \"RateLimited\",\n \"ChecksumMismatch\",\n] as const satisfies readonly string[];\n\nexport type FileSystemErrorCode = (typeof FILE_SYSTEM_ERROR_CODES)[number];\n\nexport const RETRYABLE_BY_CODE: Readonly<Record<FileSystemErrorCode, boolean>> = {\n NotFound: false,\n Forbidden: false,\n Conflict: false,\n QuotaExceeded: true,\n NetworkError: true,\n InternalError: true,\n Unauthorized: false,\n PayloadTooLarge: false,\n UnsupportedMediaType: false,\n RateLimited: true,\n ChecksumMismatch: true,\n};\n\nexport interface FileSystemErrorOptions {\n code: FileSystemErrorCode;\n message: string;\n retryable: boolean;\n cause?: { code: string; message: string; [k: string]: unknown };\n}\n\nexport interface FileSystemErrorJson {\n name: string;\n code: FileSystemErrorCode;\n message: string;\n retryable: boolean;\n cause?: { code: string; message: string; [k: string]: unknown };\n}\n\nexport class FileSystemError extends Error {\n readonly code: FileSystemErrorCode;\n readonly retryable: boolean;\n override readonly cause?: { code: string; message: string; [k: string]: unknown };\n\n constructor(opts: FileSystemErrorOptions) {\n super(opts.message);\n this.name = \"FileSystemError\";\n this.code = opts.code;\n this.retryable = opts.retryable;\n if (opts.cause !== undefined) {\n this.cause = opts.cause;\n }\n }\n\n /**\n * Stable JSON shape for RSC pass-through. Error.prototype.message\n * is non-enumerable, so plain `JSON.stringify(err)` would emit `{}`\n * and lose the message + code + retryable flag. `cause` is omitted\n * entirely (not set to undefined) when absent so the shape stays\n * stable for hash-based caches.\n */\n toJSON(): FileSystemErrorJson {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n ...(this.cause !== undefined ? { cause: this.cause } : {}),\n };\n }\n\n /**\n * Mappers from upstream error shapes (AWS SDK v3, node-postgres,\n * better-sqlite3) to FileSystemError. See `./mappers.ts` for the\n * mapping tables. Re-exposed as static methods so callers can pick\n * the import style that fits; the free functions are the canonical\n * implementation.\n */\n static fromAws(err: unknown): FileSystemError {\n // Lazy import via the runtime binding avoids the static-field\n // circular-dep trap in ESM. The mapper file imports this class\n // for instanceof checks; we look up the function at call time.\n return _fromAws(err);\n }\n\n static fromPg(err: unknown): FileSystemError {\n return _fromPg(err);\n }\n\n static fromSqlite(err: unknown): FileSystemError {\n return _fromSqlite(err);\n }\n}\n\n// Imported here as bindings (not values) so the static methods above\n// can resolve them lazily. The actual implementation lives in mappers.ts.\nimport { fromAws as _fromAws, fromPg as _fromPg, fromSqlite as _fromSqlite } from \"./mappers\";\nexport { fromAws, fromPg, fromSqlite } from \"./mappers\";\n","/**\n * Branded string types and their constructors/guards.\n *\n * Brands are TypeScript-only fictions: a `Path` and an `S3Key` are\n * both strings at runtime, but the type system treats them as\n * distinct nominal types so the compiler catches accidental\n * cross-assignment (e.g. passing an S3Key where a TenantId is\n * expected).\n *\n * Conventions:\n * - `as*` is a zero-cost cast: trust the caller, brand the value.\n * Use it at trust boundaries you have already validated.\n * - `assert*` is a runtime guard: throws TypeError on invalid\n * input. Use it at the edge (parsing user/env input).\n *\n * Validation rules are intentionally minimal in v0.1 and can be\n * tightened as the spec evolves. None of them touch the network or\n * allocate; they are safe in hot paths.\n */\n\nexport type Path = string & { readonly __brand: \"Path\" };\nexport type Prefix = string & { readonly __brand: \"Prefix\" };\nexport type S3Key = string & { readonly __brand: \"S3Key\" };\nexport type TenantId = string & { readonly __brand: \"TenantId\" };\nexport type UserId = string & { readonly __brand: \"UserId\" };\n\n/**\n * POSIX file path. Non-empty, '/' is allowed as the root.\n */\nexport const asPath = (s: string): Path => s as Path;\nexport const assertPath = (s: string): Path => {\n if (s.length === 0) {\n throw new TypeError(\"Path must be a non-empty string\");\n }\n return s as Path;\n};\n\n/**\n * S3 prefix. Empty string is the root prefix. Non-empty prefixes\n * MUST end with '/' so concatenation with a key never produces\n * 'usersfile.jpg' by accident.\n */\nexport const asPrefix = (s: string): Prefix => s as Prefix;\nexport const assertPrefix = (s: string): Prefix => {\n if (s.length > 0 && !s.endsWith(\"/\")) {\n throw new TypeError(\n `Prefix must end with \"/\" or be empty: ${JSON.stringify(s)}`,\n );\n }\n return s as Prefix;\n};\n\n/**\n * S3 object key. No leading slash, no empty segments, no '..' hops.\n */\nexport const asS3Key = (s: string): S3Key => s as S3Key;\nexport const assertS3Key = (s: string): S3Key => {\n if (s.length === 0) {\n throw new TypeError(\"S3Key must be a non-empty string\");\n }\n if (s.startsWith(\"/\")) {\n throw new TypeError(\n `S3Key must not start with a slash: ${JSON.stringify(s)}`,\n );\n }\n if (s.includes(\"..\")) {\n throw new TypeError(\n `S3Key must not contain '..' segments: ${JSON.stringify(s)}`,\n );\n }\n return s as S3Key;\n};\n\n/**\n * Tenant identifier. Alphanumerics, dashes, underscores only.\n */\nexport const asTenantId = (s: string): TenantId => s as TenantId;\nexport const assertTenantId = (s: string): TenantId => {\n if (s.length === 0 || !/^[a-zA-Z0-9_-]+$/.test(s)) {\n throw new TypeError(`Invalid TenantId: ${JSON.stringify(s)}`);\n }\n return s as TenantId;\n};\n\n/**\n * Opaque user identifier. Non-empty; the format is provider-defined.\n */\nexport const asUserId = (s: string): UserId => s as UserId;\nexport const assertUserId = (s: string): UserId => {\n if (s.length === 0) {\n throw new TypeError(\"UserId must be a non-empty string\");\n }\n return s as UserId;\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix,\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n\nconst getPrefixedClassGroupEntries = (\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]>,\n prefix: string | undefined,\n): Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]> => {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]),\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { separator, experimentalParseClassName } = config\n const isSeparatorSingleCharacter = separator.length === 1\n const firstSeparatorCharacter = separator[0]\n const separatorLength = separator.length\n\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = (className: string) => {\n const modifiers = []\n\n let bracketDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0) {\n if (\n currentCharacter === firstSeparatorCharacter &&\n (isSeparatorSingleCharacter ||\n className.slice(index, index + separatorLength) === separator)\n ) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + separatorLength\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const hasImportantModifier =\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const baseClassName = hasImportantModifier\n ? baseClassNameWithImportantModifier.substring(1)\n : baseClassNameWithImportantModifier\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (experimentalParseClassName) {\n return (className: string) => experimentalParseClassName({ className, parseClassName })\n }\n\n return parseClassName\n}\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isArbitraryVariant = modifier[0] === '['\n\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER, sortModifiers } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const { modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } =\n parseClassName(originalClassName)\n\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition)\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst stringLengths = new Set(['px', 'full', 'screen'])\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isLength = (value: string) =>\n isNumber(value) || stringLengths.has(value) || fractionRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, 'length', isLengthOnly)\n\nexport const isNumber = (value: string) => Boolean(value) && !Number.isNaN(Number(value))\n\nexport const isArbitraryNumber = (value: string) => getIsArbitraryValue(value, 'number', isNumber)\n\nexport const isInteger = (value: string) => Boolean(value) && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nconst sizeLabels = new Set(['length', 'size', 'percentage'])\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, sizeLabels, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, 'position', isNever)\n\nconst imageLabels = new Set(['image', 'url'])\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, imageLabels, isImage)\n\nexport const isArbitraryShadow = (value: string) => getIsArbitraryValue(value, '', isShadow)\n\nexport const isAny = () => true\n\nconst getIsArbitraryValue = (\n value: string,\n label: string | Set<string>,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n const colors = fromTheme('colors')\n const spacing = fromTheme('spacing')\n const blur = fromTheme('blur')\n const brightness = fromTheme('brightness')\n const borderColor = fromTheme('borderColor')\n const borderRadius = fromTheme('borderRadius')\n const borderSpacing = fromTheme('borderSpacing')\n const borderWidth = fromTheme('borderWidth')\n const contrast = fromTheme('contrast')\n const grayscale = fromTheme('grayscale')\n const hueRotate = fromTheme('hueRotate')\n const invert = fromTheme('invert')\n const gap = fromTheme('gap')\n const gradientColorStops = fromTheme('gradientColorStops')\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions')\n const inset = fromTheme('inset')\n const margin = fromTheme('margin')\n const opacity = fromTheme('opacity')\n const padding = fromTheme('padding')\n const saturate = fromTheme('saturate')\n const scale = fromTheme('scale')\n const sepia = fromTheme('sepia')\n const skew = fromTheme('skew')\n const space = fromTheme('space')\n const translate = fromTheme('translate')\n\n const getOverscroll = () => ['auto', 'contain', 'none'] as const\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing] as const\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing] as const\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength] as const\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue] as const\n const getPositions = () =>\n [\n 'bottom',\n 'center',\n 'left',\n 'left-bottom',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-top',\n 'top',\n ] as const\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'] as const\n const getBlendModes = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const getAlign = () =>\n ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'] as const\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue] as const\n const getBreaks = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue]\n\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary(),\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{ aspect: ['auto', 'square', 'video', isArbitraryValue] }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{ columns: [isTshirtSize] }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': getBreaks() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': getBreaks() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: [...getPositions(), isArbitraryValue] }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: getOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': getOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': getOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: getOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': getOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': getOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: [inset] }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': [inset] }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': [inset] }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: [inset] }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: [inset] }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: [inset] }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: [inset] }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: [inset] }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: [inset] }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: ['auto', isInteger, isArbitraryValue] }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{ basis: getSpacingWithAutoAndArbitrary() }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['wrap', 'wrap-reverse', 'nowrap'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: ['1', 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: getZeroAndEmpty() }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: getZeroAndEmpty() }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{ order: ['first', 'last', 'none', isInteger, isArbitraryValue] }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': [isAny] }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [\n {\n col: [\n 'auto',\n { span: ['full', isInteger, isArbitraryValue] },\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': [isAny] }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [\n { row: ['auto', { span: [isInteger, isArbitraryValue] }, isArbitraryValue] },\n ],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: [gap] }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': [gap] }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': [gap] }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: ['normal', ...getAlign()] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': ['start', 'end', 'center', 'stretch'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...getAlign(), 'baseline'] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{ self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline'] }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': [...getAlign(), 'baseline'] }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: [padding] }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: [padding] }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: [padding] }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: [padding] }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: [padding] }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: [padding] }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: [padding] }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: [padding] }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: [padding] }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: [margin] }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: [margin] }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: [margin] }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: [margin] }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: [margin] }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: [margin] }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: [margin] }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: [margin] }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: [margin] }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{ 'space-x': [space] }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{ 'space-y': [space] }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [\n {\n w: [\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svw',\n 'lvw',\n 'dvw',\n isArbitraryValue,\n spacing,\n ],\n },\n ],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{ 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit'] }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n isArbitraryValue,\n spacing,\n 'none',\n 'full',\n 'min',\n 'max',\n 'fit',\n 'prose',\n { screen: [isTshirtSize] },\n isTshirtSize,\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [\n {\n h: [\n isArbitraryValue,\n spacing,\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svh',\n 'lvh',\n 'dvh',\n ],\n },\n ],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [\n { 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [\n { 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{ size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit'] }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{ text: ['base', isTshirtSize, isArbitraryLength] }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isAny] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [\n {\n tracking: [\n 'tighter',\n 'tight',\n 'normal',\n 'wide',\n 'wider',\n 'widest',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{ 'line-clamp': ['none', isNumber, isArbitraryNumber] }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n 'none',\n 'tight',\n 'snug',\n 'normal',\n 'relaxed',\n 'loose',\n isLength,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryValue] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{ list: ['none', 'disc', 'decimal', isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: [colors] }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{ 'placeholder-opacity': [opacity] }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: [colors] }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{ 'text-opacity': [opacity] }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...getLineStyles(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n { decoration: ['auto', 'from-font', isLength, isArbitraryLength] },\n ],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{ 'underline-offset': ['auto', isLength, isArbitraryValue] }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: [colors] }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: getSpacingWithArbitrary() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryValue] }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{ 'bg-opacity': [opacity] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: [...getPositions(), isArbitraryPosition] }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: ['no-repeat', { repeat: ['', 'x', 'y', 'round', 'space'] }] }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: ['auto', 'cover', 'contain', isArbitrarySize] }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n { 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: [colors] }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: [gradientColorStops] }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: [gradientColorStops] }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: [gradientColorStops] }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: [borderRadius] }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': [borderRadius] }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': [borderRadius] }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': [borderRadius] }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': [borderRadius] }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': [borderRadius] }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': [borderRadius] }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': [borderRadius] }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': [borderRadius] }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': [borderRadius] }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': [borderRadius] }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': [borderRadius] }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': [borderRadius] }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': [borderRadius] }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': [borderRadius] }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: [borderWidth] }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': [borderWidth] }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': [borderWidth] }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': [borderWidth] }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': [borderWidth] }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': [borderWidth] }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': [borderWidth] }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': [borderWidth] }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': [borderWidth] }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{ 'border-opacity': [opacity] }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...getLineStyles(), 'hidden'] }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{ 'divide-x': [borderWidth] }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{ 'divide-y': [borderWidth] }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{ 'divide-opacity': [opacity] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{ divide: getLineStyles() }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: [borderColor] }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': [borderColor] }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': [borderColor] }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': [borderColor] }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': [borderColor] }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': [borderColor] }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': [borderColor] }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': [borderColor] }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': [borderColor] }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: [borderColor] }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: ['', ...getLineStyles()] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{ 'outline-offset': [isLength, isArbitraryValue] }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{ outline: [isLength, isArbitraryLength] }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: [colors] }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{ ring: getLengthWithEmptyAndArbitrary() }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{ ring: [colors] }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{ 'ring-opacity': [opacity] }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{ 'ring-offset': [isLength, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{ 'ring-offset': [colors] }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{ shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow] }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{ shadow: [isAny] }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [opacity] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': getBlendModes() }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{ filter: ['', 'none'] }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: [blur] }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [brightness] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [contrast] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{ 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue] }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: [grayscale] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [hueRotate] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: [invert] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [saturate] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: [sepia] }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{ 'backdrop-filter': ['', 'none'] }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': [blur] }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{ 'backdrop-brightness': [brightness] }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{ 'backdrop-contrast': [contrast] }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{ 'backdrop-grayscale': [grayscale] }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{ 'backdrop-hue-rotate': [hueRotate] }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{ 'backdrop-invert': [invert] }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{ 'backdrop-opacity': [opacity] }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{ 'backdrop-saturate': [saturate] }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{ 'backdrop-sepia': [sepia] }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': [borderSpacing] }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': [borderSpacing] }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': [borderSpacing] }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n 'none',\n 'all',\n '',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: getNumberAndArbitrary() }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{ ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue] }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: getNumberAndArbitrary() }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue] }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{ transform: ['', 'gpu', 'none'] }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: [scale] }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': [scale] }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': [scale] }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: [isInteger, isArbitraryValue] }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': [translate] }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': [translate] }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': [skew] }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': [skew] }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [\n {\n origin: [\n 'center',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'top-left',\n isArbitraryValue,\n ],\n },\n ],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: ['auto', colors] }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: [colors] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['none', 'auto'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', 'y', 'x', ''] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': getSpacingWithArbitrary() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [\n {\n touch: ['auto', 'none', 'manipulation'],\n },\n ],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [\n {\n 'touch-pan': ['x', 'left', 'right'],\n },\n ],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [\n {\n 'touch-pan': ['y', 'up', 'down'],\n },\n ],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n { 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue] },\n ],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: [colors, 'none'] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{ stroke: [isLength, isArbitraryLength, isArbitraryNumber] }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: [colors, 'none'] }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n Merge Tailwind CSS classes with conflict resolution.\n Mirrors shadcn/ui's `cn` utility so consumers get a familiar DX.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * `list` — the S3-compatible adapter method that lists objects\n * under a prefix with optional `delimiter` (for \"folder\" emulation)\n * and paginated `continuationToken` support.\n *\n * The wire is the S3 `ListObjectsV2` command, which all S3-compatible\n * providers (AWS S3, Cloudflare R2, Backblaze B2, MinIO) implement\n * with the same shape. The only thing that differs between providers\n * is the `S3Client` config (endpoint, forcePathStyle) — handled by\n * the `client.ts` helper, not here.\n *\n * Error mapping:\n * - `NoSuchBucket` -> NotFound (the bucket itself is gone)\n * - network/timeout -> NetworkError (retryable: true)\n * - everything else -> fromAws (uses the catalog mappers; preserves\n * the upstream `cause.code` for debugging)\n */\nimport { ListObjectsV2Command, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport { asS3Key, asPrefix } from \"@/types/branded\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { ListInput, ListOutput } from \"../adapter\";\n\nexport const listObjects = async (\n client: S3Client,\n config: FileSystemConfig,\n input: ListInput,\n): Promise<Result<ListOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: input.prefix,\n ContinuationToken: input.continuationToken,\n MaxKeys: input.limit,\n Delimiter: input.delimiter,\n }),\n );\n return ok({\n items: (res.Contents ?? []).map((c) => ({\n key: asS3Key(c.Key ?? \"\"),\n size: c.Size ?? 0,\n lastModified: c.LastModified ?? new Date(0),\n })),\n prefixes: (res.CommonPrefixes ?? []).map((p) => asPrefix(p.Prefix ?? \"\")),\n nextContinuationToken: res.NextContinuationToken,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `read` — fetch an object's body as a `Uint8Array`.\n *\n * Uses `GetObjectCommand` (a body-bearing S3 call). The wire\n * response has a `Body` field that is an SDK-readable stream;\n * we collect it into a single `Uint8Array` for the consumer\n * (small-to-medium objects only; v0.1 does NOT support range\n * reads into a streaming consumer — that lands when the headless\n * `useUploader`/`useDownloadProgress` hooks need it for\n * progress reporting).\n *\n * Provider-agnostic: any S3-compatible client works.\n */\nimport { GetObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { ReadInput, ReadOutput } from \"../adapter\";\n\n/** Collect an SDK stream body into a single Uint8Array. */\nconst streamToBytes = async (body: unknown): Promise<Uint8Array> => {\n // The SDK returns a web ReadableStream-shaped object that ALSO\n // implements AsyncIterable (it's a Readable.from(Buffer)). The\n // safest cross-runtime path is to drain it via async iteration.\n const chunks: Uint8Array[] = [];\n // The SDK body is a \"SdkStream\" which is AsyncIterable<Uint8Array>.\n // node:stream Readable is also async-iterable.\n for await (const chunk of body as AsyncIterable<Uint8Array>) {\n chunks.push(chunk);\n }\n const total = chunks.reduce((n, c) => n + c.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n};\n\nexport const readObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: ReadInput,\n): Promise<Result<ReadOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new GetObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n Range: input.range,\n }),\n );\n if (!res.Body) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"S3 returned a GetObject response with no body\",\n retryable: false,\n }),\n );\n }\n const body = await streamToBytes(res.Body);\n return ok({\n body,\n contentType: res.ContentType,\n metadata: res.Metadata,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `stat` — cheap metadata fetch via `HeadObjectCommand`.\n *\n * Returns the full HEAD response (size, etag, contentType,\n * lastModified, user metadata) in one typed object. Distinct\n * from `getMetadata` (which returns just the user-metadata\n * subset) so callers can choose between the cheap-and-typed\n * shape they need.\n */\nimport { HeadObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { StatInput, StatOutput } from \"../adapter\";\n\nexport const statObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: StatInput,\n): Promise<Result<StatOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok({\n key: input.key,\n size: res.ContentLength ?? 0,\n etag: res.ETag ?? \"\",\n contentType: res.ContentType ?? \"application/octet-stream\",\n lastModified: res.LastModified ?? new Date(0),\n metadata: res.Metadata ?? {},\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `getMetadata` — fetch just the user-defined metadata.\n *\n * S3's `HeadObject` returns size, etag, contentType, lastModified,\n * AND user metadata in one call. `getMetadata` runs the same HEAD\n * and returns only the user-metadata subset so callers that only\n * care about application-level tags don't have to thread the rest\n * of the HEAD shape through their code.\n *\n * For callers that need the full HEAD shape, use `stat` instead.\n */\nimport { HeadObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { GetMetadataInput, GetMetadataOutput } from \"../adapter\";\n\nexport const getMetadata = async (\n client: S3Client,\n config: FileSystemConfig,\n input: GetMetadataInput,\n): Promise<Result<GetMetadataOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok(res.Metadata ?? {});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * Multipart upload primitives (v0.2) — `createMultipartUpload`,\n * `uploadPart`, `completeMultipartUpload`, `abortMultipartUpload`.\n *\n * S3's chunked upload protocol is a four-step dance:\n * 1. `CreateMultipartUpload` returns an opaque `UploadId`.\n * 2. `UploadPart` (one or more) returns an `ETag` per chunk.\n * 3. `CompleteMultipartUpload` finalises the object by listing\n * the parts in the caller's chosen order (S3 honours the\n * caller's order; we do NOT pre-sort).\n * 4. On any failure, `AbortMultipartUpload` cleans up the\n * unfinished state on the server (parts are billed until\n * either complete or abort runs).\n *\n * Each helper is a thin pass-through to the corresponding AWS SDK\n * v3 command, with the standard `fromAws` error mapping (which\n * already covers `NoSuchUpload -> NotFound`, see\n * `src/errors/mappers.ts`).\n *\n * These four primitives are exposed individually so the higher-\n * level `write` method can compose them for bodies larger than one\n * part, but they are also public so server actions or stream-\n * multiplexers can drive the protocol themselves.\n */\nimport {\n CreateMultipartUploadCommand,\n UploadPartCommand,\n CompleteMultipartUploadCommand,\n AbortMultipartUploadCommand,\n type S3Client,\n} from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type {\n CreateMultipartUploadInput,\n CreateMultipartUploadOutput,\n UploadPartInput,\n UploadPartOutput,\n CompleteMultipartUploadInput,\n CompleteMultipartUploadOutput,\n AbortMultipartUploadInput,\n AbortMultipartUploadOutput,\n} from \"../adapter\";\n\nexport const createMultipartUpload = async (\n client: S3Client,\n config: FileSystemConfig,\n input: CreateMultipartUploadInput,\n): Promise<Result<CreateMultipartUploadOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new CreateMultipartUploadCommand({\n Bucket: config.bucket,\n Key: input.key,\n ContentType: input.contentType,\n Metadata: input.metadata,\n }),\n );\n return ok({\n uploadId: res.UploadId ?? \"\",\n key: input.key,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const uploadPart = async (\n client: S3Client,\n config: FileSystemConfig,\n input: UploadPartInput,\n): Promise<Result<UploadPartOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new UploadPartCommand({\n Bucket: config.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n PartNumber: input.partNumber,\n Body: input.body,\n }),\n );\n return ok({\n etag: res.ETag ?? \"\",\n partNumber: input.partNumber,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const completeMultipartUpload = async (\n client: S3Client,\n config: FileSystemConfig,\n input: CompleteMultipartUploadInput,\n): Promise<Result<CompleteMultipartUploadOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new CompleteMultipartUploadCommand({\n Bucket: config.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n MultipartUpload: {\n Parts: input.parts.map((p) => ({\n PartNumber: p.partNumber,\n ETag: p.etag,\n })),\n },\n }),\n );\n return ok({\n etag: res.ETag,\n versionId: res.VersionId,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const abortMultipartUpload = async (\n client: S3Client,\n config: FileSystemConfig,\n input: AbortMultipartUploadInput,\n): Promise<Result<AbortMultipartUploadOutput, FileSystemError>> => {\n try {\n await client.send(\n new AbortMultipartUploadCommand({\n Bucket: config.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `write` — single-PUT upload via `PutObjectCommand` (small bodies)\n * OR multipart upload via the v0.2 primitives (large bodies).\n *\n * Auto-switch (v0.2):\n * - `data.byteLength <= MULTIPART_PART_SIZE` -> single-PUT path\n * (unchanged from v0.1). Streams are always single-PUT.\n * - `data.byteLength > MULTIPART_PART_SIZE` -> multipart via\n * `createMultipartUpload` / `uploadPart` loop /\n * `completeMultipartUpload`, slicing the body into\n * `MULTIPART_PART_SIZE` chunks with a smaller final part.\n *\n * Compensation (v0.2): if any of the three multipart steps fails\n * (create / a part upload / complete), we MUST `abortMultipartUpload`\n * before returning the error — otherwise the in-flight parts stay\n * on the server and continue to bill against the bucket. The latch\n * is a `try/finally` with `uploadId` captured after create succeeds\n * and `completed` flipped to true after complete succeeds; the\n * finally block aborts when an uploadId exists and complete hasn't\n * finished.\n *\n * The 5 GB v0.1 cap is REMOVED. v0.2 multipart lifts the\n * single-PUT ceiling; the only hard limit now is S3's 10,000-part\n * / 5 TiB-per-object maximum, which is well outside any realistic\n * server-action payload.\n */\nimport { PutObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { WriteInput, WriteOutput } from \"../adapter\";\nimport {\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n} from \"./multipart\";\n\n/** Multipart part size. 8 MiB — S3 minimum is 5 MiB; 8 MiB amortises request overhead and keeps the part count well under 10,000 for any realistic object. */\nexport const MULTIPART_PART_SIZE = 8 * 1024 * 1024;\n\n/** S3 single-PUT hard limit (kept for callers that want to know the boundary; `write` no longer enforces it). */\nexport const MAX_SINGLE_PUT_SIZE = 5 * 1024 * 1024 * 1024;\n\nexport const writeObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: WriteInput,\n): Promise<Result<WriteOutput, FileSystemError>> => {\n // Auto-switch only triggers for Uint8Array bodies. Stream bodies\n // are sent as-is via single-PUT — the SDK will surface its own\n // error if the stream is too big.\n if (\n input.body instanceof Uint8Array &&\n input.body.byteLength > MULTIPART_PART_SIZE\n ) {\n return writeMultipart(client, config, input);\n }\n return writeSinglePut(client, config, input);\n};\n\nconst writeSinglePut = async (\n client: S3Client,\n config: FileSystemConfig,\n input: WriteInput,\n): Promise<Result<WriteOutput, FileSystemError>> => {\n try {\n const res = await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n Body: input.body,\n ContentType: input.contentType,\n Metadata: input.metadata,\n }),\n );\n return ok({\n etag: res.ETag ?? \"\",\n versionId: res.VersionId,\n });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nconst writeMultipart = async (\n client: S3Client,\n config: FileSystemConfig,\n input: WriteInput,\n): Promise<Result<WriteOutput, FileSystemError>> => {\n // The auto-switch guard guarantees this is a Uint8Array.\n const body = input.body as Uint8Array;\n const totalSize = body.byteLength;\n const chunkCount = Math.ceil(totalSize / MULTIPART_PART_SIZE);\n\n let uploadId: string | undefined;\n let completed = false;\n try {\n const create = await createMultipartUpload(client, config, {\n key: input.key,\n contentType: input.contentType,\n metadata: input.metadata,\n });\n if (!create.ok) return err(create.error);\n uploadId = create.value.uploadId;\n\n const parts: Array<{ partNumber: number; etag: string }> = [];\n for (let i = 0; i < chunkCount; i++) {\n const start = i * MULTIPART_PART_SIZE;\n const end = Math.min(start + MULTIPART_PART_SIZE, totalSize);\n // .slice() copies the bytes into a fresh Uint8Array; the\n // stored part is never aliased to the caller's buffer.\n const chunk = body.slice(start, end);\n const up = await uploadPart(client, config, {\n key: input.key,\n uploadId,\n partNumber: i + 1,\n body: chunk,\n });\n if (!up.ok) return err(up.error);\n parts.push({ partNumber: i + 1, etag: up.value.etag });\n }\n\n const complete = await completeMultipartUpload(client, config, {\n key: input.key,\n uploadId,\n parts,\n });\n if (!complete.ok) return err(complete.error);\n completed = true;\n return ok({\n etag: complete.value.etag ?? \"\",\n versionId: complete.value.versionId,\n });\n } finally {\n // Compensate: if create succeeded (uploadId set) but complete\n // did not, abort so the server-side parts stop billing. Abort\n // failures are swallowed — the caller already has the original\n // error and an abort-failed error would only mask it.\n if (uploadId !== undefined && !completed) {\n await abortMultipartUpload(client, config, {\n key: input.key,\n uploadId,\n });\n }\n }\n};\n","/**\n * `delete` — remove an object from the bucket.\n *\n * Missing keys are idempotent: S3 returns success even if the\n * key did not exist, so we don't need to special-case the 404.\n * That means a \"delete that found nothing\" still returns ok\n * (caller's intent was \"make sure this key is gone\" — and it is).\n */\nimport { DeleteObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { DeleteInput, DeleteOutput } from \"../adapter\";\n\nexport const deleteObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: DeleteInput,\n): Promise<Result<DeleteOutput, FileSystemError>> => {\n try {\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `exists` — boolean presence check via `HeadObjectCommand`.\n *\n * This is the ONE method where \"key not found\" is NOT an error.\n * A missing key returns `ok({ exists: false })`; other S3\n * failures (AccessDenied, networking, ...) still return\n * `err(FileSystemError)`. The special-case 404 handling is\n * centralized here so the rest of the codebase can treat\n * `exists` as a pure boolean query.\n */\nimport { HeadObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { ExistsInput, ExistsOutput } from \"../adapter\";\n\nexport const existsObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: ExistsInput,\n): Promise<Result<ExistsOutput, FileSystemError>> => {\n try {\n await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n }),\n );\n return ok({ exists: true });\n } catch (e) {\n // Special case: a 404 on HEAD is a boolean \"no\", not an error.\n const err_ = fromAws(e);\n if (err_.code === \"NotFound\") {\n return ok({ exists: false });\n }\n return err(err_);\n }\n};\n","/**\n * `copy` — server-side copy via `CopyObjectCommand`.\n *\n * The `CopySource` field is `${bucket}/${key}` per S3's wire\n * format. We construct it from the parsed config's bucket so\n * cross-bucket copies can be added later (v0.2) by accepting a\n * `destinationBucket` field on the input.\n */\nimport { CopyObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { CopyInput, CopyOutput } from \"../adapter\";\n\nexport const copyObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: CopyInput,\n): Promise<Result<CopyOutput, FileSystemError>> => {\n try {\n await client.send(\n new CopyObjectCommand({\n Bucket: config.bucket,\n Key: input.destinationKey,\n CopySource: `${config.bucket}/${input.sourceKey}`,\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `move` — implemented as `CopyObjectCommand` followed by\n * `DeleteObjectCommand`.\n *\n * S3 has no native rename primitive. The two-call dance is the\n * standard workaround. The order matters: copy FIRST, delete\n * ONLY if the copy succeeded. A copy failure leaves the source\n * intact (caller can retry); a delete failure after a successful\n * copy surfaces as a FileSystemError so the caller can clean up\n * the orphan destination themselves.\n *\n * v0.2 may add a true atomic move (e.g. via S3 Object Versioning\n * + lifecycle rules) for cases where the copy/delete window\n * is unacceptable.\n */\nimport type { S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport { copyObject } from \"./copy\";\nimport { deleteObject } from \"./delete\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { MoveInput, MoveOutput } from \"../adapter\";\n\nexport const moveObject = async (\n client: S3Client,\n config: FileSystemConfig,\n input: MoveInput,\n): Promise<Result<MoveOutput, FileSystemError>> => {\n const copy = await copyObject(client, config, {\n sourceKey: input.sourceKey,\n destinationKey: input.destinationKey,\n });\n if (!copy.ok) {\n return err(copy.error);\n }\n\n const del = await deleteObject(client, config, { key: input.sourceKey });\n if (!del.ok) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: `Move succeeded the copy step but failed to delete the source (${input.sourceKey}). Destination (${input.destinationKey}) is now an orphan.`,\n retryable: false,\n cause: { code: del.error.code, message: del.error.message },\n }),\n );\n }\n\n return ok({});\n};\n","/**\n * `setMetadata` — replace or merge user-defined metadata.\n *\n * Merge reads current metadata, unions in JS, then REPLACE.\n * COPY would ignore the new map.\n */\nimport { CopyObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { fromAws, type FileSystemError } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { SetMetadataInput, SetMetadataOutput } from \"../adapter\";\nimport { getMetadata } from \"./get-metadata\";\n\nexport const setMetadata = async (\n client: S3Client,\n config: FileSystemConfig,\n input: SetMetadataInput,\n): Promise<Result<SetMetadataOutput, FileSystemError>> => {\n try {\n let metadata = input.metadata;\n if (input.replace !== true) {\n const current = await getMetadata(client, config, { key: input.key });\n if (!current.ok) return current;\n metadata = { ...(current.value as Record<string, string>), ...input.metadata };\n }\n await client.send(\n new CopyObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n CopySource: `${config.bucket}/${input.key}`,\n Metadata: metadata,\n MetadataDirective: \"REPLACE\",\n }),\n );\n return ok({});\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * A signed GET opened in a tab must not render as a page.\n * `inline` is kept only for types the preview can show without executing script.\n */\nconst NEVER_INLINE = new Set([\"text/html\", \"application/xhtml+xml\", \"image/svg+xml\"]);\n\nconst DENIED_UPLOAD = new Set([\n \"text/html\",\n \"application/xhtml+xml\",\n \"image/svg+xml\",\n \"text/xml\",\n \"application/xml\",\n]);\n\nexport function mimeBase(contentType: string | undefined): string {\n return (contentType ?? \"\").split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n}\n\nexport function isDeniedUploadType(contentType: string | undefined): boolean {\n return DENIED_UPLOAD.has(mimeBase(contentType));\n}\n\n/** `image/*` matches `image/png` and does not match `image/svg+xml`. */\nexport function matchesAllowedContentType(pattern: string, actual: string): boolean {\n const mime = mimeBase(actual);\n if (!mime || isDeniedUploadType(mime)) return false;\n if (pattern === mime) return true;\n if (pattern.endsWith(\"/*\")) return mime.startsWith(pattern.slice(0, -1));\n return false;\n}\n\nexport function signedContentDisposition(\n requested: \"attachment\" | \"inline\" | undefined,\n contentType?: string,\n): \"attachment\" | \"inline\" {\n if (requested !== \"inline\") return \"attachment\";\n const mime = (contentType ?? \"\").split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n if (!mime || NEVER_INLINE.has(mime)) return \"attachment\";\n if (\n mime === \"application/pdf\" ||\n mime === \"text/plain\" ||\n mime === \"text/csv\" ||\n mime === \"text/markdown\" ||\n mime.startsWith(\"image/\") ||\n mime.startsWith(\"video/\") ||\n mime.startsWith(\"audio/\")\n ) {\n return \"inline\";\n }\n return \"attachment\";\n}\n","/**\n * `createPresignedUploadUrl` + `createPresignedDownloadUrl` —\n * sign a URL the client can use to PUT/GET the object directly,\n * bypassing the Next.js server entirely.\n *\n * Why this exists: large file uploads (> 1MB Server Action body\n * limit, often > 100MB in practice) MUST go directly from the\n * browser to the storage provider. The server signs the URL,\n * returns it to the client, the client does the PUT itself, and\n * then the server action confirms the upload via the metadata\n * store.\n *\n * NOTE: this adapter method does NOT cap \\`expiresIn\\`. The 7-day\n * S3 SigV4 cap is enforced at the route-handler-factory level\n * (PR 7b) so the adapter stays a low-level pass-through and\n * library consumers who need the cap have a single chokepoint\n * to configure. See\n * \\`sdd/file-next/design/decision/expiresin-cap-timing\\`.\n */\nimport { PutObjectCommand, GetObjectCommand, type S3Client } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError, fromAws } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type {\n PresignedUploadInput,\n PresignedUploadOutput,\n PresignedDownloadInput,\n PresignedDownloadOutput,\n} from \"../adapter\";\nimport { signedContentDisposition } from \"../content-disposition\";\n\nexport const createPresignedUploadUrl = async (\n client: S3Client,\n config: FileSystemConfig,\n input: PresignedUploadInput,\n): Promise<Result<PresignedUploadOutput, FileSystemError>> => {\n try {\n const cmd = new PutObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n ContentType: input.contentType,\n ContentLength: input.contentLength,\n });\n const url = await getSignedUrl(client, cmd, { expiresIn: input.expiresIn ?? 900 });\n const requiredHeaders: Record<string, string> = {};\n if (input.contentType) requiredHeaders[\"Content-Type\"] = input.contentType;\n if (input.contentLength != null) {\n requiredHeaders[\"Content-Length\"] = String(input.contentLength);\n }\n return ok({ url, method: \"PUT\", requiredHeaders });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n\nexport const createPresignedDownloadUrl = async (\n client: S3Client,\n config: FileSystemConfig,\n input: PresignedDownloadInput,\n): Promise<Result<PresignedDownloadOutput, FileSystemError>> => {\n try {\n const cmd = new GetObjectCommand({\n Bucket: config.bucket,\n Key: input.key,\n ResponseContentDisposition: signedContentDisposition(input.disposition, input.contentType),\n });\n const url = await getSignedUrl(client, cmd, { expiresIn: input.expiresIn ?? 900 });\n return ok({ url });\n } catch (e) {\n return err(fromAws(e));\n }\n};\n","/**\n * `getPublicUrl` — build the public URL for an object in the bucket.\n *\n * No HTTP call. The URL is constructed from the bucket name +\n * key + (endpoint OR region) per S3's addressing rules.\n *\n * Provider-specific shapes:\n * - **S3 (virtual-hosted, the default)**: `https://{bucket}.s3.{region}.amazonaws.com/{key}`\n * - **S3 (path-style, when `forcePathStyle: true`)**: `https://{endpoint}/{bucket}/{key}` if an endpoint is set, else `https://s3.{region}.amazonaws.com/{bucket}/{key}`\n * - **R2 (always path-style)**: `https://{endpoint}/{bucket}/{key}` (the `endpoint` is the R2 account endpoint)\n *\n * v0.1 does not support a per-bucket `customDomain` override\n * (the R2 custom-domain feature). Adding it is a one-line\n * schema change in `config.ts` + a branch in the URL builder\n * here; deferred to v0.2 per the spec.\n */\nimport type { S3Client } from \"@aws-sdk/client-s3\";\nimport { ok, type Result } from \"@/types/result\";\nimport type { FileSystemError } from \"@/errors\";\nimport type { FileSystemConfig } from \"../config\";\nimport type { GetPublicUrlInput, GetPublicUrlOutput } from \"../adapter\";\n\nexport const getPublicUrl = async (\n _client: S3Client,\n config: FileSystemConfig,\n input: GetPublicUrlInput,\n): Promise<Result<GetPublicUrlOutput, FileSystemError>> => {\n const key = input.key;\n\n if (config.provider === \"r2\") {\n // R2: always path-style, always uses the account endpoint.\n return ok({ url: `${stripTrailingSlash(config.endpoint)}/${config.bucket}/${key}` });\n }\n\n if (config.forcePathStyle && config.endpoint) {\n return ok({ url: `${stripTrailingSlash(config.endpoint)}/${config.bucket}/${key}` });\n }\n\n if (config.forcePathStyle) {\n return ok({ url: `https://s3.${config.region}.amazonaws.com/${config.bucket}/${key}` });\n }\n\n // Default: S3 virtual-hosted style.\n return ok({ url: `https://${config.bucket}.s3.${config.region}.amazonaws.com/${key}` });\n};\n\nconst stripTrailingSlash = (s: string): string =>\n s.endsWith(\"/\") ? s.slice(0, -1) : s;\n","/**\n * `createS3Client` — turn a validated `FileSystemConfig` into a\n * configured `@aws-sdk/client-s3` `S3Client`.\n *\n * This is the ONLY place that knows the provider-specific knobs\n * (endpoint, forcePathStyle, region) for the client construction.\n * The adapter methods themselves are provider-agnostic; they\n * just call `client.send(command)` and the client handles routing.\n *\n * Provider-specific notes:\n * - **S3**: `region` is the AWS region. `endpoint` is optional\n * and only set for S3-compatible providers (MinIO,\n * LocalStack). `forcePathStyle` defaults to false (virtual-\n * hosted) but can be flipped to true for MinIO compatibility.\n * - **R2**: the SDK requires a `region` value but R2 ignores\n * it; we use the conventional \"auto\". `endpoint` is the\n * account-specific Cloudflare R2 endpoint (required). R2\n * ONLY supports path-style addressing; the `R2ConfigSchema`\n * type enforces `forcePathStyle: true` at the type level.\n */\nimport { S3Client } from \"@aws-sdk/client-s3\";\nimport type { FileSystemConfig, S3Config, R2Config } from \"../config\";\n\nexport const createS3Client = (config: FileSystemConfig): S3Client => {\n if (config.provider === \"r2\") {\n return buildClient({\n region: \"auto\",\n endpoint: config.endpoint,\n credentials: config.credentials,\n forcePathStyle: true,\n });\n }\n return buildClient({\n region: config.region,\n endpoint: config.endpoint,\n credentials: config.credentials,\n forcePathStyle: config.forcePathStyle,\n });\n};\n\nconst buildClient = (opts: {\n region: string;\n endpoint: string | undefined;\n credentials: { accessKeyId: string; secretAccessKey: string };\n forcePathStyle: boolean;\n}): S3Client => {\n return new S3Client({\n region: opts.region,\n endpoint: opts.endpoint,\n credentials: opts.credentials,\n forcePathStyle: opts.forcePathStyle,\n });\n};\n\n// Re-export the config types so adapter consumers can type-narrow\n// without a second import.\nexport type { S3Config, R2Config };\n","/**\n * `createS3Adapter` — the factory that turns a validated\n * `FileSystemConfig` into a fully-shaped `S3CompatibleAdapter`.\n *\n * The 17 methods are wired as thin delegations to the per-method\n * helpers in the same directory. Each helper is independently\n * testable (one test file per method) and shares the S3Client\n * + the error-mapping via `fromAws`.\n *\n * The factory is consumed by `createFileSystem` (in\n * `../factory.ts`) which also owns the `forTenant` namespacing\n * and the (future) MetadataStore wiring. This file is\n * intentionally pure: it only knows about the adapter surface,\n * not the higher-level `FileSystem` container.\n */\nimport type { S3Client } from \"@aws-sdk/client-s3\";\nimport type {\n S3CompatibleAdapter,\n} from \"../adapter\";\nimport type { FileSystemConfig } from \"../config\";\nimport { listObjects } from \"./list\";\nimport { readObject } from \"./read\";\nimport { statObject } from \"./stat\";\nimport { getMetadata } from \"./get-metadata\";\nimport { writeObject, MAX_SINGLE_PUT_SIZE } from \"./write\";\nimport { deleteObject } from \"./delete\";\nimport { existsObject } from \"./exists\";\nimport { copyObject } from \"./copy\";\nimport { moveObject } from \"./move\";\nimport { setMetadata } from \"./set-metadata\";\nimport {\n createPresignedUploadUrl,\n createPresignedDownloadUrl,\n} from \"./presigned\";\nimport { getPublicUrl } from \"./get-public-url\";\nimport {\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n} from \"./multipart\";\n\nexport { MAX_SINGLE_PUT_SIZE };\nexport { MULTIPART_PART_SIZE } from \"./write\";\n\n/**\n * Build a `S3CompatibleAdapter` from a `FileSystemConfig`. The\n * `client` is the underlying `@aws-sdk/client-s3` S3Client; pass\n * the result of `createS3Client(config)` here.\n */\nexport const createS3Adapter = (\n client: S3Client,\n config: FileSystemConfig,\n): S3CompatibleAdapter => ({\n list: (input) => listObjects(client, config, input),\n read: (input) => readObject(client, config, input),\n write: (input) => writeObject(client, config, input),\n delete: (input) => deleteObject(client, config, input),\n move: (input) => moveObject(client, config, input),\n copy: (input) => copyObject(client, config, input),\n stat: (input) => statObject(client, config, input),\n exists: (input) => existsObject(client, config, input),\n getMetadata: (input) => getMetadata(client, config, input),\n setMetadata: (input) => setMetadata(client, config, input),\n createPresignedUploadUrl: (input) => createPresignedUploadUrl(client, config, input),\n createPresignedDownloadUrl: (input) => createPresignedDownloadUrl(client, config, input),\n getPublicUrl: (input) => getPublicUrl(client, config, input),\n createMultipartUpload: (input) => createMultipartUpload(client, config, input),\n uploadPart: (input) => uploadPart(client, config, input),\n completeMultipartUpload: (input) => completeMultipartUpload(client, config, input),\n abortMultipartUpload: (input) => abortMultipartUpload(client, config, input),\n});\n\n// Re-exports for tests and downstream consumers who want to call\n// the helpers directly (e.g. the server actions layer in PR 7).\nexport { listObjects } from \"./list\";\nexport { readObject } from \"./read\";\nexport { statObject } from \"./stat\";\nexport { getMetadata } from \"./get-metadata\";\nexport { writeObject } from \"./write\";\nexport { deleteObject } from \"./delete\";\nexport { existsObject } from \"./exists\";\nexport { copyObject } from \"./copy\";\nexport { moveObject } from \"./move\";\nexport { setMetadata } from \"./set-metadata\";\nexport {\n createPresignedUploadUrl,\n createPresignedDownloadUrl,\n} from \"./presigned\";\nexport { getPublicUrl } from \"./get-public-url\";\nexport {\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n} from \"./multipart\";\nexport { createS3Client } from \"./client\";\n","/**\n * In-memory implementation of the 17-method `S3CompatibleAdapter` contract.\n *\n * Why this exists:\n * - **Demo / try-it-now experience**: lets the consumer run the\n * demo app without provisioning AWS S3 or MinIO. The whole\n * library (server actions, route handlers, headless hooks) works\n * end-to-end against this adapter.\n * - **Test utility**: integration tests and example apps can wire\n * a deterministic in-process backend instead of relying on\n * `aws-sdk-client-mock`. The state is observable (you can\n * inspect `store()` to assert on the bytes that were written).\n * - **Spec compliance**: every method returns the same\n * `Result<T, FileSystemError>` shape, enforces the same input\n * validation (5 GB single-PUT cap, mime-type default, etc.),\n * and emits the same error codes for the same conditions as the\n * S3 adapter. A consumer can swap adapters without changing\n * any application code.\n *\n * Limitations (intentional, all documented):\n * - **`createPresignedUploadUrl` / `createPresignedDownloadUrl`**\n * return `in-memory://` URLs that are only resolvable by the\n * in-memory adapter's own getter functions. The real S3 adapter\n * returns real SigV4 URLs.\n * - **`getPublicUrl`** returns a fake `https://in-memory.local/...`\n * URL. Useful for shape parity, not for serving real assets.\n * - State is per-process; it does NOT survive a server restart.\n * For persistence, use the S3 or R2 adapter.\n * - Not optimized for large blobs — the in-memory `Map` holds\n * every byte in RAM. A 5 GB PUT occupies 5 GB of heap.\n *\n * The 17-method count is enforced by the S3 adapter's contract test\n * (`packages/core/tests/storage/adapter.test.ts`); adding/removing\n * a method here must be reflected there too.\n */\nimport { randomUUID } from \"node:crypto\";\nimport type { Result } from \"@/types/result\";\nimport { FileSystemError, RETRYABLE_BY_CODE } from \"@/errors\";\nimport { asS3Key, asPrefix, type S3Key, type Prefix } from \"@/types/branded\";\nimport type {\n S3CompatibleAdapter,\n ListInput,\n ListOutput,\n ReadInput,\n ReadOutput,\n WriteInput,\n WriteOutput,\n DeleteInput,\n DeleteOutput,\n MoveInput,\n MoveOutput,\n CopyInput,\n CopyOutput,\n StatInput,\n StatOutput,\n ExistsInput,\n ExistsOutput,\n GetMetadataInput,\n GetMetadataOutput,\n SetMetadataInput,\n SetMetadataOutput,\n PresignedUploadInput,\n PresignedUploadOutput,\n PresignedDownloadInput,\n PresignedDownloadOutput,\n GetPublicUrlInput,\n GetPublicUrlOutput,\n CreateMultipartUploadInput,\n CreateMultipartUploadOutput,\n UploadPartInput,\n UploadPartOutput,\n CompleteMultipartUploadInput,\n CompleteMultipartUploadOutput,\n AbortMultipartUploadInput,\n AbortMultipartUploadOutput,\n} from \"../adapter\";\nimport { MAX_SINGLE_PUT_SIZE, MULTIPART_PART_SIZE } from \"../s3-adapter\";\n\n/** A single object stored in the in-memory backend. */\ninterface MemoryObject {\n readonly body: Uint8Array;\n readonly contentType: string;\n readonly userMetadata: Readonly<Record<string, string>>;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n}\n\n/** Public snapshot of the store. Tests use this to assert on state. */\nexport interface MemoryStoreSnapshot {\n /** Map from S3 key to the stored object. */\n readonly objects: ReadonlyMap<S3Key, MemoryObject>;\n /** Monotonic counter used to fabricate fake etags. */\n readonly etagCounter: number;\n}\n\n/** Options for `createMemoryAdapter`. */\nexport interface MemoryAdapterOptions {\n /** Default content type when the caller doesn't supply one. Default: `application/octet-stream`. */\n readonly defaultContentType?: string;\n /** Whether to validate the single-PUT size cap. Default: true. */\n readonly enforceSizeLimit?: boolean;\n /**\n * Override the single-PUT size cap. Default: `MAX_SINGLE_PUT_SIZE`\n * (5 GB). Lower this in tests so you don't need to allocate 5+ GB\n * of memory just to assert the cap.\n */\n readonly maxSinglePutSize?: number;\n /**\n * Optional bucket name for `getPublicUrl` fabrication. The\n * default `\"in-memory\"` keeps the URLs short and obviously fake.\n */\n readonly bucket?: string;\n}\n\nconst DEFAULT_CONTENT_TYPE = \"application/octet-stream\";\n\n/**\n * Compute a fake etag from the byte length + a counter so that\n * successive writes to the same key produce different etags.\n */\nfunction fakeEtag(bodyLength: number, counter: number): string {\n return `\"mem-${counter.toString(16)}-${bodyLength.toString(16)}\"`;\n}\n\n/**\n * Create a fresh in-memory adapter. The returned adapter is a\n * closure over a private `Map`; you can read the current state\n * via the `.store()` method.\n */\nexport function createMemoryAdapter(\n options: MemoryAdapterOptions = {},\n): S3CompatibleAdapter & { readonly store: () => MemoryStoreSnapshot } {\n const defaultContentType = options.defaultContentType ?? DEFAULT_CONTENT_TYPE;\n const enforceSizeLimit = options.enforceSizeLimit ?? true;\n const maxSinglePutSize = options.maxSinglePutSize ?? MAX_SINGLE_PUT_SIZE;\n const bucket = options.bucket ?? \"in-memory\";\n\n const objects = new Map<S3Key, MemoryObject>();\n let etagCounter = 0;\n\n /**\n * In-flight multipart upload sessions. Keyed by `${key}::${uploadId}`\n * so two parallel sessions on the same key don't collide. The\n * `aborted` flag is what `abortMultipartUpload` flips and what\n * subsequent `uploadPart` / `completeMultipartUpload` calls check\n * to return `NotFound` (S3 semantics: an aborted session is gone).\n */\n interface MultipartSession {\n readonly key: S3Key;\n readonly contentType: string;\n readonly metadata: Record<string, string>;\n readonly parts: Map<number, Uint8Array>;\n aborted: boolean;\n }\n const sessions = new Map<string, MultipartSession>();\n const sessionKey = (key: S3Key, uploadId: string): string => `${key}::${uploadId}`;\n\n /** Return a deep-copied snapshot (callers can't mutate the map). */\n const store = (): MemoryStoreSnapshot => {\n // Return a plain object (not a real Map) so JSON.stringify works\n // in dev-tools / log lines. Iterating a Map preserves insertion order.\n const plain: Record<string, MemoryObject> = {};\n for (const [k, v] of objects) plain[k as string] = v;\n return {\n objects: new Map(Object.entries(plain).map(([k, v]) => [asS3Key(k), v])) as ReadonlyMap<S3Key, MemoryObject>,\n etagCounter,\n };\n };\n\n // ---------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------\n\n /** Default content type when the caller didn't supply one. */\n const resolveContentType = (input: { contentType?: string }): string =>\n input.contentType ?? defaultContentType;\n\n /** Convert bytes to a Buffer for stable byteLength access. */\n /**\n * Coerce the body to a Uint8Array. We use duck-typing on\n * `ArrayBuffer.isView` and a numeric `byteLength` instead of\n * `instanceof Uint8Array` because vitest runs tests in worker\n * threads with separate realms, and `instanceof` fails across\n * realms (the source's `Uint8Array` and the test's `Uint8Array`\n * are different constructors even though the values are\n * structurally identical). See session memory\n * `sdd/file-next/v0.2-inmemory-adapter-cross-realm`.\n *\n * We always COPY the bytes into a fresh Uint8Array — even when\n * the input is already a Uint8Array in the same realm — so the\n * stored object is never aliased to the caller's buffer (a\n * caller mutating their input after a write() would otherwise\n * silently mutate the stored object too).\n */\n const toBytes = (data: WriteInput[\"body\"]): Uint8Array => {\n if (data == null) {\n throw new TypeError(\"WriteInput.body is required\");\n }\n // string → encode\n if (typeof data === \"string\") {\n return new TextEncoder().encode(data);\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return new Uint8Array(data.size);\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n // Duck-type: any TypedArray view (Uint8Array, Buffer, Int8Array,\n // etc.) has a numeric byteLength and ArrayBuffer.isView() === true.\n // This branch handles cross-realm Uint8Arrays where\n // `data instanceof Uint8Array` returns false but the value IS\n // structurally a Uint8Array.\n if (\n typeof data === \"object\" &&\n data !== null &&\n typeof (data as { byteLength?: unknown }).byteLength === \"number\" &&\n ArrayBuffer.isView(data)\n ) {\n const view = data as unknown as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n throw new TypeError(\n `WriteInput.body must be a string, Blob, ArrayBuffer, or TypedArray. Got: ${typeof data}`,\n );\n };\n\n /** Single source of truth for \"key not found\" results. */\n const notFound = (key: string): FileSystemError =>\n new FileSystemError({\n code: \"NotFound\",\n retryable: false,\n message: `Object not found: ${key}`,\n });\n\n /** Validate the single-PUT size cap (matches s3-adapter/write.ts). */\n const validateWriteSize = (\n body: Uint8Array,\n ): FileSystemError | null => {\n if (!enforceSizeLimit) return null;\n if (body.byteLength <= maxSinglePutSize) return null;\n return new FileSystemError({\n code: \"PayloadTooLarge\",\n retryable: false,\n message: `Object size ${body.byteLength} exceeds single-PUT limit ${maxSinglePutSize}`,\n });\n };\n\n // ---------------------------------------------------------------------\n // 17 methods\n // ---------------------------------------------------------------------\n\n const list = async (input: ListInput): Promise<Result<ListOutput, FileSystemError>> => {\n const prefixStr = (input.prefix ?? \"\") as string;\n const limit = input.limit ?? 1000;\n const items: Array<{ key: S3Key; size: number; lastModified: Date }> = [];\n const seenFolders = new Set<string>();\n for (const [key, obj] of objects) {\n const keyStr = key as string;\n if (!keyStr.startsWith(prefixStr)) continue;\n const remainder = keyStr.slice(prefixStr.length);\n // Group nested keys into a synthetic \"folder\" entry.\n const slashIdx = remainder.indexOf(\"/\");\n if (slashIdx > 0) {\n const folder = prefixStr + remainder.slice(0, slashIdx + 1);\n if (!seenFolders.has(folder)) {\n seenFolders.add(folder);\n items.push({ key: asS3Key(folder), size: 0, lastModified: obj.updatedAt });\n }\n continue;\n }\n items.push({\n key,\n size: obj.body.byteLength,\n lastModified: obj.updatedAt,\n });\n if (items.length >= limit) break;\n }\n return { ok: true, value: { items, prefixes: [] } };\n };\n\n const read = async (input: ReadInput): Promise<Result<ReadOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n return { ok: true, value: { body: obj.body, contentType: obj.contentType } };\n };\n\n const write = async (input: WriteInput): Promise<Result<WriteOutput, FileSystemError>> => {\n const body = toBytes(input.body);\n // Auto-switch to multipart for large Uint8Array bodies. The\n // byte-length check mirrors the S3 adapter's switch condition\n // so the two adapters behave identically. Stream / Blob /\n // ArrayBuffer inputs skip the switch (they go single-PUT after\n // `toBytes` reduces them to a Uint8Array).\n if (input.body instanceof Uint8Array && body.byteLength > MULTIPART_PART_SIZE) {\n return writeMultipartMemory(input, body);\n }\n const sizeErr = validateWriteSize(body);\n if (sizeErr) return { ok: false, error: sizeErr };\n etagCounter += 1;\n const now = new Date();\n const existing = objects.get(asS3Key(input.key));\n objects.set(asS3Key(input.key), {\n body,\n contentType: resolveContentType(input),\n userMetadata: { ...(input.metadata ?? {}) },\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n return {\n ok: true,\n value: {\n etag: fakeEtag(body.byteLength, etagCounter),\n },\n };\n };\n\n /**\n * Multipart write path for the in-memory adapter. Drives the\n * same four primitives as the S3 adapter and shares the\n * create → loop → complete → compensate structure. The\n * in-memory primitives never fail mid-flight for in-process\n * callers (the only failure mode is a missing session, which\n * can't happen if we always pass the uploadId we just got from\n * create), so the compensation never fires in practice — but\n * the structure is preserved so the adapter stays symmetric\n * with the S3 path.\n */\n const writeMultipartMemory = async (\n input: WriteInput,\n body: Uint8Array,\n ): Promise<Result<WriteOutput, FileSystemError>> => {\n const totalSize = body.byteLength;\n const chunkCount = Math.ceil(totalSize / MULTIPART_PART_SIZE);\n\n let uploadId: string | undefined;\n let completed = false;\n try {\n const create = await createMultipartUpload({\n key: input.key,\n contentType: input.contentType,\n metadata: input.metadata,\n });\n if (!create.ok) return { ok: false, error: create.error };\n uploadId = create.value.uploadId;\n\n const parts: Array<{ partNumber: number; etag: string }> = [];\n for (let i = 0; i < chunkCount; i++) {\n const start = i * MULTIPART_PART_SIZE;\n const end = Math.min(start + MULTIPART_PART_SIZE, totalSize);\n const chunk = body.slice(start, end);\n const up = await uploadPart({\n key: input.key,\n uploadId,\n partNumber: i + 1,\n body: chunk,\n });\n if (!up.ok) return { ok: false, error: up.error };\n parts.push({ partNumber: i + 1, etag: up.value.etag });\n }\n\n const complete = await completeMultipartUpload({\n key: input.key,\n uploadId,\n parts,\n });\n if (!complete.ok) return { ok: false, error: complete.error };\n completed = true;\n return {\n ok: true,\n value: { etag: complete.value.etag ?? fakeEtag(totalSize, ++etagCounter) },\n };\n } finally {\n if (uploadId !== undefined && !completed) {\n await abortMultipartUpload({ key: input.key, uploadId });\n }\n }\n };\n\n const del = async (input: DeleteInput): Promise<Result<DeleteOutput, FileSystemError>> => {\n const existed = objects.delete(asS3Key(input.key));\n return { ok: true, value: { existed } };\n };\n\n const move = async (input: MoveInput): Promise<Result<MoveOutput, FileSystemError>> => {\n const src = objects.get(asS3Key(input.sourceKey));\n if (!src) return { ok: false, error: notFound(input.sourceKey) };\n etagCounter += 1;\n const now = new Date();\n const existing = objects.get(asS3Key(input.destinationKey));\n objects.set(asS3Key(input.destinationKey), {\n ...src,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n if (input.sourceKey !== input.destinationKey) {\n objects.delete(asS3Key(input.sourceKey));\n }\n return { ok: true, value: { key: input.destinationKey } };\n };\n\n const copy = async (input: CopyInput): Promise<Result<CopyOutput, FileSystemError>> => {\n const src = objects.get(asS3Key(input.sourceKey));\n if (!src) return { ok: false, error: notFound(input.sourceKey) };\n etagCounter += 1;\n const now = new Date();\n objects.set(asS3Key(input.destinationKey), {\n body: new Uint8Array(src.body), // defensive copy\n contentType: src.contentType,\n userMetadata: { ...src.userMetadata },\n createdAt: now,\n updatedAt: now,\n });\n return { ok: true, value: { key: input.destinationKey } };\n };\n\n const stat = async (input: StatInput): Promise<Result<StatOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n return {\n ok: true,\n value: {\n key: input.key,\n size: obj.body.byteLength,\n etag: fakeEtag(obj.body.byteLength, etagCounter),\n contentType: obj.contentType,\n lastModified: obj.updatedAt,\n metadata: { ...obj.userMetadata },\n },\n };\n };\n\n const exists = async (\n input: ExistsInput,\n ): Promise<Result<ExistsOutput, FileSystemError>> => {\n return { ok: true, value: { exists: objects.has(asS3Key(input.key)) } };\n };\n\n const getMetadata = async (\n input: GetMetadataInput,\n ): Promise<Result<GetMetadataOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n return { ok: true, value: { key: input.key, metadata: obj.userMetadata } };\n };\n\n const setMetadata = async (\n input: SetMetadataInput,\n ): Promise<Result<SetMetadataOutput, FileSystemError>> => {\n const obj = objects.get(asS3Key(input.key));\n if (!obj) return { ok: false, error: notFound(input.key) };\n const next = input.replace\n ? { ...(input.metadata ?? {}) }\n : { ...obj.userMetadata, ...(input.metadata ?? {}) };\n objects.set(asS3Key(input.key), {\n ...obj,\n userMetadata: next,\n updatedAt: new Date(),\n });\n return { ok: true, value: {} };\n };\n\n const createPresignedUploadUrl = async (\n input: PresignedUploadInput,\n ): Promise<Result<PresignedUploadOutput, FileSystemError>> => {\n // Fake URL — only resolvable by the in-memory adapter's\n // own test helper (not exposed in the public adapter).\n const expiresIn = input.expiresIn ?? 900;\n const requiredHeaders: Record<string, string> = {};\n if (input.contentType) requiredHeaders[\"Content-Type\"] = input.contentType;\n if (input.contentLength != null) {\n requiredHeaders[\"Content-Length\"] = String(input.contentLength);\n }\n return {\n ok: true,\n value: {\n url: `in-memory://${bucket}/${input.key}?expiresIn=${expiresIn}`,\n method: \"PUT\",\n requiredHeaders,\n },\n };\n };\n\n const createPresignedDownloadUrl = async (\n input: PresignedDownloadInput,\n ): Promise<Result<PresignedDownloadOutput, FileSystemError>> => {\n if (!objects.has(asS3Key(input.key))) {\n return { ok: false, error: notFound(input.key) };\n }\n const expiresIn = input.expiresIn ?? 900;\n return {\n ok: true,\n value: {\n url: `in-memory://${bucket}/${input.key}?expiresIn=${expiresIn}`,\n },\n };\n };\n\n const getPublicUrl = async (\n input: GetPublicUrlInput,\n ): Promise<Result<GetPublicUrlOutput, FileSystemError>> => {\n return {\n ok: true,\n value: { url: `https://${bucket}.local/${input.key}` },\n };\n };\n\n // ---------------------------------------------------------------------\n // Multipart upload primitives (v0.2).\n //\n // The in-memory adapter mirrors S3's session semantics: each\n // `createMultipartUpload` returns an opaque `uploadId`; subsequent\n // `uploadPart` calls accumulate per-part bytes keyed by\n // `partNumber`; `completeMultipartUpload` assembles the bytes in\n // the caller's part order and writes them into the objects Map\n // (so a subsequent `read` returns the assembled body); and\n // `abortMultipartUpload` flips a flag that makes any later\n // reference to the same uploadId return `NotFound` (matching the\n // S3 behaviour where an aborted session is gone from the\n // server's perspective).\n // ---------------------------------------------------------------------\n\n const createMultipartUpload = async (\n input: CreateMultipartUploadInput,\n ): Promise<Result<CreateMultipartUploadOutput, FileSystemError>> => {\n const uploadId = randomUUID();\n sessions.set(sessionKey(input.key, uploadId), {\n key: input.key,\n contentType: resolveContentType(input),\n metadata: { ...(input.metadata ?? {}) },\n parts: new Map(),\n aborted: false,\n });\n return {\n ok: true,\n value: { uploadId, key: input.key },\n };\n };\n\n const uploadPart = async (\n input: UploadPartInput,\n ): Promise<Result<UploadPartOutput, FileSystemError>> => {\n const session = sessions.get(sessionKey(input.key, input.uploadId));\n if (!session || session.aborted) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n session.parts.set(input.partNumber, input.body);\n return {\n ok: true,\n value: { etag: randomUUID(), partNumber: input.partNumber },\n };\n };\n\n const completeMultipartUpload = async (\n input: CompleteMultipartUploadInput,\n ): Promise<Result<CompleteMultipartUploadOutput, FileSystemError>> => {\n const session = sessions.get(sessionKey(input.key, input.uploadId));\n if (!session || session.aborted) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n // S3 semantics: every partNumber in the caller's list must\n // have been uploaded. Otherwise the complete fails.\n for (const { partNumber } of input.parts) {\n if (!session.parts.has(partNumber)) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n }\n // Assemble in the caller's order (S3 honours the part list\n // order; we do NOT sort).\n const totalLen = input.parts.reduce(\n (sum, p) => sum + (session.parts.get(p.partNumber)?.byteLength ?? 0),\n 0,\n );\n const assembled = new Uint8Array(totalLen);\n let offset = 0;\n for (const { partNumber } of input.parts) {\n const chunk = session.parts.get(partNumber)!;\n assembled.set(chunk, offset);\n offset += chunk.byteLength;\n }\n etagCounter += 1;\n const now = new Date();\n objects.set(asS3Key(input.key), {\n body: assembled,\n contentType: session.contentType,\n userMetadata: { ...session.metadata },\n createdAt: now,\n updatedAt: now,\n });\n sessions.delete(sessionKey(input.key, input.uploadId));\n return { ok: true, value: { etag: fakeEtag(assembled.byteLength, etagCounter) } };\n };\n\n const abortMultipartUpload = async (\n input: AbortMultipartUploadInput,\n ): Promise<Result<AbortMultipartUploadOutput, FileSystemError>> => {\n const session = sessions.get(sessionKey(input.key, input.uploadId));\n if (!session) {\n return { ok: false, error: notFound(input.uploadId) };\n }\n session.aborted = true;\n sessions.delete(sessionKey(input.key, input.uploadId));\n return { ok: true, value: {} };\n };\n\n return {\n list,\n read,\n write,\n delete: del,\n move,\n copy,\n stat,\n exists,\n getMetadata,\n setMetadata,\n createPresignedUploadUrl,\n createPresignedDownloadUrl,\n getPublicUrl,\n createMultipartUpload,\n uploadPart,\n completeMultipartUpload,\n abortMultipartUpload,\n store,\n } as S3CompatibleAdapter & { readonly store: () => MemoryStoreSnapshot };\n}\n\n// Avoid unused-export warning for the asPrefix import in some configs.\nvoid asPrefix;\n\n// Keep RETRYABLE_BY_CODE imported to make adapter-side error code\n// choice explicit (e.g. NotFound is non-retryable, NetworkError is).\nvoid RETRYABLE_BY_CODE;\n","/**\n * `FileSystemConfig` — the discriminated union of provider configs\n * and its Zod-driven parser.\n *\n * The Zod schema is the single source of truth for both the\n * runtime shape AND the TypeScript type (`z.infer<...>`). Adding a\n * new field is a one-line change in the schema; the inferred type\n * updates automatically and every consumer gets the new field\n * without a separate type definition to keep in sync.\n *\n * Provider-specific shape notes:\n * - **S3**: `region` is required (AWS regional endpoints). An\n * optional `endpoint` is allowed for S3-compatible providers\n * (MinIO, LocalStack, etc.).\n * - **R2**: `endpoint` is required (Cloudflare R2 has no region\n * model — you talk to your account's endpoint). `forcePathStyle`\n * is ALWAYS `true` (R2 requires path-style addressing; the\n * literal type catches accidental overrides at parse time).\n *\n * `parseFileSystemConfig` is the trust boundary. Callers receive a\n * `Result<FileSystemConfig, FileSystemError>` — a parse failure is\n * an `InternalError` (retryable: false) with the original Zod\n * issues preserved on `cause` for debugging.\n */\nimport { z } from \"zod\";\nimport { ok, err, type Result } from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\n\n// ---------------------------------------------------------------------------\n// Shared credentials schema\n// ---------------------------------------------------------------------------\n\nconst CredentialsSchema = z.object({\n accessKeyId: z.string().min(1, \"accessKeyId is required\"),\n secretAccessKey: z.string().min(1, \"secretAccessKey is required\"),\n});\n\nexport type Credentials = z.infer<typeof CredentialsSchema>;\n\n// ---------------------------------------------------------------------------\n// Per-provider schemas\n// ---------------------------------------------------------------------------\n\nexport const S3ConfigSchema = z.object({\n provider: z.literal(\"s3\"),\n bucket: z.string().min(1, \"bucket is required\"),\n region: z.string().min(1, \"region is required\"),\n /** Optional S3-compatible endpoint (MinIO, LocalStack, ...). */\n endpoint: z.string().url().optional(),\n credentials: CredentialsSchema,\n /** Default false; some S3-compatible providers need path-style. */\n forcePathStyle: z.boolean().default(false),\n});\n\nexport const R2ConfigSchema = z.object({\n provider: z.literal(\"r2\"),\n bucket: z.string().min(1, \"bucket is required\"),\n endpoint: z.string().url(\"R2 requires an endpoint URL\"),\n credentials: CredentialsSchema,\n /** R2 ONLY supports path-style; the literal-true type makes that explicit. */\n forcePathStyle: z.literal(true),\n});\n\nexport const FileSystemConfigSchema = z.discriminatedUnion(\"provider\", [\n S3ConfigSchema,\n R2ConfigSchema,\n]);\n\nexport type S3Config = z.infer<typeof S3ConfigSchema>;\nexport type R2Config = z.infer<typeof R2ConfigSchema>;\nexport type FileSystemConfig = z.infer<typeof FileSystemConfigSchema>;\n\n// ---------------------------------------------------------------------------\n// Parser — the single trust boundary for env-derived config\n// ---------------------------------------------------------------------------\n\n/**\n * Parse an unknown value (typically the env object) into a typed\n * `FileSystemConfig`. Returns a `Result` so the call site can\n * branch on parse failure without try/catch.\n *\n * Mapping strategy:\n * - On success: `ok(config)`.\n * - On Zod failure: `err(FileSystemError(InternalError, retryable: false))`\n * with the original issues preserved on `cause` (as a synthetic\n * `{ code: \"ZodError\", message, issues }` shape so the\n * FileSystemError contract is honored).\n */\nexport const parseFileSystemConfig = (\n input: unknown,\n): Result<FileSystemConfig, FileSystemError> => {\n const parsed = FileSystemConfigSchema.safeParse(input);\n if (parsed.success) {\n return ok(parsed.data);\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Invalid FileSystemConfig\",\n retryable: false,\n cause: {\n code: \"ZodError\",\n message: parsed.error.message,\n issues: parsed.error.issues,\n },\n }),\n );\n};\n","/**\n * Tenant prefix wrapper — rewrites every key/prefix so one bucket\n * can hold many tenants without the rest of the library knowing.\n *\n * Metadata stores the tenant-relative key (usually the node UUID).\n * The wrapper prepends `t/{tenantId}/` on the way in and strips it\n * on the way out.\n */\nimport { ok, type Result } from \"@/types/result\";\nimport type { FileSystemError } from \"@/errors\";\nimport { asS3Key, asPrefix, type S3Key, type Prefix } from \"@/types/branded\";\nimport type { S3CompatibleAdapter } from \"./adapter\";\n\nexport const tenantPrefix = (tenantId: string): string => `t/${tenantId}/`;\n\nexport const prefixAdapter = (\n adapter: S3CompatibleAdapter,\n prefix: string,\n): S3CompatibleAdapter => {\n const strip = (key: string): string =>\n key.startsWith(prefix) ? key.slice(prefix.length) : key;\n const pk = (key: string): S3Key => asS3Key(`${prefix}${strip(key)}`);\n const pp = (p?: Prefix): Prefix => asPrefix(`${prefix}${p ?? \"\"}`);\n\n return {\n list: async (input) => {\n const r = await adapter.list({ ...input, prefix: pp(input.prefix) });\n if (!r.ok) return r;\n return ok({\n ...r.value,\n items: r.value.items.map((item) => ({\n ...item,\n key: asS3Key(strip(item.key)),\n })),\n prefixes: r.value.prefixes.map((p) => asPrefix(strip(p))),\n });\n },\n read: (input) => adapter.read({ ...input, key: pk(input.key) }),\n write: (input) => adapter.write({ ...input, key: pk(input.key) }),\n delete: (input) => adapter.delete({ ...input, key: pk(input.key) }),\n move: (input) =>\n adapter.move({\n sourceKey: pk(input.sourceKey),\n destinationKey: pk(input.destinationKey),\n }),\n copy: (input) =>\n adapter.copy({\n sourceKey: pk(input.sourceKey),\n destinationKey: pk(input.destinationKey),\n }),\n stat: async (input) => {\n const r = await adapter.stat({ key: pk(input.key) });\n if (!r.ok) return r;\n return ok({ ...r.value, key: asS3Key(strip(r.value.key)) });\n },\n exists: (input) => adapter.exists({ key: pk(input.key) }),\n getMetadata: (input) => adapter.getMetadata({ key: pk(input.key) }),\n setMetadata: (input) =>\n adapter.setMetadata({ ...input, key: pk(input.key) }),\n createPresignedUploadUrl: (input) =>\n adapter.createPresignedUploadUrl({ ...input, key: pk(input.key) }),\n createPresignedDownloadUrl: (input) =>\n adapter.createPresignedDownloadUrl({ ...input, key: pk(input.key) }),\n getPublicUrl: (input) => adapter.getPublicUrl({ key: pk(input.key) }),\n createMultipartUpload: async (input) => {\n const r = await adapter.createMultipartUpload({\n ...input,\n key: pk(input.key),\n });\n if (!r.ok) return r;\n return ok({ ...r.value, key: asS3Key(strip(r.value.key)) });\n },\n uploadPart: (input) =>\n adapter.uploadPart({ ...input, key: pk(input.key) }),\n completeMultipartUpload: (input) =>\n adapter.completeMultipartUpload({ ...input, key: pk(input.key) }),\n abortMultipartUpload: (input) =>\n adapter.abortMultipartUpload({ ...input, key: pk(input.key) }),\n };\n};\n\nexport type { Result, FileSystemError };\n","/**\n * `createFileSystem(config, options?)` — the only place that decides\n * which concrete adapter to instantiate and how tenant scoping works.\n */\nimport { createS3Adapter, createS3Client } from \"./s3-adapter\";\nimport { createMemoryAdapter } from \"./memory-adapter\";\nimport { parseFileSystemConfig, type FileSystemConfig } from \"./config\";\nimport type { FileSystem, CreateFileSystemOptions } from \"./filesystem\";\nimport { prefixAdapter, tenantPrefix } from \"./prefix-adapter\";\n\nconst MEMORY_CONFIG: FileSystemConfig = {\n provider: \"s3\",\n bucket: \"in-memory\",\n region: \"us-east-1\",\n credentials: {\n accessKeyId: \"in-memory\",\n secretAccessKey: \"in-memory\",\n },\n forcePathStyle: false,\n};\n\nconst assemble = (\n adapter: FileSystem[\"adapter\"],\n config: FileSystemConfig,\n options: CreateFileSystemOptions | undefined,\n): FileSystem => {\n const prefixKeys = options?.prefixTenantKeys !== false;\n const forTenant = (tenantId: string): FileSystem => ({\n adapter: prefixKeys ? prefixAdapter(adapter, tenantPrefix(tenantId)) : adapter,\n config,\n metadata: options?.store,\n tenantId,\n quotaBytes: options?.quotaBytes,\n maxBytes: options?.maxBytes,\n forTenant,\n });\n\n return {\n adapter,\n config,\n metadata: options?.store,\n quotaBytes: options?.quotaBytes,\n maxBytes: options?.maxBytes,\n forTenant,\n };\n};\n\nexport const createFileSystem = (\n config: FileSystemConfig,\n options?: CreateFileSystemOptions,\n): FileSystem => {\n const parsed = parseFileSystemConfig(config);\n if (!parsed.ok) {\n throw parsed.error;\n }\n const client = createS3Client(parsed.value);\n const adapter = createS3Adapter(client, parsed.value);\n return assemble(adapter, parsed.value, options);\n};\n\nexport const createMemoryFileSystem = (\n options?: CreateFileSystemOptions,\n): FileSystem => assemble(createMemoryAdapter(), MEMORY_CONFIG, options);\n","/**\n * withAuth — opt-in request wrapper. Resolves the caller; 401 if null.\n * Server actions use getAuth() instead (no Request in the RSC path).\n */\nimport type { TenantId, UserId } from \"@/types/branded\";\n\nexport interface AuthContext {\n readonly tenantId: TenantId;\n readonly userId: UserId;\n}\n\nexport const withAuth = <C extends AuthContext, R = Response>(\n resolve: (req: Request) => Promise<C | null>,\n handler: (ctx: C, req: Request) => Promise<R>,\n): ((req: Request) => Promise<R | Response>) => {\n return async (req: Request): Promise<R | Response> => {\n const ctx = await resolve(req);\n if (ctx === null) {\n return Response.json(\n {\n ok: false,\n error: { code: \"Unauthorized\", message: \"Not authenticated\" },\n },\n { status: 401 },\n );\n }\n return handler(ctx, req);\n };\n};\n","/**\n * `getFileSystem()` — the env-driven singleton that returns a\n * memoized `FileSystem` for the lifetime of the Node process.\n *\n * Usage:\n * - Server-side code (route handlers, server actions) imports\n * `getFileSystem` and calls it; the first call reads\n * `FILE_NEXT_*` env vars, parses them, and caches the result.\n * - Subsequent calls return the same instance — no per-request\n * re-parsing, no accidental config drift.\n *\n * Env vars (all `FILE_NEXT_` prefixed):\n * - FILE_NEXT_PROVIDER (required, \"s3\" | \"r2\")\n * - FILE_NEXT_BUCKET (required)\n * - FILE_NEXT_REGION (required for s3)\n * - FILE_NEXT_ENDPOINT (required for r2)\n * - FILE_NEXT_ACCESS_KEY_ID (required)\n * - FILE_NEXT_SECRET_ACCESS_KEY (required)\n * - FILE_NEXT_FORCE_PATH_STYLE (optional, default \"false\")\n *\n * Failure mode: a missing or malformed env throws\n * `FileSystemError(InternalError, retryable: false)` with the\n * original Zod issues on `cause`. This is a startup-time failure\n * (the process cannot function without a storage backend), so\n * throwing is the right contract — the caller (server bootstrap)\n * fails the process and the operator sees the issue in the logs.\n *\n * Test escape hatch: `_resetFileSystemForTests` clears the\n * memoized instance. The naming is intentionally ugly so a casual\n * reader can tell it should never be called from production code.\n */\nimport { createFileSystem } from \"./factory\";\nimport { parseFileSystemConfig, type FileSystemConfig } from \"./config\";\nimport { FileSystemError } from \"@/errors\";\nimport type { FileSystem } from \"./filesystem\";\n\n/** Cached FileSystem instance (null until first call). */\nlet cached: FileSystem | null = null;\n\n/**\n * Read `FILE_NEXT_*` env vars and return a typed `FileSystemConfig`\n * object. Throws `FileSystemError(InternalError)` on missing or\n * malformed env, with the original Zod issues on `cause`.\n */\nconst readConfigFromEnv = (): FileSystemConfig => {\n const provider = process.env.FILE_NEXT_PROVIDER;\n const bucket = process.env.FILE_NEXT_BUCKET;\n const region = process.env.FILE_NEXT_REGION;\n const endpoint = process.env.FILE_NEXT_ENDPOINT;\n const accessKeyId = process.env.FILE_NEXT_ACCESS_KEY_ID;\n const secretAccessKey = process.env.FILE_NEXT_SECRET_ACCESS_KEY;\n const forcePathStyleRaw = process.env.FILE_NEXT_FORCE_PATH_STYLE;\n\n // Build a draft object that the Zod schema can validate. Provider-\n // specific required fields (region for s3, endpoint for r2) are\n // surfaced as parse errors if missing, so we don't need to branch\n // here.\n const draft: Record<string, unknown> = {\n provider,\n bucket,\n region,\n endpoint,\n credentials:\n accessKeyId !== undefined && secretAccessKey !== undefined\n ? { accessKeyId, secretAccessKey }\n : undefined,\n };\n // R2 always uses path-style addressing (the Zod schema enforces\n // `forcePathStyle: literal(true)` for the r2 branch), so seed it\n // unconditionally. S3 honors the env var; default false.\n if (provider === \"r2\") {\n draft.forcePathStyle = true;\n } else if (forcePathStyleRaw !== undefined) {\n draft.forcePathStyle = forcePathStyleRaw === \"true\";\n }\n\n const parsed = parseFileSystemConfig(draft);\n if (!parsed.ok) {\n // Wrap the Zod error in a \"not configured\" InternalError so the\n // message reads as a startup failure, not a malformed-shape\n // failure. The original issues stay on `cause` for debugging.\n throw new FileSystemError({\n code: \"InternalError\",\n message: \"file-next storage is not configured: missing or invalid FILE_NEXT_* env vars\",\n retryable: false,\n cause: parsed.error.cause,\n });\n }\n return parsed.value;\n};\n\n/**\n * Return the memoized `FileSystem` for the current process, building\n * it from `FILE_NEXT_*` env vars on first call.\n */\nexport const getFileSystem = (): FileSystem => {\n if (cached !== null) return cached;\n const config = readConfigFromEnv();\n cached = createFileSystem(config);\n return cached;\n};\n\n/**\n * Test-only helper: clear the memoized `FileSystem` so the next\n * `getFileSystem()` call re-reads env vars. Production code MUST\n * NOT call this — the leading underscore is the contract.\n */\nexport const _resetFileSystemForTests = (): void => {\n cached = null;\n};\n","/**\n * Display-name rules for files and folders.\n *\n * Metadata `path` is `parentPath + \"/\" + name`. A raw `/` in `name`\n * would split the tree. S3 keys are UUIDs, so the bucket is unaffected;\n * the store still has to keep names as a single path segment.\n *\n * 255 matches the common POSIX/Windows filename cap.\n */\nimport { err, ok, type Result } from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\n\nexport const NODE_NAME_MAX_LENGTH = 255;\n\nexport function normalizeNodeName(\n raw: string,\n): Result<string, FileSystemError> {\n let name = raw.replace(/[\\u0000-\\u001F]/g, \"\").replace(/[/\\\\]/g, \"-\").trim();\n if (name === \"\" || name === \".\" || name === \"..\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Invalid node name\",\n retryable: false,\n }),\n );\n }\n if (name.length > NODE_NAME_MAX_LENGTH) {\n name = truncateNodeName(name, NODE_NAME_MAX_LENGTH);\n }\n return ok(name);\n}\n\nfunction truncateNodeName(name: string, max: number): string {\n const dot = name.lastIndexOf(\".\");\n const ext =\n dot > 0 && /^[a-zA-Z0-9]{1,8}$/.test(name.slice(dot + 1))\n ? name.slice(dot)\n : \"\";\n const stemMax = max - ext.length;\n if (stemMax < 1) return name.slice(0, max);\n return name.slice(0, stemMax) + ext;\n}\n\nexport function numberedDuplicateName(original: string, n: number): string {\n if (n <= 0) return original;\n const dot = original.lastIndexOf(\".\");\n const ext =\n dot > 0 && /^[a-zA-Z0-9]{1,8}$/.test(original.slice(dot + 1))\n ? original.slice(dot)\n : \"\";\n const stem = ext ? original.slice(0, -ext.length) : original;\n const suffix = ` (${n})`;\n const stemMax = NODE_NAME_MAX_LENGTH - suffix.length - ext.length;\n return (stemMax > 0 ? stem.slice(0, stemMax) : \"\") + suffix + ext;\n}\n","/**\n * Opaque keyset cursor for listChildren / search / trash.\n * Shape: base64url({ n: name, i: id }).\n */\nexport interface NameCursor {\n readonly n: string;\n readonly i: string;\n}\n\nexport const encodeCursor = (cursor: NameCursor): string =>\n Buffer.from(JSON.stringify(cursor), \"utf8\").toString(\"base64url\");\n\nexport const decodeCursor = (raw: string | undefined): NameCursor | null => {\n if (!raw) return null;\n try {\n const value = JSON.parse(\n Buffer.from(raw, \"base64url\").toString(\"utf8\"),\n ) as Partial<NameCursor>;\n if (typeof value.n === \"string\" && typeof value.i === \"string\") {\n return { n: value.n, i: value.i };\n }\n return null;\n } catch {\n return null;\n }\n};\n\nexport const pageCursor = <T extends { name: string; id: string }>(\n items: ReadonlyArray<T>,\n limit: number,\n): string | undefined => {\n if (items.length < limit || items.length === 0) return undefined;\n const last = items[items.length - 1];\n if (!last) return undefined;\n return encodeCursor({ n: last.name, i: last.id });\n};\n","/**\n * `createMemoryStore` — a Map-backed in-memory MetadataStore.\n *\n * Intended for:\n * - Unit tests of code that depends on a MetadataStore (no DB\n * setup needed).\n * - Single-process Next.js apps where the consumer is fine\n * losing the file tree on restart (rare; SQLite is usually\n * a better fit).\n * - Demos and quickstarts.\n *\n * NOT for production multi-process deployments: state lives in\n * the Node.js heap and is not shared across instances.\n *\n * Tenant isolation: enforced in app code. Every method filters\n * by `tenantId` before reading or writing; cross-tenant reads\n * return ok(null) (not an error, per the interface contract).\n *\n * The 9-method contract is fully implemented including:\n * - createNode (with name-uniqueness check within a parent)\n * - getNode (returns null for not-found)\n * - listChildren (paginated, sorted by name)\n * - moveNode (cascades path updates to descendants)\n * - deleteNode (soft-delete, recursive for folders)\n * - updateMetadata (merge or replace)\n * - search (case-insensitive name CONTAINS — v0.2 stays naive:\n * in-process Map doesn't need an FTS index. The SQLite\n * adapter uses FTS5 + sanitization and the Postgres\n * adapter uses pg_trgm + ILIKE; the memory store's\n * substring match is the cheapest correct answer for\n * the use case. Don't \"optimize\" this without thinking\n * about the contract test that pins the behavior.)\n * - getPath (walk up via parentId)\n * - reconcile (no-op: no external source to compare against)\n */\nimport {\n err,\n ok,\n type Result,\n} from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\nimport { asTenantId, asUserId } from \"@/types/branded\";\nimport type { S3Key, TenantId } from \"@/types/branded\";\nimport { decodeCursor, pageCursor } from \"./cursor\";\nimport { normalizeNodeName } from \"./node-name\";\nimport type {\n CreateNodeInput,\n DeleteNodeInput,\n FileNode,\n GetNodeInput,\n GetPathInput,\n ListChildrenInput,\n ListChildrenOutput,\n MetadataStore,\n MoveNodeInput,\n ReconcileResult,\n SearchInput,\n UpdateMetadataInput,\n} from \"./store\";\n\ninterface PendingOrphan {\n readonly id: string;\n readonly tenantId: TenantId;\n readonly s3Key: S3Key;\n readonly metadataId: string | null;\n readonly reason: string;\n readonly createdAt: Date;\n}\n\nexport const createMemoryStore = (): MetadataStore => {\n const nodes = new Map<string, FileNode>();\n const pendingOrphans = new Map<string, PendingOrphan>();\n const shares = new Map<\n string,\n { tenantId: TenantId; nodeId: string; expiresAt: Date | null }\n >();\n // Index: tenantId + parentId -> ordered child ids. Rebuilt on\n // createNode / moveNode / deleteNode. Keeps listChildren O(k)\n // for the k children of a folder, not O(n) over the whole store.\n const children = new Map<string, Set<string>>();\n\n const tenantKey = (tenantId: string, parentId: string | null): string =>\n `${tenantId}::${parentId ?? \"<root>\"}`;\n\n const makeId = (): string => {\n // crypto.randomUUID is available in Node.js 19+ and modern browsers.\n // Fall back to a Math.random-based id for older runtimes.\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `mem-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n };\n\n const addToChildrenIndex = (node: FileNode): void => {\n const key = tenantKey(node.tenantId, node.parentId);\n let set = children.get(key);\n if (!set) {\n set = new Set();\n children.set(key, set);\n }\n set.add(node.id);\n };\n\n const removeFromChildrenIndex = (node: FileNode): void => {\n const key = tenantKey(node.tenantId, node.parentId);\n children.get(key)?.delete(node.id);\n };\n\n const computePath = (\n tenantId: string,\n parentId: string | null,\n name: string,\n ): string => {\n if (parentId === null) return `/${name}`;\n const parent = nodes.get(parentId);\n if (!parent || parent.tenantId !== tenantId) {\n // Defensive: the caller should have validated the parent\n // exists. A bad call returns the leaf path so the consumer\n // sees something rather than a hard error here.\n return `/${name}`;\n }\n return `${parent.path === \"/\" ? \"\" : parent.path}/${name}`;\n };\n\n const ensureNameAvailable = (\n tenantId: string,\n parentId: string | null,\n name: string,\n ): Result<void, FileSystemError> => {\n const set = children.get(tenantKey(tenantId, parentId));\n if (!set) return ok(undefined);\n for (const id of set) {\n const n = nodes.get(id);\n if (n && n.name === name && n.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n }\n return ok(undefined);\n };\n\n return {\n async createNode(input: CreateNodeInput): Promise<Result<FileNode, FileSystemError>> {\n const normalized = normalizeNodeName(input.name);\n if (!normalized.ok) return normalized;\n const name = normalized.value;\n const nameOk = ensureNameAvailable(input.tenantId, input.parentId, name);\n if (!nameOk.ok) return nameOk;\n\n const id = input.id ?? makeId();\n if (nodes.has(id)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Node ${id} already exists`,\n retryable: false,\n }),\n );\n }\n const now = new Date();\n const path = computePath(input.tenantId, input.parentId, name);\n const node: FileNode = {\n id,\n tenantId: input.tenantId,\n parentId: input.parentId,\n name,\n path,\n kind: input.kind,\n size: input.kind === \"folder\" ? 0 : input.size,\n mimeType: input.kind === \"folder\" ? \"\" : input.mimeType,\n s3Key: input.kind === \"folder\" ? \"\" : input.s3Key,\n ownerId: input.ownerId,\n metadata: input.metadata ?? {},\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n };\n nodes.set(id, node);\n addToChildrenIndex(node);\n return ok(node);\n },\n\n async getNode(input: GetNodeInput): Promise<Result<FileNode | null, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n) return ok(null);\n if (n.tenantId !== input.tenantId) return ok(null);\n if (n.deletedAt !== null) return ok(null);\n return ok(n);\n },\n\n async listChildren(input: ListChildrenInput): Promise<Result<ListChildrenOutput, FileSystemError>> {\n const set = children.get(tenantKey(input.tenantId, input.parentId));\n if (!set) return ok({ items: [] });\n const items: FileNode[] = [];\n for (const id of set) {\n const n = nodes.get(id);\n if (n && n.deletedAt === null) {\n items.push(n);\n }\n }\n items.sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));\n const cursor = decodeCursor(input.cursor);\n const after = cursor\n ? items.filter(\n (n) =>\n n.name.localeCompare(cursor.n) > 0 ||\n (n.name === cursor.n && n.id.localeCompare(cursor.i) > 0),\n )\n : items;\n const limit = input.limit ?? after.length;\n const page = after.slice(0, limit);\n return ok({\n items: page,\n nextCursor: pageCursor(page, limit),\n });\n },\n\n async moveNode(input: MoveNodeInput): Promise<Result<FileNode, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const normalized = normalizeNodeName(input.newName ?? n.name);\n if (!normalized.ok) return normalized;\n const newName = normalized.value;\n\n // Cycle check: the new parent must not be a descendant of n.\n let cursor: string | null = input.newParentId;\n while (cursor !== null) {\n if (cursor === n.id) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into its own descendant\",\n retryable: false,\n }),\n );\n }\n const p = nodes.get(cursor);\n cursor = p ? p.parentId : null;\n }\n\n // Name uniqueness in the new parent (excluding self).\n const set = children.get(tenantKey(input.tenantId, input.newParentId));\n if (set) {\n for (const id of set) {\n if (id === n.id) continue;\n const sibling = nodes.get(id);\n if (sibling && sibling.name === newName && sibling.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${newName}' already exists in the destination folder`,\n retryable: false,\n }),\n );\n }\n }\n }\n\n // Update: remove from old parent's index, add to new parent's index.\n removeFromChildrenIndex(n);\n const newPath = computePath(input.tenantId, input.newParentId, newName);\n const updated: FileNode = {\n ...n,\n parentId: input.newParentId,\n name: newName,\n path: newPath,\n updatedAt: new Date(),\n };\n nodes.set(updated.id, updated);\n addToChildrenIndex(updated);\n\n // Cascade path updates to descendants.\n const cascade = (parent: FileNode): void => {\n const childSet = children.get(tenantKey(parent.tenantId, parent.id));\n if (!childSet) return;\n for (const childId of childSet) {\n const child = nodes.get(childId);\n if (!child || child.deletedAt !== null) continue;\n const childPath = `${parent.path === \"/\" ? \"\" : parent.path}/${child.name}`;\n const cascaded: FileNode = { ...child, path: childPath, updatedAt: new Date() };\n nodes.set(childId, cascaded);\n cascade(cascaded);\n }\n };\n cascade(updated);\n\n return ok(updated);\n },\n\n async deleteNode(input: DeleteNodeInput): Promise<Result<void, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n\n // Collect the subtree to tombstone.\n const toDelete: string[] = [n.id];\n const walk = (id: string): void => {\n const childSet = children.get(tenantKey(input.tenantId, id));\n if (!childSet) return;\n for (const childId of childSet) {\n toDelete.push(childId);\n walk(childId);\n }\n };\n if (input.recursive || n.kind === \"file\") {\n walk(n.id);\n } else {\n // Non-recursive on a non-empty folder: check if it has\n // live children, and if so, return Conflict.\n const childSet = children.get(tenantKey(input.tenantId, n.id));\n let hasLiveChild = false;\n if (childSet) {\n for (const childId of childSet) {\n const child = nodes.get(childId);\n if (child && child.deletedAt === null) {\n hasLiveChild = true;\n break;\n }\n }\n }\n if (hasLiveChild) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Folder '${n.name}' is not empty; pass recursive: true to delete the subtree`,\n retryable: false,\n }),\n );\n }\n // No live children: fall through and just tombstone the\n // folder itself (the recursive walk is a no-op anyway).\n }\n\n const now = new Date();\n for (const id of toDelete) {\n const target = nodes.get(id);\n if (!target) continue;\n nodes.set(id, { ...target, deletedAt: now, updatedAt: now });\n }\n return ok(undefined);\n },\n\n async purgeNode(input) {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Trashed node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const prefix = `${n.path}/`;\n const s3Keys: string[] = [];\n const ids: string[] = [];\n for (const node of nodes.values()) {\n if (node.tenantId !== input.tenantId || node.deletedAt === null) continue;\n if (node.id !== n.id && !node.path.startsWith(prefix)) continue;\n ids.push(node.id);\n if (node.kind === \"file\" && node.s3Key) s3Keys.push(node.s3Key);\n }\n for (const id of ids) {\n const node = nodes.get(id);\n if (node) removeFromChildrenIndex(node);\n nodes.delete(id);\n }\n for (const [token, share] of shares) {\n if (ids.includes(share.nodeId)) shares.delete(token);\n }\n return ok({ s3Keys });\n },\n\n async updateMetadata(input: UpdateMetadataInput): Promise<Result<FileNode, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const metadata = input.replace\n ? { ...input.metadata }\n : { ...n.metadata, ...input.metadata };\n const updated: FileNode = { ...n, metadata, updatedAt: new Date() };\n nodes.set(n.id, updated);\n return ok(updated);\n },\n\n async search(input: SearchInput): Promise<Result<ListChildrenOutput, FileSystemError>> {\n // Empty query → no results (v0.2 contract). Without this,\n // `String.includes(\"\")` would match every node.\n if (input.query.length === 0) {\n return ok({ items: [], nextCursor: undefined });\n }\n\n const query = input.query.toLowerCase();\n\n // Determine the scope: the parent folder's subtree, or the\n // whole tenant tree if parentId is omitted.\n const collect = (parentId: string | null, out: FileNode[]): void => {\n const set = children.get(tenantKey(input.tenantId, parentId));\n if (!set) return;\n for (const id of set) {\n const n = nodes.get(id);\n if (!n || n.deletedAt !== null) continue;\n if (n.name.toLowerCase().includes(query)) out.push(n);\n if (n.kind === \"folder\") collect(n.id, out);\n }\n };\n const matches: FileNode[] = [];\n collect(input.parentId ?? null, matches);\n // Stable sort by name for deterministic test output.\n matches.sort((a, b) => a.name.localeCompare(b.name));\n\n const limit = input.limit ?? matches.length;\n return ok({\n items: matches.slice(0, limit),\n nextCursor: matches.length > limit ? matches[limit]?.id : undefined,\n });\n },\n\n async getPath(input: GetPathInput): Promise<Result<{ segments: FileNode[] }, FileSystemError>> {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n // Walk up to root.\n const segments: FileNode[] = [];\n let cursor: FileNode | undefined = n;\n while (cursor) {\n segments.unshift(cursor);\n if (cursor.parentId === null) break;\n cursor = nodes.get(cursor.parentId);\n }\n return ok({ segments });\n },\n\n async enqueueOrphan(input): Promise<Result<{ id: string }, FileSystemError>> {\n const id = makeId();\n pendingOrphans.set(id, {\n id,\n tenantId: input.tenantId,\n s3Key: input.s3Key,\n metadataId: input.metadataId ?? null,\n reason: input.reason,\n createdAt: new Date(),\n });\n return ok({ id });\n },\n\n async listPendingOrphans(input): Promise<Result<PendingOrphan[], FileSystemError>> {\n return ok(\n [...pendingOrphans.values()].filter(\n (orphan) => orphan.tenantId === input.tenantId,\n ),\n );\n },\n\n async deleteOrphan(input): Promise<Result<void, FileSystemError>> {\n const orphan = pendingOrphans.get(input.id);\n if (!orphan || orphan.tenantId !== input.tenantId) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Orphan ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n pendingOrphans.delete(input.id);\n return ok(undefined);\n },\n\n async reconcile(): Promise<Result<ReconcileResult, FileSystemError>> {\n return ok({ orphansInStore: [], orphansInS3: [], scanned: nodes.size });\n },\n\n async restoreNode(input) {\n const n = nodes.get(input.id);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt === null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Deleted node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const available = ensureNameAvailable(n.tenantId, n.parentId, n.name);\n if (!available.ok) return available;\n const restored: FileNode = { ...n, deletedAt: null, updatedAt: new Date() };\n nodes.set(n.id, restored);\n return ok(restored);\n },\n\n async listTrash(input) {\n const items = [...nodes.values()]\n .filter((n) => n.tenantId === input.tenantId && n.deletedAt !== null)\n .sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));\n const cursor = decodeCursor(input.cursor);\n const after = cursor\n ? items.filter(\n (n) =>\n n.name.localeCompare(cursor.n) > 0 ||\n (n.name === cursor.n && n.id.localeCompare(cursor.i) > 0),\n )\n : items;\n const limit = input.limit ?? after.length;\n const page = after.slice(0, limit);\n return ok({ items: page, nextCursor: pageCursor(page, limit) });\n },\n\n async scanFileKeys(input) {\n return ok(\n [...nodes.values()]\n .filter(\n (n) =>\n n.tenantId === input.tenantId &&\n n.deletedAt === null &&\n n.kind === \"file\" &&\n n.s3Key !== \"\",\n )\n .map((n) => ({ id: n.id, s3Key: n.s3Key })),\n );\n },\n\n async sumSize(input) {\n let total = 0;\n for (const n of nodes.values()) {\n if (n.tenantId === input.tenantId && n.deletedAt === null && n.kind === \"file\") {\n total += n.size;\n }\n }\n return ok(total);\n },\n\n async findByS3Key(input) {\n for (const n of nodes.values()) {\n if (\n n.tenantId === input.tenantId &&\n n.s3Key === input.s3Key &&\n n.deletedAt === null\n ) {\n return ok(n);\n }\n }\n return ok(null);\n },\n\n async createShare(input) {\n const n = nodes.get(input.nodeId);\n if (!n || n.tenantId !== input.tenantId || n.deletedAt !== null) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${input.nodeId} not found`,\n retryable: false,\n }),\n );\n }\n const token = makeId();\n shares.set(token, {\n tenantId: input.tenantId,\n nodeId: input.nodeId,\n expiresAt: input.expiresAt ?? null,\n });\n return ok({ token });\n },\n\n async resolveShare(input) {\n const share = shares.get(input.token);\n if (!share) return ok(null);\n if (share.expiresAt && share.expiresAt.getTime() < Date.now()) return ok(null);\n const n = nodes.get(share.nodeId);\n if (!n || n.deletedAt !== null) return ok(null);\n return ok(n);\n },\n\n async revokeShare(input) {\n const share = shares.get(input.token);\n if (!share || share.tenantId !== input.tenantId) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Share ${input.token} not found`,\n retryable: false,\n }),\n );\n }\n shares.delete(input.token);\n return ok(undefined);\n },\n };\n};\n\n// Re-export the types and helpers that consumers may want to use\n// when constructing inputs to the memory store.\nexport { asTenantId, asUserId };\n","/**\n * Query sanitizers for the SQL `MetadataStore.search()` adapters.\n *\n * FTS5 (SQLite MATCH) and SQL LIKE (Postgres `ILIKE`) both treat\n * user input as syntax. Without sanitization, a query like\n *\n * `name:foo` → FTS5 column-filter (literal `name` column only)\n * `foo AND bar` → FTS5 boolean AND\n * `(foo OR bar)` → FTS5 grouping\n * `*foo*` → FTS5 wildcard\n * `100%` → LIKE wildcard\n * `under_score` → LIKE single-char wildcard\n *\n * Either crashes the query (FTS5 syntax error) or returns wrong\n * rows (LIKE wildcard bypass). Each sanitizer is one-way: we wrap\n * user input in the syntax that makes it literal, never the other\n * way around.\n *\n * The FTS5 strategy is phrase-wrapping: put the query inside a\n * double-quoted phrase so every special character (including\n * reserved keywords) is treated as part of the literal string.\n * Embedded `\"` are doubled per FTS5 phrase-escape rules.\n *\n * The LIKE strategy is character-escaping: backslash-escape `%`,\n * `_`, and `\\` so they match literally under `ESCAPE '\\'`.\n */\n\n// ---------------------------------------------------------------------------\n// FTS5 (SQLite MATCH)\n// ---------------------------------------------------------------------------\n\n/**\n * Wrap a user query as an FTS5 phrase so every metacharacter and\n * reserved keyword (`\"`, `*`, `(`, `)`, `:`, `AND`, `OR`, `NOT`,\n * `NEAR`) is treated as literal text. Embedded `\"` are doubled\n * per FTS5 phrase-escape syntax. Empty input becomes an empty\n * phrase (`\"\"`) which is valid MATCH syntax and matches nothing.\n */\nexport function sanitizeFts5Query(query: string): string {\n return `\"${query.replace(/\"/g, `\"\"`)}\"`;\n}\n\n// ---------------------------------------------------------------------------\n// SQL LIKE (Postgres ILIKE)\n// ---------------------------------------------------------------------------\n\n/**\n * Escape `%`, `_`, and `\\` in a user query so it matches literally\n * inside a `LIKE` pattern that uses `ESCAPE '\\'`. Order matters:\n * the backslash must be escaped first so we don't double-escape\n * the escapes we add for `%` and `_`.\n */\nexport function sanitizeLikePattern(query: string): string {\n return query\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/%/g, \"\\\\%\")\n .replace(/_/g, \"\\\\_\");\n}\n","/**\n * `createSqliteStore` — a SQLite-backed `MetadataStore`.\n *\n * Built on `better-sqlite3` (sync native binding). Every public\n * method returns a Promise to satisfy the `MetadataStore`\n * interface, but the actual SQL work is synchronous — there is\n * no I/O between calls.\n *\n * Schema (one table):\n *\n * nodes(\n * id TEXT PRIMARY KEY, -- UUID v4\n * tenant_id TEXT NOT NULL,\n * parent_id TEXT NOT NULL DEFAULT '', -- '' = root (SQLite treats NULL\n * -- as distinct in unique indexes,\n * -- so we use '' to enforce\n * -- uniqueness at root level)\n * name TEXT NOT NULL,\n * path TEXT NOT NULL, -- materialized \"/a/b/c\"\n * kind TEXT NOT NULL CHECK (kind IN ('file','folder')),\n * size INTEGER NOT NULL DEFAULT 0,\n * mime_type TEXT NOT NULL DEFAULT '',\n * s3_key TEXT NOT NULL DEFAULT '',\n * owner_id TEXT NOT NULL,\n * metadata TEXT NOT NULL DEFAULT '{}', -- JSON\n * created_at TEXT NOT NULL, -- ISO 8601\n * updated_at TEXT NOT NULL,\n * deleted_at TEXT -- ISO 8601 or NULL\n * )\n *\n * Partial unique index on (tenant_id, parent_id, name)\n * WHERE deleted_at IS NULL → name uniqueness only for live\n * rows. Soft-deleted rows free the name.\n *\n * Indexes for hot paths:\n * nodes_path_prefix → LIKE 'path/%' for moveNode cascade\n * nodes_tenant_root → list root children\n * nodes_tenant_parent → list children of any folder\n * nodes_name_nocase → search by name COLLATE NOCASE\n *\n * Full-text search:\n * nodes_fts FTS5 virtual table mirroring nodes.name\n * (tokenizer: unicode61 remove_diacritics 2\n * — ASCII case folding + diacritic strip).\n * Kept in sync with `nodes` via triggers\n * (insert / update / delete). Tombstoned\n * rows (deleted_at NOT NULL) are excluded\n * from the FTS index so search results\n * never include deleted nodes.\n *\n * Tenant isolation is enforced in app code (filter by tenant_id\n * in every query). Same posture as the memory store.\n *\n * The `reconcile()` method is a no-op — the real reconcile that\n * walks the S3 bucket needs the adapter injected, which would\n * change the MetadataStore interface. Tracked for v0.3.\n */\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Database as BetterSqliteDatabase } from \"better-sqlite3\";\n\n/**\n * The native `better-sqlite3` binding is loaded lazily. A top-level\n * `import Database from \"better-sqlite3\"` pulls the native module\n * into every consumer's dependency graph, and bundlers like Next.js\n * webpack/turbopack walk the native require chain at build time and\n * fail with \"Can't resolve 'fs'\" — even when createSqliteStore is\n * never called. Loading inside `buildInner` (the real factory body)\n * keeps the native binding out of the consumer's bundle until\n * createSqliteStore is actually invoked.\n *\n * We use `createRequire(import.meta.url)` to make webpack/turbopack\n * emit a runtime `require()` call. Vitest resolves the require at\n * runtime too (no static analysis).\n */\ntype BetterSqlite3Module = typeof import(\"better-sqlite3\");\ntype DatabaseCtor = new (path: string) => BetterSqliteDatabase;\nconst extractDatabase = (mod: BetterSqlite3Module): DatabaseCtor => {\n const m = mod as unknown as { default?: DatabaseCtor };\n return (m.default ?? (mod as unknown as DatabaseCtor));\n};\nimport {\n err,\n ok,\n type Result,\n} from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\nimport { asS3Key, asTenantId, asUserId } from \"@/types/branded\";\nimport type { TenantId } from \"@/types/branded\";\nimport { sanitizeFts5Query } from \"./sanitize\";\nimport { normalizeNodeName } from \"./node-name\";\nimport { decodeCursor, pageCursor } from \"./cursor\";\nimport type {\n CreateNodeInput,\n DeleteNodeInput,\n FileNode,\n GetNodeInput,\n GetPathInput,\n ListChildrenInput,\n ListChildrenOutput,\n MetadataStore,\n MoveNodeInput,\n ReconcileResult,\n SearchInput,\n UpdateMetadataInput,\n} from \"./store\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface SqliteStoreOptions {\n /**\n * SQLite file path, or \":memory:\" for a private in-memory\n * database. Use \":memory:\" in tests; a real path in apps so\n * the file tree survives restarts.\n */\n readonly path: string;\n /**\n * Run schema migrations on construction. Default: true.\n * Set false when sharing a DB across multiple stores (each\n * instance would otherwise re-run the idempotent CREATE).\n */\n readonly runMigrations?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Row → FileNode\n// ---------------------------------------------------------------------------\n\ninterface NodeRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly parent_id: string | null;\n readonly name: string;\n readonly path: string;\n readonly kind: \"file\" | \"folder\";\n readonly size: number;\n readonly mime_type: string;\n readonly s3_key: string;\n readonly owner_id: string;\n readonly metadata: string;\n readonly created_at: string;\n readonly updated_at: string;\n readonly deleted_at: string | null;\n}\n\ninterface OrphanRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly s3_key: string;\n readonly metadata_id: string | null;\n readonly reason: string;\n readonly created_at: string;\n}\n\nconst rowToPendingOrphan = (row: OrphanRow) => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n s3Key: asS3Key(row.s3_key),\n metadataId: row.metadata_id,\n reason: row.reason,\n createdAt: new Date(row.created_at),\n});\n\nconst rowToFileNode = (row: NodeRow): FileNode => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n // SQLite stores '' for \"no parent\" (NULL doesn't work in\n // unique indexes — see the schema comment).\n parentId: row.parent_id === \"\" ? null : row.parent_id,\n name: row.name,\n path: row.path,\n kind: row.kind,\n size: row.size,\n mimeType: row.mime_type,\n s3Key: row.s3_key,\n ownerId: asUserId(row.owner_id),\n metadata: JSON.parse(row.metadata) as Record<string, string>,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n deletedAt: row.deleted_at === null ? null : new Date(row.deleted_at),\n});\n\n// ---------------------------------------------------------------------------\n// Migrations\n// ---------------------------------------------------------------------------\n\nconst SCHEMA_VERSION = 4;\n\nconst MIGRATION_SQL = `\nCREATE TABLE IF NOT EXISTS schema_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n parent_id TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK (kind IN ('file', 'folder')),\n size INTEGER NOT NULL DEFAULT 0,\n mime_type TEXT NOT NULL DEFAULT '',\n s3_key TEXT NOT NULL DEFAULT '',\n owner_id TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS pending_orphans (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n s3_key TEXT NOT NULL,\n metadata_id TEXT,\n reason TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS pending_orphans_tenant_created\n ON pending_orphans(tenant_id, created_at);\n\nCREATE TABLE IF NOT EXISTS shares (\n token TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n node_id TEXT NOT NULL,\n expires_at TEXT,\n created_at TEXT NOT NULL\n);\n\n-- Name uniqueness for LIVE rows only. NULL deleted_at lets two\n-- deleted rows share a name; a new live row then claims the slot.\nCREATE UNIQUE INDEX IF NOT EXISTS nodes_unique_live_name\n ON nodes(tenant_id, parent_id, name)\n WHERE deleted_at IS NULL;\n\nCREATE INDEX IF NOT EXISTS nodes_path_prefix\n ON nodes(path);\nCREATE INDEX IF NOT EXISTS nodes_tenant_parent\n ON nodes(tenant_id, parent_id);\nCREATE INDEX IF NOT EXISTS nodes_name_nocase\n ON nodes(name COLLATE NOCASE);\n\n-- FTS5 virtual table for search. content='nodes' + content_rowid='rowid'\n-- makes FTS5 read row metadata from the source table; triggers below\n-- are still responsible for keeping the FTS index in sync (FTS5 does\n-- NOT auto-track the content table when you mutate the source).\n--\n-- Tokenizer: unicode61 remove_diacritics 2\n-- - ASCII case folding (Hello → hello)\n-- - Latin script case folding\n-- - Diacritic stripping (café → cafe)\n-- This matches the \"case-insensitive matching\" contract.\nCREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(\n name,\n content='nodes',\n content_rowid='rowid',\n tokenize='unicode61 remove_diacritics 2'\n);\n\n-- Sync triggers. Tombstoned rows (deleted_at NOT NULL) are NOT in\n-- the FTS index — the UPDATE trigger re-inserts only when the new\n-- row is live. This means search() never has to filter on deleted_at\n-- (the index already excludes them), but we keep the filter as a\n-- safety net in case the triggers ever diverge.\nCREATE TRIGGER IF NOT EXISTS nodes_fts_ai AFTER INSERT ON nodes\nWHEN new.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(rowid, name) VALUES (new.rowid, new.name);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS nodes_fts_ad AFTER DELETE ON nodes\nWHEN old.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS nodes_fts_au AFTER UPDATE ON nodes BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\n INSERT INTO nodes_fts(rowid, name)\n SELECT new.rowid, new.name WHERE new.deleted_at IS NULL;\nEND;\n`;\n\nconst FTS_REBUILD_SQL = `\nDROP TRIGGER IF EXISTS nodes_fts_ai;\nDROP TRIGGER IF EXISTS nodes_fts_ad;\nDROP TRIGGER IF EXISTS nodes_fts_au;\nDROP TABLE IF EXISTS nodes_fts;\nCREATE VIRTUAL TABLE nodes_fts USING fts5(\n name,\n content='nodes',\n content_rowid='rowid',\n tokenize='unicode61 remove_diacritics 2'\n);\nCREATE TRIGGER nodes_fts_ai AFTER INSERT ON nodes\nWHEN new.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(rowid, name) VALUES (new.rowid, new.name);\nEND;\nCREATE TRIGGER nodes_fts_ad AFTER DELETE ON nodes\nWHEN old.deleted_at IS NULL BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\nEND;\nCREATE TRIGGER nodes_fts_au AFTER UPDATE ON nodes BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, name) VALUES('delete', old.rowid, old.name);\n INSERT INTO nodes_fts(rowid, name)\n SELECT new.rowid, new.name WHERE new.deleted_at IS NULL;\nEND;\nINSERT INTO nodes_fts(rowid, name) SELECT rowid, name FROM nodes WHERE deleted_at IS NULL;\n`;\n\nconst runMigrations = (db: BetterSqliteDatabase): void => {\n db.exec(MIGRATION_SQL);\n const row = db\n .prepare(\"SELECT value FROM schema_meta WHERE key = 'version'\")\n .get() as { value: string } | undefined;\n const version = row ? Number(row.value) : 0;\n if (!Number.isFinite(version) || version < 4) {\n db.exec(FTS_REBUILD_SQL);\n }\n db.prepare(\n \"INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('version', ?)\",\n ).run(String(SCHEMA_VERSION));\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nconst loadBetterSqlite = (): BetterSqlite3Module => {\n const origins = [import.meta.url, pathToFileURL(join(process.cwd(), \"package.json\")).href];\n const errors: string[] = [];\n for (const origin of origins) {\n try {\n return createRequire(origin)(\"better-sqlite3\") as BetterSqlite3Module;\n } catch (error) {\n errors.push(`${origin}: ${(error as Error).message}`);\n }\n }\n throw new FileSystemError({\n code: \"InternalError\",\n message: `better-sqlite3 is not installed or its native binding is missing. ${errors.join(\" | \")}`,\n retryable: false,\n });\n};\n\nexport const createSqliteStore = (\n options: SqliteStoreOptions,\n): MetadataStore => {\n // The consumer-facing factory is sync (matches the MetadataStore\n // contract). The real work is built lazily — we return an object\n // that delegates every method through `ensureReady()`, which\n // resolves once and caches. First method call pays the import\n // cost; the rest are direct.\n let inner: MetadataStore | null = null;\n let pending: Promise<MetadataStore> | null = null;\n\n const ensureReady = async (): Promise<MetadataStore> => {\n if (inner) return inner;\n if (!pending) {\n pending = (async () => {\n // createRequire gives us a real require() call that\n // webpack/turbopack leave alone (treated as a runtime call).\n const mod = loadBetterSqlite();\n inner = buildInner(extractDatabase(mod), options);\n return inner;\n })();\n }\n return pending;\n };\n\n const wrap = <A extends unknown[], R>(\n method: (store: MetadataStore, ...args: A) => Promise<R>,\n ): ((...args: A) => Promise<R>) =>\n async (...args: A): Promise<R> => {\n const s = await ensureReady();\n return method(s, ...args);\n };\n\n return {\n createNode: wrap((s, i) => s.createNode(i)),\n getNode: wrap((s, i) => s.getNode(i)),\n listChildren: wrap((s, i) => s.listChildren(i)),\n moveNode: wrap((s, i) => s.moveNode(i)),\n deleteNode: wrap((s, i) => s.deleteNode(i)),\n purgeNode: wrap((s, i) => s.purgeNode(i)),\n updateMetadata: wrap((s, i) => s.updateMetadata(i)),\n search: wrap((s, i) => s.search(i)),\n getPath: wrap((s, i) => s.getPath(i)),\n reconcile: wrap((s) => s.reconcile()),\n enqueueOrphan: wrap((s, i) => s.enqueueOrphan(i)),\n listPendingOrphans: wrap((s, i) => s.listPendingOrphans(i)),\n deleteOrphan: wrap((s, i) => s.deleteOrphan(i)),\n restoreNode: wrap((s, i) => s.restoreNode(i)),\n listTrash: wrap((s, i) => s.listTrash(i)),\n scanFileKeys: wrap((s, i) => s.scanFileKeys(i)),\n sumSize: wrap((s, i) => s.sumSize(i)),\n findByS3Key: wrap((s, i) => s.findByS3Key(i)),\n createShare: wrap((s, i) => s.createShare(i)),\n resolveShare: wrap((s, i) => s.resolveShare(i)),\n revokeShare: wrap((s, i) => s.revokeShare(i)),\n };\n};\n\n/**\n * The real factory — receives the loaded Database constructor and\n * options, builds the prepared statements and the 9-method store.\n * Defined below as a closure that captures `Database` at call\n * time (after the lazy import resolves).\n */\nconst buildInner = (\n Database: DatabaseCtor,\n options: SqliteStoreOptions,\n): MetadataStore => {\n const db = new Database(options.path);\n // WAL gives us better concurrent read performance for little\n // extra cost (we're not heavily contended; still, cheap).\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n\n if (options.runMigrations !== false) {\n runMigrations(db);\n }\n\n // -------------------------------------------------------------------------\n // Prepared statements\n // -------------------------------------------------------------------------\n\n const stmtInsert = db.prepare(`\n INSERT INTO nodes (\n id, tenant_id, parent_id, name, path, kind, size, mime_type,\n s3_key, owner_id, metadata, created_at, updated_at, deleted_at\n ) VALUES (\n @id, @tenant_id, @parent_id, @name, @path, @kind, @size, @mime_type,\n @s3_key, @owner_id, @metadata, @created_at, @updated_at, NULL\n )\n `);\n\n const stmtGetById = db.prepare(`\n SELECT * FROM nodes\n WHERE id = ? AND tenant_id = ? AND deleted_at IS NULL\n `);\n\n // For getPath chain walking — include tombstoned ancestors so\n // the path mirrors the memory-store behavior (no gaps even if a\n // mid-chain parent is soft-deleted).\n const stmtGetByIdAny = db.prepare(`\n SELECT * FROM nodes\n WHERE id = ? AND tenant_id = ?\n `);\n\n // parent_id is stored as '' (empty string) for \"no parent\"\n // because SQLite treats NULL as distinct in unique indexes.\n // All queries that compare parent_id use `=` with '' bound.\n const stmtListChildren = db.prepare(`\n SELECT * FROM nodes\n WHERE tenant_id = ? AND parent_id = ?\n AND deleted_at IS NULL\n ORDER BY name COLLATE NOCASE ASC\n LIMIT ?\n `);\n\n const stmtCountChildren = db.prepare(`\n SELECT COUNT(*) AS c FROM nodes\n WHERE tenant_id = ? AND parent_id = ? AND deleted_at IS NULL\n `);\n\n const stmtUpdateSelfMove = db.prepare(`\n UPDATE nodes\n SET parent_id = ?, name = ?, path = ?, updated_at = ?\n WHERE id = ? AND tenant_id = ?\n `);\n\n // Prefix-only replace: SUBSTR strips the leading oldPath and\n // we prepend newPath. Avoids accidentally rewriting nested\n // segments that happen to share the moved name (e.g. moving\n // \"/foo\" to \"/bar\" must turn \"/foo/sub/foo\" into \"/bar/sub/foo\",\n // not \"/bar/sub/bar\"). LENGTH uses the raw path; LIKE uses the\n // escaped path so a folder named \"%\" or \"_\" cannot widen the match.\n const stmtCascadeDescendants = db.prepare(`\n UPDATE nodes\n SET path = ? || SUBSTR(path, LENGTH(?) + 1), updated_at = ?\n WHERE tenant_id = ? AND path LIKE ? || '/%' ESCAPE '\\\\'\n `);\n\n const stmtTombstone = db.prepare(`\n UPDATE nodes\n SET deleted_at = ?, updated_at = ?\n WHERE id = ? AND tenant_id = ?\n `);\n\n const stmtTombstoneSubtree = db.prepare(`\n UPDATE nodes\n SET deleted_at = ?, updated_at = ?\n WHERE tenant_id = ? AND (id = ? OR path LIKE ? || '/%' ESCAPE '\\\\')\n AND deleted_at IS NULL\n `);\n\n const stmtHasLiveChild = db.prepare(`\n SELECT 1 FROM nodes\n WHERE tenant_id = ? AND parent_id = ? AND deleted_at IS NULL\n LIMIT 1\n `);\n\n const stmtUpdateMetadata = db.prepare(`\n UPDATE nodes\n SET metadata = ?, updated_at = ?\n WHERE id = ? AND tenant_id = ? AND deleted_at IS NULL\n `);\n\n const stmtSearchGlobal = db.prepare(`\n SELECT n.* FROM nodes n\n JOIN nodes_fts ON n.rowid = nodes_fts.rowid\n WHERE nodes_fts MATCH ?\n AND n.tenant_id = ?\n AND n.deleted_at IS NULL\n ORDER BY bm25(nodes_fts)\n LIMIT ?\n `);\n\n const stmtSearchInFolder = db.prepare(`\n SELECT n.* FROM nodes n\n JOIN nodes_fts ON n.rowid = nodes_fts.rowid\n WHERE nodes_fts MATCH ?\n AND n.tenant_id = ?\n AND n.deleted_at IS NULL\n AND (n.id = ? OR n.path LIKE ? || '/%' ESCAPE '\\\\')\n ORDER BY bm25(nodes_fts)\n LIMIT ?\n `);\n\n const stmtEnqueueOrphan = db.prepare(`\n INSERT INTO pending_orphans (\n id, tenant_id, s3_key, metadata_id, reason, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const stmtListPendingOrphans = db.prepare(`\n SELECT * FROM pending_orphans\n WHERE tenant_id = ?\n ORDER BY created_at ASC, id ASC\n `);\n\n const stmtDeleteOrphan = db.prepare(`\n DELETE FROM pending_orphans\n WHERE tenant_id = ? AND id = ?\n `);\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n const makeId = (): string => {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `sql-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n };\n\n const nowIso = (): string => new Date().toISOString();\n\n // Boundary translation: FileNode.parentId is null | string,\n // but the SQLite column is NOT NULL with '' for root. Map at\n // every bind site so the rest of the code can compare with =.\n const dbParent = (id: string | null): string => id ?? \"\";\n\n const computePath = (\n parentPath: string | null,\n name: string,\n ): string => {\n if (parentPath === null) return `/${name}`;\n return `${parentPath}/${name}`;\n };\n\n const notFound = (id: string): Result<never, FileSystemError> =>\n err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${id} not found`,\n retryable: false,\n }),\n );\n\n const escapeLike = (s: string): string =>\n s.replace(/\\\\/g, \"\\\\\\\\\").replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n\n // -------------------------------------------------------------------------\n // 9-method contract\n // -------------------------------------------------------------------------\n\n return {\n async createNode(\n input: CreateNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n const normalized = normalizeNodeName(input.name);\n if (!normalized.ok) return normalized;\n const name = normalized.value;\n const now = nowIso();\n const id = input.id ?? makeId();\n\n // Look up parent (if any) to compute the path. We require\n // a LIVE parent; tombstoned parents can't have new children.\n // `!= null` (not `!== null`) so that BOTH null and\n // undefined skip the lookup.\n let parentPath: string | null = null;\n if (input.parentId != null) {\n const parent = stmtGetById.get(input.parentId, input.tenantId) as\n | NodeRow\n | undefined;\n if (!parent) return notFound(input.parentId);\n if (parent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Parent ${input.parentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n parentPath = parent.path;\n }\n\n const path = computePath(parentPath, name);\n\n try {\n stmtInsert.run({\n id,\n tenant_id: input.tenantId,\n parent_id: dbParent(input.parentId),\n name,\n path,\n kind: input.kind,\n size: input.kind === \"folder\" ? 0 : input.size,\n mime_type: input.kind === \"folder\" ? \"\" : input.mimeType,\n s3_key: input.kind === \"folder\" ? \"\" : input.s3Key,\n owner_id: input.ownerId,\n metadata: JSON.stringify(input.metadata ?? {}),\n created_at: now,\n updated_at: now,\n });\n } catch (e) {\n // SQLite UNIQUE violation on nodes_unique_live_name.\n if (e instanceof Error && /UNIQUE constraint failed/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"createNode failed\",\n retryable: false,\n }),\n );\n }\n\n const created = stmtGetById.get(id, input.tenantId) as NodeRow | undefined;\n if (!created) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Row missing immediately after insert\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(created));\n },\n\n async getNode(\n input: GetNodeInput,\n ): Promise<Result<FileNode | null, FileSystemError>> {\n const row = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n return ok(row ? rowToFileNode(row) : null);\n },\n\n async listChildren(\n input: ListChildrenInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n const limit = input.limit ?? 1000;\n const parentId = dbParent(input.parentId);\n const cursor = decodeCursor(input.cursor);\n const rows = (\n cursor\n ? db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND parent_id = ?\n AND deleted_at IS NULL\n AND (name COLLATE NOCASE > ? COLLATE NOCASE\n OR (name COLLATE NOCASE = ? COLLATE NOCASE AND id > ?))\n ORDER BY name COLLATE NOCASE ASC, id ASC\n LIMIT ?`,\n )\n .all(input.tenantId, parentId, cursor.n, cursor.n, cursor.i, limit)\n : stmtListChildren.all(input.tenantId, parentId, limit)\n ) as ReadonlyArray<NodeRow>;\n const items = rows.map(rowToFileNode);\n return ok({\n items,\n nextCursor: pageCursor(items, limit),\n });\n },\n\n async moveNode(\n input: MoveNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n const current = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!current) return notFound(input.id);\n\n const normalized = normalizeNodeName(input.newName ?? current.name);\n if (!normalized.ok) return normalized;\n const newName = normalized.value;\n\n // Validate the new parent (if any) and check for cycles.\n // `!= null` (not `!== null`) so that BOTH null and\n // undefined skip the validation. (undefined !== null is\n // TRUE in JS — the footgun that hid this for an hour.)\n let newParentPath: string | null = null;\n if (input.newParentId != null) {\n if (input.newParentId === current.id) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into itself\",\n retryable: false,\n }),\n );\n }\n const newParent = stmtGetById.get(input.newParentId, input.tenantId) as\n | NodeRow\n | undefined;\n if (!newParent) return notFound(input.newParentId);\n if (newParent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Destination ${input.newParentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n // Cycle: newParent must not be a descendant of current.\n if (newParent.path === current.path || newParent.path.startsWith(`${current.path}/`)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into its own descendant\",\n retryable: false,\n }),\n );\n }\n newParentPath = newParent.path;\n }\n\n const newPath = computePath(newParentPath, newName);\n\n try {\n const tx = db.transaction(() => {\n stmtUpdateSelfMove.run(\n dbParent(input.newParentId),\n newName,\n newPath,\n nowIso(),\n input.id,\n input.tenantId,\n );\n if (current.path !== newPath) {\n // LENGTH uses the raw path. LIKE uses the escaped path.\n stmtCascadeDescendants.run(\n newPath,\n current.path,\n nowIso(),\n input.tenantId,\n escapeLike(current.path),\n );\n }\n });\n tx();\n } catch (e) {\n if (e instanceof Error && /UNIQUE constraint failed/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${newName}' already exists in the destination folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"moveNode failed\",\n retryable: false,\n }),\n );\n }\n\n const updated = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!updated) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Node missing after move\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(updated));\n },\n\n async deleteNode(\n input: DeleteNodeInput,\n ): Promise<Result<void, FileSystemError>> {\n const node = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!node) return notFound(input.id);\n\n if (node.kind === \"folder\" && !input.recursive) {\n const hasChild = stmtHasLiveChild.get(input.tenantId, input.id);\n if (hasChild) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Folder '${node.name}' is not empty; pass recursive: true to delete the subtree`,\n retryable: false,\n }),\n );\n }\n }\n\n const now = nowIso();\n if (input.recursive || node.kind === \"file\") {\n stmtTombstoneSubtree.run(now, now, input.tenantId, input.id, escapeLike(node.path));\n } else {\n stmtTombstone.run(now, now, input.id, input.tenantId);\n }\n return ok(undefined);\n },\n\n async purgeNode(input: {\n tenantId: TenantId;\n id: string;\n }): Promise<Result<{ s3Keys: ReadonlyArray<string> }, FileSystemError>> {\n const node = db\n .prepare(\n `SELECT id, path FROM nodes WHERE id = ? AND tenant_id = ? AND deleted_at IS NOT NULL`,\n )\n .get(input.id, input.tenantId) as { id: string; path: string } | undefined;\n if (!node) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Trashed node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const like = `${escapeLike(node.path)}/%`;\n const files = db\n .prepare(\n `SELECT s3_key FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NOT NULL AND kind = 'file' AND s3_key != ''\n AND (id = ? OR path LIKE ? ESCAPE '\\\\')`,\n )\n .all(input.tenantId, input.id, like) as Array<{ s3_key: string }>;\n db.prepare(\n `DELETE FROM shares WHERE tenant_id = ? AND node_id IN (\n SELECT id FROM nodes WHERE tenant_id = ? AND deleted_at IS NOT NULL AND (id = ? OR path LIKE ? ESCAPE '\\\\')\n )`,\n ).run(input.tenantId, input.tenantId, input.id, like);\n db.prepare(\n `DELETE FROM nodes WHERE tenant_id = ? AND deleted_at IS NOT NULL AND (id = ? OR path LIKE ? ESCAPE '\\\\')`,\n ).run(input.tenantId, input.id, like);\n return ok({ s3Keys: files.map((row) => row.s3_key) });\n },\n\n async updateMetadata(\n input: UpdateMetadataInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n const node = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!node) return notFound(input.id);\n\n const next = input.replace\n ? { ...input.metadata }\n : { ...(JSON.parse(node.metadata) as Record<string, string>), ...input.metadata };\n\n const result = stmtUpdateMetadata.run(\n JSON.stringify(next),\n nowIso(),\n input.id,\n input.tenantId,\n );\n if (result.changes === 0) {\n return notFound(input.id);\n }\n const updated = stmtGetById.get(input.id, input.tenantId) as NodeRow;\n return ok(rowToFileNode(updated));\n },\n\n async search(\n input: SearchInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n const limit = input.limit ?? 100;\n\n // Empty query → no results (preserves existing contract).\n if (input.query.length === 0) {\n return ok({ items: [], nextCursor: undefined });\n }\n\n // Sanitize for FTS5 MATCH. The sanitizer wraps the query in a\n // phrase so every metacharacter and reserved keyword is\n // treated as literal text. Without it, `name:foo` would be\n // parsed as a column-filter, `foo AND bar` would become a\n // boolean AND, etc.\n const ftsQuery = sanitizeFts5Query(input.query);\n\n let rows: ReadonlyArray<NodeRow>;\n try {\n if (input.parentId === undefined) {\n rows = stmtSearchGlobal.all(ftsQuery, input.tenantId, limit) as ReadonlyArray<NodeRow>;\n } else {\n const parent = stmtGetById.get(input.parentId, input.tenantId) as\n | NodeRow\n | undefined;\n if (!parent) return notFound(input.parentId);\n if (parent.path === \"/\") {\n // Root's subtree is the whole tenant — use the global\n // query (avoids the root path's \"LIKE '//%'\" no-op).\n rows = stmtSearchGlobal.all(ftsQuery, input.tenantId, limit) as ReadonlyArray<NodeRow>;\n } else {\n rows = stmtSearchInFolder.all(\n ftsQuery,\n input.tenantId,\n input.parentId,\n escapeLike(parent.path),\n limit,\n ) as ReadonlyArray<NodeRow>;\n }\n }\n } catch (e) {\n // Defensive: a sanitized phrase query should never raise a\n // syntax error, but if FTS5 ever does, return empty rather\n // than crash. The empty-results-on-bad-pattern behavior\n // is the documented contract.\n return ok({ items: [], nextCursor: undefined });\n }\n\n return ok({\n items: rows.map(rowToFileNode),\n nextCursor: rows.length === limit ? String(limit) : undefined,\n });\n },\n\n async getPath(\n input: GetPathInput,\n ): Promise<Result<{ segments: FileNode[] }, FileSystemError>> {\n const start = stmtGetById.get(input.id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!start) return notFound(input.id);\n\n const segments: FileNode[] = [];\n let cursor: NodeRow | undefined = start;\n while (cursor) {\n segments.unshift(rowToFileNode(cursor));\n // parent_id is stored as '' for root; treat '' as the\n // termination condition.\n if (cursor.parent_id === \"\") break;\n // Include tombstoned ancestors — mirrors memory-store and\n // gives the consumer a complete breadcrumb even if a\n // mid-chain parent was soft-deleted.\n cursor = stmtGetByIdAny.get(cursor.parent_id, input.tenantId) as\n | NodeRow\n | undefined;\n if (!cursor) break;\n }\n return ok({ segments });\n },\n\n async enqueueOrphan(input) {\n const id = makeId();\n try {\n stmtEnqueueOrphan.run(\n id,\n input.tenantId,\n input.s3Key,\n input.metadataId ?? null,\n input.reason,\n nowIso(),\n );\n return ok({ id });\n } catch (error) {\n return err(FileSystemError.fromSqlite(error));\n }\n },\n\n async listPendingOrphans(input) {\n try {\n const rows = stmtListPendingOrphans.all(\n input.tenantId,\n ) as ReadonlyArray<OrphanRow>;\n return ok(rows.map(rowToPendingOrphan));\n } catch (error) {\n return err(FileSystemError.fromSqlite(error));\n }\n },\n\n async deleteOrphan(input) {\n try {\n const result = stmtDeleteOrphan.run(input.tenantId, input.id);\n if (result.changes === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Orphan ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n } catch (error) {\n return err(FileSystemError.fromSqlite(error));\n }\n },\n\n async reconcile(): Promise<Result<ReconcileResult, FileSystemError>> {\n const row = db\n .prepare(\"SELECT COUNT(*) AS c FROM nodes WHERE deleted_at IS NULL\")\n .get() as { c: number };\n return ok({\n orphansInStore: [],\n orphansInS3: [],\n scanned: row.c,\n });\n },\n\n async restoreNode(input) {\n const row = stmtGetByIdAny.get(input.id, input.tenantId) as NodeRow | undefined;\n if (!row || row.deleted_at === null) return notFound(input.id);\n try {\n db.prepare(\n `UPDATE nodes SET deleted_at = NULL, updated_at = ? WHERE id = ? AND tenant_id = ?`,\n ).run(nowIso(), input.id, input.tenantId);\n } catch (e) {\n if (e instanceof Error && /UNIQUE constraint failed/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A live node named '${row.name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n return err(FileSystemError.fromSqlite(e));\n }\n const restored = stmtGetById.get(input.id, input.tenantId) as NodeRow | undefined;\n if (!restored) return notFound(input.id);\n return ok(rowToFileNode(restored));\n },\n\n async listTrash(input) {\n const limit = input.limit ?? 1000;\n const cursor = decodeCursor(input.cursor);\n const rows = (\n cursor\n ? db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NOT NULL\n AND (name COLLATE NOCASE > ? COLLATE NOCASE\n OR (name COLLATE NOCASE = ? COLLATE NOCASE AND id > ?))\n ORDER BY name COLLATE NOCASE ASC, id ASC\n LIMIT ?`,\n )\n .all(input.tenantId, cursor.n, cursor.n, cursor.i, limit)\n : db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NOT NULL\n ORDER BY name COLLATE NOCASE ASC, id ASC\n LIMIT ?`,\n )\n .all(input.tenantId, limit)\n ) as ReadonlyArray<NodeRow>;\n const items = rows.map(rowToFileNode);\n return ok({ items, nextCursor: pageCursor(items, limit) });\n },\n\n async scanFileKeys(input) {\n const rows = db\n .prepare(\n `SELECT id, s3_key FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NULL AND kind = 'file' AND s3_key != ''`,\n )\n .all(input.tenantId) as Array<{ id: string; s3_key: string }>;\n return ok(rows.map((r) => ({ id: r.id, s3Key: r.s3_key })));\n },\n\n async sumSize(input) {\n const row = db\n .prepare(\n `SELECT COALESCE(SUM(size), 0) AS c FROM nodes\n WHERE tenant_id = ? AND deleted_at IS NULL AND kind = 'file'`,\n )\n .get(input.tenantId) as { c: number };\n return ok(row.c);\n },\n\n async findByS3Key(input) {\n const row = db\n .prepare(\n `SELECT * FROM nodes\n WHERE tenant_id = ? AND s3_key = ? AND deleted_at IS NULL\n LIMIT 1`,\n )\n .get(input.tenantId, input.s3Key) as NodeRow | undefined;\n return ok(row ? rowToFileNode(row) : null);\n },\n\n async createShare(input) {\n const node = stmtGetById.get(input.nodeId, input.tenantId) as NodeRow | undefined;\n if (!node) return notFound(input.nodeId);\n const token = makeId();\n db.prepare(\n `INSERT INTO shares (token, tenant_id, node_id, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n ).run(\n token,\n input.tenantId,\n input.nodeId,\n input.expiresAt?.toISOString() ?? null,\n nowIso(),\n );\n return ok({ token });\n },\n\n async resolveShare(input) {\n const share = db\n .prepare(`SELECT * FROM shares WHERE token = ?`)\n .get(input.token) as\n | { tenant_id: string; node_id: string; expires_at: string | null }\n | undefined;\n if (!share) return ok(null);\n if (share.expires_at && Date.parse(share.expires_at) < Date.now()) return ok(null);\n const node = stmtGetById.get(share.node_id, share.tenant_id) as NodeRow | undefined;\n return ok(node ? rowToFileNode(node) : null);\n },\n\n async revokeShare(input) {\n const result = db\n .prepare(`DELETE FROM shares WHERE token = ? AND tenant_id = ?`)\n .run(input.token, input.tenantId);\n if (result.changes === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Share ${input.token} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n },\n };\n};\n\nexport { asTenantId, asUserId };\n","/**\n * `createPostgresStore` — a Postgres-backed `MetadataStore`.\n *\n * Built on `pg` (node-postgres). Public methods are async (the\n * interface requires it); the actual SQL runs against a `Pool`\n * whose connections are managed internally.\n *\n * Schema (one table):\n *\n * nodes(\n * id UUID PRIMARY KEY, -- generated by the app\n * tenant_id TEXT NOT NULL,\n * parent_id UUID, -- NULL = root\n * name TEXT NOT NULL,\n * path TEXT NOT NULL, -- materialized \"/a/b/c\"\n * kind TEXT NOT NULL CHECK (kind IN ('file','folder')),\n * size BIGINT NOT NULL DEFAULT 0,\n * mime_type TEXT NOT NULL DEFAULT '',\n * s3_key TEXT NOT NULL DEFAULT '',\n * owner_id TEXT NOT NULL,\n * metadata JSONB NOT NULL DEFAULT '{}'::jsonb,\n * created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n * updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n * deleted_at TIMESTAMPTZ\n * )\n *\n * Two partial unique indexes for name uniqueness (Postgres treats\n * NULL as distinct in UNIQUE indexes, same footgun as SQLite):\n *\n * - (tenant_id, parent_id, name) WHERE deleted_at IS NULL\n * AND parent_id IS NOT NULL → non-root siblings\n * - (tenant_id, name) WHERE deleted_at IS NULL\n * AND parent_id IS NULL → root children\n *\n * Indexes for hot paths:\n * nodes_path_prefix → LIKE 'path/%' for moveNode cascade\n * nodes_tenant_parent → listChildren\n * nodes_name_lower → btree on lower(name); used for exact-match\n * LIKE/ILIKE plans (no leading wildcard)\n * nodes_name_trgm_idx → GIN trigram on lower(name); used for\n * ILIKE '%x%' plans (leading wildcard).\n * Requires CREATE EXTENSION pg_trgm.\n *\n * Tenant isolation is enforced in app code (every query filters\n * by tenant_id, including path cascades) and by RLS. RLS does not\n * apply to superusers or roles with BYPASSRLS, so the tenant_id\n * predicate is required even when FORCE ROW LEVEL SECURITY is on.\n *\n * The `reconcile()` method is a no-op scan — same as the memory\n * and SQLite stores. Real bucket-walking reconcile would need\n * the S3 adapter injected into the store, which would change the\n * interface. Deferred to a follow-up.\n */\nimport { createRequire } from \"node:module\";\nimport type { Pool, PoolClient, QueryResultRow } from \"pg\";\n\n/**\n * Lazy-load `pg` (node-postgres). The native modules (pg's optional\n * native bindings) and connection management shouldn't enter\n * every consumer's bundle. Same pattern as `sqlite-store.ts`.\n */\ntype PgModule = typeof import(\"pg\");\ntype PgTypes = {\n Pool: new (opts: { connectionString: string; max?: number }) => Pool;\n PoolClient: new (...args: never[]) => PoolClient;\n QueryResultRow: QueryResultRow;\n};\nconst extractPg = (mod: PgModule): PgTypes => {\n const m = mod as unknown as { default?: PgTypes };\n return m.default ?? (mod as unknown as PgTypes);\n};\nimport {\n err,\n ok,\n type Result,\n} from \"@/types/result\";\nimport { FileSystemError } from \"@/errors\";\nimport { asS3Key, asTenantId, asUserId } from \"@/types/branded\";\nimport type { TenantId } from \"@/types/branded\";\nimport { sanitizeLikePattern } from \"./sanitize\";\nimport { decodeCursor, pageCursor } from \"./cursor\";\nimport { normalizeNodeName } from \"./node-name\";\nimport type {\n CreateNodeInput,\n DeleteNodeInput,\n FileNode,\n GetNodeInput,\n GetPathInput,\n ListChildrenInput,\n ListChildrenOutput,\n MetadataStore,\n MoveNodeInput,\n ReconcileResult,\n SearchInput,\n UpdateMetadataInput,\n} from \"./store\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface PostgresStoreOptions {\n /**\n * A libpq connection string. Example:\n * postgres://user:pass@localhost:5432/dbname\n */\n readonly connectionString: string;\n /**\n * Postgres schema (namespace). Defaults to \"public\".\n * Use a dedicated schema per tenant in shared clusters.\n */\n readonly schema?: string;\n /**\n * Run schema migrations on construction. Default: true.\n */\n readonly runMigrations?: boolean;\n /**\n * Max pool size. Defaults to 10.\n */\n readonly maxPoolSize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Row → FileNode\n// ---------------------------------------------------------------------------\n\ninterface NodeRow extends QueryResultRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly parent_id: string | null;\n readonly name: string;\n readonly path: string;\n readonly kind: \"file\" | \"folder\";\n readonly size: string | number;\n readonly mime_type: string;\n readonly s3_key: string;\n readonly owner_id: string;\n readonly metadata: Record<string, string>;\n readonly created_at: Date;\n readonly updated_at: Date;\n readonly deleted_at: Date | null;\n}\n\ninterface OrphanRow {\n readonly id: string;\n readonly tenant_id: string;\n readonly s3_key: string;\n readonly metadata_id: string | null;\n readonly reason: string;\n readonly created_at: Date;\n}\n\nconst rowToPendingOrphan = (row: OrphanRow) => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n s3Key: asS3Key(row.s3_key),\n metadataId: row.metadata_id,\n reason: row.reason,\n createdAt: row.created_at,\n});\n\nconst rowToFileNode = (row: NodeRow): FileNode => ({\n id: row.id,\n tenantId: asTenantId(row.tenant_id),\n parentId: row.parent_id,\n name: row.name,\n path: row.path,\n kind: row.kind,\n // pg returns BIGINT as string by default to avoid precision loss\n // on JS numbers > 2^53. Cast back; file sizes fit comfortably.\n size: typeof row.size === \"string\" ? Number.parseInt(row.size, 10) : row.size,\n mimeType: row.mime_type,\n s3Key: row.s3_key,\n ownerId: asUserId(row.owner_id),\n metadata: row.metadata,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: row.deleted_at,\n});\n\n// ---------------------------------------------------------------------------\n// Migrations\n// ---------------------------------------------------------------------------\n\nconst SCHEMA_VERSION = 3;\n\nconst MIGRATION_SQL = (schema: string): string => `\n-- pg_trgm provides the gin_trgm_ops operator class so we can build\n-- a GIN trigram index on lower(name). Without the extension,\n-- CREATE INDEX … USING GIN (lower(name) gin_trgm_ops) fails.\n-- The extension is shared across the cluster (no schema), so it\n-- only needs to be installed once per database. IF NOT EXISTS\n-- makes the call a no-op on subsequent migrations.\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\n\nCREATE SCHEMA IF NOT EXISTS \"${schema}\";\n\n-- Tables are schema-qualified (they have to be, to live in\n-- the schema). Index NAMES must NOT be schema-qualified —\n-- Postgres syntax error otherwise. The index inherits the\n-- schema from its table, so search_path isn't required.\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".schema_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".nodes (\n id UUID PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n parent_id UUID,\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK (kind IN ('file', 'folder')),\n size BIGINT NOT NULL DEFAULT 0,\n mime_type TEXT NOT NULL DEFAULT '',\n s3_key TEXT NOT NULL DEFAULT '',\n owner_id TEXT NOT NULL,\n metadata JSONB NOT NULL DEFAULT '{}'::jsonb,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".pending_orphans (\n id UUID PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n s3_key TEXT NOT NULL,\n metadata_id TEXT,\n reason TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE INDEX IF NOT EXISTS pending_orphans_tenant_created\n ON \"${schema}\".pending_orphans (tenant_id, created_at);\n\n-- Name uniqueness for non-root siblings.\nCREATE UNIQUE INDEX IF NOT EXISTS nodes_unique_live_nonroot_name\n ON \"${schema}\".nodes (tenant_id, parent_id, name)\n WHERE deleted_at IS NULL AND parent_id IS NOT NULL;\n\n-- Name uniqueness for root children (NULL parent_id).\nCREATE UNIQUE INDEX IF NOT EXISTS nodes_unique_live_root_name\n ON \"${schema}\".nodes (tenant_id, name)\n WHERE deleted_at IS NULL AND parent_id IS NULL;\n\nCREATE INDEX IF NOT EXISTS nodes_path_prefix\n ON \"${schema}\".nodes (path text_pattern_ops);\nCREATE INDEX IF NOT EXISTS nodes_tenant_parent\n ON \"${schema}\".nodes (tenant_id, parent_id);\nCREATE INDEX IF NOT EXISTS nodes_name_lower\n ON \"${schema}\".nodes (lower(name));\n\n-- GIN trigram index lets ILIKE '%foo%' on lower(name) use an\n-- index plan instead of a seq scan. Cheap to maintain (~3x the\n-- row size), but search is O(matches) instead of O(rows) — a\n-- real win past a few thousand rows.\nCREATE INDEX IF NOT EXISTS nodes_name_trgm_idx\n ON \"${schema}\".nodes USING GIN (lower(name) gin_trgm_ops);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".shares (\n token TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n node_id UUID NOT NULL,\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nALTER TABLE \"${schema}\".nodes ENABLE ROW LEVEL SECURITY;\nALTER TABLE \"${schema}\".nodes FORCE ROW LEVEL SECURITY;\nDROP POLICY IF EXISTS tenant_isolation ON \"${schema}\".nodes;\nCREATE POLICY tenant_isolation ON \"${schema}\".nodes\n USING (tenant_id = current_setting('app.current_tenant', true))\n WITH CHECK (tenant_id = current_setting('app.current_tenant', true));\n\nALTER TABLE \"${schema}\".pending_orphans ENABLE ROW LEVEL SECURITY;\nALTER TABLE \"${schema}\".pending_orphans FORCE ROW LEVEL SECURITY;\nDROP POLICY IF EXISTS orphan_tenant_isolation ON \"${schema}\".pending_orphans;\nCREATE POLICY orphan_tenant_isolation ON \"${schema}\".pending_orphans\n USING (tenant_id = current_setting('app.current_tenant', true))\n WITH CHECK (tenant_id = current_setting('app.current_tenant', true));\n`;\n\nconst runMigrations = async (\n pool: Pool,\n schema: string,\n): Promise<void> => {\n const client = await pool.connect();\n try {\n await client.query(MIGRATION_SQL(schema));\n await client.query(\n `INSERT INTO \"${schema}\".schema_meta (key, value) VALUES ('version', $1)\n ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,\n [String(SCHEMA_VERSION)],\n );\n } finally {\n client.release();\n }\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport const createPostgresStore = (\n options: PostgresStoreOptions,\n): MetadataStore => {\n // Public factory is sync; the real work builds lazily on first\n // method call. See the matching comment in sqlite-store.ts.\n let inner: MetadataStore | null = null;\n let pending: Promise<MetadataStore> | null = null;\n\n const ensureReady = async (): Promise<MetadataStore> => {\n if (inner) return inner;\n if (!pending) {\n pending = (async () => {\n const req = createRequire(import.meta.url);\n const mod = req(\"pg\") as PgModule;\n inner = buildInner(extractPg(mod), options);\n return inner;\n })();\n }\n return pending;\n };\n\n const wrap = <A extends unknown[], R>(\n method: (store: MetadataStore, ...args: A) => Promise<R>,\n ): ((...args: A) => Promise<R>) =>\n async (...args: A): Promise<R> => {\n const s = await ensureReady();\n return method(s, ...args);\n };\n\n return {\n createNode: wrap((s, i) => s.createNode(i)),\n getNode: wrap((s, i) => s.getNode(i)),\n listChildren: wrap((s, i) => s.listChildren(i)),\n moveNode: wrap((s, i) => s.moveNode(i)),\n deleteNode: wrap((s, i) => s.deleteNode(i)),\n purgeNode: wrap((s, i) => s.purgeNode(i)),\n updateMetadata: wrap((s, i) => s.updateMetadata(i)),\n search: wrap((s, i) => s.search(i)),\n getPath: wrap((s, i) => s.getPath(i)),\n reconcile: wrap((s) => s.reconcile()),\n enqueueOrphan: wrap((s, i) => s.enqueueOrphan(i)),\n listPendingOrphans: wrap((s, i) => s.listPendingOrphans(i)),\n deleteOrphan: wrap((s, i) => s.deleteOrphan(i)),\n restoreNode: wrap((s, i) => s.restoreNode(i)),\n listTrash: wrap((s, i) => s.listTrash(i)),\n scanFileKeys: wrap((s, i) => s.scanFileKeys(i)),\n sumSize: wrap((s, i) => s.sumSize(i)),\n findByS3Key: wrap((s, i) => s.findByS3Key(i)),\n createShare: wrap((s, i) => s.createShare(i)),\n resolveShare: wrap((s, i) => s.resolveShare(i)),\n revokeShare: wrap((s, i) => s.revokeShare(i)),\n };\n};\n\n/**\n * Real factory — builds the prepared-query store using the loaded\n * pg module.\n */\nconst buildInner = (pg: PgTypes, options: PostgresStoreOptions): MetadataStore => {\n const pool = new pg.Pool({\n connectionString: options.connectionString,\n max: options.maxPoolSize ?? 10,\n });\n const schema = options.schema ?? \"public\";\n\n // Lazy migrations on first method call — keeps the factory\n // synchronous (the MetadataStore contract is async per method).\n let initPromise: Promise<void> | null = null;\n const ensureInitialized = async (): Promise<void> => {\n if (!initPromise) {\n initPromise =\n options.runMigrations === false\n ? Promise.resolve()\n : runMigrations(pool, schema);\n }\n return initPromise;\n };\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n const makeId = (): string => {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `pg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n };\n\n const notFound = (id: string): Result<never, FileSystemError> =>\n err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Node ${id} not found`,\n retryable: false,\n }),\n );\n\n // LIKE escape helper kept for any future ad-hoc LIKE; the\n // sanitizer in `./sanitize` is the canonical version (it has\n // unit tests and is shared with the SQLite adapter's intent\n // for FTS5).\n const escapeLike = sanitizeLikePattern;\n\n // Wrap a query in a transaction. Caller provides the work as an\n // async function; on success the tx commits, on throw it rolls back.\n const withTenant = async <T>(\n tenantId: string,\n fn: (c: PoolClient) => Promise<T>,\n ): Promise<T> => {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n await client.query(`SELECT set_config('app.current_tenant', $1, true)`, [\n tenantId,\n ]);\n const result = await fn(client);\n await client.query(\"COMMIT\");\n return result;\n } catch (e) {\n await client.query(\"ROLLBACK\").catch(() => {\n // Ignore rollback errors — the original error is more useful.\n });\n throw e;\n } finally {\n client.release();\n }\n };\n\n const q = <T extends QueryResultRow>(\n tenantId: string,\n text: string,\n params: unknown[] = [],\n ) => withTenant(tenantId, (c) => c.query<T>(text, params));\n\n const withTx = async <T>(\n tenantId: string,\n fn: (c: PoolClient) => Promise<T>,\n ): Promise<T> => withTenant(tenantId, fn);\n\n // -------------------------------------------------------------------------\n // 9-method contract\n // -------------------------------------------------------------------------\n\n return {\n async createNode(\n input: CreateNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n await ensureInitialized();\n const normalized = normalizeNodeName(input.name);\n if (!normalized.ok) return normalized;\n const name = normalized.value;\n // Look up parent (if any) to compute the path. We require\n // a LIVE parent; tombstoned parents can't have new children.\n // `!= null` so BOTH null and undefined skip the lookup.\n let parentPath: string | null = null;\n if (input.parentId != null) {\n const parentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.parentId, input.tenantId],\n );\n const parent = parentRes.rows[0];\n if (!parent) return notFound(input.parentId);\n if (parent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Parent ${input.parentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n parentPath = parent.path;\n }\n\n const id = input.id ?? makeId();\n const path = parentPath === null ? `/${name}` : `${parentPath}/${name}`;\n\n try {\n await q(input.tenantId,\n `INSERT INTO \"${schema}\".nodes (\n id, tenant_id, parent_id, name, path, kind, size, mime_type,\n s3_key, owner_id, metadata\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11::jsonb)`,\n [\n id,\n input.tenantId,\n input.parentId,\n name,\n path,\n input.kind,\n input.kind === \"folder\" ? 0 : input.size,\n input.kind === \"folder\" ? \"\" : input.mimeType,\n input.kind === \"folder\" ? \"\" : input.s3Key,\n input.ownerId,\n JSON.stringify(input.metadata ?? {}),\n ],\n );\n } catch (e) {\n if (e instanceof Error && /nodes_unique_live/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${name}' already exists in this folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"createNode failed\",\n retryable: false,\n }),\n );\n }\n\n const created = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes WHERE id = $1 AND tenant_id = $2`,\n [id, input.tenantId],\n );\n if (created.rows.length === 0) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Row missing immediately after insert\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(created.rows[0]!));\n },\n\n async getNode(\n input: GetNodeInput,\n ): Promise<Result<FileNode | null, FileSystemError>> {\n await ensureInitialized();\n const res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n return ok(res.rows[0] ? rowToFileNode(res.rows[0]) : null);\n },\n\n async listChildren(\n input: ListChildrenInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n await ensureInitialized();\n const limit = input.limit ?? 1000;\n const cursor = decodeCursor(input.cursor);\n const res = cursor\n ? await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND parent_id IS NOT DISTINCT FROM $2\n AND deleted_at IS NULL\n AND (lower(name) > lower($3) OR (lower(name) = lower($3) AND id::text > $4))\n ORDER BY lower(name) ASC, id ASC\n LIMIT $5`,\n [input.tenantId, input.parentId, cursor.n, cursor.i, limit],\n )\n : await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND parent_id IS NOT DISTINCT FROM $2\n AND deleted_at IS NULL\n ORDER BY lower(name) ASC, id ASC\n LIMIT $3`,\n [input.tenantId, input.parentId, limit],\n );\n const items = res.rows.map(rowToFileNode);\n return ok({\n items,\n nextCursor: pageCursor(items, limit),\n });\n },\n\n async moveNode(\n input: MoveNodeInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n await ensureInitialized();\n const currentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n const current = currentRes.rows[0];\n if (!current) return notFound(input.id);\n\n const normalized = normalizeNodeName(input.newName ?? current.name);\n if (!normalized.ok) return normalized;\n const newName = normalized.value;\n\n // Validate the new parent (if any). `!= null` (NOT `!== null`)\n // so both null and undefined skip the block.\n let newParentPath: string | null = null;\n if (input.newParentId != null) {\n if (input.newParentId === current.id) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into itself\",\n retryable: false,\n }),\n );\n }\n const newParentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.newParentId, input.tenantId],\n );\n const newParent = newParentRes.rows[0];\n if (!newParent) return notFound(input.newParentId);\n if (newParent.kind !== \"folder\") {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Destination ${input.newParentId} is not a folder`,\n retryable: false,\n }),\n );\n }\n // Cycle: newParent must not be a descendant of current.\n if (\n newParent.path === current.path ||\n newParent.path.startsWith(`${current.path}/`)\n ) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"Cannot move a folder into its own descendant\",\n retryable: false,\n }),\n );\n }\n newParentPath = newParent.path;\n }\n\n const newPath =\n newParentPath === null ? `/${newName}` : `${newParentPath}/${newName}`;\n\n try {\n await withTx(input.tenantId, async (client) => {\n await client.query(\n `UPDATE \"${schema}\".nodes\n SET parent_id = $1, name = $2, path = $3, updated_at = now()\n WHERE id = $4 AND tenant_id = $5`,\n [input.newParentId, newName, newPath, input.id, input.tenantId],\n );\n if (current.path !== newPath) {\n // Prefix-only replace via substring — same trick as\n // the SQLite store, but using Postgres substring()\n // (1-indexed). length($2) is the raw old path.\n // $4 is escaped so \"%\" and \"_\" stay literal.\n await client.query(\n `UPDATE \"${schema}\".nodes\n SET path = $1 || substring(path FROM length($2) + 1),\n updated_at = now()\n WHERE tenant_id = $3 AND path LIKE $4 || '/%' ESCAPE '\\\\'`,\n [newPath, current.path, input.tenantId, escapeLike(current.path)],\n );\n }\n });\n } catch (e) {\n if (e instanceof Error && /nodes_unique_live/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `A node named '${newName}' already exists in the destination folder`,\n retryable: false,\n }),\n );\n }\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"moveNode failed\",\n retryable: false,\n }),\n );\n }\n\n const updated = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n if (updated.rows.length === 0) {\n return err(\n new FileSystemError({\n code: \"InternalError\",\n message: \"Node missing after move\",\n retryable: false,\n }),\n );\n }\n return ok(rowToFileNode(updated.rows[0]!));\n },\n\n async deleteNode(\n input: DeleteNodeInput,\n ): Promise<Result<void, FileSystemError>> {\n await ensureInitialized();\n const nodeRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n const node = nodeRes.rows[0];\n if (!node) return notFound(input.id);\n\n if (node.kind === \"folder\" && !input.recursive) {\n const childRes = await q(input.tenantId,\n `SELECT 1 FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND parent_id = $2 AND deleted_at IS NULL\n LIMIT 1`,\n [input.tenantId, input.id],\n );\n if (childRes.rows.length > 0) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: `Folder '${node.name}' is not empty; pass recursive: true to delete the subtree`,\n retryable: false,\n }),\n );\n }\n }\n\n if (input.recursive || node.kind === \"file\") {\n await q(input.tenantId,\n `UPDATE \"${schema}\".nodes\n SET deleted_at = now(), updated_at = now()\n WHERE tenant_id = $1 AND (id = $2 OR path LIKE $3 || '/%' ESCAPE '\\\\')\n AND deleted_at IS NULL`,\n [input.tenantId, input.id, escapeLike(node.path)],\n );\n } else {\n await q(input.tenantId,\n `UPDATE \"${schema}\".nodes\n SET deleted_at = now(), updated_at = now()\n WHERE id = $1 AND tenant_id = $2`,\n [input.id, input.tenantId],\n );\n }\n return ok(undefined);\n },\n\n async purgeNode(input: {\n tenantId: TenantId;\n id: string;\n }): Promise<Result<{ s3Keys: ReadonlyArray<string> }, FileSystemError>> {\n await ensureInitialized();\n const nodeRes = await q<{ id: string; path: string }>(input.tenantId,\n `SELECT id, path FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NOT NULL`,\n [input.id, input.tenantId],\n );\n const node = nodeRes.rows[0];\n if (!node) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Trashed node ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n const like = `${escapeLike(node.path)}/%`;\n const files = await q<{ s3_key: string }>(input.tenantId,\n `SELECT s3_key FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL AND kind = 'file' AND s3_key <> ''\n AND (id = $2 OR path LIKE $3 ESCAPE '\\\\')`,\n [input.tenantId, input.id, like],\n );\n await q(input.tenantId,\n `DELETE FROM \"${schema}\".shares WHERE tenant_id = $1 AND node_id IN (\n SELECT id FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL AND (id = $2 OR path LIKE $3 ESCAPE '\\\\')\n )`,\n [input.tenantId, input.id, like],\n );\n await q(input.tenantId,\n `DELETE FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL AND (id = $2 OR path LIKE $3 ESCAPE '\\\\')`,\n [input.tenantId, input.id, like],\n );\n return ok({ s3Keys: files.rows.map((row) => row.s3_key) });\n },\n\n async updateMetadata(\n input: UpdateMetadataInput,\n ): Promise<Result<FileNode, FileSystemError>> {\n await ensureInitialized();\n const exists = await q(input.tenantId,\n `SELECT 1 FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.id, input.tenantId],\n );\n if (exists.rows.length === 0) return notFound(input.id);\n\n // Replace or merge via JSONB concat. The `||` operator\n // merges with right-hand keys winning on conflict.\n const sql = input.replace\n ? `UPDATE \"${schema}\".nodes\n SET metadata = $1::jsonb, updated_at = now()\n WHERE id = $2 AND tenant_id = $3`\n : `UPDATE \"${schema}\".nodes\n SET metadata = metadata || $1::jsonb, updated_at = now()\n WHERE id = $2 AND tenant_id = $3`;\n await q(input.tenantId, sql, [\n JSON.stringify(input.metadata),\n input.id,\n input.tenantId,\n ]);\n\n const updated = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes WHERE id = $1 AND tenant_id = $2`,\n [input.id, input.tenantId],\n );\n if (updated.rows.length === 0) return notFound(input.id);\n return ok(rowToFileNode(updated.rows[0]!));\n },\n\n async search(\n input: SearchInput,\n ): Promise<Result<ListChildrenOutput, FileSystemError>> {\n await ensureInitialized();\n const limit = input.limit ?? 100;\n\n // Empty query → no results (v0.2 contract). Without this,\n // `ILIKE '%%'` would match every node in the tenant.\n if (input.query.length === 0) {\n return ok({ items: [], nextCursor: undefined });\n }\n\n const pattern = `%${escapeLike(input.query)}%`;\n\n let res;\n if (input.parentId === undefined) {\n // No scope: search the whole tenant.\n res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL\n AND name ILIKE $2 ESCAPE '\\\\'\n ORDER BY lower(name) ASC\n LIMIT $3`,\n [input.tenantId, pattern, limit],\n );\n } else {\n const parentRes = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.parentId, input.tenantId],\n );\n const parent = parentRes.rows[0];\n if (!parent) return notFound(input.parentId);\n // Root's subtree is the whole tenant — use the unscoped query.\n if (parent.path === \"/\") {\n res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL\n AND name ILIKE $2 ESCAPE '\\\\'\n ORDER BY lower(name) ASC\n LIMIT $3`,\n [input.tenantId, pattern, limit],\n );\n } else {\n res = await q<NodeRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL\n AND (id = $2 OR path LIKE $3 || '/%' ESCAPE '\\\\')\n AND name ILIKE $4 ESCAPE '\\\\'\n ORDER BY lower(name) ASC\n LIMIT $5`,\n [input.tenantId, input.parentId, escapeLike(parent.path), pattern, limit],\n );\n }\n }\n return ok({\n items: res.rows.map(rowToFileNode),\n nextCursor: res.rows.length === limit ? String(limit) : undefined,\n });\n },\n\n async getPath(\n input: GetPathInput,\n ): Promise<Result<{ segments: FileNode[] }, FileSystemError>> {\n await ensureInitialized();\n // Recursive CTE walks up the parent chain in one query.\n // Includes tombstoned ancestors to match the memory/SQLite\n // behavior (no gaps even if a mid-chain parent is deleted).\n const res = await q<NodeRow>(input.tenantId,\n `WITH RECURSIVE chain AS (\n SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2\n UNION ALL\n SELECT n.* FROM \"${schema}\".nodes n\n JOIN chain c ON n.id = c.parent_id\n WHERE n.tenant_id = $2\n )\n SELECT * FROM chain ORDER BY path ASC`,\n [input.id, input.tenantId],\n );\n if (res.rows.length === 0) return notFound(input.id);\n return ok({ segments: res.rows.map(rowToFileNode) });\n },\n\n async enqueueOrphan(input) {\n await ensureInitialized();\n const id = makeId();\n try {\n await q(input.tenantId,\n `INSERT INTO \"${schema}\".pending_orphans (\n id, tenant_id, s3_key, metadata_id, reason\n ) VALUES ($1, $2, $3, $4, $5)`,\n [\n id,\n input.tenantId,\n input.s3Key,\n input.metadataId ?? null,\n input.reason,\n ],\n );\n return ok({ id });\n } catch (error) {\n return err(FileSystemError.fromPg(error));\n }\n },\n\n async listPendingOrphans(input) {\n await ensureInitialized();\n try {\n const result = await q<OrphanRow>(input.tenantId,\n `SELECT * FROM \"${schema}\".pending_orphans\n WHERE tenant_id = $1\n ORDER BY created_at ASC, id ASC`,\n [input.tenantId],\n );\n return ok(result.rows.map(rowToPendingOrphan));\n } catch (error) {\n return err(FileSystemError.fromPg(error));\n }\n },\n\n async deleteOrphan(input) {\n await ensureInitialized();\n try {\n const result = await q(input.tenantId,\n `DELETE FROM \"${schema}\".pending_orphans\n WHERE tenant_id = $1 AND id = $2`,\n [input.tenantId, input.id],\n );\n if (result.rowCount === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Orphan ${input.id} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n } catch (error) {\n return err(FileSystemError.fromPg(error));\n }\n },\n\n async reconcile(): Promise<Result<ReconcileResult, FileSystemError>> {\n await ensureInitialized();\n return ok({ orphansInStore: [], orphansInS3: [], scanned: 0 });\n },\n\n async restoreNode(input) {\n await ensureInitialized();\n try {\n const res = await q<NodeRow>(\n input.tenantId,\n `UPDATE \"${schema}\".nodes\n SET deleted_at = NULL, updated_at = now()\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NOT NULL\n RETURNING *`,\n [input.id, input.tenantId],\n );\n if (!res.rows[0]) return notFound(input.id);\n return ok(rowToFileNode(res.rows[0]));\n } catch (e) {\n if (e instanceof Error && /nodes_unique_live/.test(e.message)) {\n return err(\n new FileSystemError({\n code: \"Conflict\",\n message: \"A live node with this name already exists in the folder\",\n retryable: false,\n }),\n );\n }\n return err(FileSystemError.fromPg(e));\n }\n },\n\n async listTrash(input) {\n await ensureInitialized();\n const limit = input.limit ?? 1000;\n const cursor = decodeCursor(input.cursor);\n const res = cursor\n ? await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL\n AND (lower(name) > lower($2) OR (lower(name) = lower($2) AND id::text > $3))\n ORDER BY lower(name) ASC, id ASC\n LIMIT $4`,\n [input.tenantId, cursor.n, cursor.i, limit],\n )\n : await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NOT NULL\n ORDER BY lower(name) ASC, id ASC\n LIMIT $2`,\n [input.tenantId, limit],\n );\n const items = res.rows.map(rowToFileNode);\n return ok({ items, nextCursor: pageCursor(items, limit) });\n },\n\n async scanFileKeys(input) {\n await ensureInitialized();\n const res = await q<{ id: string; s3_key: string }>(\n input.tenantId,\n `SELECT id, s3_key FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL AND kind = 'file' AND s3_key <> ''`,\n [input.tenantId],\n );\n return ok(res.rows.map((r) => ({ id: r.id, s3Key: r.s3_key })));\n },\n\n async sumSize(input) {\n await ensureInitialized();\n const res = await q<{ c: string }>(\n input.tenantId,\n `SELECT COALESCE(SUM(size), 0)::text AS c FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND deleted_at IS NULL AND kind = 'file'`,\n [input.tenantId],\n );\n return ok(Number.parseInt(res.rows[0]?.c ?? \"0\", 10));\n },\n\n async findByS3Key(input) {\n await ensureInitialized();\n const res = await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE tenant_id = $1 AND s3_key = $2 AND deleted_at IS NULL\n LIMIT 1`,\n [input.tenantId, input.s3Key],\n );\n return ok(res.rows[0] ? rowToFileNode(res.rows[0]) : null);\n },\n\n async createShare(input) {\n await ensureInitialized();\n const node = await q<NodeRow>(\n input.tenantId,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [input.nodeId, input.tenantId],\n );\n if (!node.rows[0]) return notFound(input.nodeId);\n const token = makeId();\n await q(\n input.tenantId,\n `INSERT INTO \"${schema}\".shares (token, tenant_id, node_id, expires_at)\n VALUES ($1, $2, $3, $4)`,\n [token, input.tenantId, input.nodeId, input.expiresAt ?? null],\n );\n return ok({ token });\n },\n\n async resolveShare(input) {\n await ensureInitialized();\n const share = await pool.query<{\n tenant_id: string;\n node_id: string;\n expires_at: Date | null;\n }>(\n `SELECT tenant_id, node_id, expires_at FROM \"${schema}\".shares WHERE token = $1`,\n [input.token],\n );\n const row = share.rows[0];\n if (!row) return ok(null);\n if (row.expires_at && row.expires_at.getTime() < Date.now()) return ok(null);\n const node = await q<NodeRow>(\n row.tenant_id,\n `SELECT * FROM \"${schema}\".nodes\n WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL`,\n [row.node_id, row.tenant_id],\n );\n return ok(node.rows[0] ? rowToFileNode(node.rows[0]) : null);\n },\n\n async revokeShare(input) {\n await ensureInitialized();\n const result = await pool.query(\n `DELETE FROM \"${schema}\".shares WHERE token = $1 AND tenant_id = $2`,\n [input.token, input.tenantId],\n );\n if (result.rowCount === 0) {\n return err(\n new FileSystemError({\n code: \"NotFound\",\n message: `Share ${input.token} not found`,\n retryable: false,\n }),\n );\n }\n return ok(undefined);\n },\n };\n};\n\nexport { asTenantId, asUserId };\n"]}
|