s3-client-dtb 0.0.1 → 1.0.2

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.
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readOfflineConfig = readOfflineConfig;
4
+ exports.readOnlineConfig = readOnlineConfig;
5
+ exports.getStorageMode = getStorageMode;
6
+ exports.readStorageConfig = readStorageConfig;
7
+ exports.readClientConfig = readClientConfig;
8
+ exports.toClientConfig = toClientConfig;
9
+ /**
10
+ * Parsea un string que puede ser JSON array o comma-separated a un array
11
+ */
12
+ function parseArray(value, fieldName) {
13
+ if (!value) {
14
+ throw new Error(`${fieldName} es requerido como variable de entorno`);
15
+ }
16
+ // Intentar parsear como JSON primero
17
+ try {
18
+ const parsed = JSON.parse(value);
19
+ if (Array.isArray(parsed)) {
20
+ return parsed;
21
+ }
22
+ }
23
+ catch {
24
+ // Si no es JSON válido, intentar como comma-separated
25
+ }
26
+ // Parsear como comma-separated
27
+ const items = value.split(',').map((item) => item.trim()).filter((item) => item.length > 0);
28
+ if (items.length === 0) {
29
+ throw new Error(`${fieldName} debe contener al menos un valor`);
30
+ }
31
+ return items;
32
+ }
33
+ /**
34
+ * Lee la configuración del modo offline desde variables de entorno
35
+ */
36
+ function readOfflineConfig() {
37
+ const rootPath = process.env.STORAGE_ROOT_PATH;
38
+ if (!rootPath || typeof rootPath !== 'string' || rootPath.trim().length === 0) {
39
+ throw new Error('STORAGE_ROOT_PATH es requerido para modo offline');
40
+ }
41
+ const maxFileSize = process.env.STORAGE_MAX_FILE_SIZE;
42
+ // MIME types permitidos (opcional)
43
+ let allowedMimeTypes;
44
+ const mimeTypesStr = process.env.STORAGE_ALLOWED_MIME_TYPES;
45
+ if (mimeTypesStr) {
46
+ try {
47
+ allowedMimeTypes = parseArray(mimeTypesStr, 'STORAGE_ALLOWED_MIME_TYPES');
48
+ }
49
+ catch {
50
+ // Si falla, intentar como string único
51
+ allowedMimeTypes = [mimeTypesStr.trim()];
52
+ }
53
+ }
54
+ return {
55
+ mode: 'offline',
56
+ rootPath: rootPath.trim(),
57
+ maxFileSize: maxFileSize?.trim(),
58
+ allowedMimeTypes,
59
+ };
60
+ }
61
+ /**
62
+ * Lee la configuración del modo online desde variables de entorno
63
+ */
64
+ function readOnlineConfig() {
65
+ // Leer variables de entorno requeridas
66
+ const clientId = process.env.STORAGE_CLIENT_ID;
67
+ const name = process.env.STORAGE_CLIENT_NAME;
68
+ const baseUrl = process.env.STORAGE_BASE_URL;
69
+ const clientSecret = process.env.STORAGE_CLIENT_SECRET;
70
+ const totpSecret = process.env.STORAGE_TOTP_SECRET;
71
+ // Validar campos requeridos
72
+ if (!clientId || typeof clientId !== 'string' || clientId.trim().length === 0) {
73
+ throw new Error('STORAGE_CLIENT_ID es requerido como variable de entorno');
74
+ }
75
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
76
+ throw new Error('STORAGE_CLIENT_NAME es requerido como variable de entorno');
77
+ }
78
+ if (!baseUrl || typeof baseUrl !== 'string' || baseUrl.trim().length === 0) {
79
+ throw new Error('STORAGE_BASE_URL es requerido como variable de entorno');
80
+ }
81
+ if (!clientSecret || typeof clientSecret !== 'string' || clientSecret.trim().length === 0) {
82
+ throw new Error('STORAGE_CLIENT_SECRET es requerido como variable de entorno');
83
+ }
84
+ if (!totpSecret || typeof totpSecret !== 'string' || totpSecret.trim().length === 0) {
85
+ throw new Error('STORAGE_TOTP_SECRET es requerido como variable de entorno');
86
+ }
87
+ // Parsear arrays desde variables de entorno
88
+ const permissionsStr = process.env.STORAGE_PERMISSIONS;
89
+ const allowedPathsStr = process.env.STORAGE_ALLOWED_PATHS;
90
+ let permissions;
91
+ try {
92
+ permissions = parseArray(permissionsStr, 'STORAGE_PERMISSIONS');
93
+ }
94
+ catch (error) {
95
+ throw new Error(`STORAGE_PERMISSIONS es requerido: ${error instanceof Error ? error.message : String(error)}`);
96
+ }
97
+ let allowedPaths;
98
+ try {
99
+ allowedPaths = parseArray(allowedPathsStr, 'STORAGE_ALLOWED_PATHS');
100
+ }
101
+ catch (error) {
102
+ throw new Error(`STORAGE_ALLOWED_PATHS es requerido: ${error instanceof Error ? error.message : String(error)}`);
103
+ }
104
+ // Validar permisos
105
+ const validPermissions = ['read', 'write', 'delete'];
106
+ for (const perm of permissions) {
107
+ if (!validPermissions.includes(perm)) {
108
+ throw new Error(`Permiso inválido: ${perm}. Permisos válidos: read, write, delete`);
109
+ }
110
+ }
111
+ // Parsear configuración opcional de rate limit
112
+ let rateLimit;
113
+ const rateLimitRequests = process.env.STORAGE_RATE_LIMIT_REQUESTS;
114
+ const rateLimitWindow = process.env.STORAGE_RATE_LIMIT_WINDOW;
115
+ if (rateLimitRequests || rateLimitWindow) {
116
+ if (!rateLimitRequests || !rateLimitWindow) {
117
+ throw new Error('STORAGE_RATE_LIMIT_REQUESTS y STORAGE_RATE_LIMIT_WINDOW deben estar ambos definidos si se usa rate limit');
118
+ }
119
+ const requests = parseInt(rateLimitRequests, 10);
120
+ if (isNaN(requests) || requests <= 0) {
121
+ throw new Error('STORAGE_RATE_LIMIT_REQUESTS debe ser un número positivo');
122
+ }
123
+ rateLimit = {
124
+ requests,
125
+ window: rateLimitWindow,
126
+ };
127
+ }
128
+ // Token expires in (opcional)
129
+ const tokenExpiresIn = process.env.STORAGE_TOKEN_EXPIRES_IN;
130
+ // Período TOTP en segundos (opcional, default 30). Debe coincidir con TOTP_PERIOD del servidor.
131
+ let totpPeriod;
132
+ const totpPeriodStr = process.env.STORAGE_TOTP_PERIOD;
133
+ if (totpPeriodStr) {
134
+ const n = parseInt(totpPeriodStr, 10);
135
+ if (isNaN(n) || n < 15 || n > 300) {
136
+ throw new Error('STORAGE_TOTP_PERIOD debe ser un número entre 15 y 300 (segundos)');
137
+ }
138
+ totpPeriod = n;
139
+ }
140
+ return {
141
+ mode: 'online',
142
+ clientId: clientId.trim(),
143
+ name: name.trim(),
144
+ baseUrl: baseUrl.trim(),
145
+ permissions: permissions,
146
+ allowedPaths,
147
+ rateLimit,
148
+ tokenExpiresIn: tokenExpiresIn?.trim(),
149
+ clientSecret: clientSecret.trim(),
150
+ totpSecret: totpSecret.trim(),
151
+ totpPeriod,
152
+ };
153
+ }
154
+ /**
155
+ * Detecta el modo de almacenamiento desde STORAGE_MODE.
156
+ * Default: 'online' si no se especifica.
157
+ */
158
+ function getStorageMode() {
159
+ const mode = process.env.STORAGE_MODE?.toLowerCase().trim();
160
+ if (!mode || mode === 'online') {
161
+ return 'online';
162
+ }
163
+ if (mode === 'offline' || mode === 'local') {
164
+ return 'offline';
165
+ }
166
+ throw new Error(`STORAGE_MODE inválido: "${mode}". Valores válidos: "online", "offline"`);
167
+ }
168
+ /**
169
+ * Lee la configuración del cliente desde variables de entorno.
170
+ * Detecta automáticamente el modo (online/offline) según STORAGE_MODE.
171
+ *
172
+ * @returns Configuración para modo online u offline
173
+ */
174
+ function readStorageConfig() {
175
+ const mode = getStorageMode();
176
+ if (mode === 'offline') {
177
+ return readOfflineConfig();
178
+ }
179
+ return readOnlineConfig();
180
+ }
181
+ /**
182
+ * Lee la configuración del cliente desde variables de entorno (modo online)
183
+ * @deprecated Usa readStorageConfig() para soporte automático de modo online/offline
184
+ */
185
+ function readClientConfig() {
186
+ return readOnlineConfig();
187
+ }
188
+ /**
189
+ * Convierte ClientConfigFile a ClientConfig (sin baseUrl y tiempos)
190
+ */
191
+ function toClientConfig(config) {
192
+ return {
193
+ clientId: config.clientId,
194
+ name: config.name,
195
+ permissions: config.permissions,
196
+ allowedPaths: config.allowedPaths,
197
+ rateLimit: config.rateLimit,
198
+ tokenExpiresIn: config.tokenExpiresIn,
199
+ };
200
+ }
201
+ //# sourceMappingURL=config-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-reader.js","sourceRoot":"","sources":["../../src/config/config-reader.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  export { StorageCore } from './core/storage-core';
2
2
  export type { StorageCoreOptions } from './types';
3
- export { StorageClient } from './client/storage-client';
3
+ export { StorageClient, LocalStorageClient, createClientFromConfig, createOnlineClient, createOfflineClient, isOfflineClient, isOnlineClient, readClientConfig, readStorageConfig, readOfflineConfig, readOnlineConfig, getStorageMode, toClientConfig, } from './client';
4
4
  export type { StorageClientOptions } from './client/storage-client';
5
+ export type { LocalStorageClientOptions } from './client/local-storage-client';
6
+ export type { ClientConfig, ClientConfigFile, OfflineConfigFile, StorageConfigFile, StorageMode, UnifiedStorageClient, } from './client';
5
7
  export type { FileMetadata, ListFilesOptions } from './types';
6
8
  export { StorageError, FileNotFoundError, InvalidMimeTypeError, FileTooLargeError, UploadError, DownloadError, DeleteError, MetadataError, ListError, } from './errors/storage-errors';
7
9
  export { sanitizePath } from './helpers/path-sanitizer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAGpE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGlD,OAAO,EAEL,aAAa,EACb,kBAAkB,EAElB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EAEnB,eAAe,EACf,cAAc,EAEd,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseMaxFileSize = exports.isMimeTypeAllowed = exports.assertPathSafe = exports.validatePathSafe = exports.sanitizePath = exports.ListError = exports.MetadataError = exports.DeleteError = exports.DownloadError = exports.UploadError = exports.FileTooLargeError = exports.InvalidMimeTypeError = exports.FileNotFoundError = exports.StorageError = exports.StorageClient = exports.StorageCore = void 0;
3
+ exports.parseMaxFileSize = exports.isMimeTypeAllowed = exports.assertPathSafe = exports.validatePathSafe = exports.sanitizePath = exports.ListError = exports.MetadataError = exports.DeleteError = exports.DownloadError = exports.UploadError = exports.FileTooLargeError = exports.InvalidMimeTypeError = exports.FileNotFoundError = exports.StorageError = exports.toClientConfig = exports.getStorageMode = exports.readOnlineConfig = exports.readOfflineConfig = exports.readStorageConfig = exports.readClientConfig = exports.isOnlineClient = exports.isOfflineClient = exports.createOfflineClient = exports.createOnlineClient = exports.createClientFromConfig = exports.LocalStorageClient = exports.StorageClient = exports.StorageCore = void 0;
4
4
  // Core exports - Para Node.js puro (almacenamiento local)
5
5
  var storage_core_1 = require("./core/storage-core");
6
6
  Object.defineProperty(exports, "StorageCore", { enumerable: true, get: function () { return storage_core_1.StorageCore; } });
7
- // Client exports - Para conectarse al backend remoto
8
- var storage_client_1 = require("./client/storage-client");
9
- Object.defineProperty(exports, "StorageClient", { enumerable: true, get: function () { return storage_client_1.StorageClient; } });
7
+ // Client exports - Para conectarse al backend remoto o almacenamiento local
8
+ var client_1 = require("./client");
9
+ // Clientes
10
+ Object.defineProperty(exports, "StorageClient", { enumerable: true, get: function () { return client_1.StorageClient; } });
11
+ Object.defineProperty(exports, "LocalStorageClient", { enumerable: true, get: function () { return client_1.LocalStorageClient; } });
12
+ // Factory functions
13
+ Object.defineProperty(exports, "createClientFromConfig", { enumerable: true, get: function () { return client_1.createClientFromConfig; } });
14
+ Object.defineProperty(exports, "createOnlineClient", { enumerable: true, get: function () { return client_1.createOnlineClient; } });
15
+ Object.defineProperty(exports, "createOfflineClient", { enumerable: true, get: function () { return client_1.createOfflineClient; } });
16
+ // Helpers
17
+ Object.defineProperty(exports, "isOfflineClient", { enumerable: true, get: function () { return client_1.isOfflineClient; } });
18
+ Object.defineProperty(exports, "isOnlineClient", { enumerable: true, get: function () { return client_1.isOnlineClient; } });
19
+ // Config readers
20
+ Object.defineProperty(exports, "readClientConfig", { enumerable: true, get: function () { return client_1.readClientConfig; } });
21
+ Object.defineProperty(exports, "readStorageConfig", { enumerable: true, get: function () { return client_1.readStorageConfig; } });
22
+ Object.defineProperty(exports, "readOfflineConfig", { enumerable: true, get: function () { return client_1.readOfflineConfig; } });
23
+ Object.defineProperty(exports, "readOnlineConfig", { enumerable: true, get: function () { return client_1.readOnlineConfig; } });
24
+ Object.defineProperty(exports, "getStorageMode", { enumerable: true, get: function () { return client_1.getStorageMode; } });
25
+ Object.defineProperty(exports, "toClientConfig", { enumerable: true, get: function () { return client_1.toClientConfig; } });
10
26
  // Errors exports
11
27
  var storage_errors_1 = require("./errors/storage-errors");
12
28
  Object.defineProperty(exports, "StorageError", { enumerable: true, get: function () { return storage_errors_1.StorageError; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,0DAA0D;AAC1D,oDAAkD;AAAzC,2GAAA,WAAW,OAAA;AAGpB,qDAAqD;AACrD,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AAMtB,iBAAiB;AACjB,0DAUiC;AAT/B,8GAAA,YAAY,OAAA;AACZ,mHAAA,iBAAiB,OAAA;AACjB,sHAAA,oBAAoB,OAAA;AACpB,mHAAA,iBAAiB,OAAA;AACjB,6GAAA,WAAW,OAAA;AACX,+GAAA,aAAa,OAAA;AACb,6GAAA,WAAW,OAAA;AACX,+GAAA,aAAa,OAAA;AACb,2GAAA,SAAS,OAAA;AAGX,gDAAgD;AAChD,2DAAwD;AAA/C,8GAAA,YAAY,OAAA;AACrB,2DAA4E;AAAnE,kHAAA,gBAAgB,OAAA;AAAE,gHAAA,cAAc,OAAA;AAEzC,2DAA6D;AAApD,mHAAA,iBAAiB,OAAA;AAC1B,qDAAyD;AAAhD,+GAAA,gBAAgB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,0DAA0D;AAC1D,oDAAkD;AAAzC,2GAAA,WAAW,OAAA;AAGpB,4EAA4E;AAC5E,mCAkBkB;AAjBhB,WAAW;AACX,uGAAA,aAAa,OAAA;AACb,4GAAA,kBAAkB,OAAA;AAClB,oBAAoB;AACpB,gHAAA,sBAAsB,OAAA;AACtB,4GAAA,kBAAkB,OAAA;AAClB,6GAAA,mBAAmB,OAAA;AACnB,UAAU;AACV,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AACd,iBAAiB;AACjB,0GAAA,gBAAgB,OAAA;AAChB,2GAAA,iBAAiB,OAAA;AACjB,2GAAA,iBAAiB,OAAA;AACjB,0GAAA,gBAAgB,OAAA;AAChB,wGAAA,cAAc,OAAA;AACd,wGAAA,cAAc,OAAA;AAkBhB,iBAAiB;AACjB,0DAUiC;AAT/B,8GAAA,YAAY,OAAA;AACZ,mHAAA,iBAAiB,OAAA;AACjB,sHAAA,oBAAoB,OAAA;AACpB,mHAAA,iBAAiB,OAAA;AACjB,6GAAA,WAAW,OAAA;AACX,+GAAA,aAAa,OAAA;AACb,6GAAA,WAAW,OAAA;AACX,+GAAA,aAAa,OAAA;AACb,2GAAA,SAAS,OAAA;AAGX,gDAAgD;AAChD,2DAAwD;AAA/C,8GAAA,YAAY,OAAA;AACrB,2DAA4E;AAAnE,kHAAA,gBAAgB,OAAA;AAAE,gHAAA,cAAc,OAAA;AAEzC,2DAA6D;AAApD,mHAAA,iBAAiB,OAAA;AAC1B,qDAAyD;AAAhD,+GAAA,gBAAgB,OAAA"}
@@ -17,4 +17,17 @@ export interface StorageCoreOptions {
17
17
  maxFileSize?: string;
18
18
  allowedMimeTypes?: string[];
19
19
  }
20
+ export type Permission = 'read' | 'write' | 'delete';
21
+ export interface ClientRateLimit {
22
+ requests: number;
23
+ window: string;
24
+ }
25
+ export interface ClientConfig {
26
+ clientId: string;
27
+ name: string;
28
+ permissions: Permission[];
29
+ allowedPaths: string[];
30
+ rateLimit?: ClientRateLimit;
31
+ tokenExpiresIn?: string;
32
+ }
20
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "s3-client-dtb",
3
- "version": "0.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Paquete de almacenamiento de archivos local para Node.js y NestJS",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
-
8
7
  "exports": {
9
8
  ".": {
10
9
  "types": "./dist/index.d.ts",
@@ -17,7 +16,9 @@
17
16
  },
18
17
  "scripts": {
19
18
  "build": "tsc",
20
- "prepublishOnly": "npm run build"
19
+ "prepublishOnly": "npm run build",
20
+ "test:client": "ts-node test-client.ts",
21
+ "test:security": "ts-node test-security-and-usage.ts"
21
22
  },
22
23
  "keywords": [
23
24
  "storage",
@@ -31,8 +32,9 @@
31
32
  "author": "DTB",
32
33
  "license": "MIT",
33
34
  "dependencies": {
34
- "form-data": "^4.0.0",
35
- "uuid": "^10.0.0"
35
+ "jsonwebtoken": "^9.0.2",
36
+ "otplib": "^13.2.1",
37
+ "uuid": "^13.0.0"
36
38
  },
37
39
  "peerDependencies": {
38
40
  "@nestjs/common": "^10.0.0 || ^11.0.0"
@@ -43,8 +45,11 @@
43
45
  }
44
46
  },
45
47
  "devDependencies": {
46
- "@types/node": "^22.0.0",
48
+ "@types/jsonwebtoken": "^9.0.6",
49
+ "@types/node": "^25.0.10",
47
50
  "@types/uuid": "^10.0.0",
51
+ "dotenv": "^17.2.3",
52
+ "ts-node": "^10.9.2",
48
53
  "typescript": "^5.7.0"
49
54
  },
50
55
  "files": [