@nestm/storage 0.1.0-alpha.7 → 0.1.0-alpha.8

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.
Files changed (74) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +217 -18
  3. package/SECURITY.md +34 -5
  4. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +14 -3
  5. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -1
  6. package/dist/ai-sdk/ai-sdk-workspace-tools.js +54 -23
  7. package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -1
  8. package/dist/ai-sdk/index.d.ts +1 -1
  9. package/dist/ai-sdk/index.d.ts.map +1 -1
  10. package/dist/ai-sdk/index.js.map +1 -1
  11. package/dist/files-sdk/files-sdk.driver.d.ts +54 -10
  12. package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
  13. package/dist/files-sdk/files-sdk.driver.js +784 -63
  14. package/dist/files-sdk/files-sdk.driver.js.map +1 -1
  15. package/dist/files-sdk/fs/index.d.ts +4 -4
  16. package/dist/files-sdk/fs/index.d.ts.map +1 -1
  17. package/dist/files-sdk/fs/index.js +242 -9
  18. package/dist/files-sdk/fs/index.js.map +1 -1
  19. package/dist/files-sdk/index.d.ts +1 -1
  20. package/dist/files-sdk/index.d.ts.map +1 -1
  21. package/dist/files-sdk/index.js.map +1 -1
  22. package/dist/files-sdk/provider/index.d.ts +9 -5
  23. package/dist/files-sdk/provider/index.d.ts.map +1 -1
  24. package/dist/files-sdk/provider/index.js +53 -15
  25. package/dist/files-sdk/provider/index.js.map +1 -1
  26. package/dist/files-sdk/s3/construction-metadata.d.ts +7 -0
  27. package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
  28. package/dist/files-sdk/s3/construction-metadata.js +13 -0
  29. package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
  30. package/dist/files-sdk/s3/index.d.ts +39 -19
  31. package/dist/files-sdk/s3/index.d.ts.map +1 -1
  32. package/dist/files-sdk/s3/index.js +936 -113
  33. package/dist/files-sdk/s3/index.js.map +1 -1
  34. package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
  35. package/dist/gateway/storage-gateway.controller.js +25 -5
  36. package/dist/gateway/storage-gateway.controller.js.map +1 -1
  37. package/dist/storage-etag.d.ts +13 -0
  38. package/dist/storage-etag.d.ts.map +1 -0
  39. package/dist/storage-etag.js +31 -0
  40. package/dist/storage-etag.js.map +1 -0
  41. package/dist/storage.client.d.ts +3 -1
  42. package/dist/storage.client.d.ts.map +1 -1
  43. package/dist/storage.client.js +87 -22
  44. package/dist/storage.client.js.map +1 -1
  45. package/dist/storage.driver.d.ts +21 -1
  46. package/dist/storage.driver.d.ts.map +1 -1
  47. package/dist/storage.driver.js.map +1 -1
  48. package/dist/storage.types.d.ts +90 -19
  49. package/dist/storage.types.d.ts.map +1 -1
  50. package/dist/storage.types.js.map +1 -1
  51. package/dist/testing/index.d.ts +1 -0
  52. package/dist/testing/index.d.ts.map +1 -1
  53. package/dist/testing/index.js +1 -0
  54. package/dist/testing/index.js.map +1 -1
  55. package/dist/testing/provider-conformance.d.ts +65 -0
  56. package/dist/testing/provider-conformance.d.ts.map +1 -0
  57. package/dist/testing/provider-conformance.js +853 -0
  58. package/dist/testing/provider-conformance.js.map +1 -0
  59. package/dist/workspace/index.d.ts +1 -0
  60. package/dist/workspace/index.d.ts.map +1 -1
  61. package/dist/workspace/index.js +1 -0
  62. package/dist/workspace/index.js.map +1 -1
  63. package/dist/workspace/storage-workspace.cursor.d.ts +68 -3
  64. package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -1
  65. package/dist/workspace/storage-workspace.cursor.js +402 -39
  66. package/dist/workspace/storage-workspace.cursor.js.map +1 -1
  67. package/dist/workspace/storage-workspace.d.ts.map +1 -1
  68. package/dist/workspace/storage-workspace.js +54 -46
  69. package/dist/workspace/storage-workspace.js.map +1 -1
  70. package/dist/workspace/storage-workspace.types.d.ts +10 -2
  71. package/dist/workspace/storage-workspace.types.d.ts.map +1 -1
  72. package/dist/workspace/storage-workspace.types.js +1 -0
  73. package/dist/workspace/storage-workspace.types.js.map +1 -1
  74. package/package.json +3 -3
@@ -2,8 +2,10 @@ import { createHash, randomUUID } from 'node:crypto';
2
2
  import { constants as fsConstants } from 'node:fs';
3
3
  import * as fsp from 'node:fs/promises';
4
4
  import path from 'node:path';
5
+ import { Readable } from 'node:stream';
5
6
  import { fs } from 'files-sdk/fs';
6
7
  import { StorageError, StorageErrorCode } from '../../storage.error.js';
8
+ import { isCanonicalStorageEtag, normalizeProviderStorageEtag, } from '../../storage-etag.js';
7
9
  import { createFilesSdkDriver, } from '../files-sdk.driver.js';
8
10
  const SIDECAR_SUFFIX = '.meta.json';
9
11
  const TEMP_SUFFIX = '.fls-part';
@@ -27,7 +29,6 @@ function storageFsError(error, key, operation) {
27
29
  ? StorageErrorCode.UNAUTHORIZED
28
30
  : StorageErrorCode.PROVIDER;
29
31
  return new StorageError(`Filesystem ${operation} failed for "${key}".`, {
30
- cause: error,
31
32
  code,
32
33
  key,
33
34
  operation,
@@ -116,7 +117,6 @@ function assertActive(runtime, key) {
116
117
  ? `Filesystem mutation timed out for "${key}".`
117
118
  : `Filesystem mutation was aborted for "${key}".`, {
118
119
  aborted: true,
119
- cause: runtime.signal.reason,
120
120
  code: timedOut ? StorageErrorCode.TIMEOUT : StorageErrorCode.ABORTED,
121
121
  key,
122
122
  permanent: true,
@@ -265,7 +265,16 @@ async function readSidecar(target, key) {
265
265
  permanent: true,
266
266
  });
267
267
  }
268
- return parsed;
268
+ const sidecar = parsed;
269
+ const etag = normalizeProviderStorageEtag(sidecar.etag);
270
+ if (etag === undefined) {
271
+ throw new StorageError(`Filesystem metadata is invalid for "${key}".`, {
272
+ code: StorageErrorCode.PROVIDER,
273
+ key,
274
+ permanent: true,
275
+ });
276
+ }
277
+ return { ...sidecar, etag };
269
278
  }
270
279
  finally {
271
280
  await handle.close();
@@ -381,7 +390,7 @@ async function stageBody(directory, key, body, options, runtime) {
381
390
  await staged.handle.sync();
382
391
  await staged.handle.close();
383
392
  return {
384
- etag: `"${hash.digest('hex')}"`,
393
+ etag: hash.digest('hex'),
385
394
  path: staged.path,
386
395
  size,
387
396
  };
@@ -427,8 +436,8 @@ async function serializeFsKey(lockKey, operation) {
427
436
  }
428
437
  }
429
438
  /**
430
- * Adds symlink-defended reads and process-local conditional mutations to a
431
- * files-sdk fs adapter.
439
+ * Adds symlink-defended reads and process-local exact conditional operations
440
+ * to a files-sdk fs adapter.
432
441
  *
433
442
  * The configured root must be dedicated to this driver: no other process and
434
443
  * no unconditional filesystem writer may mutate it concurrently. Each call
@@ -446,17 +455,136 @@ export function withFsConditionalMutation(base) {
446
455
  const head = base.head.bind(base);
447
456
  const list = base.list.bind(base);
448
457
  const serialize = (key, operation) => serializeFsKey(`${root}\0${key.normalize('NFC').toLowerCase()}`, operation);
458
+ const serializePair = (first, second, operation) => {
459
+ const identity = (key) => key.normalize('NFC').toLowerCase();
460
+ if (identity(first) === identity(second)) {
461
+ throw new StorageError('Conditional filesystem copy requires distinct source and destination keys.', {
462
+ code: StorageErrorCode.INVALID_ARGUMENT,
463
+ key: first,
464
+ operation: 'copy',
465
+ permanent: true,
466
+ });
467
+ }
468
+ const ordered = [first, second].sort((left, right) => identity(left).localeCompare(identity(right)));
469
+ const [headKey, tailKey] = ordered;
470
+ if (headKey === undefined || tailKey === undefined) {
471
+ throw new StorageError('Conditional filesystem copy requires distinct source and destination keys.', {
472
+ code: StorageErrorCode.INVALID_ARGUMENT,
473
+ key: first,
474
+ operation: 'copy',
475
+ permanent: true,
476
+ });
477
+ }
478
+ return serialize(headKey, () => serialize(tailKey, operation));
479
+ };
480
+ const assertEtag = (value, label, key, operation) => {
481
+ if (!isCanonicalStorageEtag(value)) {
482
+ throw new StorageError(`${label} must be a canonical storage ETag.`, {
483
+ code: StorageErrorCode.INVALID_ARGUMENT,
484
+ key,
485
+ operation,
486
+ permanent: true,
487
+ });
488
+ }
489
+ };
449
490
  return Object.assign(base, {
450
- conditionalMutation: Object.freeze({
491
+ conditionalCreate: Object.freeze({ resultEtag: true }),
492
+ conditionalReplace: Object.freeze({ resultEtag: true }),
493
+ conditionalDelete: Object.freeze({ etag: true }),
494
+ conditionalRead: Object.freeze({ etag: true, version: false }),
495
+ conditionalCopySource: Object.freeze({ etag: true, version: false }),
496
+ conditionalCopyDestination: Object.freeze({
497
+ atomicWithSource: true,
451
498
  create: true,
452
- delete: true,
453
- etag: true,
454
499
  replace: true,
455
500
  }),
501
+ physicalKey: Object.freeze({ maxBytes: 4096 }),
456
502
  async download(key, options) {
457
503
  await assertSymlinkFreeReadPath(root, key);
458
504
  return download(key, options);
459
505
  },
506
+ async downloadConditional(key, options) {
507
+ if (options.condition.etag !== undefined) {
508
+ assertEtag(options.condition.etag, 'condition.etag', key, 'download');
509
+ }
510
+ if (options.condition.version !== undefined) {
511
+ throw new StorageError('The filesystem provider has no immutable object versions.', {
512
+ code: StorageErrorCode.NOT_SUPPORTED,
513
+ key,
514
+ operation: 'download',
515
+ permanent: true,
516
+ });
517
+ }
518
+ return serialize(key, async () => {
519
+ let handle;
520
+ try {
521
+ const runtime = runtimeOf(options);
522
+ const segments = strictSegments(key);
523
+ const bodyPath = await ensureParents(root, segments, key, false, runtime);
524
+ const sidecarPath = bodyPath + SIDECAR_SUFFIX;
525
+ if ((await regularFileOrMissing(bodyPath, key)) === undefined ||
526
+ (await regularFileOrMissing(sidecarPath, key)) === undefined) {
527
+ notFound(key);
528
+ }
529
+ const sidecar = await readSidecar(sidecarPath, key);
530
+ if (options.condition.etag !== undefined &&
531
+ sidecar.etag !== options.condition.etag) {
532
+ conflict(key);
533
+ }
534
+ assertActive(runtime, key);
535
+ handle = await fsp.open(bodyPath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
536
+ const stat = await handle.stat();
537
+ if (!stat.isFile() || stat.nlink !== 1) {
538
+ invalidFsPath(key, 'an object path is not a regular file');
539
+ }
540
+ const start = options.range?.start ?? 0;
541
+ const requestedEnd = options.range?.end ?? Math.max(0, stat.size - 1);
542
+ const end = Math.min(requestedEnd, Math.max(0, stat.size - 1));
543
+ const size = start >= stat.size ? 0 : Math.max(0, end - start + 1);
544
+ if (size === 0) {
545
+ await handle.close();
546
+ handle = undefined;
547
+ return {
548
+ body: new ReadableStream({
549
+ start(controller) {
550
+ controller.close();
551
+ },
552
+ }),
553
+ contentType: sidecar.contentType,
554
+ etag: sidecar.etag,
555
+ key,
556
+ lastModified: new Date(sidecar.lastModified),
557
+ ...(sidecar.metadata !== undefined && {
558
+ metadata: { ...sidecar.metadata },
559
+ }),
560
+ name: path.basename(key),
561
+ size: 0,
562
+ };
563
+ }
564
+ const nodeStream = handle.createReadStream({
565
+ autoClose: true,
566
+ ...(options.range !== undefined && { end, start }),
567
+ });
568
+ handle = undefined;
569
+ return {
570
+ body: Readable.toWeb(nodeStream),
571
+ contentType: sidecar.contentType,
572
+ etag: sidecar.etag,
573
+ key,
574
+ lastModified: new Date(sidecar.lastModified),
575
+ ...(sidecar.metadata !== undefined && {
576
+ metadata: { ...sidecar.metadata },
577
+ }),
578
+ name: path.basename(key),
579
+ size,
580
+ };
581
+ }
582
+ catch (error) {
583
+ await handle?.close().catch(() => undefined);
584
+ throw storageFsError(error, key, 'download');
585
+ }
586
+ });
587
+ },
460
588
  async exists(key, options) {
461
589
  await assertSymlinkFreeReadPath(root, key);
462
590
  return exists(key, options);
@@ -473,6 +601,7 @@ export function withFsConditionalMutation(base) {
473
601
  return result;
474
602
  },
475
603
  async deleteConditional(key, options) {
604
+ assertEtag(options.condition.etag, 'condition.etag', key, 'delete');
476
605
  return serialize(key, async () => {
477
606
  const runtime = runtimeOf(options);
478
607
  try {
@@ -508,7 +637,111 @@ export function withFsConditionalMutation(base) {
508
637
  }
509
638
  });
510
639
  },
640
+ async promote(sourceKey, destinationKey, options) {
641
+ const destination = options.destination;
642
+ if (destination !== undefined &&
643
+ (typeof destination !== 'object' ||
644
+ destination === null ||
645
+ (destination.type !== 'create' && destination.type !== 'replace'))) {
646
+ throw new StorageError('destination.type must be "create" or "replace".', {
647
+ code: StorageErrorCode.INVALID_ARGUMENT,
648
+ key: destinationKey,
649
+ operation: 'copy',
650
+ permanent: true,
651
+ });
652
+ }
653
+ if (options.sourceEtag !== undefined) {
654
+ assertEtag(options.sourceEtag, 'sourceEtag', sourceKey, 'copy');
655
+ }
656
+ if (destination?.type === 'replace') {
657
+ assertEtag(destination.etag, 'destination.etag', destinationKey, 'copy');
658
+ }
659
+ if (options.sourceVersion !== undefined) {
660
+ throw new StorageError('The filesystem provider has no immutable object versions.', {
661
+ code: StorageErrorCode.NOT_SUPPORTED,
662
+ key: sourceKey,
663
+ operation: 'copy',
664
+ permanent: true,
665
+ });
666
+ }
667
+ return serializePair(sourceKey, destinationKey, async () => {
668
+ let bodyTemp;
669
+ let sidecarTemp;
670
+ const runtime = runtimeOf(options);
671
+ try {
672
+ const sourceSegments = strictSegments(sourceKey);
673
+ const destinationSegments = strictSegments(destinationKey);
674
+ const sourcePath = await ensureParents(root, sourceSegments, sourceKey, false, runtime);
675
+ const sourceSidecarPath = sourcePath + SIDECAR_SUFFIX;
676
+ if ((await regularFileOrMissing(sourcePath, sourceKey)) === undefined ||
677
+ (await regularFileOrMissing(sourceSidecarPath, sourceKey)) ===
678
+ undefined) {
679
+ notFound(sourceKey);
680
+ }
681
+ const sourceSidecar = await readSidecar(sourceSidecarPath, sourceKey);
682
+ if (options.sourceEtag !== undefined &&
683
+ sourceSidecar.etag !== options.sourceEtag) {
684
+ conflict(sourceKey);
685
+ }
686
+ const destinationPath = await ensureParents(root, destinationSegments, destinationKey, true, runtime);
687
+ const destinationSidecarPath = destinationPath + SIDECAR_SUFFIX;
688
+ const assertDestination = async () => {
689
+ const body = await regularFileOrMissing(destinationPath, destinationKey);
690
+ const sidecar = await regularFileOrMissing(destinationSidecarPath, destinationKey);
691
+ if (options.destination?.type === 'create') {
692
+ if (body !== undefined || sidecar !== undefined) {
693
+ conflict(destinationKey);
694
+ }
695
+ return;
696
+ }
697
+ if (options.destination?.type === 'replace') {
698
+ if (body === undefined || sidecar === undefined) {
699
+ notFound(destinationKey);
700
+ }
701
+ if ((await readSidecar(destinationSidecarPath, destinationKey))
702
+ .etag !== options.destination.etag) {
703
+ conflict(destinationKey);
704
+ }
705
+ }
706
+ };
707
+ await assertDestination();
708
+ const staged = await openTemp(path.dirname(destinationPath));
709
+ await staged.handle.close();
710
+ bodyTemp = staged.path;
711
+ await fsp.copyFile(sourcePath, bodyTemp);
712
+ const lastModified = Date.now();
713
+ sidecarTemp = await stageSidecar(path.dirname(destinationPath), {
714
+ ...sourceSidecar,
715
+ lastModified,
716
+ });
717
+ assertActive(runtime, sourceKey);
718
+ if ((await regularFileOrMissing(sourcePath, sourceKey)) === undefined ||
719
+ (await regularFileOrMissing(sourceSidecarPath, sourceKey)) ===
720
+ undefined ||
721
+ (options.sourceEtag !== undefined &&
722
+ (await readSidecar(sourceSidecarPath, sourceKey)).etag !==
723
+ options.sourceEtag)) {
724
+ conflict(sourceKey);
725
+ }
726
+ await assertDestination();
727
+ await fsp.rename(bodyTemp, destinationPath);
728
+ bodyTemp = undefined;
729
+ await fsp.rename(sidecarTemp, destinationSidecarPath);
730
+ sidecarTemp = undefined;
731
+ }
732
+ catch (error) {
733
+ throw storageFsError(error, sourceKey, 'copy');
734
+ }
735
+ finally {
736
+ await removeTemp(bodyTemp).catch(() => undefined);
737
+ await removeTemp(sidecarTemp).catch(() => undefined);
738
+ }
739
+ });
740
+ },
511
741
  async uploadConditional(key, body, options) {
742
+ if (options.condition.type === 'replace') {
743
+ assertEtag(options.condition.etag, 'condition.etag', key, 'upload');
744
+ }
512
745
  return serialize(key, async () => {
513
746
  let bodyTemp;
514
747
  let sidecarTemp;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/files-sdk/fs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,IAAI,WAAW,EAAc,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,OAAO,EAAE,EAAE,EAAyC,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAOxE,OAAO,EACL,oBAAoB,GAIrB,MAAM,wBAAwB,CAAC;AAWhC,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AAgBtC,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CACrB,KAAc,EACd,GAAW,EACX,SAA8B;IAE9B,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,IAAI,GACR,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS;QACjD,CAAC,CAAC,gBAAgB,CAAC,SAAS;QAC5B,CAAC,CAAC,UAAU,KAAK,QAAQ;YACvB,CAAC,CAAC,gBAAgB,CAAC,QAAQ;YAC3B,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO;gBACjD,CAAC,CAAC,gBAAgB,CAAC,YAAY;gBAC/B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IACpC,OAAO,IAAI,YAAY,CAAC,cAAc,SAAS,gBAAgB,GAAG,IAAI,EAAE;QACtE,KAAK,EAAE,KAAK;QACZ,IAAI;QACJ,GAAG;QACH,SAAS;QACT,SAAS,EACP,IAAI,KAAK,gBAAgB,CAAC,SAAS;YACnC,IAAI,KAAK,gBAAgB,CAAC,QAAQ;YAClC,IAAI,KAAK,gBAAgB,CAAC,YAAY;KACzC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,OAAe;IACjD,MAAM,IAAI,YAAY,CAAC,mCAAmC,OAAO,GAAG,EAAE;QACpE,IAAI,EAAE,gBAAgB,CAAC,gBAAgB;QACvC,GAAG;QACH,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,aAAa,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,aAAa,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IACE,QAAQ,CAAC,IAAI,CACX,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CACzE,EACD,CAAC;QACD,aAAa,CAAC,GAAG,EAAE,kDAAkD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvD,aAAa,CAAC,GAAG,EAAE,oDAAoD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChE,aAAa,CAAC,GAAG,EAAE,kDAAkD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,IAAI,YAAY,CACrB,2BAA2B,GAAG,4BAA4B,EAC1D;QACE,IAAI,EAAE,gBAAgB,CAAC,gBAAgB;QACvC,GAAG;QACH,SAAS,EAAE,IAAI;KAChB,CACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,OAAe;IACrD,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE;QAC9B,IAAI,EAAE,gBAAgB,CAAC,aAAa;QACpC,GAAG;QACH,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,IAAI,YAAY,CAAC,wCAAwC,GAAG,IAAI,EAAE;QACtE,IAAI,EAAE,gBAAgB,CAAC,QAAQ;QAC/B,GAAG;QACH,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,IAAI,YAAY,CAAC,mBAAmB,GAAG,kBAAkB,EAAE;QAC/D,IAAI,EAAE,gBAAgB,CAAC,SAAS;QAChC,GAAG;QACH,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,OAAgC;IACjD,MAAM,aAAa,GACjB,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,MAAM,EACJ,OAAO,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,aAAa,KAAK,SAAS;gBAC3B,CAAC,CAAC,OAAO,CAAC,MAAM;gBAChB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACxD,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAyB,EAAE,GAAW;IAC1D,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GACZ,OAAO,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI;QACvC,OAAO,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,MAAM,IAAI,YAAY,CACpB,QAAQ;QACN,CAAC,CAAC,sCAAsC,GAAG,IAAI;QAC/C,CAAC,CAAC,wCAAwC,GAAG,IAAI,EACnD;QACE,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QAC5B,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO;QACpE,GAAG;QACH,SAAS,EAAE,IAAI;QACf,QAAQ;KACT,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,GAAW;IACjD,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,aAAa,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,QAA2B,EAC3B,GAAW,EACX,MAAe,EACf,OAAyB;IAEzB,MAAM,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3B,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,IAAW,CAAC;QAChB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACzC,MAAM,UAAU,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,aAAa,CAAC,GAAG,EAAE,qCAAqC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,MAAc,EACd,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,aAAa,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACrB,aAAa,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,IAAY,EACZ,GAAW;IAEX,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,QAAe,CAAC;IACpB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9B,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,aAAa,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,IAAW,CAAC;QAChB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YAC/D,aAAa,CACX,GAAG,EACH,IAAI;gBACF,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,qCAAqC,CAC1C,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAC7B,aAAa,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,GAAG,cAAc,EAAE,GAAG,CAAC,CAAC;IAC1E,IAAI,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAC9B,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,GAAW;IACpD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC3B,MAAM,EACN,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,UAAU,CAC9C,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC;YACpD,MAAM,IAAI,YAAY,CAAC,uCAAuC,GAAG,IAAI,EAAE;gBACrE,IAAI,EAAE,gBAAgB,CAAC,QAAQ;gBAC/B,GAAG;gBACH,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,IACE,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC;YACnB,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC;YAC1B,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;YACtC,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC;YAC3B,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,EACvC,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,uCAAuC,GAAG,IAAI,EAAE;gBACrE,IAAI,EAAE,gBAAgB,CAAC,QAAQ;gBAC/B,GAAG;gBACH,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAmB,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAU;IAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAU,EAAE,QAA4B;IAClE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,MAAsB,EACtB,KAAiB;IAEjB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CACzC,KAAK,EACL,MAAM,EACN,KAAK,CAAC,UAAU,GAAG,MAAM,CAC1B,CAAC;QACF,MAAM,IAAI,YAAY,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,SAAiB;IAIvC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC3B,MAAM,EACN,WAAW,CAAC,OAAO;QACjB,WAAW,CAAC,MAAM;QAClB,WAAW,CAAC,QAAQ;QACpB,WAAW,CAAC,UAAU,EACxB,KAAK,CACN,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAA0B;IAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,SAAiB,EACjB,GAAW,EACX,IAAU,EACV,OAAwC,EACxC,OAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GACb,UAAU,EAAE,UAAU,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3E,OAAO,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,IAAI,CAAC;QACH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxB,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC;YAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;YACxB,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAI,IAAmC,CAAC,SAAS,EAAE,CAAC;YAChE,IAAI,CAAC;gBACH,OAAO,IAAI,EAAE,CAAC;oBACZ,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAC3B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAClC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACf,MAAM;oBACR,CAAC;oBACD,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACzB,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClD,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QACD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI;SACL,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,SAAiB,EACjB,OAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,CACZ,MAAM,CAAC,MAAM,EACb,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAClD,CAAC;QACF,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE9D,KAAK,UAAU,cAAc,CAC3B,OAAe,EACf,SAAgC;IAEhC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACxE,IAAI,OAAO,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACzC,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,CAAC;IACf,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;QACV,IAAI,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAe;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,CAChB,GAAW,EACX,SAAgC,EACf,EAAE,CACnB,cAAc,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAE9E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC;YACjC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,IAAI;SACd,CAAC;QACF,KAAK,CAAC,QAAQ,CACZ,GAAW,EACX,OAAyB;YAEzB,MAAM,yBAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAA0B;YAClD,MAAM,yBAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,OAA0B;YAChD,MAAM,yBAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAqB;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,iBAAiB,CACrB,GAAW,EACX,OAAwC;YAExC,OAAO,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;gBAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;oBACrC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,IAAI,EACJ,QAAQ,EACR,GAAG,EACH,KAAK,EACL,OAAO,CACR,CAAC;oBACF,MAAM,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;oBAC9C,IACE,CAAC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,SAAS;wBACzD,CAAC,MAAM,oBAAoB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,SAAS,EAC5D,CAAC;wBACD,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAChB,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBACpD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;wBAC5C,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAChB,CAAC;oBAED,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAC3B,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;oBACzD,IACE,CAAC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,SAAS;wBACzD,CAAC,MAAM,oBAAoB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,SAAS;wBAC5D,CAAC,MAAM,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI;4BACxC,OAAO,CAAC,SAAS,CAAC,IAAI,EACxB,CAAC;wBACD,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAChB,CAAC;oBACD,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC3B,IAAI,CAAC;wBACH,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAChC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,iBAAiB,CACrB,GAAW,EACX,IAAU,EACV,OAAwC;YAExC,OAAO,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;gBAC/B,IAAI,QAA4B,CAAC;gBACjC,IAAI,WAA+B,CAAC;gBACpC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnC,IAAI,CAAC;oBACH,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;wBACnE,iBAAiB,CACf,GAAG,EACH,+DAA+D,CAChE,CAAC;oBACJ,CAAC;oBACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAClC,iBAAiB,CACf,GAAG,EACH,kEAAkE,CACnE,CAAC;oBACJ,CAAC;oBAED,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;oBACrC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,IAAI,EACJ,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,OAAO,CACR,CAAC;oBACF,MAAM,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;oBAC9C,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC/D,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBACrE,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACxC,IAAI,YAAY,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;4BAChE,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAChB,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,IAAI,YAAY,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;4BAChE,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAChB,CAAC;wBACD,IACE,CAAC,MAAM,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI;4BAC1C,OAAO,CAAC,SAAS,CAAC,IAAI,EACtB,CAAC;4BACD,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAChB,CAAC;oBACH,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtB,GAAG,EACH,IAAI,EACJ,OAAO,EACP,OAAO,CACR,CAAC;oBACF,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;oBACvB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAChC,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;oBAClE,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;wBACvD,WAAW;wBACX,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,YAAY;wBACZ,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI;4BACxC,YAAY,EAAE,OAAO,CAAC,YAAY;yBACnC,CAAC;wBACF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI;4BACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;yBAC3B,CAAC;qBACH,CAAC,CAAC;oBAEH,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAC3B,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;oBACzD,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC9D,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBACpE,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACxC,IAAI,WAAW,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;4BAC9D,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAChB,CAAC;oBACH,CAAC;yBAAM,IACL,WAAW,KAAK,SAAS;wBACzB,cAAc,KAAK,SAAS;wBAC5B,CAAC,MAAM,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI;4BACxC,OAAO,CAAC,SAAS,CAAC,IAAI,EACxB,CAAC;wBACD,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAChB,CAAC;oBAED,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACrC,QAAQ,GAAG,SAAS,CAAC;oBACrB,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAC3C,WAAW,GAAG,SAAS,CAAC;oBACxB,OAAO;wBACL,WAAW;wBACX,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,GAAG;wBACH,YAAY,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;wBACpC,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC7C,CAAC;wBAAS,CAAC;oBACT,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBAClD,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KAEuD,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC7D,OAAO,oBAAoB,CAAC;QAC1B,GAAG,YAAY;QACf,OAAO,EAAE,yBAAyB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\nimport { constants as fsConstants, type Stats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type {\n Body,\n DownloadOptions,\n ListOptions,\n ListResult,\n OperationOptions,\n StoredFile,\n} from 'files-sdk';\nimport { fs, type FsAdapter, type FsAdapterOptions } from 'files-sdk/fs';\n\nimport { StorageError, StorageErrorCode } from '../../storage.error.js';\nimport type {\n StorageConditionalDeleteOptions,\n StorageConditionalUploadOptions,\n StorageOperationOptions,\n StorageUploadResult,\n} from '../../storage.types.js';\nimport {\n createFilesSdkDriver,\n type FilesSdkConditionalMutationAdapter,\n type FilesSdkDriverOptions,\n type FilesSdkStorageDriver,\n} from '../files-sdk.driver.js';\n\nexport interface FsStorageDriverOptions extends Omit<\n FilesSdkDriverOptions<FsAdapter>,\n 'adapter'\n> {\n adapter: FsAdapterOptions;\n}\n\nexport type FsStorageAdapter = FsAdapter & FilesSdkConditionalMutationAdapter;\n\nconst SIDECAR_SUFFIX = '.meta.json';\nconst TEMP_SUFFIX = '.fls-part';\nconst MAX_SIDECAR_BYTES = 1024 * 1024;\n\ninterface FsSidecar {\n contentType: string;\n cacheControl?: string;\n metadata?: Record<string, string>;\n etag: string;\n lastModified: number;\n}\n\ninterface OperationRuntime {\n signal: AbortSignal | undefined;\n timeoutSignal: AbortSignal | undefined;\n callerSignal: AbortSignal | undefined;\n}\n\nfunction fsErrorCode(error: unknown): string | undefined {\n if (typeof error === 'object' && error !== null && 'code' in error) {\n return typeof error.code === 'string' ? error.code : undefined;\n }\n return undefined;\n}\n\nfunction storageFsError(\n error: unknown,\n key: string,\n operation: 'upload' | 'delete',\n): StorageError {\n if (error instanceof StorageError) {\n return error;\n }\n const systemCode = fsErrorCode(error);\n const code =\n systemCode === 'ENOENT' || systemCode === 'ENOTDIR'\n ? StorageErrorCode.NOT_FOUND\n : systemCode === 'EEXIST'\n ? StorageErrorCode.CONFLICT\n : systemCode === 'EACCES' || systemCode === 'EPERM'\n ? StorageErrorCode.UNAUTHORIZED\n : StorageErrorCode.PROVIDER;\n return new StorageError(`Filesystem ${operation} failed for \"${key}\".`, {\n cause: error,\n code,\n key,\n operation,\n permanent:\n code === StorageErrorCode.NOT_FOUND ||\n code === StorageErrorCode.CONFLICT ||\n code === StorageErrorCode.UNAUTHORIZED,\n });\n}\n\nfunction invalidFsPath(key: string, message: string): never {\n throw new StorageError(`Invalid filesystem storage key: ${message}.`, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n permanent: true,\n });\n}\n\nfunction strictSegments(key: string): string[] {\n if (key.length === 0 || key.includes('\\0')) {\n invalidFsPath(key, 'the key is empty or contains a null byte');\n }\n if (path.isAbsolute(key) || key.includes('\\\\')) {\n invalidFsPath(key, 'only relative POSIX paths are accepted');\n }\n const segments = key.split('/');\n if (\n segments.some(\n (segment) => segment.length === 0 || segment === '.' || segment === '..',\n )\n ) {\n invalidFsPath(key, 'empty, dot, and parent segments are not accepted');\n }\n if (segments.some((segment) => /[. ]$/u.test(segment))) {\n invalidFsPath(key, 'segments ending in a dot or space are not accepted');\n }\n const leaf = segments.at(-1)?.toLowerCase() ?? '';\n if (leaf.endsWith(SIDECAR_SUFFIX) || leaf.endsWith(TEMP_SUFFIX)) {\n invalidFsPath(key, 'the final segment uses a reserved adapter suffix');\n }\n return segments;\n}\n\nfunction symlinkError(key: string): StorageError {\n return new StorageError(\n `Filesystem storage key \"${key}\" crosses a symbolic link.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n permanent: true,\n },\n );\n}\n\nfunction unsupportedUpload(key: string, message: string): never {\n throw new StorageError(message, {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'upload',\n permanent: true,\n });\n}\n\nfunction conflict(key: string): never {\n throw new StorageError(`Conditional mutation conflicted for \"${key}\".`, {\n code: StorageErrorCode.CONFLICT,\n key,\n permanent: true,\n });\n}\n\nfunction notFound(key: string): never {\n throw new StorageError(`Storage object \"${key}\" was not found.`, {\n code: StorageErrorCode.NOT_FOUND,\n key,\n permanent: true,\n });\n}\n\nfunction runtimeOf(options: StorageOperationOptions): OperationRuntime {\n const timeoutSignal =\n options.timeout === undefined || options.timeout <= 0\n ? undefined\n : AbortSignal.timeout(options.timeout);\n return {\n callerSignal: options.signal,\n signal:\n options.signal === undefined\n ? timeoutSignal\n : timeoutSignal === undefined\n ? options.signal\n : AbortSignal.any([options.signal, timeoutSignal]),\n timeoutSignal,\n };\n}\n\nfunction assertActive(runtime: OperationRuntime, key: string): void {\n if (runtime.signal?.aborted !== true) {\n return;\n }\n const timedOut =\n runtime.timeoutSignal?.aborted === true &&\n runtime.callerSignal?.aborted !== true;\n throw new StorageError(\n timedOut\n ? `Filesystem mutation timed out for \"${key}\".`\n : `Filesystem mutation was aborted for \"${key}\".`,\n {\n aborted: true,\n cause: runtime.signal.reason,\n code: timedOut ? StorageErrorCode.TIMEOUT : StorageErrorCode.ABORTED,\n key,\n permanent: true,\n timedOut,\n },\n );\n}\n\nasync function ensureRoot(root: string, key: string): Promise<void> {\n await fsp.mkdir(root, { mode: 0o700, recursive: true });\n const stat = await fsp.lstat(root);\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!stat.isDirectory()) {\n invalidFsPath(key, 'the configured root is not a directory');\n }\n}\n\nasync function ensureParents(\n root: string,\n segments: readonly string[],\n key: string,\n create: boolean,\n runtime: OperationRuntime,\n): Promise<string> {\n await ensureRoot(root, key);\n let current = root;\n for (const segment of segments.slice(0, -1)) {\n assertActive(runtime, key);\n current = path.join(current, segment);\n let stat: Stats;\n try {\n stat = await fsp.lstat(current);\n } catch (error) {\n if (fsErrorCode(error) !== 'ENOENT') {\n throw error;\n }\n if (!create) {\n notFound(key);\n }\n try {\n await fsp.mkdir(current, { mode: 0o700 });\n } catch (mkdirError) {\n if (fsErrorCode(mkdirError) !== 'EEXIST') {\n throw mkdirError;\n }\n }\n stat = await fsp.lstat(current);\n }\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!stat.isDirectory()) {\n invalidFsPath(key, 'a parent segment is not a directory');\n }\n }\n return path.join(root, ...segments);\n}\n\nasync function regularFileOrMissing(\n target: string,\n key: string,\n): Promise<Stats | undefined> {\n try {\n const stat = await fsp.lstat(target);\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!stat.isFile()) {\n invalidFsPath(key, 'an object path is not a regular file');\n }\n if (stat.nlink !== 1) {\n invalidFsPath(key, 'hard-linked object files are not accepted');\n }\n return stat;\n } catch (error) {\n if (fsErrorCode(error) === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function assertSymlinkFreeReadPath(\n root: string,\n key: string,\n): Promise<void> {\n const segments = strictSegments(key);\n let rootStat: Stats;\n try {\n rootStat = await fsp.lstat(root);\n } catch (error) {\n if (fsErrorCode(error) === 'ENOENT') {\n return;\n }\n throw error;\n }\n if (rootStat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!rootStat.isDirectory()) {\n invalidFsPath(key, 'the configured root is not a directory');\n }\n\n let current = root;\n for (const [index, segment] of segments.entries()) {\n current = path.join(current, segment);\n let stat: Stats;\n try {\n stat = await fsp.lstat(current);\n } catch (error) {\n if (fsErrorCode(error) === 'ENOENT') {\n return;\n }\n throw error;\n }\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n const leaf = index === segments.length - 1;\n if ((!leaf && !stat.isDirectory()) || (leaf && !stat.isFile())) {\n invalidFsPath(\n key,\n leaf\n ? 'an object path is not a regular file'\n : 'a parent segment is not a directory',\n );\n }\n if (leaf && stat.nlink !== 1) {\n invalidFsPath(key, 'hard-linked object files are not accepted');\n }\n }\n\n const sidecar = await regularFileOrMissing(current + SIDECAR_SUFFIX, key);\n if (sidecar?.isSymbolicLink()) {\n throw symlinkError(key);\n }\n}\n\nasync function readSidecar(target: string, key: string): Promise<FsSidecar> {\n const handle = await fsp.open(\n target,\n fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW,\n );\n try {\n const stat = await handle.stat();\n if (!stat.isFile() || stat.size > MAX_SIDECAR_BYTES) {\n throw new StorageError(`Filesystem metadata is invalid for \"${key}\".`, {\n code: StorageErrorCode.PROVIDER,\n key,\n permanent: true,\n });\n }\n const parsed: unknown = JSON.parse(await handle.readFile('utf8'));\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('etag' in parsed) ||\n typeof parsed.etag !== 'string' ||\n !('contentType' in parsed) ||\n typeof parsed.contentType !== 'string' ||\n !('lastModified' in parsed) ||\n typeof parsed.lastModified !== 'number'\n ) {\n throw new StorageError(`Filesystem metadata is invalid for \"${key}\".`, {\n code: StorageErrorCode.PROVIDER,\n key,\n permanent: true,\n });\n }\n return parsed as FsSidecar;\n } finally {\n await handle.close();\n }\n}\n\nfunction bodyBytes(body: Body): Uint8Array | undefined {\n if (typeof body === 'string') {\n return new TextEncoder().encode(body);\n }\n if (body instanceof Uint8Array) {\n return body;\n }\n if (body instanceof ArrayBuffer) {\n return new Uint8Array(body);\n }\n if (ArrayBuffer.isView(body)) {\n return new Uint8Array(body.buffer, body.byteOffset, body.byteLength);\n }\n return undefined;\n}\n\nfunction defaultContentType(body: Body, override: string | undefined): string {\n if (override !== undefined) {\n return override;\n }\n if (typeof body === 'string') {\n return 'text/plain; charset=utf-8';\n }\n if (body instanceof Blob && body.type.length > 0) {\n return body.type;\n }\n return 'application/octet-stream';\n}\n\nasync function writeAll(\n handle: fsp.FileHandle,\n bytes: Uint8Array,\n): Promise<void> {\n let offset = 0;\n while (offset < bytes.byteLength) {\n const { bytesWritten } = await handle.write(\n bytes,\n offset,\n bytes.byteLength - offset,\n );\n offset += bytesWritten;\n }\n}\n\nfunction tempPath(directory: string): string {\n return path.join(directory, `.nestm-${randomUUID()}${TEMP_SUFFIX}`);\n}\n\nasync function openTemp(directory: string): Promise<{\n handle: fsp.FileHandle;\n path: string;\n}> {\n const target = tempPath(directory);\n const handle = await fsp.open(\n target,\n fsConstants.O_CREAT |\n fsConstants.O_EXCL |\n fsConstants.O_WRONLY |\n fsConstants.O_NOFOLLOW,\n 0o600,\n );\n return { handle, path: target };\n}\n\nasync function removeTemp(target: string | undefined): Promise<void> {\n if (target === undefined) {\n return;\n }\n try {\n await fsp.unlink(target);\n } catch (error) {\n if (fsErrorCode(error) !== 'ENOENT') {\n throw error;\n }\n }\n}\n\nasync function stageBody(\n directory: string,\n key: string,\n body: Body,\n options: StorageConditionalUploadOptions,\n runtime: OperationRuntime,\n): Promise<{ etag: string; path: string; size: number }> {\n const staged = await openTemp(directory);\n const hash = createHash('sha256');\n let size = 0;\n const knownBytes = bodyBytes(body);\n const knownSize =\n knownBytes?.byteLength ?? (body instanceof Blob ? body.size : undefined);\n options.onProgress?.({\n loaded: 0,\n ...(knownSize !== undefined && { total: knownSize }),\n });\n try {\n if (knownBytes !== undefined) {\n assertActive(runtime, key);\n await writeAll(staged.handle, knownBytes);\n hash.update(knownBytes);\n size = knownBytes.byteLength;\n options.onProgress?.({ loaded: size, total: size });\n } else if (body instanceof Blob) {\n const bytes = new Uint8Array(await body.arrayBuffer());\n assertActive(runtime, key);\n await writeAll(staged.handle, bytes);\n hash.update(bytes);\n size = bytes.byteLength;\n options.onProgress?.({ loaded: size, total: size });\n } else {\n const reader = (body as ReadableStream<Uint8Array>).getReader();\n try {\n while (true) {\n assertActive(runtime, key);\n const chunk = await reader.read();\n if (chunk.done) {\n break;\n }\n await writeAll(staged.handle, chunk.value);\n hash.update(chunk.value);\n size += chunk.value.byteLength;\n options.onProgress?.({ loaded: size });\n }\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n }\n await staged.handle.sync();\n await staged.handle.close();\n return {\n etag: `\"${hash.digest('hex')}\"`,\n path: staged.path,\n size,\n };\n } catch (error) {\n await staged.handle.close().catch(() => undefined);\n await removeTemp(staged.path).catch(() => undefined);\n throw error;\n }\n}\n\nasync function stageSidecar(\n directory: string,\n sidecar: FsSidecar,\n): Promise<string> {\n const staged = await openTemp(directory);\n try {\n await writeAll(\n staged.handle,\n new TextEncoder().encode(JSON.stringify(sidecar)),\n );\n await staged.handle.sync();\n await staged.handle.close();\n return staged.path;\n } catch (error) {\n await staged.handle.close().catch(() => undefined);\n await removeTemp(staged.path).catch(() => undefined);\n throw error;\n }\n}\n\nconst CONDITIONAL_FS_TAILS = new Map<string, Promise<void>>();\n\nasync function serializeFsKey<Result>(\n lockKey: string,\n operation: () => Promise<Result>,\n): Promise<Result> {\n const previous = CONDITIONAL_FS_TAILS.get(lockKey) ?? Promise.resolve();\n let release = (): void => undefined;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const tail = previous.then(() => gate);\n CONDITIONAL_FS_TAILS.set(lockKey, tail);\n await previous;\n try {\n return await operation();\n } finally {\n release();\n if (CONDITIONAL_FS_TAILS.get(lockKey) === tail) {\n CONDITIONAL_FS_TAILS.delete(lockKey);\n }\n }\n}\n\n/**\n * Adds symlink-defended reads and process-local conditional mutations to a\n * files-sdk fs adapter.\n *\n * The configured root must be dedicated to this driver: no other process and\n * no unconditional filesystem writer may mutate it concurrently. Each call\n * rejects symlinks in the existing key path and uses exclusive same-directory\n * temporary files plus atomic renames, but Node has no portable `openat2`\n * equivalent that could make those checks safe against a hostile concurrent\n * tree rewrite. This is a CAS implementation for an exclusively-owned local\n * workspace, not a host-filesystem sandbox. Body and metadata sidecars are two\n * files, so a process crash between their renames can still require cleanup.\n */\nexport function withFsConditionalMutation(base: FsAdapter): FsStorageAdapter {\n const root = path.resolve(base.root);\n const download = base.download.bind(base);\n const exists = base.exists.bind(base);\n const head = base.head.bind(base);\n const list = base.list.bind(base);\n const serialize = <Result>(\n key: string,\n operation: () => Promise<Result>,\n ): Promise<Result> =>\n serializeFsKey(`${root}\\0${key.normalize('NFC').toLowerCase()}`, operation);\n\n return Object.assign(base, {\n conditionalMutation: Object.freeze({\n create: true,\n delete: true,\n etag: true,\n replace: true,\n }),\n async download(\n key: string,\n options?: DownloadOptions,\n ): Promise<StoredFile> {\n await assertSymlinkFreeReadPath(root, key);\n return download(key, options);\n },\n async exists(key: string, options?: OperationOptions): Promise<boolean> {\n await assertSymlinkFreeReadPath(root, key);\n return exists(key, options);\n },\n async head(key: string, options?: OperationOptions): Promise<StoredFile> {\n await assertSymlinkFreeReadPath(root, key);\n return head(key, options);\n },\n async list(options?: ListOptions): Promise<ListResult> {\n const result = await list(options);\n for (const item of result.items) {\n await assertSymlinkFreeReadPath(root, item.key);\n }\n return result;\n },\n async deleteConditional(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void> {\n return serialize(key, async () => {\n const runtime = runtimeOf(options);\n try {\n const segments = strictSegments(key);\n const bodyPath = await ensureParents(\n root,\n segments,\n key,\n false,\n runtime,\n );\n const sidecarPath = bodyPath + SIDECAR_SUFFIX;\n if (\n (await regularFileOrMissing(bodyPath, key)) === undefined ||\n (await regularFileOrMissing(sidecarPath, key)) === undefined\n ) {\n notFound(key);\n }\n const sidecar = await readSidecar(sidecarPath, key);\n if (sidecar.etag !== options.condition.etag) {\n conflict(key);\n }\n\n assertActive(runtime, key);\n await ensureParents(root, segments, key, false, runtime);\n if (\n (await regularFileOrMissing(bodyPath, key)) === undefined ||\n (await regularFileOrMissing(sidecarPath, key)) === undefined ||\n (await readSidecar(sidecarPath, key)).etag !==\n options.condition.etag\n ) {\n conflict(key);\n }\n await fsp.unlink(bodyPath);\n try {\n await fsp.unlink(sidecarPath);\n } catch (error) {\n throw storageFsError(error, key, 'delete');\n }\n } catch (error) {\n throw storageFsError(error, key, 'delete');\n }\n });\n },\n async uploadConditional(\n key: string,\n body: Body,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult> {\n return serialize(key, async () => {\n let bodyTemp: string | undefined;\n let sidecarTemp: string | undefined;\n const runtime = runtimeOf(options);\n try {\n if (options.multipart !== undefined && options.multipart !== false) {\n unsupportedUpload(\n key,\n 'Conditional filesystem uploads do not support multipart mode.',\n );\n }\n if (options.control !== undefined) {\n unsupportedUpload(\n key,\n 'Conditional filesystem uploads do not support resumable control.',\n );\n }\n\n const segments = strictSegments(key);\n const bodyPath = await ensureParents(\n root,\n segments,\n key,\n true,\n runtime,\n );\n const sidecarPath = bodyPath + SIDECAR_SUFFIX;\n const existingBody = await regularFileOrMissing(bodyPath, key);\n const existingSidecar = await regularFileOrMissing(sidecarPath, key);\n if (options.condition.type === 'create') {\n if (existingBody !== undefined || existingSidecar !== undefined) {\n conflict(key);\n }\n } else {\n if (existingBody === undefined || existingSidecar === undefined) {\n notFound(key);\n }\n if (\n (await readSidecar(sidecarPath, key)).etag !==\n options.condition.etag\n ) {\n conflict(key);\n }\n }\n\n const staged = await stageBody(\n path.dirname(bodyPath),\n key,\n body,\n options,\n runtime,\n );\n bodyTemp = staged.path;\n const lastModified = Date.now();\n const contentType = defaultContentType(body, options.contentType);\n sidecarTemp = await stageSidecar(path.dirname(bodyPath), {\n contentType,\n etag: staged.etag,\n lastModified,\n ...(options.cacheControl !== undefined && {\n cacheControl: options.cacheControl,\n }),\n ...(options.metadata !== undefined && {\n metadata: options.metadata,\n }),\n });\n\n assertActive(runtime, key);\n await ensureParents(root, segments, key, false, runtime);\n const currentBody = await regularFileOrMissing(bodyPath, key);\n const currentSidecar = await regularFileOrMissing(sidecarPath, key);\n if (options.condition.type === 'create') {\n if (currentBody !== undefined || currentSidecar !== undefined) {\n conflict(key);\n }\n } else if (\n currentBody === undefined ||\n currentSidecar === undefined ||\n (await readSidecar(sidecarPath, key)).etag !==\n options.condition.etag\n ) {\n conflict(key);\n }\n\n await fsp.rename(bodyTemp, bodyPath);\n bodyTemp = undefined;\n await fsp.rename(sidecarTemp, sidecarPath);\n sidecarTemp = undefined;\n return {\n contentType,\n etag: staged.etag,\n key,\n lastModified: new Date(lastModified),\n size: staged.size,\n };\n } catch (error) {\n throw storageFsError(error, key, 'upload');\n } finally {\n await removeTemp(bodyTemp).catch(() => undefined);\n await removeTemp(sidecarTemp).catch(() => undefined);\n }\n });\n },\n } satisfies FilesSdkConditionalMutationAdapter &\n Pick<FsAdapter, 'download' | 'exists' | 'head' | 'list'>);\n}\n\n/**\n * Creates the files-sdk filesystem driver from the storage package's own\n * dependency context. The adapter reaches only `node:fs`, so this entry point\n * adds no native SDK to the install — unlike every object-store provider, it is\n * always available.\n *\n * The adapter keeps a `<key>.meta.json` sidecar beside each body to carry the\n * content type, ETag, and custom metadata that a filesystem has nowhere else to\n * put. Sidecars never surface as keys: `list` and `search` skip them, and\n * uploading a key that ends in `.meta.json` fails closed rather than colliding\n * with one.\n *\n * Conditional mutations additionally require an exclusively-owned root. See\n * {@link withFsConditionalMutation}; use an OS sandbox as well when running an\n * agent that has direct shell or filesystem tools.\n */\nexport function createFsStorageDriver(\n options: FsStorageDriverOptions,\n): FilesSdkStorageDriver<FsStorageAdapter> {\n const { adapter: adapterOptions, ...filesOptions } = options;\n return createFilesSdkDriver({\n ...filesOptions,\n adapter: withFsConditionalMutation(fs(adapterOptions)),\n });\n}\n\nexport { fs, mapFsError } from 'files-sdk/fs';\nexport type { FsAdapter, FsAdapterOptions } from 'files-sdk/fs';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/files-sdk/fs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\nimport { constants as fsConstants, type Stats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\n\nimport type {\n Body,\n DownloadOptions,\n ListOptions,\n ListResult,\n OperationOptions,\n StoredFile,\n} from 'files-sdk';\nimport { fs, type FsAdapter, type FsAdapterOptions } from 'files-sdk/fs';\n\nimport { StorageError, StorageErrorCode } from '../../storage.error.js';\nimport {\n isCanonicalStorageEtag,\n normalizeProviderStorageEtag,\n} from '../../storage-etag.js';\nimport type {\n StorageConditionalDeleteOptions,\n StorageConditionalReadOptions,\n StorageConditionalUploadOptions,\n StorageObject,\n StorageOperationOptions,\n StoragePromotionOptions,\n StorageUploadResult,\n} from '../../storage.types.js';\nimport {\n createFilesSdkDriver,\n type FilesSdkConditionalCopyAdapter,\n type FilesSdkConditionalDeleteAdapter,\n type FilesSdkConditionalReadAdapter,\n type FilesSdkConditionalUploadAdapter,\n type FilesSdkDriverOptions,\n type FilesSdkPhysicalKeyAdapter,\n type FilesSdkStorageDriver,\n} from '../files-sdk.driver.js';\n\nexport interface FsStorageDriverOptions extends Omit<\n FilesSdkDriverOptions<FsAdapter>,\n 'adapter'\n> {\n adapter: FsAdapterOptions;\n}\n\nexport type FsStorageAdapter = FsAdapter &\n FilesSdkConditionalCopyAdapter &\n FilesSdkConditionalDeleteAdapter &\n FilesSdkConditionalReadAdapter &\n FilesSdkConditionalUploadAdapter &\n FilesSdkPhysicalKeyAdapter;\n\nconst SIDECAR_SUFFIX = '.meta.json';\nconst TEMP_SUFFIX = '.fls-part';\nconst MAX_SIDECAR_BYTES = 1024 * 1024;\n\ninterface FsSidecar {\n contentType: string;\n cacheControl?: string;\n metadata?: Record<string, string>;\n etag: string;\n lastModified: number;\n}\n\ninterface OperationRuntime {\n signal: AbortSignal | undefined;\n timeoutSignal: AbortSignal | undefined;\n callerSignal: AbortSignal | undefined;\n}\n\nfunction fsErrorCode(error: unknown): string | undefined {\n if (typeof error === 'object' && error !== null && 'code' in error) {\n return typeof error.code === 'string' ? error.code : undefined;\n }\n return undefined;\n}\n\nfunction storageFsError(\n error: unknown,\n key: string,\n operation: 'copy' | 'delete' | 'download' | 'upload',\n): StorageError {\n if (error instanceof StorageError) {\n return error;\n }\n const systemCode = fsErrorCode(error);\n const code =\n systemCode === 'ENOENT' || systemCode === 'ENOTDIR'\n ? StorageErrorCode.NOT_FOUND\n : systemCode === 'EEXIST'\n ? StorageErrorCode.CONFLICT\n : systemCode === 'EACCES' || systemCode === 'EPERM'\n ? StorageErrorCode.UNAUTHORIZED\n : StorageErrorCode.PROVIDER;\n return new StorageError(`Filesystem ${operation} failed for \"${key}\".`, {\n code,\n key,\n operation,\n permanent:\n code === StorageErrorCode.NOT_FOUND ||\n code === StorageErrorCode.CONFLICT ||\n code === StorageErrorCode.UNAUTHORIZED,\n });\n}\n\nfunction invalidFsPath(key: string, message: string): never {\n throw new StorageError(`Invalid filesystem storage key: ${message}.`, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n permanent: true,\n });\n}\n\nfunction strictSegments(key: string): string[] {\n if (key.length === 0 || key.includes('\\0')) {\n invalidFsPath(key, 'the key is empty or contains a null byte');\n }\n if (path.isAbsolute(key) || key.includes('\\\\')) {\n invalidFsPath(key, 'only relative POSIX paths are accepted');\n }\n const segments = key.split('/');\n if (\n segments.some(\n (segment) => segment.length === 0 || segment === '.' || segment === '..',\n )\n ) {\n invalidFsPath(key, 'empty, dot, and parent segments are not accepted');\n }\n if (segments.some((segment) => /[. ]$/u.test(segment))) {\n invalidFsPath(key, 'segments ending in a dot or space are not accepted');\n }\n const leaf = segments.at(-1)?.toLowerCase() ?? '';\n if (leaf.endsWith(SIDECAR_SUFFIX) || leaf.endsWith(TEMP_SUFFIX)) {\n invalidFsPath(key, 'the final segment uses a reserved adapter suffix');\n }\n return segments;\n}\n\nfunction symlinkError(key: string): StorageError {\n return new StorageError(\n `Filesystem storage key \"${key}\" crosses a symbolic link.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n permanent: true,\n },\n );\n}\n\nfunction unsupportedUpload(key: string, message: string): never {\n throw new StorageError(message, {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'upload',\n permanent: true,\n });\n}\n\nfunction conflict(key: string): never {\n throw new StorageError(`Conditional mutation conflicted for \"${key}\".`, {\n code: StorageErrorCode.CONFLICT,\n key,\n permanent: true,\n });\n}\n\nfunction notFound(key: string): never {\n throw new StorageError(`Storage object \"${key}\" was not found.`, {\n code: StorageErrorCode.NOT_FOUND,\n key,\n permanent: true,\n });\n}\n\nfunction runtimeOf(options: StorageOperationOptions): OperationRuntime {\n const timeoutSignal =\n options.timeout === undefined || options.timeout <= 0\n ? undefined\n : AbortSignal.timeout(options.timeout);\n return {\n callerSignal: options.signal,\n signal:\n options.signal === undefined\n ? timeoutSignal\n : timeoutSignal === undefined\n ? options.signal\n : AbortSignal.any([options.signal, timeoutSignal]),\n timeoutSignal,\n };\n}\n\nfunction assertActive(runtime: OperationRuntime, key: string): void {\n if (runtime.signal?.aborted !== true) {\n return;\n }\n const timedOut =\n runtime.timeoutSignal?.aborted === true &&\n runtime.callerSignal?.aborted !== true;\n throw new StorageError(\n timedOut\n ? `Filesystem mutation timed out for \"${key}\".`\n : `Filesystem mutation was aborted for \"${key}\".`,\n {\n aborted: true,\n code: timedOut ? StorageErrorCode.TIMEOUT : StorageErrorCode.ABORTED,\n key,\n permanent: true,\n timedOut,\n },\n );\n}\n\nasync function ensureRoot(root: string, key: string): Promise<void> {\n await fsp.mkdir(root, { mode: 0o700, recursive: true });\n const stat = await fsp.lstat(root);\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!stat.isDirectory()) {\n invalidFsPath(key, 'the configured root is not a directory');\n }\n}\n\nasync function ensureParents(\n root: string,\n segments: readonly string[],\n key: string,\n create: boolean,\n runtime: OperationRuntime,\n): Promise<string> {\n await ensureRoot(root, key);\n let current = root;\n for (const segment of segments.slice(0, -1)) {\n assertActive(runtime, key);\n current = path.join(current, segment);\n let stat: Stats;\n try {\n stat = await fsp.lstat(current);\n } catch (error) {\n if (fsErrorCode(error) !== 'ENOENT') {\n throw error;\n }\n if (!create) {\n notFound(key);\n }\n try {\n await fsp.mkdir(current, { mode: 0o700 });\n } catch (mkdirError) {\n if (fsErrorCode(mkdirError) !== 'EEXIST') {\n throw mkdirError;\n }\n }\n stat = await fsp.lstat(current);\n }\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!stat.isDirectory()) {\n invalidFsPath(key, 'a parent segment is not a directory');\n }\n }\n return path.join(root, ...segments);\n}\n\nasync function regularFileOrMissing(\n target: string,\n key: string,\n): Promise<Stats | undefined> {\n try {\n const stat = await fsp.lstat(target);\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!stat.isFile()) {\n invalidFsPath(key, 'an object path is not a regular file');\n }\n if (stat.nlink !== 1) {\n invalidFsPath(key, 'hard-linked object files are not accepted');\n }\n return stat;\n } catch (error) {\n if (fsErrorCode(error) === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function assertSymlinkFreeReadPath(\n root: string,\n key: string,\n): Promise<void> {\n const segments = strictSegments(key);\n let rootStat: Stats;\n try {\n rootStat = await fsp.lstat(root);\n } catch (error) {\n if (fsErrorCode(error) === 'ENOENT') {\n return;\n }\n throw error;\n }\n if (rootStat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n if (!rootStat.isDirectory()) {\n invalidFsPath(key, 'the configured root is not a directory');\n }\n\n let current = root;\n for (const [index, segment] of segments.entries()) {\n current = path.join(current, segment);\n let stat: Stats;\n try {\n stat = await fsp.lstat(current);\n } catch (error) {\n if (fsErrorCode(error) === 'ENOENT') {\n return;\n }\n throw error;\n }\n if (stat.isSymbolicLink()) {\n throw symlinkError(key);\n }\n const leaf = index === segments.length - 1;\n if ((!leaf && !stat.isDirectory()) || (leaf && !stat.isFile())) {\n invalidFsPath(\n key,\n leaf\n ? 'an object path is not a regular file'\n : 'a parent segment is not a directory',\n );\n }\n if (leaf && stat.nlink !== 1) {\n invalidFsPath(key, 'hard-linked object files are not accepted');\n }\n }\n\n const sidecar = await regularFileOrMissing(current + SIDECAR_SUFFIX, key);\n if (sidecar?.isSymbolicLink()) {\n throw symlinkError(key);\n }\n}\n\nasync function readSidecar(target: string, key: string): Promise<FsSidecar> {\n const handle = await fsp.open(\n target,\n fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW,\n );\n try {\n const stat = await handle.stat();\n if (!stat.isFile() || stat.size > MAX_SIDECAR_BYTES) {\n throw new StorageError(`Filesystem metadata is invalid for \"${key}\".`, {\n code: StorageErrorCode.PROVIDER,\n key,\n permanent: true,\n });\n }\n const parsed: unknown = JSON.parse(await handle.readFile('utf8'));\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('etag' in parsed) ||\n typeof parsed.etag !== 'string' ||\n !('contentType' in parsed) ||\n typeof parsed.contentType !== 'string' ||\n !('lastModified' in parsed) ||\n typeof parsed.lastModified !== 'number'\n ) {\n throw new StorageError(`Filesystem metadata is invalid for \"${key}\".`, {\n code: StorageErrorCode.PROVIDER,\n key,\n permanent: true,\n });\n }\n const sidecar = parsed as FsSidecar;\n const etag = normalizeProviderStorageEtag(sidecar.etag);\n if (etag === undefined) {\n throw new StorageError(`Filesystem metadata is invalid for \"${key}\".`, {\n code: StorageErrorCode.PROVIDER,\n key,\n permanent: true,\n });\n }\n return { ...sidecar, etag };\n } finally {\n await handle.close();\n }\n}\n\nfunction bodyBytes(body: Body): Uint8Array | undefined {\n if (typeof body === 'string') {\n return new TextEncoder().encode(body);\n }\n if (body instanceof Uint8Array) {\n return body;\n }\n if (body instanceof ArrayBuffer) {\n return new Uint8Array(body);\n }\n if (ArrayBuffer.isView(body)) {\n return new Uint8Array(body.buffer, body.byteOffset, body.byteLength);\n }\n return undefined;\n}\n\nfunction defaultContentType(body: Body, override: string | undefined): string {\n if (override !== undefined) {\n return override;\n }\n if (typeof body === 'string') {\n return 'text/plain; charset=utf-8';\n }\n if (body instanceof Blob && body.type.length > 0) {\n return body.type;\n }\n return 'application/octet-stream';\n}\n\nasync function writeAll(\n handle: fsp.FileHandle,\n bytes: Uint8Array,\n): Promise<void> {\n let offset = 0;\n while (offset < bytes.byteLength) {\n const { bytesWritten } = await handle.write(\n bytes,\n offset,\n bytes.byteLength - offset,\n );\n offset += bytesWritten;\n }\n}\n\nfunction tempPath(directory: string): string {\n return path.join(directory, `.nestm-${randomUUID()}${TEMP_SUFFIX}`);\n}\n\nasync function openTemp(directory: string): Promise<{\n handle: fsp.FileHandle;\n path: string;\n}> {\n const target = tempPath(directory);\n const handle = await fsp.open(\n target,\n fsConstants.O_CREAT |\n fsConstants.O_EXCL |\n fsConstants.O_WRONLY |\n fsConstants.O_NOFOLLOW,\n 0o600,\n );\n return { handle, path: target };\n}\n\nasync function removeTemp(target: string | undefined): Promise<void> {\n if (target === undefined) {\n return;\n }\n try {\n await fsp.unlink(target);\n } catch (error) {\n if (fsErrorCode(error) !== 'ENOENT') {\n throw error;\n }\n }\n}\n\nasync function stageBody(\n directory: string,\n key: string,\n body: Body,\n options: StorageConditionalUploadOptions,\n runtime: OperationRuntime,\n): Promise<{ etag: string; path: string; size: number }> {\n const staged = await openTemp(directory);\n const hash = createHash('sha256');\n let size = 0;\n const knownBytes = bodyBytes(body);\n const knownSize =\n knownBytes?.byteLength ?? (body instanceof Blob ? body.size : undefined);\n options.onProgress?.({\n loaded: 0,\n ...(knownSize !== undefined && { total: knownSize }),\n });\n try {\n if (knownBytes !== undefined) {\n assertActive(runtime, key);\n await writeAll(staged.handle, knownBytes);\n hash.update(knownBytes);\n size = knownBytes.byteLength;\n options.onProgress?.({ loaded: size, total: size });\n } else if (body instanceof Blob) {\n const bytes = new Uint8Array(await body.arrayBuffer());\n assertActive(runtime, key);\n await writeAll(staged.handle, bytes);\n hash.update(bytes);\n size = bytes.byteLength;\n options.onProgress?.({ loaded: size, total: size });\n } else {\n const reader = (body as ReadableStream<Uint8Array>).getReader();\n try {\n while (true) {\n assertActive(runtime, key);\n const chunk = await reader.read();\n if (chunk.done) {\n break;\n }\n await writeAll(staged.handle, chunk.value);\n hash.update(chunk.value);\n size += chunk.value.byteLength;\n options.onProgress?.({ loaded: size });\n }\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n }\n await staged.handle.sync();\n await staged.handle.close();\n return {\n etag: hash.digest('hex'),\n path: staged.path,\n size,\n };\n } catch (error) {\n await staged.handle.close().catch(() => undefined);\n await removeTemp(staged.path).catch(() => undefined);\n throw error;\n }\n}\n\nasync function stageSidecar(\n directory: string,\n sidecar: FsSidecar,\n): Promise<string> {\n const staged = await openTemp(directory);\n try {\n await writeAll(\n staged.handle,\n new TextEncoder().encode(JSON.stringify(sidecar)),\n );\n await staged.handle.sync();\n await staged.handle.close();\n return staged.path;\n } catch (error) {\n await staged.handle.close().catch(() => undefined);\n await removeTemp(staged.path).catch(() => undefined);\n throw error;\n }\n}\n\nconst CONDITIONAL_FS_TAILS = new Map<string, Promise<void>>();\n\nasync function serializeFsKey<Result>(\n lockKey: string,\n operation: () => Promise<Result>,\n): Promise<Result> {\n const previous = CONDITIONAL_FS_TAILS.get(lockKey) ?? Promise.resolve();\n let release = (): void => undefined;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const tail = previous.then(() => gate);\n CONDITIONAL_FS_TAILS.set(lockKey, tail);\n await previous;\n try {\n return await operation();\n } finally {\n release();\n if (CONDITIONAL_FS_TAILS.get(lockKey) === tail) {\n CONDITIONAL_FS_TAILS.delete(lockKey);\n }\n }\n}\n\n/**\n * Adds symlink-defended reads and process-local exact conditional operations\n * to a files-sdk fs adapter.\n *\n * The configured root must be dedicated to this driver: no other process and\n * no unconditional filesystem writer may mutate it concurrently. Each call\n * rejects symlinks in the existing key path and uses exclusive same-directory\n * temporary files plus atomic renames, but Node has no portable `openat2`\n * equivalent that could make those checks safe against a hostile concurrent\n * tree rewrite. This is a CAS implementation for an exclusively-owned local\n * workspace, not a host-filesystem sandbox. Body and metadata sidecars are two\n * files, so a process crash between their renames can still require cleanup.\n */\nexport function withFsConditionalMutation(base: FsAdapter): FsStorageAdapter {\n const root = path.resolve(base.root);\n const download = base.download.bind(base);\n const exists = base.exists.bind(base);\n const head = base.head.bind(base);\n const list = base.list.bind(base);\n const serialize = <Result>(\n key: string,\n operation: () => Promise<Result>,\n ): Promise<Result> =>\n serializeFsKey(`${root}\\0${key.normalize('NFC').toLowerCase()}`, operation);\n const serializePair = <Result>(\n first: string,\n second: string,\n operation: () => Promise<Result>,\n ): Promise<Result> => {\n const identity = (key: string): string =>\n key.normalize('NFC').toLowerCase();\n if (identity(first) === identity(second)) {\n throw new StorageError(\n 'Conditional filesystem copy requires distinct source and destination keys.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key: first,\n operation: 'copy',\n permanent: true,\n },\n );\n }\n const ordered = [first, second].sort((left, right) =>\n identity(left).localeCompare(identity(right)),\n );\n const [headKey, tailKey] = ordered;\n if (headKey === undefined || tailKey === undefined) {\n throw new StorageError(\n 'Conditional filesystem copy requires distinct source and destination keys.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key: first,\n operation: 'copy',\n permanent: true,\n },\n );\n }\n return serialize(headKey, () => serialize(tailKey, operation));\n };\n const assertEtag = (\n value: unknown,\n label: string,\n key: string,\n operation: 'copy' | 'delete' | 'download' | 'upload',\n ): void => {\n if (!isCanonicalStorageEtag(value)) {\n throw new StorageError(`${label} must be a canonical storage ETag.`, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n operation,\n permanent: true,\n });\n }\n };\n\n return Object.assign(base, {\n conditionalCreate: Object.freeze({ resultEtag: true }),\n conditionalReplace: Object.freeze({ resultEtag: true }),\n conditionalDelete: Object.freeze({ etag: true }),\n conditionalRead: Object.freeze({ etag: true, version: false }),\n conditionalCopySource: Object.freeze({ etag: true, version: false }),\n conditionalCopyDestination: Object.freeze({\n atomicWithSource: true,\n create: true,\n replace: true,\n }),\n physicalKey: Object.freeze({ maxBytes: 4096 }),\n async download(\n key: string,\n options?: DownloadOptions,\n ): Promise<StoredFile> {\n await assertSymlinkFreeReadPath(root, key);\n return download(key, options);\n },\n async downloadConditional(\n key: string,\n options: StorageConditionalReadOptions,\n ): Promise<StorageObject> {\n if (options.condition.etag !== undefined) {\n assertEtag(options.condition.etag, 'condition.etag', key, 'download');\n }\n if (options.condition.version !== undefined) {\n throw new StorageError(\n 'The filesystem provider has no immutable object versions.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'download',\n permanent: true,\n },\n );\n }\n return serialize(key, async () => {\n let handle: fsp.FileHandle | undefined;\n try {\n const runtime = runtimeOf(options);\n const segments = strictSegments(key);\n const bodyPath = await ensureParents(\n root,\n segments,\n key,\n false,\n runtime,\n );\n const sidecarPath = bodyPath + SIDECAR_SUFFIX;\n if (\n (await regularFileOrMissing(bodyPath, key)) === undefined ||\n (await regularFileOrMissing(sidecarPath, key)) === undefined\n ) {\n notFound(key);\n }\n const sidecar = await readSidecar(sidecarPath, key);\n if (\n options.condition.etag !== undefined &&\n sidecar.etag !== options.condition.etag\n ) {\n conflict(key);\n }\n assertActive(runtime, key);\n handle = await fsp.open(\n bodyPath,\n fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW,\n );\n const stat = await handle.stat();\n if (!stat.isFile() || stat.nlink !== 1) {\n invalidFsPath(key, 'an object path is not a regular file');\n }\n const start = options.range?.start ?? 0;\n const requestedEnd = options.range?.end ?? Math.max(0, stat.size - 1);\n const end = Math.min(requestedEnd, Math.max(0, stat.size - 1));\n const size = start >= stat.size ? 0 : Math.max(0, end - start + 1);\n if (size === 0) {\n await handle.close();\n handle = undefined;\n return {\n body: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n }),\n contentType: sidecar.contentType,\n etag: sidecar.etag,\n key,\n lastModified: new Date(sidecar.lastModified),\n ...(sidecar.metadata !== undefined && {\n metadata: { ...sidecar.metadata },\n }),\n name: path.basename(key),\n size: 0,\n };\n }\n const nodeStream = handle.createReadStream({\n autoClose: true,\n ...(options.range !== undefined && { end, start }),\n });\n handle = undefined;\n return {\n body: Readable.toWeb(nodeStream) as ReadableStream<Uint8Array>,\n contentType: sidecar.contentType,\n etag: sidecar.etag,\n key,\n lastModified: new Date(sidecar.lastModified),\n ...(sidecar.metadata !== undefined && {\n metadata: { ...sidecar.metadata },\n }),\n name: path.basename(key),\n size,\n };\n } catch (error) {\n await handle?.close().catch(() => undefined);\n throw storageFsError(error, key, 'download');\n }\n });\n },\n async exists(key: string, options?: OperationOptions): Promise<boolean> {\n await assertSymlinkFreeReadPath(root, key);\n return exists(key, options);\n },\n async head(key: string, options?: OperationOptions): Promise<StoredFile> {\n await assertSymlinkFreeReadPath(root, key);\n return head(key, options);\n },\n async list(options?: ListOptions): Promise<ListResult> {\n const result = await list(options);\n for (const item of result.items) {\n await assertSymlinkFreeReadPath(root, item.key);\n }\n return result;\n },\n async deleteConditional(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void> {\n assertEtag(options.condition.etag, 'condition.etag', key, 'delete');\n return serialize(key, async () => {\n const runtime = runtimeOf(options);\n try {\n const segments = strictSegments(key);\n const bodyPath = await ensureParents(\n root,\n segments,\n key,\n false,\n runtime,\n );\n const sidecarPath = bodyPath + SIDECAR_SUFFIX;\n if (\n (await regularFileOrMissing(bodyPath, key)) === undefined ||\n (await regularFileOrMissing(sidecarPath, key)) === undefined\n ) {\n notFound(key);\n }\n const sidecar = await readSidecar(sidecarPath, key);\n if (sidecar.etag !== options.condition.etag) {\n conflict(key);\n }\n\n assertActive(runtime, key);\n await ensureParents(root, segments, key, false, runtime);\n if (\n (await regularFileOrMissing(bodyPath, key)) === undefined ||\n (await regularFileOrMissing(sidecarPath, key)) === undefined ||\n (await readSidecar(sidecarPath, key)).etag !==\n options.condition.etag\n ) {\n conflict(key);\n }\n await fsp.unlink(bodyPath);\n try {\n await fsp.unlink(sidecarPath);\n } catch (error) {\n throw storageFsError(error, key, 'delete');\n }\n } catch (error) {\n throw storageFsError(error, key, 'delete');\n }\n });\n },\n async promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void> {\n const destination = options.destination;\n if (\n destination !== undefined &&\n (typeof destination !== 'object' ||\n destination === null ||\n (destination.type !== 'create' && destination.type !== 'replace'))\n ) {\n throw new StorageError(\n 'destination.type must be \"create\" or \"replace\".',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key: destinationKey,\n operation: 'copy',\n permanent: true,\n },\n );\n }\n if (options.sourceEtag !== undefined) {\n assertEtag(options.sourceEtag, 'sourceEtag', sourceKey, 'copy');\n }\n if (destination?.type === 'replace') {\n assertEtag(\n destination.etag,\n 'destination.etag',\n destinationKey,\n 'copy',\n );\n }\n if (options.sourceVersion !== undefined) {\n throw new StorageError(\n 'The filesystem provider has no immutable object versions.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: sourceKey,\n operation: 'copy',\n permanent: true,\n },\n );\n }\n return serializePair(sourceKey, destinationKey, async () => {\n let bodyTemp: string | undefined;\n let sidecarTemp: string | undefined;\n const runtime = runtimeOf(options);\n try {\n const sourceSegments = strictSegments(sourceKey);\n const destinationSegments = strictSegments(destinationKey);\n const sourcePath = await ensureParents(\n root,\n sourceSegments,\n sourceKey,\n false,\n runtime,\n );\n const sourceSidecarPath = sourcePath + SIDECAR_SUFFIX;\n if (\n (await regularFileOrMissing(sourcePath, sourceKey)) === undefined ||\n (await regularFileOrMissing(sourceSidecarPath, sourceKey)) ===\n undefined\n ) {\n notFound(sourceKey);\n }\n const sourceSidecar = await readSidecar(sourceSidecarPath, sourceKey);\n if (\n options.sourceEtag !== undefined &&\n sourceSidecar.etag !== options.sourceEtag\n ) {\n conflict(sourceKey);\n }\n\n const destinationPath = await ensureParents(\n root,\n destinationSegments,\n destinationKey,\n true,\n runtime,\n );\n const destinationSidecarPath = destinationPath + SIDECAR_SUFFIX;\n const assertDestination = async (): Promise<void> => {\n const body = await regularFileOrMissing(\n destinationPath,\n destinationKey,\n );\n const sidecar = await regularFileOrMissing(\n destinationSidecarPath,\n destinationKey,\n );\n if (options.destination?.type === 'create') {\n if (body !== undefined || sidecar !== undefined) {\n conflict(destinationKey);\n }\n return;\n }\n if (options.destination?.type === 'replace') {\n if (body === undefined || sidecar === undefined) {\n notFound(destinationKey);\n }\n if (\n (await readSidecar(destinationSidecarPath, destinationKey))\n .etag !== options.destination.etag\n ) {\n conflict(destinationKey);\n }\n }\n };\n await assertDestination();\n\n const staged = await openTemp(path.dirname(destinationPath));\n await staged.handle.close();\n bodyTemp = staged.path;\n await fsp.copyFile(sourcePath, bodyTemp);\n const lastModified = Date.now();\n sidecarTemp = await stageSidecar(path.dirname(destinationPath), {\n ...sourceSidecar,\n lastModified,\n });\n\n assertActive(runtime, sourceKey);\n if (\n (await regularFileOrMissing(sourcePath, sourceKey)) === undefined ||\n (await regularFileOrMissing(sourceSidecarPath, sourceKey)) ===\n undefined ||\n (options.sourceEtag !== undefined &&\n (await readSidecar(sourceSidecarPath, sourceKey)).etag !==\n options.sourceEtag)\n ) {\n conflict(sourceKey);\n }\n await assertDestination();\n await fsp.rename(bodyTemp, destinationPath);\n bodyTemp = undefined;\n await fsp.rename(sidecarTemp, destinationSidecarPath);\n sidecarTemp = undefined;\n } catch (error) {\n throw storageFsError(error, sourceKey, 'copy');\n } finally {\n await removeTemp(bodyTemp).catch(() => undefined);\n await removeTemp(sidecarTemp).catch(() => undefined);\n }\n });\n },\n async uploadConditional(\n key: string,\n body: Body,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult> {\n if (options.condition.type === 'replace') {\n assertEtag(options.condition.etag, 'condition.etag', key, 'upload');\n }\n return serialize(key, async () => {\n let bodyTemp: string | undefined;\n let sidecarTemp: string | undefined;\n const runtime = runtimeOf(options);\n try {\n if (options.multipart !== undefined && options.multipart !== false) {\n unsupportedUpload(\n key,\n 'Conditional filesystem uploads do not support multipart mode.',\n );\n }\n if (options.control !== undefined) {\n unsupportedUpload(\n key,\n 'Conditional filesystem uploads do not support resumable control.',\n );\n }\n\n const segments = strictSegments(key);\n const bodyPath = await ensureParents(\n root,\n segments,\n key,\n true,\n runtime,\n );\n const sidecarPath = bodyPath + SIDECAR_SUFFIX;\n const existingBody = await regularFileOrMissing(bodyPath, key);\n const existingSidecar = await regularFileOrMissing(sidecarPath, key);\n if (options.condition.type === 'create') {\n if (existingBody !== undefined || existingSidecar !== undefined) {\n conflict(key);\n }\n } else {\n if (existingBody === undefined || existingSidecar === undefined) {\n notFound(key);\n }\n if (\n (await readSidecar(sidecarPath, key)).etag !==\n options.condition.etag\n ) {\n conflict(key);\n }\n }\n\n const staged = await stageBody(\n path.dirname(bodyPath),\n key,\n body,\n options,\n runtime,\n );\n bodyTemp = staged.path;\n const lastModified = Date.now();\n const contentType = defaultContentType(body, options.contentType);\n sidecarTemp = await stageSidecar(path.dirname(bodyPath), {\n contentType,\n etag: staged.etag,\n lastModified,\n ...(options.cacheControl !== undefined && {\n cacheControl: options.cacheControl,\n }),\n ...(options.metadata !== undefined && {\n metadata: options.metadata,\n }),\n });\n\n assertActive(runtime, key);\n await ensureParents(root, segments, key, false, runtime);\n const currentBody = await regularFileOrMissing(bodyPath, key);\n const currentSidecar = await regularFileOrMissing(sidecarPath, key);\n if (options.condition.type === 'create') {\n if (currentBody !== undefined || currentSidecar !== undefined) {\n conflict(key);\n }\n } else if (\n currentBody === undefined ||\n currentSidecar === undefined ||\n (await readSidecar(sidecarPath, key)).etag !==\n options.condition.etag\n ) {\n conflict(key);\n }\n\n await fsp.rename(bodyTemp, bodyPath);\n bodyTemp = undefined;\n await fsp.rename(sidecarTemp, sidecarPath);\n sidecarTemp = undefined;\n return {\n contentType,\n etag: staged.etag,\n key,\n lastModified: new Date(lastModified),\n size: staged.size,\n };\n } catch (error) {\n throw storageFsError(error, key, 'upload');\n } finally {\n await removeTemp(bodyTemp).catch(() => undefined);\n await removeTemp(sidecarTemp).catch(() => undefined);\n }\n });\n },\n } satisfies FilesSdkConditionalCopyAdapter &\n FilesSdkConditionalDeleteAdapter &\n FilesSdkConditionalReadAdapter &\n FilesSdkConditionalUploadAdapter &\n FilesSdkPhysicalKeyAdapter &\n Pick<FsAdapter, 'download' | 'exists' | 'head' | 'list'>);\n}\n\n/**\n * Creates the files-sdk filesystem driver from the storage package's own\n * dependency context. The adapter reaches only `node:fs`, so this entry point\n * adds no native SDK to the install — unlike every object-store provider, it is\n * always available.\n *\n * The adapter keeps a `<key>.meta.json` sidecar beside each body to carry the\n * content type, ETag, and custom metadata that a filesystem has nowhere else to\n * put. Sidecars never surface as keys: `list` and `search` skip them, and\n * uploading a key that ends in `.meta.json` fails closed rather than colliding\n * with one.\n *\n * Conditional mutations additionally require an exclusively-owned root. See\n * {@link withFsConditionalMutation}; use an OS sandbox as well when running an\n * agent that has direct shell or filesystem tools.\n */\nexport function createFsStorageDriver(\n options: FsStorageDriverOptions,\n): FilesSdkStorageDriver<FsStorageAdapter> {\n const { adapter: adapterOptions, ...filesOptions } = options;\n return createFilesSdkDriver({\n ...filesOptions,\n adapter: withFsConditionalMutation(fs(adapterOptions)),\n });\n}\n\nexport { fs, mapFsError } from 'files-sdk/fs';\nexport type { FsAdapter, FsAdapterOptions } from 'files-sdk/fs';\n"]}
@@ -1,3 +1,3 @@
1
- export { FilesSdkStorageDriver, createFilesSdkDriver, type FilesSdkConditionalCopyAdapter, type FilesSdkConditionalMutationAdapter, type FilesSdkSignedUploadPolicyAdapter, type FilesSdkSignedDownloadPolicyAdapter, type FilesSdkDriverOptions, } from './files-sdk.driver.js';
1
+ export { FilesSdkStorageDriver, createFilesSdkDriver, type FilesSdkConditionalCopyAdapter, type FilesSdkConditionalDeleteAdapter, type FilesSdkConditionalReadAdapter, type FilesSdkConditionalUploadAdapter, type FilesSdkPhysicalKeyAdapter, type FilesSdkSignedUploadPolicyAdapter, type FilesSdkSignedDownloadPolicyAdapter, type FilesSdkDriverOptions, } from './files-sdk.driver.js';
2
2
  export type { Adapter as FilesSdkAdapter, FilesHooks as FilesSdkHooks, FilesPlugin as FilesSdkPlugin, } from 'files-sdk';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,KAAK,mCAAmC,EACxC,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,aAAa,EAC3B,WAAW,IAAI,cAAc,GAC9B,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACrC,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,mCAAmC,EACxC,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,aAAa,EAC3B,WAAW,IAAI,cAAc,GAC9B,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAMrB,MAAM,uBAAuB,CAAC","sourcesContent":["export {\n FilesSdkStorageDriver,\n createFilesSdkDriver,\n type FilesSdkConditionalCopyAdapter,\n type FilesSdkConditionalMutationAdapter,\n type FilesSdkSignedUploadPolicyAdapter,\n type FilesSdkSignedDownloadPolicyAdapter,\n type FilesSdkDriverOptions,\n} from './files-sdk.driver.js';\n\nexport type {\n Adapter as FilesSdkAdapter,\n FilesHooks as FilesSdkHooks,\n FilesPlugin as FilesSdkPlugin,\n} from 'files-sdk';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/files-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GASrB,MAAM,uBAAuB,CAAC","sourcesContent":["export {\n FilesSdkStorageDriver,\n createFilesSdkDriver,\n type FilesSdkConditionalCopyAdapter,\n type FilesSdkConditionalDeleteAdapter,\n type FilesSdkConditionalReadAdapter,\n type FilesSdkConditionalUploadAdapter,\n type FilesSdkPhysicalKeyAdapter,\n type FilesSdkSignedUploadPolicyAdapter,\n type FilesSdkSignedDownloadPolicyAdapter,\n type FilesSdkDriverOptions,\n} from './files-sdk.driver.js';\n\nexport type {\n Adapter as FilesSdkAdapter,\n FilesHooks as FilesSdkHooks,\n FilesPlugin as FilesSdkPlugin,\n} from 'files-sdk';\n"]}