@typetron/framework 0.5.31 → 0.5.32

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 (113) hide show
  1. package/Framework/Readme.md +8 -3
  2. package/Storage/Readme.md +137 -32
  3. package/build/Cache/Stores/FileStore.d.ts +3 -3
  4. package/build/Cache/Stores/FileStore.d.ts.map +1 -1
  5. package/build/Cache/Stores/FileStore.js.map +1 -1
  6. package/build/Database/List.d.ts +1 -1
  7. package/build/Database/Migrations/Migrator.d.ts +3 -3
  8. package/build/Database/Migrations/Migrator.d.ts.map +1 -1
  9. package/build/Database/Migrations/Migrator.js.map +1 -1
  10. package/build/Database/Seeders/SeederManager.d.ts +3 -3
  11. package/build/Database/Seeders/SeederManager.d.ts.map +1 -1
  12. package/build/Database/Seeders/SeederManager.js +3 -3
  13. package/build/Database/Seeders/SeederManager.js.map +1 -1
  14. package/build/Framework/Application.js +1 -1
  15. package/build/Framework/Application.js.map +1 -1
  16. package/build/Framework/Config/StorageConfig.d.ts +7 -0
  17. package/build/Framework/Config/StorageConfig.d.ts.map +1 -0
  18. package/build/Framework/Config/StorageConfig.js +15 -0
  19. package/build/Framework/Config/StorageConfig.js.map +1 -0
  20. package/build/Framework/Config/index.d.ts +1 -0
  21. package/build/Framework/Config/index.d.ts.map +1 -1
  22. package/build/Framework/Config/index.js +1 -0
  23. package/build/Framework/Config/index.js.map +1 -1
  24. package/build/Framework/Middleware/StaticAssetsMiddleware.d.ts +2 -2
  25. package/build/Framework/Middleware/StaticAssetsMiddleware.d.ts.map +1 -1
  26. package/build/Framework/Middleware/StaticAssetsMiddleware.js +1 -1
  27. package/build/Framework/Middleware/StaticAssetsMiddleware.js.map +1 -1
  28. package/build/Framework/Providers/CacheProvider.js +1 -1
  29. package/build/Framework/Providers/CacheProvider.js.map +1 -1
  30. package/build/Framework/Providers/DatabaseProvider.d.ts +2 -2
  31. package/build/Framework/Providers/DatabaseProvider.d.ts.map +1 -1
  32. package/build/Framework/Providers/DatabaseProvider.js +1 -1
  33. package/build/Framework/Providers/DatabaseProvider.js.map +1 -1
  34. package/build/Framework/Providers/StorageProvider.d.ts +7 -0
  35. package/build/Framework/Providers/StorageProvider.d.ts.map +1 -0
  36. package/build/Framework/Providers/StorageProvider.js +28 -0
  37. package/build/Framework/Providers/StorageProvider.js.map +1 -0
  38. package/build/Framework/Providers/WebsocketsProvider.d.ts.map +1 -1
  39. package/build/Framework/Providers/WebsocketsProvider.js +13 -0
  40. package/build/Framework/Providers/WebsocketsProvider.js.map +1 -1
  41. package/build/Framework/index.d.ts +1 -0
  42. package/build/Framework/index.d.ts.map +1 -1
  43. package/build/Framework/index.js +1 -0
  44. package/build/Framework/index.js.map +1 -1
  45. package/build/Router/Http/Request.d.ts.map +1 -1
  46. package/build/Router/Http/Request.js +3 -4
  47. package/build/Router/Http/Request.js.map +1 -1
  48. package/build/Router/Router.js +1 -1
  49. package/build/Router/Router.js.map +1 -1
  50. package/build/Router/Servers/uNetworking.d.ts.map +1 -1
  51. package/build/Router/Servers/uNetworking.js +3 -4
  52. package/build/Router/Servers/uNetworking.js.map +1 -1
  53. package/build/Storage/Drivers/LocalDriver.d.ts +26 -0
  54. package/build/Storage/Drivers/LocalDriver.d.ts.map +1 -0
  55. package/build/Storage/Drivers/LocalDriver.js +209 -0
  56. package/build/Storage/Drivers/LocalDriver.js.map +1 -0
  57. package/build/Storage/Drivers/MemoryDriver.d.ts +25 -0
  58. package/build/Storage/Drivers/MemoryDriver.d.ts.map +1 -0
  59. package/build/Storage/Drivers/MemoryDriver.js +108 -0
  60. package/build/Storage/Drivers/MemoryDriver.js.map +1 -0
  61. package/build/Storage/Drivers/ReadOnlyDriver.d.ts +22 -0
  62. package/build/Storage/Drivers/ReadOnlyDriver.d.ts.map +1 -0
  63. package/build/Storage/Drivers/ReadOnlyDriver.js +38 -0
  64. package/build/Storage/Drivers/ReadOnlyDriver.js.map +1 -0
  65. package/build/Storage/Drivers/S3Driver.d.ts +32 -0
  66. package/build/Storage/Drivers/S3Driver.d.ts.map +1 -0
  67. package/build/Storage/Drivers/S3Driver.js +248 -0
  68. package/build/Storage/Drivers/S3Driver.js.map +1 -0
  69. package/build/Storage/Drivers/ScopedDriver.d.ts +24 -0
  70. package/build/Storage/Drivers/ScopedDriver.d.ts.map +1 -0
  71. package/build/Storage/Drivers/ScopedDriver.js +50 -0
  72. package/build/Storage/Drivers/ScopedDriver.js.map +1 -0
  73. package/build/Storage/File.d.ts +14 -4
  74. package/build/Storage/File.d.ts.map +1 -1
  75. package/build/Storage/File.js +29 -47
  76. package/build/Storage/File.js.map +1 -1
  77. package/build/Storage/Filesystem.d.ts +31 -0
  78. package/build/Storage/Filesystem.d.ts.map +1 -0
  79. package/build/Storage/Filesystem.js +121 -0
  80. package/build/Storage/Filesystem.js.map +1 -0
  81. package/build/Storage/PathPrefixer.d.ts +9 -0
  82. package/build/Storage/PathPrefixer.d.ts.map +1 -0
  83. package/build/Storage/PathPrefixer.js +53 -0
  84. package/build/Storage/PathPrefixer.js.map +1 -0
  85. package/build/Storage/Storage.d.ts +37 -9
  86. package/build/Storage/Storage.d.ts.map +1 -1
  87. package/build/Storage/Storage.js +85 -101
  88. package/build/Storage/Storage.js.map +1 -1
  89. package/build/Storage/StorageDisk.d.ts +34 -0
  90. package/build/Storage/StorageDisk.d.ts.map +1 -0
  91. package/build/Storage/StorageDisk.js +104 -0
  92. package/build/Storage/StorageDisk.js.map +1 -0
  93. package/build/Storage/StorageDriver.d.ts +19 -0
  94. package/build/Storage/StorageDriver.d.ts.map +1 -0
  95. package/build/Storage/StorageDriver.js +7 -0
  96. package/build/Storage/StorageDriver.js.map +1 -0
  97. package/build/Storage/UploadedFile.d.ts +9 -0
  98. package/build/Storage/UploadedFile.d.ts.map +1 -0
  99. package/build/Storage/UploadedFile.js +22 -0
  100. package/build/Storage/UploadedFile.js.map +1 -0
  101. package/build/Storage/errors.d.ts +21 -0
  102. package/build/Storage/errors.d.ts.map +1 -0
  103. package/build/Storage/errors.js +43 -0
  104. package/build/Storage/errors.js.map +1 -0
  105. package/build/Storage/index.d.ts +12 -0
  106. package/build/Storage/index.d.ts.map +1 -1
  107. package/build/Storage/index.js +12 -0
  108. package/build/Storage/index.js.map +1 -1
  109. package/build/Storage/types.d.ts +73 -0
  110. package/build/Storage/types.d.ts.map +1 -0
  111. package/build/Storage/types.js +3 -0
  112. package/build/Storage/types.js.map +1 -0
  113. package/package.json +16 -2
@@ -1,61 +1,43 @@
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
6
  exports.File = void 0;
37
- const path = __importStar(require("path"));
7
+ const node_path_1 = __importDefault(require("node:path"));
38
8
  class File {
39
- name;
40
- directory;
41
- // content?: string | Buffer
9
+ key;
10
+ disk;
42
11
  originalName;
43
12
  saved = false;
44
- constructor(name, directory) {
45
- this.name = name;
46
- this.directory = directory;
13
+ size;
14
+ lastModified;
15
+ mimeType;
16
+ etag;
17
+ metadata;
18
+ visibility;
19
+ constructor(key, disk, metadata = {}) {
20
+ this.key = key;
21
+ this.disk = disk;
22
+ Object.assign(this, metadata);
47
23
  }
48
- get extension() {
49
- return this.guessExtension();
24
+ get name() {
25
+ return node_path_1.default.posix.basename(this.key.replaceAll('\\', '/'));
26
+ }
27
+ get directory() {
28
+ const directory = node_path_1.default.posix.dirname(this.key.replaceAll('\\', '/'));
29
+ return directory === '.' ? '' : directory;
50
30
  }
31
+ /** The logical storage key. Kept as an alias for existing file consumers. */
51
32
  get path() {
52
- return path.join(this.directory || '', this.name);
33
+ return this.key;
34
+ }
35
+ get extension() {
36
+ const extension = node_path_1.default.posix.extname(this.name);
37
+ return extension ? extension.slice(1) : undefined;
53
38
  }
54
39
  guessExtension() {
55
- const fileParts = this.name.split('.');
56
- if (fileParts.length >= 1) {
57
- return fileParts.pop();
58
- }
40
+ return this.extension;
59
41
  }
60
42
  toString() {
61
43
  return this.name;
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","sourceRoot":"","sources":["../../Storage/File.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAE5B,MAAa,IAAI;IAMM;IAAqB;IALxC,4BAA4B;IAC5B,YAAY,CAAS;IAErB,KAAK,GAAG,KAAK,CAAA;IAEb,YAAmB,IAAY,EAAS,SAAkB;QAAvC,SAAI,GAAJ,IAAI,CAAQ;QAAS,cAAS,GAAT,SAAS,CAAS;IAC1D,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,cAAc,EAAE,CAAA;IAChC,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACrD,CAAC;IAED,cAAc;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,GAAG,EAAE,CAAA;QAC1B,CAAC;IACL,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,CAAA;IACpB,CAAC;CACJ;AA3BD,oBA2BC"}
1
+ {"version":3,"file":"File.js","sourceRoot":"","sources":["../../Storage/File.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA4B;AAG5B,MAAa,IAAI;IAWF;IACA;IAXX,YAAY,CAAS;IACrB,KAAK,GAAG,KAAK,CAAA;IACb,IAAI,CAAS;IACb,YAAY,CAAO;IACnB,QAAQ,CAAS;IACjB,IAAI,CAAS;IACb,QAAQ,CAAyB;IACjC,UAAU,CAAa;IAEvB,YACW,GAAW,EACX,IAAa,EACpB,WAAkC,EAAE;QAF7B,QAAG,GAAH,GAAG,CAAQ;QACX,SAAI,GAAJ,IAAI,CAAS;QAGpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,mBAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,IAAI,SAAS;QACT,MAAM,SAAS,GAAG,mBAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACpE,OAAO,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7C,CAAC;IAED,6EAA6E;IAC7E,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACnB,CAAC;IAED,IAAI,SAAS;QACT,MAAM,SAAS,GAAG,mBAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED,cAAc;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,CAAA;IACpB,CAAC;CACJ;AA5CD,oBA4CC"}
@@ -0,0 +1,31 @@
1
+ import * as fileSystem from 'node:fs/promises';
2
+ import { File } from './File';
3
+ /**
4
+ * Typetron's internal access to the host operating-system filesystem.
5
+ *
6
+ * Framework bootstrap uses this service before application storage configuration
7
+ * is available. It accepts real OS paths so Typetron can discover configuration,
8
+ * controllers, entities, migrations, seeders, static assets, and file-cache data.
9
+ * Application code should use `Storage` and its configured disks instead.
10
+ *
11
+ * This is deliberately separate from `LocalDriver`: a local storage disk is
12
+ * constrained to its configured root and works with portable logical keys,
13
+ * while this service works with framework-owned host paths.
14
+ *
15
+ * @internal
16
+ */
17
+ export declare class Filesystem {
18
+ /**
19
+ * Lists files synchronously because framework modules are currently loaded
20
+ * synchronously during bootstrap. Application storage listings are async.
21
+ */
22
+ files(directory: string, recursively?: boolean): File[];
23
+ read(filePath: string): Promise<Buffer>;
24
+ exists(filePath: string): Promise<boolean>;
25
+ save(file: File, destination: string, name?: string | number): Promise<File>;
26
+ put(filePath: string, content: string | Buffer, options?: Parameters<typeof fileSystem.writeFile>[2]): Promise<File>;
27
+ makeDirectory(directory: string): Promise<void>;
28
+ deleteDirectory(directory: string): Promise<void>;
29
+ delete(filePath: string): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=Filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Filesystem.d.ts","sourceRoot":"","sources":["../../Storage/Filesystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAU;IACnB;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,IAAI,EAAE;IAc/C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5E,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAShD"}
@@ -0,0 +1,121 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Filesystem = void 0;
40
+ const node_fs_1 = __importDefault(require("node:fs"));
41
+ const fileSystem = __importStar(require("node:fs/promises"));
42
+ const node_path_1 = __importDefault(require("node:path"));
43
+ const File_1 = require("./File");
44
+ /**
45
+ * Typetron's internal access to the host operating-system filesystem.
46
+ *
47
+ * Framework bootstrap uses this service before application storage configuration
48
+ * is available. It accepts real OS paths so Typetron can discover configuration,
49
+ * controllers, entities, migrations, seeders, static assets, and file-cache data.
50
+ * Application code should use `Storage` and its configured disks instead.
51
+ *
52
+ * This is deliberately separate from `LocalDriver`: a local storage disk is
53
+ * constrained to its configured root and works with portable logical keys,
54
+ * while this service works with framework-owned host paths.
55
+ *
56
+ * @internal
57
+ */
58
+ class Filesystem {
59
+ /**
60
+ * Lists files synchronously because framework modules are currently loaded
61
+ * synchronously during bootstrap. Application storage listings are async.
62
+ */
63
+ files(directory, recursively = false) {
64
+ return node_fs_1.default.readdirSync(directory).reduce((files, name) => {
65
+ const filePath = node_path_1.default.join(directory, name);
66
+ const stats = node_fs_1.default.statSync(filePath);
67
+ if (stats.isFile()) {
68
+ files.push(new File_1.File(filePath));
69
+ }
70
+ if (recursively && stats.isDirectory()) {
71
+ files.push(...this.files(filePath, true));
72
+ }
73
+ return files;
74
+ }, []);
75
+ }
76
+ async read(filePath) {
77
+ return fileSystem.readFile(filePath);
78
+ }
79
+ async exists(filePath) {
80
+ try {
81
+ await fileSystem.access(filePath);
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ async save(file, destination, name) {
89
+ const stats = await fileSystem.stat(destination).catch(() => undefined);
90
+ const destinationPath = stats?.isDirectory()
91
+ ? node_path_1.default.join(destination, String(name ?? file.name))
92
+ : destination;
93
+ await fileSystem.mkdir(node_path_1.default.dirname(destinationPath), { recursive: true });
94
+ await fileSystem.copyFile(file.path, destinationPath);
95
+ return new File_1.File(destinationPath);
96
+ }
97
+ async put(filePath, content, options) {
98
+ await fileSystem.mkdir(node_path_1.default.dirname(filePath), { recursive: true });
99
+ await fileSystem.writeFile(filePath, content, options);
100
+ return new File_1.File(filePath);
101
+ }
102
+ async makeDirectory(directory) {
103
+ await fileSystem.mkdir(directory, { recursive: true });
104
+ }
105
+ async deleteDirectory(directory) {
106
+ if (await this.exists(directory)) {
107
+ await fileSystem.rm(directory, { recursive: true });
108
+ }
109
+ }
110
+ async delete(filePath) {
111
+ if (!(await this.exists(filePath))) {
112
+ return;
113
+ }
114
+ if ((await fileSystem.stat(filePath)).isDirectory()) {
115
+ throw new Error('Can not delete because this path leads to a directory and not a file.');
116
+ }
117
+ await fileSystem.unlink(filePath);
118
+ }
119
+ }
120
+ exports.Filesystem = Filesystem;
121
+ //# sourceMappingURL=Filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Filesystem.js","sourceRoot":"","sources":["../../Storage/Filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare class PathPrefixer {
2
+ private readonly prefixValue;
3
+ constructor(prefix?: string);
4
+ normalize(key: string, allowEmpty?: boolean): string;
5
+ prefix(key: string, allowEmpty?: boolean): string;
6
+ stripPrefix(key: string): string;
7
+ resolve(root: string, key: string): string;
8
+ }
9
+ //# sourceMappingURL=PathPrefixer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathPrefixer.d.ts","sourceRoot":"","sources":["../../Storage/PathPrefixer.ts"],"names":[],"mappings":"AAGA,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,MAAM,SAAK;IAIvB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM;IAalD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM;IAK/C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAchC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAS7C"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PathPrefixer = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const errors_1 = require("./errors");
9
+ class PathPrefixer {
10
+ prefixValue;
11
+ constructor(prefix = '') {
12
+ this.prefixValue = this.normalize(prefix, true);
13
+ }
14
+ normalize(key, allowEmpty = false) {
15
+ if (key.includes('\0')) {
16
+ throw new errors_1.InvalidStorageKey(key);
17
+ }
18
+ const normalized = key.replaceAll('\\', '/').replace(/^\/+|\/+$/g, '').replace(/\/{2,}/g, '/');
19
+ const segments = normalized.split('/');
20
+ if (segments.includes('..') || (!allowEmpty && !normalized)) {
21
+ throw new errors_1.InvalidStorageKey(key);
22
+ }
23
+ return normalized;
24
+ }
25
+ prefix(key, allowEmpty = false) {
26
+ const normalized = this.normalize(key, allowEmpty);
27
+ return [this.prefixValue, normalized].filter(Boolean).join('/');
28
+ }
29
+ stripPrefix(key) {
30
+ const normalized = this.normalize(key, true);
31
+ if (!this.prefixValue) {
32
+ return normalized;
33
+ }
34
+ if (normalized === this.prefixValue) {
35
+ return '';
36
+ }
37
+ if (!normalized.startsWith(`${this.prefixValue}/`)) {
38
+ throw new errors_1.InvalidStorageKey(key);
39
+ }
40
+ return normalized.slice(this.prefixValue.length + 1);
41
+ }
42
+ resolve(root, key) {
43
+ const normalized = this.prefix(key);
44
+ const resolvedRoot = node_path_1.default.resolve(root);
45
+ const resolved = node_path_1.default.resolve(resolvedRoot, ...normalized.split('/'));
46
+ if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${node_path_1.default.sep}`)) {
47
+ throw new errors_1.InvalidStorageKey(key);
48
+ }
49
+ return resolved;
50
+ }
51
+ }
52
+ exports.PathPrefixer = PathPrefixer;
53
+ //# sourceMappingURL=PathPrefixer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathPrefixer.js","sourceRoot":"","sources":["../../Storage/PathPrefixer.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA4B;AAC5B,qCAA4C;AAE5C,MAAa,YAAY;IACJ,WAAW,CAAQ;IAEpC,YAAY,MAAM,GAAG,EAAE;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,UAAU,GAAG,KAAK;QACrC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,0BAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAC9F,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,0BAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QACD,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,UAAU,GAAG,KAAK;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnE,CAAC;IAED,WAAW,CAAC,GAAW;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,UAAU,CAAA;QACrB,CAAC;QACD,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,OAAO,EAAE,CAAA;QACb,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,0BAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,GAAW;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,mBAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QACrE,IAAI,QAAQ,KAAK,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,mBAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,0BAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QACD,OAAO,QAAQ,CAAA;IACnB,CAAC;CACJ;AAhDD,oCAgDC"}
@@ -1,13 +1,41 @@
1
+ import { Readable } from 'node:stream';
1
2
  import { File } from './File';
3
+ import { StorageDisk } from './StorageDisk';
4
+ import { StorageDriver } from './StorageDriver';
5
+ import { UploadedFile } from './UploadedFile';
6
+ import { ListOptions, StorageConfiguration, StorageContent, StorageDiskConfig, TemporaryUrlOptions, Visibility, WriteOptions } from './types';
7
+ export type StorageDriverFactory = (config: StorageDiskConfig, name: string, storage: Storage) => StorageDriver;
2
8
  export declare class Storage {
3
- files(directory: string, recursively?: boolean): File[];
4
- read(filePath: string): Promise<Buffer>;
5
- exists(filePath: string): Promise<boolean>;
6
- save(file: File, directory?: string, name?: string | number): Promise<File>;
7
- put(filePath: string, content: string | Buffer, options?: any): Promise<File>;
8
- makeDirectory(directory: string): Promise<void>;
9
- deleteDirectory(directory: string): Promise<void>;
10
- delete(filePath: string): Promise<void>;
11
- private generateRandomFileName;
9
+ readonly config: StorageConfiguration;
10
+ private readonly disks;
11
+ private readonly factories;
12
+ private readonly resolving;
13
+ constructor(config?: StorageConfiguration);
14
+ disk(name?: string): StorageDisk;
15
+ build(config: StorageDiskConfig, name?: string): StorageDisk;
16
+ extend(driver: string, factory: StorageDriverFactory): this;
17
+ set(name: string, disk: StorageDisk): this;
18
+ forget(name: string): this;
19
+ fake(name?: string): StorageDisk;
20
+ put(key: string, content: StorageContent, options?: WriteOptions): Promise<File>;
21
+ putFile(key: string, file: UploadedFile, options?: WriteOptions): Promise<File>;
22
+ read(key: string): Promise<Buffer>;
23
+ get(key: string): Promise<Buffer>;
24
+ readStream(key: string): Promise<Readable>;
25
+ json<T>(key: string): Promise<T>;
26
+ exists(key: string): Promise<boolean>;
27
+ missing(key: string): Promise<boolean>;
28
+ stat(key: string): Promise<File>;
29
+ list(prefix?: string, options?: ListOptions): AsyncIterable<import("./types").StorageEntry>;
30
+ files(prefix?: string, options?: ListOptions): Promise<File[]>;
31
+ directories(prefix?: string): Promise<string[]>;
32
+ delete(key: string): Promise<void>;
33
+ deleteDirectory(prefix: string): Promise<void>;
34
+ copy(source: string, destination: string): Promise<File>;
35
+ move(source: string, destination: string): Promise<File>;
36
+ visibility(key: string): Promise<Visibility>;
37
+ setVisibility(key: string, visibility: Visibility): Promise<void>;
38
+ url(key: string): string;
39
+ temporaryUrl(key: string, expiresInSeconds: number, options?: TemporaryUrlOptions): Promise<string>;
12
40
  }
13
41
  //# sourceMappingURL=Storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../Storage/Storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAI7B,qBAAa,OAAO;IAChB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,IAAI,EAAE;IAmB/C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,GAAE,MAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/E,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7E,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C,OAAO,CAAC,sBAAsB;CAOjC"}
1
+ {"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../Storage/Storage.ts"],"names":[],"mappings":"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"}
@@ -1,119 +1,103 @@
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.Storage = void 0;
37
- const fileSystemDeprecated = __importStar(require("fs"));
38
- const File_1 = require("./File");
39
- const path = __importStar(require("path"));
40
- const fileSystem = __importStar(require("node:fs/promises"));
4
+ const LocalDriver_1 = require("./Drivers/LocalDriver");
5
+ const MemoryDriver_1 = require("./Drivers/MemoryDriver");
6
+ const ReadOnlyDriver_1 = require("./Drivers/ReadOnlyDriver");
7
+ const S3Driver_1 = require("./Drivers/S3Driver");
8
+ const ScopedDriver_1 = require("./Drivers/ScopedDriver");
9
+ const StorageDisk_1 = require("./StorageDisk");
10
+ const errors_1 = require("./errors");
11
+ const defaultConfiguration = {
12
+ default: 'local',
13
+ disks: { local: { driver: 'local', root: 'storage/app' } },
14
+ };
41
15
  class Storage {
42
- files(directory, recursively = false) {
43
- return fileSystemDeprecated
44
- .readdirSync(directory) // TODO make this async
45
- .reduce((files, name) => {
46
- const filePath = path.join(directory, name);
47
- const stats = fileSystemDeprecated.statSync(filePath);
48
- if (stats.isFile()) {
49
- const file = new File_1.File(name);
50
- file.directory = directory;
51
- files.push(file);
52
- }
53
- if (recursively && stats.isDirectory()) {
54
- files = files.concat(this.files(filePath));
55
- }
56
- return files;
57
- }, []);
58
- }
59
- async read(filePath) {
60
- return fileSystem.readFile(filePath);
16
+ config;
17
+ disks = new Map();
18
+ factories = new Map();
19
+ resolving = new Set();
20
+ constructor(config = defaultConfiguration) {
21
+ this.config = config;
22
+ this.extend('local', config => new LocalDriver_1.LocalDriver(config));
23
+ this.extend('memory', config => new MemoryDriver_1.MemoryDriver(config));
24
+ this.extend('s3', config => new S3Driver_1.S3Driver(config));
25
+ this.extend('scoped', config => {
26
+ const scoped = config;
27
+ return new ScopedDriver_1.ScopedDriver(this.disk(scoped.disk).driver(), scoped.prefix);
28
+ });
29
+ this.extend('read-only', config => {
30
+ const readOnly = config;
31
+ return new ReadOnlyDriver_1.ReadOnlyDriver(this.disk(readOnly.disk).driver());
32
+ });
61
33
  }
62
- async exists(filePath) {
63
- try {
64
- await fileSystem.access(filePath);
65
- return true;
34
+ disk(name = this.config.default) {
35
+ const cached = this.disks.get(name);
36
+ if (cached) {
37
+ return cached;
66
38
  }
67
- catch (error) {
68
- return false;
39
+ const config = this.config.disks[name];
40
+ if (!config) {
41
+ throw new errors_1.StorageDiskNotFound(name);
69
42
  }
70
- }
71
- async save(file, directory = '', name) {
72
- const newPath = path.join(directory, file.name);
73
- if (!file.name) {
74
- file.name = String(name || this.generateRandomFileName() + '.' + file.extension);
43
+ if (this.resolving.has(name)) {
44
+ throw new Error(`Circular storage disk configuration detected at '${name}'.`);
75
45
  }
76
- if (directory && !(await this.exists(directory))) {
77
- await this.makeDirectory(directory);
46
+ this.resolving.add(name);
47
+ try {
48
+ const disk = this.build(config, name);
49
+ this.disks.set(name, disk);
50
+ return disk;
51
+ }
52
+ finally {
53
+ this.resolving.delete(name);
78
54
  }
79
- return new Promise(async (resolve, reject) => {
80
- fileSystemDeprecated
81
- .createReadStream(file.path)
82
- .on('error', reject)
83
- .pipe(fileSystemDeprecated.createWriteStream(newPath))
84
- .on('finish', () => resolve(file))
85
- .on('error', reject);
86
- });
87
55
  }
88
- async put(filePath, content, options) {
89
- const file = new File_1.File(path.basename(filePath));
90
- file.directory = path.dirname(filePath);
91
- if (file.directory && !(await this.exists(file.directory))) {
92
- await this.makeDirectory(file.directory);
56
+ build(config, name = 'ondemand') {
57
+ const factory = this.factories.get(config.driver);
58
+ if (!factory) {
59
+ throw new errors_1.StorageDriverNotSupported(config.driver);
93
60
  }
94
- await fileSystem.writeFile(filePath, content, options);
95
- return file;
61
+ return new StorageDisk_1.StorageDisk(name, factory(config, name, this));
96
62
  }
97
- async makeDirectory(directory) {
98
- await fileSystem.mkdir(directory, { recursive: true });
63
+ extend(driver, factory) {
64
+ this.factories.set(driver, factory);
65
+ return this;
99
66
  }
100
- async deleteDirectory(directory) {
101
- if (await this.exists(directory)) {
102
- await fileSystem.rm(directory, { recursive: true });
103
- }
67
+ set(name, disk) {
68
+ this.disks.set(name, disk);
69
+ return this;
104
70
  }
105
- async delete(filePath) {
106
- if (!(await this.exists(filePath))) {
107
- return;
108
- }
109
- if ((await fileSystem.stat(filePath)).isDirectory()) {
110
- throw new Error('Can not delete because this path leads to a directory and not a file.');
111
- }
112
- await fileSystem.unlink(filePath);
71
+ forget(name) {
72
+ this.disks.delete(name);
73
+ return this;
74
+ }
75
+ fake(name = this.config.default) {
76
+ const disk = new StorageDisk_1.StorageDisk(name, new MemoryDriver_1.MemoryDriver({ driver: 'memory' }));
77
+ this.set(name, disk);
78
+ return disk;
113
79
  }
114
- generateRandomFileName() {
115
- const stringDomain = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
116
- return (String.random(13, stringDomain) + '-' + new Date().getTime().toString());
80
+ put(key, content, options) { return this.disk().put(key, content, options); }
81
+ putFile(key, file, options) { return this.disk().putFile(key, file, options); }
82
+ read(key) { return this.disk().read(key); }
83
+ get(key) { return this.disk().get(key); }
84
+ readStream(key) { return this.disk().readStream(key); }
85
+ json(key) { return this.disk().json(key); }
86
+ exists(key) { return this.disk().exists(key); }
87
+ missing(key) { return this.disk().missing(key); }
88
+ stat(key) { return this.disk().stat(key); }
89
+ list(prefix = '', options) { return this.disk().list(prefix, options); }
90
+ files(prefix = '', options) { return this.disk().files(prefix, options); }
91
+ directories(prefix = '') { return this.disk().directories(prefix); }
92
+ delete(key) { return this.disk().delete(key); }
93
+ deleteDirectory(prefix) { return this.disk().deleteDirectory(prefix); }
94
+ copy(source, destination) { return this.disk().copy(source, destination); }
95
+ move(source, destination) { return this.disk().move(source, destination); }
96
+ visibility(key) { return this.disk().visibility(key); }
97
+ setVisibility(key, visibility) { return this.disk().setVisibility(key, visibility); }
98
+ url(key) { return this.disk().url(key); }
99
+ temporaryUrl(key, expiresInSeconds, options) {
100
+ return this.disk().temporaryUrl(key, expiresInSeconds, options);
117
101
  }
118
102
  }
119
103
  exports.Storage = Storage;