@unchainedshop/core-files 4.3.3 → 4.4.0

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 (66) hide show
  1. package/README.md +110 -1
  2. package/lib/db/MediaObjectsCollection.d.ts +1 -2
  3. package/lib/db/MediaObjectsCollection.js +1 -2
  4. package/lib/files-index.d.ts +5 -6
  5. package/lib/files-index.js +5 -6
  6. package/lib/files-settings.d.ts +0 -1
  7. package/lib/files-settings.js +1 -2
  8. package/lib/module/configureFilesModule.d.ts +3 -4
  9. package/lib/module/configureFilesModule.js +3 -5
  10. package/lib/utils/getFileAdapter.d.ts +0 -1
  11. package/lib/utils/getFileAdapter.js +0 -2
  12. package/lib/utils/getFileFromFileData.d.ts +1 -2
  13. package/lib/utils/getFileFromFileData.js +0 -1
  14. package/package.json +12 -11
  15. package/lib/db/MediaObjectsCollection.d.ts.map +0 -1
  16. package/lib/db/MediaObjectsCollection.js.map +0 -1
  17. package/lib/db/MediaObjectsSchema.d.ts +0 -3
  18. package/lib/db/MediaObjectsSchema.d.ts.map +0 -1
  19. package/lib/db/MediaObjectsSchema.js +0 -13
  20. package/lib/db/MediaObjectsSchema.js.map +0 -1
  21. package/lib/files-index.d.ts.map +0 -1
  22. package/lib/files-index.js.map +0 -1
  23. package/lib/files-settings.d.ts.map +0 -1
  24. package/lib/files-settings.js.map +0 -1
  25. package/lib/module/configureFilesModule.d.ts.map +0 -1
  26. package/lib/module/configureFilesModule.js.map +0 -1
  27. package/lib/service/createDownloadStreamService.d.ts +0 -3
  28. package/lib/service/createDownloadStreamService.d.ts.map +0 -1
  29. package/lib/service/createDownloadStreamService.js +0 -9
  30. package/lib/service/createDownloadStreamService.js.map +0 -1
  31. package/lib/service/createSignedURLService.d.ts +0 -3
  32. package/lib/service/createSignedURLService.d.ts.map +0 -1
  33. package/lib/service/createSignedURLService.js +0 -15
  34. package/lib/service/createSignedURLService.js.map +0 -1
  35. package/lib/service/fileServices.d.ts +0 -3
  36. package/lib/service/fileServices.d.ts.map +0 -1
  37. package/lib/service/fileServices.js +0 -15
  38. package/lib/service/fileServices.js.map +0 -1
  39. package/lib/service/linkFileService.d.ts +0 -3
  40. package/lib/service/linkFileService.d.ts.map +0 -1
  41. package/lib/service/linkFileService.js +0 -15
  42. package/lib/service/linkFileService.js.map +0 -1
  43. package/lib/service/removeFilesService.d.ts +0 -3
  44. package/lib/service/removeFilesService.d.ts.map +0 -1
  45. package/lib/service/removeFilesService.js +0 -21
  46. package/lib/service/removeFilesService.js.map +0 -1
  47. package/lib/service/uploadFileFromStreamService.d.ts +0 -3
  48. package/lib/service/uploadFileFromStreamService.d.ts.map +0 -1
  49. package/lib/service/uploadFileFromStreamService.js +0 -11
  50. package/lib/service/uploadFileFromStreamService.js.map +0 -1
  51. package/lib/service/uploadFileFromURLService.d.ts +0 -3
  52. package/lib/service/uploadFileFromURLService.d.ts.map +0 -1
  53. package/lib/service/uploadFileFromURLService.js +0 -11
  54. package/lib/service/uploadFileFromURLService.js.map +0 -1
  55. package/lib/utils/getFileAdapter.d.ts.map +0 -1
  56. package/lib/utils/getFileAdapter.js.map +0 -1
  57. package/lib/utils/getFileFromFileData.d.ts.map +0 -1
  58. package/lib/utils/getFileFromFileData.js.map +0 -1
  59. package/src/db/MediaObjectsCollection.ts +0 -28
  60. package/src/files-index.ts +0 -5
  61. package/src/files-settings.ts +0 -19
  62. package/src/module/configureFilesModule.ts +0 -100
  63. package/src/utils/getFileAdapter.ts +0 -9
  64. package/src/utils/getFileFromFileData.ts +0 -14
  65. package/tests/files-index.test.ts +0 -8
  66. package/tsconfig.json +0 -10
package/README.md CHANGED
@@ -1 +1,110 @@
1
- # Files (Unchained)
1
+ [![npm version](https://img.shields.io/npm/v/@unchainedshop/core-files.svg)](https://npmjs.com/package/@unchainedshop/core-files)
2
+ [![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](https://opensource.org/licenses/EUPL-1.2)
3
+
4
+ # @unchainedshop/core-files
5
+
6
+ File management module for the Unchained Engine. Handles media file metadata storage and URL normalization.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install @unchainedshop/core-files
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```typescript
17
+ import { configureFilesModule } from '@unchainedshop/core-files';
18
+
19
+ const filesModule = await configureFilesModule({
20
+ db,
21
+ options: {
22
+ transformUrl: (url, params) => url, // Optional URL transformation
23
+ },
24
+ });
25
+
26
+ // Create a file record
27
+ const fileId = await filesModule.create({
28
+ name: 'product-image.jpg',
29
+ type: 'image/jpeg',
30
+ path: 'products/123',
31
+ url: '/uploads/product-image.jpg',
32
+ });
33
+
34
+ // Find file and normalize URL
35
+ const file = await filesModule.findFile({ fileId });
36
+ const normalizedUrl = filesModule.normalizeUrl(file.url, {});
37
+ ```
38
+
39
+ ## API Overview
40
+
41
+ ### Module Configuration
42
+
43
+ | Export | Description |
44
+ |--------|-------------|
45
+ | `configureFilesModule` | Configure and return the files module |
46
+
47
+ ### Queries
48
+
49
+ | Method | Description |
50
+ |--------|-------------|
51
+ | `findFile` | Find file by ID or URL |
52
+ | `findFiles` | Find files with custom selector |
53
+
54
+ ### Mutations
55
+
56
+ | Method | Description |
57
+ |--------|-------------|
58
+ | `create` | Create a new file record |
59
+ | `update` | Update an existing file |
60
+ | `delete` | Delete a file record |
61
+ | `deleteMany` | Delete multiple file records |
62
+ | `unexpire` | Remove expiration from a file |
63
+
64
+ ### Helper Methods
65
+
66
+ | Method | Description |
67
+ |--------|-------------|
68
+ | `normalizeUrl` | Normalize and transform file URL |
69
+
70
+ ### Utilities
71
+
72
+ | Export | Description |
73
+ |--------|-------------|
74
+ | `getFileAdapter` | Get configured file storage adapter |
75
+ | `getFileFromFileData` | Convert file data to File object |
76
+ | `filesSettings` | Access file module settings |
77
+
78
+ ### Types
79
+
80
+ | Export | Description |
81
+ |--------|-------------|
82
+ | `File` | File document type |
83
+ | `FilesModule` | Module interface type |
84
+ | `FilesSettingsOptions` | Configuration options type |
85
+
86
+ ## Configuration
87
+
88
+ ```typescript
89
+ const filesModule = await configureFilesModule({
90
+ db,
91
+ options: {
92
+ transformUrl: (url, params) => {
93
+ // Transform URLs for CDN, thumbnails, etc.
94
+ return `https://cdn.example.com${url}`;
95
+ },
96
+ },
97
+ });
98
+ ```
99
+
100
+ ## Events
101
+
102
+ | Event | Description |
103
+ |-------|-------------|
104
+ | `FILE_CREATE` | Emitted when a file is created |
105
+ | `FILE_UPDATE` | Emitted when a file is updated |
106
+ | `FILE_REMOVE` | Emitted when a file is removed |
107
+
108
+ ## License
109
+
110
+ EUPL-1.2
@@ -1,5 +1,5 @@
1
1
  import { mongodb } from '@unchainedshop/mongodb';
2
- import { TimestampFields } from '@unchainedshop/mongodb';
2
+ import type { TimestampFields } from '@unchainedshop/mongodb';
3
3
  export type File = {
4
4
  _id: string;
5
5
  expires: Date | null;
@@ -14,4 +14,3 @@ export type SignedFileUpload = File & {
14
14
  putURL: string;
15
15
  };
16
16
  export declare const MediaObjectsCollection: (db: mongodb.Db) => Promise<mongodb.Collection<File>>;
17
- //# sourceMappingURL=MediaObjectsCollection.d.ts.map
@@ -1,4 +1,4 @@
1
- import { buildDbIndexes } from '@unchainedshop/mongodb';
1
+ import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
2
2
  export const MediaObjectsCollection = async (db) => {
3
3
  const MediaObjects = db.collection('media_objects');
4
4
  await buildDbIndexes(MediaObjects, [
@@ -8,4 +8,3 @@ export const MediaObjectsCollection = async (db) => {
8
8
  ]);
9
9
  return MediaObjects;
10
10
  };
11
- //# sourceMappingURL=MediaObjectsCollection.js.map
@@ -1,6 +1,5 @@
1
- export * from './module/configureFilesModule.js';
2
- export * from './db/MediaObjectsCollection.js';
3
- export * from './files-settings.js';
4
- export * from './utils/getFileAdapter.js';
5
- export * from './utils/getFileFromFileData.js';
6
- //# sourceMappingURL=files-index.d.ts.map
1
+ export * from './module/configureFilesModule.ts';
2
+ export * from './db/MediaObjectsCollection.ts';
3
+ export * from './files-settings.ts';
4
+ export * from './utils/getFileAdapter.ts';
5
+ export * from './utils/getFileFromFileData.ts';
@@ -1,6 +1,5 @@
1
- export * from './module/configureFilesModule.js';
2
- export * from './db/MediaObjectsCollection.js';
3
- export * from './files-settings.js';
4
- export * from './utils/getFileAdapter.js';
5
- export * from './utils/getFileFromFileData.js';
6
- //# sourceMappingURL=files-index.js.map
1
+ export * from "./module/configureFilesModule.js";
2
+ export * from "./db/MediaObjectsCollection.js";
3
+ export * from "./files-settings.js";
4
+ export * from "./utils/getFileAdapter.js";
5
+ export * from "./utils/getFileFromFileData.js";
@@ -7,4 +7,3 @@ export type FilesSettingsOptions = Omit<Partial<FilesSettings>, 'configureSettin
7
7
  export declare const defaultTransformUrl: (url: any) => any;
8
8
  export declare const PRIVATE_FILE_SHARING_MAX_AGE = 86400000;
9
9
  export declare const filesSettings: FilesSettings;
10
- //# sourceMappingURL=files-settings.d.ts.map
@@ -1,5 +1,5 @@
1
1
  export const defaultTransformUrl = (url) => url;
2
- export const PRIVATE_FILE_SHARING_MAX_AGE = 86400000; // 24 hours in milliseconds
2
+ export const PRIVATE_FILE_SHARING_MAX_AGE = 86400000;
3
3
  export const filesSettings = {
4
4
  transformUrl: defaultTransformUrl,
5
5
  privateFileSharingMaxAge: PRIVATE_FILE_SHARING_MAX_AGE,
@@ -8,4 +8,3 @@ export const filesSettings = {
8
8
  filesSettings.privateFileSharingMaxAge = privateFileSharingMaxAge || PRIVATE_FILE_SHARING_MAX_AGE;
9
9
  },
10
10
  };
11
- //# sourceMappingURL=files-settings.js.map
@@ -1,7 +1,7 @@
1
- import { ModuleInput } from '@unchainedshop/mongodb';
1
+ import type { ModuleInput } from '@unchainedshop/mongodb';
2
2
  import { mongodb } from '@unchainedshop/mongodb';
3
- import { File } from '../db/MediaObjectsCollection.js';
4
- import { FilesSettingsOptions } from '../files-settings.js';
3
+ import { type File } from '../db/MediaObjectsCollection.ts';
4
+ import { type FilesSettingsOptions } from '../files-settings.ts';
5
5
  export declare const configureFilesModule: ({ db, options: filesOptions, }: ModuleInput<FilesSettingsOptions>) => Promise<{
6
6
  normalizeUrl: (url: string, params: Record<string, any>) => string;
7
7
  findFile: (params: {
@@ -17,4 +17,3 @@ export declare const configureFilesModule: ({ db, options: filesOptions, }: Modu
17
17
  delete: (fileId: string) => Promise<number>;
18
18
  }>;
19
19
  export type FilesModule = Awaited<ReturnType<typeof configureFilesModule>>;
20
- //# sourceMappingURL=configureFilesModule.d.ts.map
@@ -1,12 +1,11 @@
1
1
  import { emit, registerEvents } from '@unchainedshop/events';
2
- import { generateDbFilterById, generateDbObjectId } from '@unchainedshop/mongodb';
3
- import { MediaObjectsCollection } from '../db/MediaObjectsCollection.js';
4
- import { filesSettings } from '../files-settings.js';
2
+ import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
3
+ import { MediaObjectsCollection } from "../db/MediaObjectsCollection.js";
4
+ import { filesSettings } from "../files-settings.js";
5
5
  const FILE_EVENTS = ['FILE_CREATE', 'FILE_UPDATE', 'FILE_REMOVE'];
6
6
  const { ROOT_URL = 'http://localhost:4010' } = process.env;
7
7
  export const configureFilesModule = async ({ db, options: filesOptions = {}, }) => {
8
8
  registerEvents(FILE_EVENTS);
9
- // Settings
10
9
  await filesSettings.configureSettings(filesOptions);
11
10
  const Files = await MediaObjectsCollection(db);
12
11
  return {
@@ -71,4 +70,3 @@ export const configureFilesModule = async ({ db, options: filesOptions = {}, })
71
70
  },
72
71
  };
73
72
  };
74
- //# sourceMappingURL=configureFilesModule.js.map
@@ -1,2 +1 @@
1
1
  export declare const getFileAdapter: () => import("@unchainedshop/file-upload").IFileAdapter<unknown>;
2
- //# sourceMappingURL=getFileAdapter.d.ts.map
@@ -3,7 +3,5 @@ export const getFileAdapter = () => {
3
3
  const adapters = FileDirector.getAdapters();
4
4
  if (adapters.length === 0)
5
5
  throw Error('No file adapter found.');
6
- // For now we return the first file upload adapter without further filter options
7
6
  return adapters[0];
8
7
  };
9
- //# sourceMappingURL=getFileAdapter.js.map
@@ -1,4 +1,4 @@
1
- import { UploadFileData } from '@unchainedshop/file-upload';
1
+ import type { UploadFileData } from '@unchainedshop/file-upload';
2
2
  export declare const getFileFromFileData: (fileData: UploadFileData, meta: any) => {
3
3
  _id: string;
4
4
  path: string;
@@ -10,4 +10,3 @@ export declare const getFileFromFileData: (fileData: UploadFileData, meta: any)
10
10
  meta: any;
11
11
  };
12
12
  export default getFileFromFileData;
13
- //# sourceMappingURL=getFileFromFileData.d.ts.map
@@ -9,4 +9,3 @@ export const getFileFromFileData = (fileData, meta) => ({
9
9
  meta,
10
10
  });
11
11
  export default getFileFromFileData;
12
- //# sourceMappingURL=getFileFromFileData.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/core-files",
3
- "version": "4.3.3",
3
+ "version": "4.4.0",
4
4
  "main": "lib/files-index.js",
5
5
  "types": "lib/files-index.d.ts",
6
6
  "type": "module",
@@ -9,8 +9,8 @@
9
9
  "build": "tsc -b",
10
10
  "prepublishOnly": "npm run clean && npm run build",
11
11
  "watch": "tsc -w",
12
- "test": "tsx --test",
13
- "test:watch": "tsx --test --watch"
12
+ "test": "node --test",
13
+ "test:watch": "node --test --watch"
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
@@ -22,8 +22,10 @@
22
22
  "core"
23
23
  ],
24
24
  "authors": [
25
- "Joël Meiller",
26
- "Pascal Kaufmann"
25
+ "Pascal Kaufmann",
26
+ "Mikael Araya",
27
+ "Vedran Rudelj",
28
+ "Joël Meiller"
27
29
  ],
28
30
  "license": "EUPL-1.2",
29
31
  "bugs": {
@@ -31,14 +33,13 @@
31
33
  },
32
34
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
35
  "dependencies": {
34
- "@unchainedshop/events": "^4.3.0",
35
- "@unchainedshop/file-upload": "^4.3.0",
36
- "@unchainedshop/logger": "^4.3.0",
37
- "@unchainedshop/utils": "^4.3.0"
36
+ "@unchainedshop/events": "^4.4.0",
37
+ "@unchainedshop/file-upload": "^4.4.0",
38
+ "@unchainedshop/logger": "^4.4.0",
39
+ "@unchainedshop/utils": "^4.4.0"
38
40
  },
39
41
  "devDependencies": {
40
- "@types/node": "^24.0.13",
41
- "tsx": "^4.20.3",
42
+ "@types/node": "^25.0.0",
42
43
  "typescript": "^5.8.3"
43
44
  }
44
45
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaObjectsCollection.d.ts","sourceRoot":"","sources":["../../src/db/MediaObjectsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,MAAM,IAAI,GAAG;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,eAAe,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,eAAO,MAAM,sBAAsB,GAAU,IAAI,OAAO,CAAC,EAAE,sCAU1D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaObjectsCollection.js","sourceRoot":"","sources":["../../src/db/MediaObjectsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAiBjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;IAC7D,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAO,eAAe,CAAC,CAAC;IAE1D,MAAM,cAAc,CAAO,YAAY,EAAE;QACvC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACrB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,EAAE;QAC7D,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;KAC3B,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import SimpleSchema from 'simpl-schema';
2
- export declare const MediaObjectsSchema: SimpleSchema;
3
- //# sourceMappingURL=MediaObjectsSchema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaObjectsSchema.d.ts","sourceRoot":"","sources":["../../src/db/MediaObjectsSchema.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,eAAO,MAAM,kBAAkB,cAY9B,CAAC"}
@@ -1,13 +0,0 @@
1
- import { Schemas } from '@unchainedshop/utils';
2
- import SimpleSchema from 'simpl-schema';
3
- export const MediaObjectsSchema = new SimpleSchema({
4
- expires: { type: Date },
5
- path: { type: String, required: true },
6
- meta: { type: Object, blackbox: true },
7
- name: { type: String, required: true },
8
- size: { type: String },
9
- type: { type: String },
10
- url: { type: String },
11
- ...Schemas.timestampFields,
12
- }, { requiredByDefault: false });
13
- //# sourceMappingURL=MediaObjectsSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaObjectsSchema.js","sourceRoot":"","sources":["../../src/db/MediaObjectsSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,YAAY,CAChD;IACE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IACvB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACtB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACtB,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACrB,GAAG,OAAO,CAAC,eAAe;CAC3B,EACD,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"files-index.d.ts","sourceRoot":"","sources":["../src/files-index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"files-index.js","sourceRoot":"","sources":["../src/files-index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"files-settings.d.ts","sourceRoot":"","sources":["../src/files-settings.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;IACnE,wBAAwB,EAAE,MAAM,CAAC;IACjC,iBAAiB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC5D;AAED,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAErF,eAAO,MAAM,mBAAmB,GAAI,QAAG,QAAQ,CAAC;AAChD,eAAO,MAAM,4BAA4B,WAAW,CAAC;AAErD,eAAO,MAAM,aAAa,EAAE,aAO3B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"files-settings.js","sourceRoot":"","sources":["../src/files-settings.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC;AAChD,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAQ,CAAC,CAAC,2BAA2B;AAEjF,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,YAAY,EAAE,mBAAmB;IACjC,wBAAwB,EAAE,4BAA4B;IACtD,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE;QACrE,aAAa,CAAC,YAAY,GAAG,YAAY,IAAI,mBAAmB,CAAC;QACjE,aAAa,CAAC,wBAAwB,GAAG,wBAAwB,IAAI,4BAA4B,CAAC;IACpG,CAAC;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configureFilesModule.d.ts","sourceRoot":"","sources":["../../src/module/configureFilesModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAA4C,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAA0B,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAiB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM3E,eAAO,MAAM,oBAAoB,GAAU,gCAGxC,WAAW,CAAC,oBAAoB,CAAC;wBASZ,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,MAAM;uBAYvC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,YAAY,OAAO,CAAC,WAAW;0BAQhF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YACpB,OAAO,CAAC,WAAW,KAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;0BAIU,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC;kBAKlC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;qBAUnE,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC;uBAcxB,MAAM;qBAcR,MAAM;EAMhC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configureFilesModule.js","sourceRoot":"","sources":["../../src/module/configureFilesModule.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { CreateDownloadStreamService } from '@unchainedshop/types/files.js';
2
- export declare const createDownloadStreamService: CreateDownloadStreamService;
3
- //# sourceMappingURL=createDownloadStreamService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createDownloadStreamService.d.ts","sourceRoot":"","sources":["../../src/service/createDownloadStreamService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAG5E,eAAO,MAAM,2BAA2B,EAAE,2BAYzC,CAAC"}
@@ -1,9 +0,0 @@
1
- import { getFileAdapter } from '../utils/getFileAdapter.js';
2
- export const createDownloadStreamService = async ({ fileId }, unchainedContext) => {
3
- const { modules: { files }, } = unchainedContext;
4
- const fileAdapter = getFileAdapter();
5
- const file = await files.findFile({ fileId });
6
- const stream = fileAdapter.createDownloadStream(file, unchainedContext);
7
- return stream;
8
- };
9
- //# sourceMappingURL=createDownloadStreamService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createDownloadStreamService.js","sourceRoot":"","sources":["../../src/service/createDownloadStreamService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,CAAC,MAAM,2BAA2B,GAAgC,KAAK,EAC3E,EAAE,MAAM,EAAE,EACV,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { CreateSignedURLService } from '@unchainedshop/types/files.js';
2
- export declare const createSignedURLService: CreateSignedURLService;
3
- //# sourceMappingURL=createSignedURLService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSignedURLService.d.ts","sourceRoot":"","sources":["../../src/service/createSignedURLService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,eAAO,MAAM,sBAAsB,EAAE,sBAqBpC,CAAC"}
@@ -1,15 +0,0 @@
1
- import { getFileAdapter } from '../utils/getFileAdapter.js';
2
- import { getFileFromFileData } from '../utils/getFileFromFileData.js';
3
- export const createSignedURLService = async ({ directoryName, fileName, meta }, unchainedContext) => {
4
- const { modules: { files }, } = unchainedContext;
5
- const fileUploadAdapter = getFileAdapter();
6
- const preparedFileData = await fileUploadAdapter.createSignedURL(directoryName, fileName, unchainedContext);
7
- const fileData = getFileFromFileData(preparedFileData, meta);
8
- const fileId = await files.create(fileData);
9
- const file = await files.findFile({ fileId });
10
- return {
11
- ...file,
12
- putURL: preparedFileData.putURL,
13
- };
14
- };
15
- //# sourceMappingURL=createSignedURLService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSignedURLService.js","sourceRoot":"","sources":["../../src/service/createSignedURLService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EACjE,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EACjC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAC9D,aAAa,EACb,QAAQ,EACR,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,gBAAgB,CAAC,MAAgB;KAC1C,CAAC;AACJ,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { FileServices } from '@unchainedshop/types/files.js';
2
- export declare const fileServices: FileServices;
3
- //# sourceMappingURL=fileServices.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fileServices.d.ts","sourceRoot":"","sources":["../../src/service/fileServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAQ7D,eAAO,MAAM,YAAY,EAAE,YAO1B,CAAC"}
@@ -1,15 +0,0 @@
1
- import { linkFileService } from './linkFileService.js';
2
- import { createSignedURLService } from './createSignedURLService.js';
3
- import { uploadFileFromURLService } from './uploadFileFromURLService.js';
4
- import { uploadFileFromStreamService } from './uploadFileFromStreamService.js';
5
- import { removeFilesService } from './removeFilesService.js';
6
- import { createDownloadStreamService } from './createDownloadStreamService.js';
7
- export const fileServices = {
8
- linkFile: linkFileService,
9
- createSignedURL: createSignedURLService,
10
- uploadFileFromURL: uploadFileFromURLService,
11
- uploadFileFromStream: uploadFileFromStreamService,
12
- removeFiles: removeFilesService,
13
- createDownloadStream: createDownloadStreamService,
14
- };
15
- //# sourceMappingURL=fileServices.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fileServices.js","sourceRoot":"","sources":["../../src/service/fileServices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,QAAQ,EAAE,eAAe;IACzB,eAAe,EAAE,sBAAsB;IACvC,iBAAiB,EAAE,wBAAwB;IAC3C,oBAAoB,EAAE,2BAA2B;IACjD,WAAW,EAAE,kBAAkB;IAC/B,oBAAoB,EAAE,2BAA2B;CAClD,CAAC"}
@@ -1,3 +0,0 @@
1
- import { LinkFileService } from '@unchainedshop/types/files.js';
2
- export declare const linkFileService: LinkFileService;
3
- //# sourceMappingURL=linkFileService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"linkFileService.d.ts","sourceRoot":"","sources":["../../src/service/linkFileService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,eAAO,MAAM,eAAe,EAAE,eAc7B,CAAC"}
@@ -1,15 +0,0 @@
1
- import { FileDirector } from '@unchainedshop/file-upload';
2
- export const linkFileService = async ({ fileId, size, type }, unchainedAPI) => {
3
- const { modules: { files }, } = unchainedAPI;
4
- const file = await files.findFile({ fileId });
5
- if (file?.expires) {
6
- await files.update(file._id, { size: size || file.size, type: type || file.type, expires: null });
7
- const callback = FileDirector.getFileUploadCallback(file.path);
8
- if (callback) {
9
- await callback(file, unchainedAPI);
10
- }
11
- return files.findFile({ fileId });
12
- }
13
- return file;
14
- };
15
- //# sourceMappingURL=linkFileService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"linkFileService.js","sourceRoot":"","sources":["../../src/service/linkFileService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAoB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE;IAC7F,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,YAAY,CAAC;IACjB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClG,MAAM,QAAQ,GAAG,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { RemoveFilesService } from '@unchainedshop/types/files.js';
2
- export declare const removeFilesService: RemoveFilesService;
3
- //# sourceMappingURL=removeFilesService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"removeFilesService.d.ts","sourceRoot":"","sources":["../../src/service/removeFilesService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIzE,eAAO,MAAM,kBAAkB,EAAE,kBA2BhC,CAAC"}
@@ -1,21 +0,0 @@
1
- import { getFileAdapter } from '../utils/getFileAdapter.js';
2
- export const removeFilesService = async ({ fileIds }, unchainedAPI) => {
3
- const { modules: { files }, } = unchainedAPI;
4
- if (fileIds && typeof fileIds !== 'string' && !Array.isArray(fileIds))
5
- throw Error('Media id/s to be removed not provided as a string or array');
6
- const selector = {
7
- _id: { $in: fileIds },
8
- };
9
- const fileUploadAdapter = getFileAdapter();
10
- const fileObjects = await files.findFiles(selector);
11
- try {
12
- await fileUploadAdapter.removeFiles(fileObjects, unchainedAPI);
13
- }
14
- catch (e) {
15
- console.warn(e); // eslint-disable-line
16
- }
17
- const fileIdsToDelete = fileObjects.map((f) => f._id).filter(Boolean);
18
- await files.deleteMany(fileIdsToDelete);
19
- return fileIdsToDelete.length;
20
- };
21
- //# sourceMappingURL=removeFilesService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"removeFilesService.js","sourceRoot":"","sources":["../../src/service/removeFilesService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAuB,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE;IACxF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,YAAY,CAAC;IAEjB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACnE,MAAM,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAyB;QACrC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KACtB,CAAC;IAEF,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;IACzC,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAExC,OAAO,eAAe,CAAC,MAAM,CAAC;AAChC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { UploadFileFromStreamService } from '@unchainedshop/types/files.js';
2
- export declare const uploadFileFromStreamService: UploadFileFromStreamService;
3
- //# sourceMappingURL=uploadFileFromStreamService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadFileFromStreamService.d.ts","sourceRoot":"","sources":["../../src/service/uploadFileFromStreamService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAI5E,eAAO,MAAM,2BAA2B,EAAE,2BAgBzC,CAAC"}
@@ -1,11 +0,0 @@
1
- import { getFileAdapter } from '../utils/getFileAdapter.js';
2
- import { getFileFromFileData } from '../utils/getFileFromFileData.js';
3
- export const uploadFileFromStreamService = async ({ directoryName, rawFile, meta }, unchainedContext) => {
4
- const { modules: { files }, } = unchainedContext;
5
- const fileUploadAdapter = getFileAdapter();
6
- const uploadFileData = await fileUploadAdapter.uploadFileFromStream(directoryName, rawFile, unchainedContext);
7
- const fileData = getFileFromFileData(uploadFileData, meta);
8
- const fileId = await files.create(fileData);
9
- return files.findFile({ fileId });
10
- };
11
- //# sourceMappingURL=uploadFileFromStreamService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadFileFromStreamService.js","sourceRoot":"","sources":["../../src/service/uploadFileFromStreamService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,CAAC,MAAM,2BAA2B,GAAgC,KAAK,EAC3E,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,EAChC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,oBAAoB,CACjE,aAAa,EACb,OAAO,EACP,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { UploadFileFromURLService } from '@unchainedshop/types/files.js';
2
- export declare const uploadFileFromURLService: UploadFileFromURLService;
3
- //# sourceMappingURL=uploadFileFromURLService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadFileFromURLService.d.ts","sourceRoot":"","sources":["../../src/service/uploadFileFromURLService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAIzE,eAAO,MAAM,wBAAwB,EAAE,wBAiBtC,CAAC"}
@@ -1,11 +0,0 @@
1
- import { getFileAdapter } from '../utils/getFileAdapter.js';
2
- import { getFileFromFileData } from '../utils/getFileFromFileData.js';
3
- export const uploadFileFromURLService = async ({ directoryName, fileInput, meta }, unchainedContext) => {
4
- const { modules: { files }, } = unchainedContext;
5
- const fileUploadAdapter = getFileAdapter();
6
- const uploadFileData = await fileUploadAdapter.uploadFileFromURL(directoryName, fileInput, unchainedContext);
7
- const fileData = getFileFromFileData(uploadFileData, meta);
8
- const fileId = await files.create(fileData);
9
- return files.findFile({ fileId });
10
- };
11
- //# sourceMappingURL=uploadFileFromURLService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadFileFromURLService.js","sourceRoot":"","sources":["../../src/service/uploadFileFromURLService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,CAAC,MAAM,wBAAwB,GAA6B,KAAK,EACrE,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,EAClC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAE3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAC9D,aAAa,EACb,SAAS,EACT,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFileAdapter.d.ts","sourceRoot":"","sources":["../../src/utils/getFileAdapter.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,kEAM1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFileAdapter.js","sourceRoot":"","sources":["../../src/utils/getFileAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAEjE,iFAAiF;IACjF,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFileFromFileData.d.ts","sourceRoot":"","sources":["../../src/utils/getFileFromFileData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,eAAO,MAAM,mBAAmB,GAAI,UAAU,cAAc,EAAE,MAAM,GAAG;;;;;;;;;CASrE,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFileFromFileData.js","sourceRoot":"","sources":["../../src/utils/getFileFromFileData.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAwB,EAAE,IAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,GAAG,EAAE,QAAQ,CAAC,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAC,aAAa;IAC5B,OAAO,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI;IACpC,IAAI,EAAE,QAAQ,CAAC,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,0BAA0B;IACjD,GAAG,EAAE,QAAQ,CAAC,GAAG;IACjB,IAAI;CACL,CAAC,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
@@ -1,28 +0,0 @@
1
- import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
2
- import { TimestampFields } from '@unchainedshop/mongodb';
3
-
4
- export type File = {
5
- _id: string;
6
- expires: Date | null;
7
- path: string;
8
- meta?: Record<string, unknown>;
9
- name: string;
10
- size?: number;
11
- type?: string;
12
- url?: string;
13
- } & TimestampFields;
14
-
15
- export type SignedFileUpload = File & {
16
- putURL: string;
17
- };
18
- export const MediaObjectsCollection = async (db: mongodb.Db) => {
19
- const MediaObjects = db.collection<File>('media_objects');
20
-
21
- await buildDbIndexes<File>(MediaObjects, [
22
- { index: { url: 1 } },
23
- { index: { expires: 1 }, options: { expireAfterSeconds: 0 } },
24
- { index: { created: -1 } },
25
- ]);
26
-
27
- return MediaObjects;
28
- };
@@ -1,5 +0,0 @@
1
- export * from './module/configureFilesModule.js';
2
- export * from './db/MediaObjectsCollection.js';
3
- export * from './files-settings.js';
4
- export * from './utils/getFileAdapter.js';
5
- export * from './utils/getFileFromFileData.js';
@@ -1,19 +0,0 @@
1
- export interface FilesSettings {
2
- transformUrl: (url: string, params: Record<string, any>) => string;
3
- privateFileSharingMaxAge: number;
4
- configureSettings: (options: FilesSettingsOptions) => void;
5
- }
6
-
7
- export type FilesSettingsOptions = Omit<Partial<FilesSettings>, 'configureSettings'>;
8
-
9
- export const defaultTransformUrl = (url) => url;
10
- export const PRIVATE_FILE_SHARING_MAX_AGE = 86400000; // 24 hours in milliseconds
11
-
12
- export const filesSettings: FilesSettings = {
13
- transformUrl: defaultTransformUrl,
14
- privateFileSharingMaxAge: PRIVATE_FILE_SHARING_MAX_AGE,
15
- configureSettings: ({ transformUrl, privateFileSharingMaxAge } = {}) => {
16
- filesSettings.transformUrl = transformUrl || defaultTransformUrl;
17
- filesSettings.privateFileSharingMaxAge = privateFileSharingMaxAge || PRIVATE_FILE_SHARING_MAX_AGE;
18
- },
19
- };
@@ -1,100 +0,0 @@
1
- import { ModuleInput } from '@unchainedshop/mongodb';
2
- import { emit, registerEvents } from '@unchainedshop/events';
3
- import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
4
- import { MediaObjectsCollection, File } from '../db/MediaObjectsCollection.js';
5
- import { filesSettings, FilesSettingsOptions } from '../files-settings.js';
6
-
7
- const FILE_EVENTS: string[] = ['FILE_CREATE', 'FILE_UPDATE', 'FILE_REMOVE'];
8
-
9
- const { ROOT_URL = 'http://localhost:4010' } = process.env;
10
-
11
- export const configureFilesModule = async ({
12
- db,
13
- options: filesOptions = {},
14
- }: ModuleInput<FilesSettingsOptions>) => {
15
- registerEvents(FILE_EVENTS);
16
-
17
- // Settings
18
- await filesSettings.configureSettings(filesOptions);
19
-
20
- const Files = await MediaObjectsCollection(db);
21
-
22
- return {
23
- normalizeUrl: (url: string, params: Record<string, any>): string => {
24
- const transformedURLString = filesSettings.transformUrl(url, params);
25
- if (URL.canParse(transformedURLString)) {
26
- const finalURL = new URL(transformedURLString);
27
- return finalURL.href;
28
- } else if (URL.canParse(transformedURLString, ROOT_URL)) {
29
- const finalURL = new URL(transformedURLString, ROOT_URL);
30
- return finalURL.href;
31
- }
32
- return transformedURLString;
33
- },
34
-
35
- findFile: async (params: { fileId: string } | { url: string }, options?: mongodb.FindOptions) => {
36
- if ('url' in params) {
37
- return Files.findOne({ url: params.url }, options);
38
- }
39
- return Files.findOne(generateDbFilterById(params.fileId), options);
40
- },
41
-
42
- findFiles: async (
43
- selector: mongodb.Filter<File>,
44
- options?: mongodb.FindOptions,
45
- ): Promise<File[]> => {
46
- return Files.find(selector, options).toArray();
47
- },
48
-
49
- deleteMany: async (fileIds: string[]): Promise<number> => {
50
- const deletionResult = await Files.deleteMany({ _id: { $in: fileIds } });
51
- return deletionResult.deletedCount;
52
- },
53
-
54
- create: async (doc: Omit<File, '_id' | 'created'> & Pick<Partial<File>, '_id' | 'created'>) => {
55
- const { insertedId: fileId } = await Files.insertOne({
56
- _id: generateDbObjectId(),
57
- created: new Date(),
58
- ...doc,
59
- });
60
- await emit('FILE_CREATE', { fileId });
61
- return fileId;
62
- },
63
-
64
- update: async (fileId: string, doc: Partial<File>) => {
65
- await Files.updateOne(
66
- { _id: fileId },
67
- {
68
- $set: {
69
- updated: new Date(),
70
- ...doc,
71
- },
72
- },
73
- );
74
- await emit('FILE_UPDATE', { fileId });
75
- return fileId;
76
- },
77
-
78
- unexpire: async (fileId: string) => {
79
- await Files.updateOne(
80
- { _id: fileId },
81
- {
82
- $set: {
83
- updated: new Date(),
84
- },
85
- $unset: { expires: 1 },
86
- },
87
- );
88
- await emit('FILE_UPDATE', { fileId });
89
- return fileId;
90
- },
91
-
92
- delete: async (fileId: string) => {
93
- const { deletedCount } = await Files.deleteOne({ _id: fileId });
94
- await emit('FILE_REMOVE', { fileId });
95
- return deletedCount;
96
- },
97
- };
98
- };
99
-
100
- export type FilesModule = Awaited<ReturnType<typeof configureFilesModule>>;
@@ -1,9 +0,0 @@
1
- import { FileDirector } from '@unchainedshop/file-upload';
2
-
3
- export const getFileAdapter = () => {
4
- const adapters = FileDirector.getAdapters();
5
- if (adapters.length === 0) throw Error('No file adapter found.');
6
-
7
- // For now we return the first file upload adapter without further filter options
8
- return adapters[0];
9
- };
@@ -1,14 +0,0 @@
1
- import { UploadFileData } from '@unchainedshop/file-upload';
2
-
3
- export const getFileFromFileData = (fileData: UploadFileData, meta: any) => ({
4
- _id: fileData._id,
5
- path: fileData.directoryName,
6
- expires: fileData.expiryDate || null,
7
- name: fileData.fileName,
8
- size: fileData.size,
9
- type: fileData.type || 'application/octet-stream',
10
- url: fileData.url,
11
- meta,
12
- });
13
-
14
- export default getFileFromFileData;
@@ -1,8 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
-
4
- describe('Files', () => {
5
- it('Init', () => {
6
- assert(true);
7
- });
8
- });
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../shared/base.tsconfig.json",
3
- "compilerOptions": {
4
- "declarationDir": "./lib",
5
- "rootDir": "./src",
6
- "outDir": "./lib",
7
-
8
- },
9
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
10
- }