@flystorage/file-storage 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checksumFromStream = void 0;
4
- const crypto_1 = require("crypto");
5
- async function checksumFromStream(stream, options) {
1
+ import { createHash } from 'crypto';
2
+ export async function checksumFromStream(stream, options) {
6
3
  return new Promise(async (resolve, reject) => {
7
- const hash = (0, crypto_1.createHash)(options.algo ?? 'md5');
4
+ const hash = createHash(options.algo ?? 'md5');
8
5
  stream.on('error', reject);
9
6
  stream.pipe(hash, { end: false });
10
7
  stream.on('end', () => {
@@ -13,4 +10,3 @@ async function checksumFromStream(stream, options) {
13
10
  });
14
11
  });
15
12
  }
16
- exports.checksumFromStream = checksumFromStream;
@@ -1,11 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UnableToListDirectory = exports.UnableToCheckDirectoryExistence = exports.UnableToCheckFileExistence = exports.UnableToDeleteFile = exports.UnableToDeleteDirectory = exports.UnableToCreateDirectory = exports.UnableToGetStat = exports.UnableToMoveFile = exports.UnableToCopyFile = exports.UnableToGetTemporaryUrl = exports.UnableToGetPublicUrl = exports.UnableToGetVisibility = exports.UnableToSetVisibility = exports.UnableToReadFile = exports.UnableToWriteFile = exports.UnableToGetFileSize = exports.UnableToGetLastModified = exports.UnableToGetMimeType = exports.UnableToGetChecksum = exports.ChecksumIsNotAvailable = exports.FlystorageError = exports.errorToMessage = void 0;
4
- function errorToMessage(error) {
1
+ export function errorToMessage(error) {
5
2
  return error instanceof Error ? error.message : String(error);
6
3
  }
7
- exports.errorToMessage = errorToMessage;
8
- class FlystorageError extends Error {
4
+ export class FlystorageError extends Error {
9
5
  context;
10
6
  code = 'unknown_error';
11
7
  constructor(message, context = {}, cause = undefined) {
@@ -15,12 +11,11 @@ class FlystorageError extends Error {
15
11
  this.context = context;
16
12
  }
17
13
  }
18
- exports.FlystorageError = FlystorageError;
19
14
  /**
20
15
  * Thrown when the checksum algo is not supported or not pre-computed. This error
21
16
  * is thrown with the intention of falling back to computing it based on a file read.
22
17
  */
23
- class ChecksumIsNotAvailable extends FlystorageError {
18
+ export class ChecksumIsNotAvailable extends FlystorageError {
24
19
  algo;
25
20
  code = 'flystorage.checksum_not_supported';
26
21
  constructor(message, algo, context = {}, cause = undefined) {
@@ -29,100 +24,80 @@ class ChecksumIsNotAvailable extends FlystorageError {
29
24
  }
30
25
  static checksumNotSupported = (algo, { context = {}, cause = undefined } = {}) => new ChecksumIsNotAvailable(`Checksum algo "${algo}" is not supported`, algo, { ...context, algo }, cause);
31
26
  }
32
- exports.ChecksumIsNotAvailable = ChecksumIsNotAvailable;
33
- class UnableToGetChecksum extends FlystorageError {
27
+ export class UnableToGetChecksum extends FlystorageError {
34
28
  code = 'flystorage.unable_to_get_checksum';
35
29
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetChecksum(`Unable to write the file. Reason: ${reason}`, context, cause);
36
30
  }
37
- exports.UnableToGetChecksum = UnableToGetChecksum;
38
- class UnableToGetMimeType extends FlystorageError {
31
+ export class UnableToGetMimeType extends FlystorageError {
39
32
  code = 'flystorage.unable_to_get_mimetype';
40
33
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetMimeType(`Unable to get mime-type. Reason: ${reason}`, context, cause);
41
34
  }
42
- exports.UnableToGetMimeType = UnableToGetMimeType;
43
- class UnableToGetLastModified extends FlystorageError {
35
+ export class UnableToGetLastModified extends FlystorageError {
44
36
  code = 'flystorage.unable_to_get_last_modified';
45
37
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetLastModified(`Unable to get last modified. Reason: ${reason}`, context, cause);
46
38
  }
47
- exports.UnableToGetLastModified = UnableToGetLastModified;
48
- class UnableToGetFileSize extends FlystorageError {
39
+ export class UnableToGetFileSize extends FlystorageError {
49
40
  code = 'flystorage.unable_to_get_file_size';
50
41
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetFileSize(`Unable to get file size. Reason: ${reason}`, context, cause);
51
42
  }
52
- exports.UnableToGetFileSize = UnableToGetFileSize;
53
- class UnableToWriteFile extends FlystorageError {
43
+ export class UnableToWriteFile extends FlystorageError {
54
44
  code = 'flystorage.unable_to_write_file';
55
45
  static because = (reason, { context = {}, cause = undefined }) => new UnableToWriteFile(`Unable to write the file. Reason: ${reason}`, context, cause);
56
46
  }
57
- exports.UnableToWriteFile = UnableToWriteFile;
58
- class UnableToReadFile extends FlystorageError {
47
+ export class UnableToReadFile extends FlystorageError {
59
48
  code = 'flystorage.unable_to_read_file';
60
49
  static because = (reason, { context = {}, cause = undefined }) => new UnableToReadFile(`Unable to read the file. Reason: ${reason}`, context, cause);
61
50
  }
62
- exports.UnableToReadFile = UnableToReadFile;
63
- class UnableToSetVisibility extends FlystorageError {
51
+ export class UnableToSetVisibility extends FlystorageError {
64
52
  code = 'flystorage.unable_to_set_visibility';
65
53
  static because = (reason, { context = {}, cause = undefined }) => new UnableToSetVisibility(`Unable to set visibility. Reason: ${reason}`, context, cause);
66
54
  }
67
- exports.UnableToSetVisibility = UnableToSetVisibility;
68
- class UnableToGetVisibility extends FlystorageError {
55
+ export class UnableToGetVisibility extends FlystorageError {
69
56
  code = 'flystorage.unable_to_get_visibility';
70
57
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetVisibility(`Unable to get visibility. Reason: ${reason}`, context, cause);
71
58
  }
72
- exports.UnableToGetVisibility = UnableToGetVisibility;
73
- class UnableToGetPublicUrl extends FlystorageError {
59
+ export class UnableToGetPublicUrl extends FlystorageError {
74
60
  code = 'flystorage.unable_to_get_public_url';
75
61
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetPublicUrl(`Unable to get public URL. Reason: ${reason}`, context, cause);
76
62
  }
77
- exports.UnableToGetPublicUrl = UnableToGetPublicUrl;
78
- class UnableToGetTemporaryUrl extends FlystorageError {
63
+ export class UnableToGetTemporaryUrl extends FlystorageError {
79
64
  code = 'flystorage.unable_to_get_temporary_url';
80
65
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetTemporaryUrl(`Unable to get temporary URL. Reason: ${reason}`, context, cause);
81
66
  }
82
- exports.UnableToGetTemporaryUrl = UnableToGetTemporaryUrl;
83
- class UnableToCopyFile extends FlystorageError {
67
+ export class UnableToCopyFile extends FlystorageError {
84
68
  code = 'flystorage.unable_to_copy_file';
85
69
  static because = (reason, { context = {}, cause = undefined }) => new UnableToCopyFile(`Unable to copy file. Reason: ${reason}`, context, cause);
86
70
  }
87
- exports.UnableToCopyFile = UnableToCopyFile;
88
- class UnableToMoveFile extends FlystorageError {
71
+ export class UnableToMoveFile extends FlystorageError {
89
72
  code = 'flystorage.unable_to_move_file';
90
73
  static because = (reason, { context = {}, cause = undefined }) => new UnableToMoveFile(`Unable to move file. Reason: ${reason}`, context, cause);
91
74
  }
92
- exports.UnableToMoveFile = UnableToMoveFile;
93
- class UnableToGetStat extends FlystorageError {
75
+ export class UnableToGetStat extends FlystorageError {
94
76
  code = 'flystorage.unable_to_get_stat';
95
77
  static because = (reason, { context = {}, cause = undefined }) => new UnableToGetStat(`Unable to get stat. Reason: ${reason}`, context, cause);
96
78
  static noFileStatResolved = ({ context = {}, cause = undefined }) => new UnableToGetStat(`Stat was not a file.`, context, cause);
97
79
  }
98
- exports.UnableToGetStat = UnableToGetStat;
99
- class UnableToCreateDirectory extends FlystorageError {
80
+ export class UnableToCreateDirectory extends FlystorageError {
100
81
  code = 'flystorage.unable_to_create_directory';
101
82
  static because = (reason, { context = {}, cause = undefined }) => new UnableToCreateDirectory(`Unable to create directory. Reason: ${reason}`, context, cause);
102
83
  }
103
- exports.UnableToCreateDirectory = UnableToCreateDirectory;
104
- class UnableToDeleteDirectory extends FlystorageError {
84
+ export class UnableToDeleteDirectory extends FlystorageError {
105
85
  code = 'flystorage.unable_to_delete_directory';
106
86
  static because = (reason, { context = {}, cause = undefined }) => new UnableToDeleteDirectory(`Unable to delete directory. Reason: ${reason}`, context, cause);
107
87
  }
108
- exports.UnableToDeleteDirectory = UnableToDeleteDirectory;
109
- class UnableToDeleteFile extends FlystorageError {
88
+ export class UnableToDeleteFile extends FlystorageError {
110
89
  code = 'flystorage.unable_to_delete_file';
111
90
  static because = (reason, { context = {}, cause = undefined }) => new UnableToDeleteFile(`Unable to delete file. Reason: ${reason}`, context, cause);
112
91
  }
113
- exports.UnableToDeleteFile = UnableToDeleteFile;
114
- class UnableToCheckFileExistence extends FlystorageError {
92
+ export class UnableToCheckFileExistence extends FlystorageError {
115
93
  code = 'flystorage.unable_to_check_file_existence';
116
94
  static because = (reason, { context = {}, cause = undefined }) => new UnableToCheckFileExistence(`Unable to check file existence. Reason: ${reason}`, context, cause);
117
95
  }
118
- exports.UnableToCheckFileExistence = UnableToCheckFileExistence;
119
- class UnableToCheckDirectoryExistence extends FlystorageError {
96
+ export class UnableToCheckDirectoryExistence extends FlystorageError {
120
97
  code = 'flystorage.unable_to_check_directory_existence';
121
98
  static because = (reason, { context = {}, cause = undefined }) => new UnableToCheckDirectoryExistence(`Unable to check directory existence. Reason: ${reason}`, context, cause);
122
99
  }
123
- exports.UnableToCheckDirectoryExistence = UnableToCheckDirectoryExistence;
124
- class UnableToListDirectory extends FlystorageError {
100
+ export class UnableToListDirectory extends FlystorageError {
125
101
  code = 'flystorage.unable_to_list_directory_contents';
126
102
  static because = (reason, { context = {}, cause = undefined }) => new UnableToListDirectory(`Unable to list directory contents. Reason: ${reason}`, context, cause);
127
103
  }
128
- exports.UnableToListDirectory = UnableToListDirectory;
@@ -1,21 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readableToUint8Array = exports.readableToString = exports.closeReadable = exports.normalizeExpiryToMilliseconds = exports.normalizeExpiryToDate = exports.FileStorage = exports.toReadable = exports.DirectoryListing = exports.isDirectory = exports.isFile = void 0;
4
- const stream_1 = require("stream");
5
- const checksum_from_stream_js_1 = require("./checksum-from-stream.js");
6
- const errors = require("./errors.js");
7
- const errors_js_1 = require("./errors.js");
8
- const path_normalizer_js_1 = require("./path-normalizer.js");
9
- const util_1 = require("util");
10
- function isFile(stat) {
1
+ import { Readable } from 'stream';
2
+ import { checksumFromStream } from './checksum-from-stream.js';
3
+ import * as errors from './errors.js';
4
+ import { ChecksumIsNotAvailable } from './errors.js';
5
+ import { PathNormalizerV1 } from './path-normalizer.js';
6
+ import { TextEncoder } from "util";
7
+ export function isFile(stat) {
11
8
  return stat.isFile;
12
9
  }
13
- exports.isFile = isFile;
14
- function isDirectory(stat) {
10
+ export function isDirectory(stat) {
15
11
  return stat.isDirectory;
16
12
  }
17
- exports.isDirectory = isDirectory;
18
- class DirectoryListing {
13
+ export class DirectoryListing {
19
14
  listing;
20
15
  path;
21
16
  deep;
@@ -53,23 +48,21 @@ class DirectoryListing {
53
48
  }
54
49
  }
55
50
  }
56
- exports.DirectoryListing = DirectoryListing;
57
- function toReadable(contents) {
58
- if (contents instanceof stream_1.Readable) {
51
+ export function toReadable(contents) {
52
+ if (contents instanceof Readable) {
59
53
  return contents;
60
54
  }
61
- return stream_1.Readable.from(contents);
55
+ return Readable.from(contents);
62
56
  }
63
- exports.toReadable = toReadable;
64
57
  const naturalSorting = new Intl.Collator(undefined, {
65
58
  numeric: true,
66
59
  sensitivity: 'base'
67
60
  });
68
- class FileStorage {
61
+ export class FileStorage {
69
62
  adapter;
70
63
  pathNormalizer;
71
64
  options;
72
- constructor(adapter, pathNormalizer = new path_normalizer_js_1.PathNormalizerV1(), options = {}) {
65
+ constructor(adapter, pathNormalizer = new PathNormalizerV1(), options = {}) {
73
66
  this.adapter = adapter;
74
67
  this.pathNormalizer = pathNormalizer;
75
68
  this.options = options;
@@ -86,7 +79,7 @@ class FileStorage {
86
79
  }
87
80
  async read(path) {
88
81
  try {
89
- return stream_1.Readable.from(await this.adapter.read(this.pathNormalizer.normalizePath(path)));
82
+ return Readable.from(await this.adapter.read(this.pathNormalizer.normalizePath(path)));
90
83
  }
91
84
  catch (error) {
92
85
  throw errors.UnableToReadFile.because(errors.errorToMessage(error), { cause: error, context: { path } });
@@ -218,7 +211,7 @@ class FileStorage {
218
211
  return await this.adapter.checksum(this.pathNormalizer.normalizePath(path), { ...this.options.checksums, ...options });
219
212
  }
220
213
  catch (error) {
221
- if (error instanceof errors_js_1.ChecksumIsNotAvailable) {
214
+ if (error instanceof ChecksumIsNotAvailable) {
222
215
  return this.calculateChecksum(path, options);
223
216
  }
224
217
  throw errors.UnableToGetChecksum.because(errors.errorToMessage(error), { cause: error, context: { path, options } });
@@ -250,23 +243,20 @@ class FileStorage {
250
243
  }
251
244
  async calculateChecksum(path, options) {
252
245
  try {
253
- return await (0, checksum_from_stream_js_1.checksumFromStream)(await this.read(path), options);
246
+ return await checksumFromStream(await this.read(path), options);
254
247
  }
255
248
  catch (error) {
256
249
  throw errors.UnableToGetChecksum.because(errors.errorToMessage(error), { cause: error, context: { path, options } });
257
250
  }
258
251
  }
259
252
  }
260
- exports.FileStorage = FileStorage;
261
- function normalizeExpiryToDate(expiresAt) {
253
+ export function normalizeExpiryToDate(expiresAt) {
262
254
  return expiresAt instanceof Date ? expiresAt : new Date(expiresAt);
263
255
  }
264
- exports.normalizeExpiryToDate = normalizeExpiryToDate;
265
- function normalizeExpiryToMilliseconds(expiresAt) {
256
+ export function normalizeExpiryToMilliseconds(expiresAt) {
266
257
  return expiresAt instanceof Date ? expiresAt.getTime() : expiresAt;
267
258
  }
268
- exports.normalizeExpiryToMilliseconds = normalizeExpiryToMilliseconds;
269
- async function closeReadable(body) {
259
+ export async function closeReadable(body) {
270
260
  if (body.closed) {
271
261
  return;
272
262
  }
@@ -277,16 +267,14 @@ async function closeReadable(body) {
277
267
  body.destroy();
278
268
  });
279
269
  }
280
- exports.closeReadable = closeReadable;
281
270
  const decoder = new TextDecoder();
282
- async function readableToString(stream) {
271
+ export async function readableToString(stream) {
283
272
  const contents = decoder.decode(await readableToUint8Array(stream));
284
273
  await closeReadable(stream);
285
274
  return contents;
286
275
  }
287
- exports.readableToString = readableToString;
288
- const encoder = new util_1.TextEncoder();
289
- function readableToUint8Array(stream) {
276
+ const encoder = new TextEncoder();
277
+ export function readableToUint8Array(stream) {
290
278
  return new Promise((resolve, reject) => {
291
279
  const parts = [];
292
280
  stream.on('data', (chunk) => {
@@ -303,7 +291,6 @@ function readableToUint8Array(stream) {
303
291
  stream.on('end', () => resolve(concatUint8Arrays(parts)));
304
292
  });
305
293
  }
306
- exports.readableToUint8Array = readableToUint8Array;
307
294
  function concatUint8Arrays(input) {
308
295
  const length = input.reduce((l, a) => l + (a.byteLength), 0);
309
296
  const output = new Uint8Array(length);
package/dist/cjs/index.js CHANGED
@@ -1,22 +1,6 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./checksum-from-stream.js"), exports);
18
- __exportStar(require("./file-storage.js"), exports);
19
- __exportStar(require("./errors.js"), exports);
20
- __exportStar(require("./path-normalizer.js"), exports);
21
- __exportStar(require("./path-prefixer.js"), exports);
22
- __exportStar(require("./portable-visibility.js"), exports);
1
+ export * from './checksum-from-stream.js';
2
+ export * from './file-storage.js';
3
+ export * from './errors.js';
4
+ export * from './path-normalizer.js';
5
+ export * from './path-prefixer.js';
6
+ export * from './portable-visibility.js';
@@ -1,26 +1,20 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PathTraversalDetected = exports.CorruptedPathDetected = exports.PathNormalizerV1 = void 0;
4
- const node_path_1 = require("node:path");
1
+ import { join } from 'node:path';
5
2
  const funkyWhiteSpaceRegex = new RegExp('\\p{C}+', 'u');
6
- class PathNormalizerV1 {
3
+ export class PathNormalizerV1 {
7
4
  normalizePath(path) {
8
5
  if (funkyWhiteSpaceRegex.test(path)) {
9
6
  throw CorruptedPathDetected.unexpectedWhitespace(path);
10
7
  }
11
- const normalized = (0, node_path_1.join)(...(path.split('/')));
8
+ const normalized = join(...(path.split('/')));
12
9
  if (normalized.indexOf('../') !== -1 || normalized == '..') {
13
10
  throw PathTraversalDetected.forPath(path);
14
11
  }
15
12
  return normalized === '.' ? '' : normalized;
16
13
  }
17
14
  }
18
- exports.PathNormalizerV1 = PathNormalizerV1;
19
- class CorruptedPathDetected extends Error {
15
+ export class CorruptedPathDetected extends Error {
20
16
  static unexpectedWhitespace = (path) => new CorruptedPathDetected(`Corrupted path detected with unexpected whitespace: ${path}`);
21
17
  }
22
- exports.CorruptedPathDetected = CorruptedPathDetected;
23
- class PathTraversalDetected extends Error {
18
+ export class PathTraversalDetected extends Error {
24
19
  static forPath = (path) => new PathTraversalDetected(`Path traversal detected for: ${path}`);
25
20
  }
26
- exports.PathTraversalDetected = PathTraversalDetected;
@@ -1,12 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PathPrefixer = void 0;
4
- const node_path_1 = require("node:path");
5
- class PathPrefixer {
1
+ import { join } from 'node:path';
2
+ export class PathPrefixer {
6
3
  separator;
7
4
  joinFunc;
8
5
  prefix = '';
9
- constructor(prefix = '', separator = '/', joinFunc = node_path_1.join) {
6
+ constructor(prefix = '', separator = '/', joinFunc = join) {
10
7
  this.separator = separator;
11
8
  this.joinFunc = joinFunc;
12
9
  if (prefix.length > 0) {
@@ -26,4 +23,3 @@ class PathPrefixer {
26
23
  return this.stripFilePath(path).replace(/\/+$/g, '');
27
24
  }
28
25
  }
29
- exports.PathPrefixer = PathPrefixer;
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Visibility = void 0;
4
- var Visibility;
1
+ export var Visibility;
5
2
  (function (Visibility) {
6
3
  Visibility["PUBLIC"] = "public";
7
4
  Visibility["PRIVATE"] = "private";
8
- })(Visibility || (exports.Visibility = Visibility = {}));
5
+ })(Visibility || (Visibility = {}));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flystorage/file-storage",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.3",
5
5
  "description": "File-storage abstraction: multiple filesystems, one API.",
6
6
  "main": "./dist/cjs/index.js",
7
7
  "types": "./dist/types/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "compile": "rm -rf ./dist/ && concurrently npm:compile:* && echo '{\"type\": \"commonjs\"}' > ./dist/cjs/package.json",
22
22
  "compile:esm": "tsc --outDir ./dist/esm/ --declaration false",
23
- "compile:cjs": "tsc --outDir ./dist/cjs/ --declaration false --module commonjs --moduleResolution node",
23
+ "compile:cjs": "tsc --outDir ./dist/cjs/ --declaration false --module node16 --moduleResolution node16",
24
24
  "compile:types": "tsc --outDir ./dist/types/ --declaration --emitDeclarationOnly",
25
25
  "watch": "tsc --watch"
26
26
  },