@flystorage/file-storage 0.1.3 → 0.1.4

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