@nocobase/plugin-file-manager 0.5.0-alpha.37 → 0.7.0-alpha.1
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.
- package/LICENSE +201 -21
- package/esm/actions/upload.d.ts +3 -0
- package/esm/actions/upload.js +143 -0
- package/esm/actions/upload.js.map +1 -0
- package/esm/collections/attachments.d.ts +3 -0
- package/esm/collections/attachments.js +59 -0
- package/esm/collections/attachments.js.map +1 -0
- package/esm/collections/storages.d.ts +3 -0
- package/esm/collections/storages.js +60 -0
- package/esm/collections/storages.js.map +1 -0
- package/esm/constants.d.ts +6 -0
- package/esm/constants.js +7 -0
- package/esm/constants.js.map +1 -0
- package/esm/index.d.ts +2 -0
- package/esm/index.js +3 -0
- package/esm/index.js.map +1 -0
- package/esm/rules/index.d.ts +1 -0
- package/esm/rules/index.js +3 -0
- package/esm/rules/index.js.map +1 -0
- package/esm/rules/mimetype.d.ts +1 -0
- package/esm/rules/mimetype.js +5 -0
- package/esm/rules/mimetype.js.map +1 -0
- package/esm/server.d.ts +7 -0
- package/esm/server.js +48 -0
- package/esm/server.js.map +1 -0
- package/esm/storages/ali-oss.d.ts +16 -0
- package/esm/storages/ali-oss.js +26 -0
- package/esm/storages/ali-oss.js.map +1 -0
- package/esm/storages/index.d.ts +8 -0
- package/esm/storages/index.js +12 -0
- package/esm/storages/index.js.map +1 -0
- package/esm/storages/local.d.ts +14 -0
- package/esm/storages/local.js +127 -0
- package/esm/storages/local.js.map +1 -0
- package/esm/storages/s3.d.ts +17 -0
- package/esm/storages/s3.js +53 -0
- package/esm/storages/s3.js.map +1 -0
- package/esm/utils.d.ts +2 -0
- package/esm/utils.js +16 -0
- package/esm/utils.js.map +1 -0
- package/lib/actions/upload.js +145 -228
- package/lib/actions/upload.js.map +1 -1
- package/lib/collections/attachments.d.ts +2 -2
- package/lib/collections/attachments.js +58 -56
- package/lib/collections/attachments.js.map +1 -1
- package/lib/collections/storages.d.ts +2 -2
- package/lib/collections/storages.js +59 -62
- package/lib/collections/storages.js.map +1 -1
- package/lib/constants.js +2 -17
- package/lib/constants.js.map +1 -1
- package/lib/index.js +14 -47
- package/lib/index.js.map +1 -1
- package/lib/rules/index.js +6 -30
- package/lib/rules/index.js.map +1 -1
- package/lib/rules/mimetype.js +5 -26
- package/lib/rules/mimetype.js.map +1 -1
- package/lib/server.d.ts +7 -3
- package/lib/server.js +46 -95
- package/lib/server.js.map +1 -1
- package/lib/storages/ali-oss.js +23 -44
- package/lib/storages/ali-oss.js.map +1 -1
- package/lib/storages/index.js +5 -31
- package/lib/storages/index.js.map +1 -1
- package/lib/storages/local.d.ts +2 -1
- package/lib/storages/local.js +110 -198
- package/lib/storages/local.js.map +1 -1
- package/lib/storages/s3.js +49 -84
- package/lib/storages/s3.js.map +1 -1
- package/lib/utils.js +14 -39
- package/lib/utils.js.map +1 -1
- package/package.json +17 -3
- package/tsconfig.build.json +9 -0
- package/lib/actions/upload.d.ts.map +0 -1
- package/lib/collections/attachments.d.ts.map +0 -1
- package/lib/collections/storages.d.ts.map +0 -1
- package/lib/constants.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/rules/index.d.ts.map +0 -1
- package/lib/rules/mimetype.d.ts.map +0 -1
- package/lib/server.d.ts.map +0 -1
- package/lib/storages/ali-oss.d.ts.map +0 -1
- package/lib/storages/index.d.ts.map +0 -1
- package/lib/storages/local.d.ts.map +0 -1
- package/lib/storages/s3.d.ts.map +0 -1
- package/lib/utils.d.ts.map +0 -1
package/lib/storages/index.js
CHANGED
|
@@ -1,45 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const data = _interopRequireDefault(require("react"));
|
|
5
|
-
|
|
6
|
-
_react = function _react() {
|
|
7
|
-
return data;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
return data;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
-
|
|
15
|
-
var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
|
|
16
|
-
return mod && mod.__esModule ? mod : {
|
|
17
|
-
"default": mod
|
|
18
|
-
};
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
4
|
};
|
|
20
|
-
|
|
21
|
-
Object.defineProperty(exports, "__esModule", {
|
|
22
|
-
value: true
|
|
23
|
-
});
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
6
|
exports.getStorageConfig = void 0;
|
|
25
|
-
|
|
26
7
|
const local_1 = __importDefault(require("./local"));
|
|
27
|
-
|
|
28
8
|
const ali_oss_1 = __importDefault(require("./ali-oss"));
|
|
29
|
-
|
|
30
9
|
const s3_1 = __importDefault(require("./s3"));
|
|
31
|
-
|
|
32
10
|
const constants_1 = require("../constants");
|
|
33
|
-
|
|
34
11
|
const map = new Map();
|
|
35
12
|
map.set(constants_1.STORAGE_TYPE_LOCAL, local_1.default);
|
|
36
13
|
map.set(constants_1.STORAGE_TYPE_ALI_OSS, ali_oss_1.default);
|
|
37
14
|
map.set(constants_1.STORAGE_TYPE_S3, s3_1.default);
|
|
38
|
-
|
|
39
15
|
function getStorageConfig(key) {
|
|
40
|
-
|
|
16
|
+
return map.get(key);
|
|
41
17
|
}
|
|
42
|
-
|
|
43
18
|
exports.getStorageConfig = getStorageConfig;
|
|
44
|
-
|
|
45
|
-
//# sourceMappingURL=index.js.map
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["storages/index.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,wDAA4B;AAC5B,8CAAsB;AAEtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storages/index.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,wDAA4B;AAC5B,8CAAsB;AAEtB,4CAAyF;AAUzF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;AACxC,GAAG,CAAC,GAAG,CAAC,8BAAkB,EAAE,eAAK,CAAC,CAAC;AACnC,GAAG,CAAC,GAAG,CAAC,gCAAoB,EAAE,iBAAG,CAAC,CAAC;AACnC,GAAG,CAAC,GAAG,CAAC,2BAAe,EAAE,YAAE,CAAC,CAAC;AAE7B,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAFD,4CAEC","sourcesContent":["import local from './local';\nimport oss from './ali-oss';\nimport s3 from './s3';\n\nimport { STORAGE_TYPE_LOCAL, STORAGE_TYPE_ALI_OSS, STORAGE_TYPE_S3 } from '../constants';\n\nexport interface IStorage {\n filenameKey?: string;\n middleware?: Function;\n getFileData?: Function;\n make: Function;\n defaults: Function;\n}\n\nconst map = new Map<string, IStorage>();\nmap.set(STORAGE_TYPE_LOCAL, local);\nmap.set(STORAGE_TYPE_ALI_OSS, oss);\nmap.set(STORAGE_TYPE_S3, s3);\n\nexport function getStorageConfig(key: string): IStorage {\n return map.get(key);\n}\n"]}
|
package/lib/storages/local.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import Application from '@nocobase/server';
|
|
1
2
|
import multer from 'multer';
|
|
2
|
-
declare function middleware(app:
|
|
3
|
+
declare function middleware(app: Application, options?: any): Promise<void>;
|
|
3
4
|
declare const _default: {
|
|
4
5
|
middleware: typeof middleware;
|
|
5
6
|
make(storage: any): multer.StorageEngine;
|
package/lib/storages/local.js
CHANGED
|
@@ -1,220 +1,132 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return data;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
-
|
|
15
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
16
|
-
|
|
17
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
18
|
-
|
|
19
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
20
|
-
|
|
21
|
-
var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
|
|
22
|
-
function adopt(value) {
|
|
23
|
-
return value instanceof P ? value : new P(function (resolve) {
|
|
24
|
-
resolve(value);
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
25
9
|
});
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
29
|
-
function fulfilled(value) {
|
|
30
|
-
try {
|
|
31
|
-
step(generator.next(value));
|
|
32
|
-
} catch (e) {
|
|
33
|
-
reject(e);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function rejected(value) {
|
|
38
|
-
try {
|
|
39
|
-
step(generator["throw"](value));
|
|
40
|
-
} catch (e) {
|
|
41
|
-
reject(e);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function step(result) {
|
|
46
|
-
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
50
|
-
});
|
|
51
10
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return mod && mod.__esModule ? mod : {
|
|
55
|
-
"default": mod
|
|
56
|
-
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
57
13
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
value: true
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const path_1 = __importDefault(require("path"));
|
|
64
|
-
|
|
65
|
-
const url_1 = require("url");
|
|
66
|
-
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const koa_static_1 = __importDefault(require("koa-static"));
|
|
67
16
|
const mkdirp_1 = __importDefault(require("mkdirp"));
|
|
68
|
-
|
|
69
17
|
const multer_1 = __importDefault(require("multer"));
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const url_1 = require("url");
|
|
73
20
|
const constants_1 = require("../constants");
|
|
74
|
-
|
|
75
21
|
const utils_1 = require("../utils");
|
|
76
|
-
|
|
22
|
+
// use koa-mount match logic
|
|
77
23
|
function match(basePath, pathname) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return newPath[0] === '/';
|
|
24
|
+
if (!pathname.startsWith(basePath)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const newPath = pathname.replace(basePath, '') || '/';
|
|
28
|
+
if (basePath.slice(-1) === '/') {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return newPath[0] === '/';
|
|
89
32
|
}
|
|
90
|
-
|
|
91
33
|
function update(app, storages) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
const Storage = app.db.getCollection('storages');
|
|
36
|
+
const items = yield Storage.repository.find({
|
|
37
|
+
filter: {
|
|
38
|
+
type: constants_1.STORAGE_TYPE_LOCAL,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const primaryKey = Storage.model.primaryKeyAttribute;
|
|
42
|
+
storages.clear();
|
|
43
|
+
for (const storage of items) {
|
|
44
|
+
storages.set(storage[primaryKey], storage);
|
|
45
|
+
}
|
|
98
46
|
});
|
|
99
|
-
const primaryKey = StorageModel.primaryKeyAttribute;
|
|
100
|
-
storages.clear();
|
|
101
|
-
|
|
102
|
-
var _iterator = _createForOfIteratorHelper(items),
|
|
103
|
-
_step;
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
107
|
-
const storage = _step.value;
|
|
108
|
-
storages.set(storage[primaryKey], storage);
|
|
109
|
-
}
|
|
110
|
-
} catch (err) {
|
|
111
|
-
_iterator.e(err);
|
|
112
|
-
} finally {
|
|
113
|
-
_iterator.f();
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
47
|
}
|
|
117
|
-
|
|
118
48
|
function createLocalServerUpdateHook(app, storages) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
49
|
+
return function (row) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
if (row.get('type') === constants_1.STORAGE_TYPE_LOCAL) {
|
|
52
|
+
yield update(app, storages);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
126
56
|
}
|
|
127
|
-
|
|
128
57
|
function getDocumentRoot(storage) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return path_1.default.resolve(path_1.default.isAbsolute(documentRoot) ? documentRoot : path_1.default.join(process.cwd(), documentRoot));
|
|
58
|
+
const { documentRoot = 'uploads' } = storage.options || {};
|
|
59
|
+
// TODO(feature): 后面考虑以字符串模板的方式使用,可注入 req/action 相关变量,以便于区分文件夹
|
|
60
|
+
return path_1.default.resolve(path_1.default.isAbsolute(documentRoot) ? documentRoot : path_1.default.join(process.cwd(), documentRoot));
|
|
134
61
|
}
|
|
135
|
-
|
|
136
62
|
function middleware(app, options) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
} catch (err) {
|
|
186
|
-
_iterator2.e(err);
|
|
187
|
-
} finally {
|
|
188
|
-
_iterator2.f();
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
yield next();
|
|
192
|
-
});
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const LOCALHOST = `http://localhost:${process.env.SERVER_PORT || '13002'}`;
|
|
65
|
+
const Storage = app.db.getCollection('storages');
|
|
66
|
+
const storages = new Map();
|
|
67
|
+
const localServerUpdateHook = createLocalServerUpdateHook(app, storages);
|
|
68
|
+
Storage.model.addHook('afterCreate', localServerUpdateHook);
|
|
69
|
+
Storage.model.addHook('afterUpdate', localServerUpdateHook);
|
|
70
|
+
Storage.model.addHook('afterDestroy', localServerUpdateHook);
|
|
71
|
+
app.on('beforeStart', () => __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
yield update(app, storages);
|
|
73
|
+
}));
|
|
74
|
+
app.use(function (ctx, next) {
|
|
75
|
+
var _a;
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
for (const storage of storages.values()) {
|
|
78
|
+
const baseUrl = storage.get('baseUrl');
|
|
79
|
+
let url;
|
|
80
|
+
try {
|
|
81
|
+
url = new url_1.URL(baseUrl);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
url = {
|
|
85
|
+
pathname: baseUrl,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// 以下情况才认为当前进程所应该提供静态服务
|
|
89
|
+
// 否则都忽略,交给其他 server 来提供(如 nginx/cdn 等)
|
|
90
|
+
if (url.origin && ((_a = storage === null || storage === void 0 ? void 0 : storage.options) === null || _a === void 0 ? void 0 : _a.serve) === false) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const basePath = url.pathname.startsWith('/') ? url.pathname : `/${url.pathname}`;
|
|
94
|
+
if (!match(basePath, ctx.path)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
return (0, koa_static_1.default)(getDocumentRoot(storage), {
|
|
98
|
+
// for handle files after any api handlers
|
|
99
|
+
defer: true,
|
|
100
|
+
})(ctx, () => __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
if (ctx.path.startsWith(basePath)) {
|
|
102
|
+
ctx.path = ctx.path.replace(basePath, '');
|
|
103
|
+
}
|
|
104
|
+
yield next();
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
yield next();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
193
110
|
});
|
|
194
|
-
});
|
|
195
111
|
}
|
|
196
|
-
|
|
197
112
|
exports.default = {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
113
|
+
middleware,
|
|
114
|
+
make(storage) {
|
|
115
|
+
return multer_1.default.diskStorage({
|
|
116
|
+
destination: function (req, file, cb) {
|
|
117
|
+
const destPath = path_1.default.join(getDocumentRoot(storage), storage.path);
|
|
118
|
+
(0, mkdirp_1.default)(destPath, (err) => cb(err, destPath));
|
|
119
|
+
},
|
|
120
|
+
filename: utils_1.getFilename,
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
defaults() {
|
|
124
|
+
return {
|
|
125
|
+
title: '本地存储',
|
|
126
|
+
type: constants_1.STORAGE_TYPE_LOCAL,
|
|
127
|
+
name: `local`,
|
|
128
|
+
baseUrl: process.env.LOCAL_STORAGE_BASE_URL || `http://localhost:${process.env.SERVER_PORT || '13002'}/uploads`,
|
|
129
|
+
};
|
|
130
|
+
},
|
|
219
131
|
};
|
|
220
|
-
//# sourceMappingURL=local.js.map
|
|
132
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["storages/local.ts"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storages/local.ts"],"names":[],"mappings":"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","sourcesContent":["import Application from '@nocobase/server';\nimport serve from 'koa-static';\nimport mkdirp from 'mkdirp';\nimport multer from 'multer';\nimport path from 'path';\nimport { URL } from 'url';\nimport { STORAGE_TYPE_LOCAL } from '../constants';\nimport { getFilename } from '../utils';\n\n// use koa-mount match logic\nfunction match(basePath: string, pathname: string): boolean {\n if (!pathname.startsWith(basePath)) {\n return false;\n }\n\n const newPath = pathname.replace(basePath, '') || '/';\n if (basePath.slice(-1) === '/') {\n return true;\n }\n\n return newPath[0] === '/';\n}\n\nasync function update(app: Application, storages) {\n const Storage = app.db.getCollection('storages');\n\n const items = await Storage.repository.find({\n filter: {\n type: STORAGE_TYPE_LOCAL,\n },\n });\n\n const primaryKey = Storage.model.primaryKeyAttribute;\n\n storages.clear();\n for (const storage of items) {\n storages.set(storage[primaryKey], storage);\n }\n}\n\nfunction createLocalServerUpdateHook(app, storages) {\n return async function (row) {\n if (row.get('type') === STORAGE_TYPE_LOCAL) {\n await update(app, storages);\n }\n };\n}\n\nfunction getDocumentRoot(storage): string {\n const { documentRoot = 'uploads' } = storage.options || {};\n // TODO(feature): 后面考虑以字符串模板的方式使用,可注入 req/action 相关变量,以便于区分文件夹\n return path.resolve(path.isAbsolute(documentRoot) ? documentRoot : path.join(process.cwd(), documentRoot));\n}\n\nasync function middleware(app: Application, options?) {\n const LOCALHOST = `http://localhost:${process.env.SERVER_PORT || '13002'}`;\n\n const Storage = app.db.getCollection('storages');\n const storages = new Map<string, any>();\n\n const localServerUpdateHook = createLocalServerUpdateHook(app, storages);\n Storage.model.addHook('afterCreate', localServerUpdateHook);\n Storage.model.addHook('afterUpdate', localServerUpdateHook);\n Storage.model.addHook('afterDestroy', localServerUpdateHook);\n\n app.on('beforeStart', async () => {\n await update(app, storages);\n });\n\n app.use(async function (ctx, next) {\n for (const storage of storages.values()) {\n const baseUrl = storage.get('baseUrl');\n\n let url;\n try {\n url = new URL(baseUrl);\n } catch (e) {\n url = {\n pathname: baseUrl,\n };\n }\n\n // 以下情况才认为当前进程所应该提供静态服务\n // 否则都忽略,交给其他 server 来提供(如 nginx/cdn 等)\n if (url.origin && storage?.options?.serve === false) {\n continue;\n }\n\n const basePath = url.pathname.startsWith('/') ? url.pathname : `/${url.pathname}`;\n\n if (!match(basePath, ctx.path)) {\n continue;\n }\n\n return serve(getDocumentRoot(storage), {\n // for handle files after any api handlers\n defer: true,\n })(ctx, async () => {\n if (ctx.path.startsWith(basePath)) {\n ctx.path = ctx.path.replace(basePath, '');\n }\n await next();\n });\n }\n\n await next();\n });\n}\n\nexport default {\n middleware,\n make(storage) {\n return multer.diskStorage({\n destination: function (req, file, cb) {\n const destPath = path.join(getDocumentRoot(storage), storage.path);\n mkdirp(destPath, (err: Error | null) => cb(err, destPath));\n },\n filename: getFilename,\n });\n },\n defaults() {\n return {\n title: '本地存储',\n type: STORAGE_TYPE_LOCAL,\n name: `local`,\n baseUrl: process.env.LOCAL_STORAGE_BASE_URL || `http://localhost:${process.env.SERVER_PORT || '13002'}/uploads`,\n };\n },\n};\n"]}
|
package/lib/storages/s3.js
CHANGED
|
@@ -1,90 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
-
|
|
15
|
-
var __rest = void 0 && (void 0).__rest || function (s, e) {
|
|
16
|
-
var t = {};
|
|
17
|
-
|
|
18
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
|
|
19
|
-
|
|
20
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
21
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
|
|
22
|
-
}
|
|
23
|
-
return t;
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
24
12
|
};
|
|
25
|
-
|
|
26
|
-
Object.defineProperty(exports, "__esModule", {
|
|
27
|
-
value: true
|
|
28
|
-
});
|
|
29
|
-
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
14
|
const constants_1 = require("../constants");
|
|
31
|
-
|
|
32
15
|
const utils_1 = require("../utils");
|
|
33
|
-
|
|
34
16
|
exports.default = {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
defaults() {
|
|
75
|
-
return {
|
|
76
|
-
title: 'AWS S3',
|
|
77
|
-
name: 'aws-s3',
|
|
78
|
-
type: constants_1.STORAGE_TYPE_S3,
|
|
79
|
-
baseUrl: process.env.AWS_S3_STORAGE_BASE_URL,
|
|
80
|
-
options: {
|
|
81
|
-
region: process.env.AWS_S3_REGION,
|
|
82
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
83
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
84
|
-
bucket: process.env.AWS_S3_BUCKET
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
17
|
+
filenameKey: 'key',
|
|
18
|
+
make(storage) {
|
|
19
|
+
const S3Client = require('aws-sdk/clients/s3');
|
|
20
|
+
const multerS3 = require('multer-s3');
|
|
21
|
+
const _a = storage.options, { accessKeyId, secretAccessKey, bucket, acl = 'public-read' } = _a, options = __rest(_a, ["accessKeyId", "secretAccessKey", "bucket", "acl"]);
|
|
22
|
+
const s3 = new S3Client(Object.assign(Object.assign({}, options), { credentials: {
|
|
23
|
+
accessKeyId,
|
|
24
|
+
secretAccessKey,
|
|
25
|
+
} }));
|
|
26
|
+
return multerS3({
|
|
27
|
+
s3,
|
|
28
|
+
bucket,
|
|
29
|
+
acl,
|
|
30
|
+
contentType(req, file, cb) {
|
|
31
|
+
if (file.mimetype) {
|
|
32
|
+
cb(null, file.mimetype);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
multerS3.AUTO_CONTENT_TYPE(req, file, cb);
|
|
36
|
+
},
|
|
37
|
+
key: (0, utils_1.cloudFilenameGetter)(storage),
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
defaults() {
|
|
41
|
+
return {
|
|
42
|
+
title: 'AWS S3',
|
|
43
|
+
name: 'aws-s3',
|
|
44
|
+
type: constants_1.STORAGE_TYPE_S3,
|
|
45
|
+
baseUrl: process.env.AWS_S3_STORAGE_BASE_URL,
|
|
46
|
+
options: {
|
|
47
|
+
region: process.env.AWS_S3_REGION,
|
|
48
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
49
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
50
|
+
bucket: process.env.AWS_S3_BUCKET,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
},
|
|
89
54
|
};
|
|
90
|
-
//# sourceMappingURL=s3.js.map
|
|
55
|
+
//# sourceMappingURL=s3.js.map
|
package/lib/storages/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["storages/s3.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,4CAA+C;AAC/C,oCAA+C;AAE/C,kBAAe;IACb,WAAW,EAAE,KAAK;IAClB,IAAI,CAAC,OAAO;QACV,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/storages/s3.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,4CAA+C;AAC/C,oCAA+C;AAE/C,kBAAe;IACb,WAAW,EAAE,KAAK;IAClB,IAAI,CAAC,OAAO;QACV,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,KAA4E,OAAO,CAAC,OAAO,EAA3F,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,GAAG,aAAa,OAAgC,EAA3B,OAAO,cAAvE,mDAAyE,CAAkB,CAAC;QAClG,MAAM,EAAE,GAAG,IAAI,QAAQ,iCAClB,OAAO,KACV,WAAW,EAAE;gBACX,WAAW;gBACX,eAAe;aAChB,IACD,CAAC;QAEH,OAAO,QAAQ,CAAC;YACd,EAAE;YACF,MAAM;YACN,GAAG;YACH,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACxB,OAAO;iBACR;gBAED,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,GAAG,EAAE,IAAA,2BAAmB,EAAC,OAAO,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IACD,QAAQ;QACN,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,2BAAe;YACrB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;YAC5C,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;gBACjC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAC1C,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;gBAClD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;aAClC;SACF,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["import { STORAGE_TYPE_S3 } from '../constants';\nimport { cloudFilenameGetter } from '../utils';\n\nexport default {\n filenameKey: 'key',\n make(storage) {\n const S3Client = require('aws-sdk/clients/s3');\n const multerS3 = require('multer-s3');\n const { accessKeyId, secretAccessKey, bucket, acl = 'public-read', ...options } = storage.options;\n const s3 = new S3Client({\n ...options,\n credentials: {\n accessKeyId,\n secretAccessKey,\n },\n });\n\n return multerS3({\n s3,\n bucket,\n acl,\n contentType(req, file, cb) {\n if (file.mimetype) {\n cb(null, file.mimetype);\n return;\n }\n\n multerS3.AUTO_CONTENT_TYPE(req, file, cb);\n },\n key: cloudFilenameGetter(storage),\n });\n },\n defaults() {\n return {\n title: 'AWS S3',\n name: 'aws-s3',\n type: STORAGE_TYPE_S3,\n baseUrl: process.env.AWS_S3_STORAGE_BASE_URL,\n options: {\n region: process.env.AWS_S3_REGION,\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n bucket: process.env.AWS_S3_BUCKET,\n },\n };\n },\n};\n"]}
|