@silexlabs/silex 3.0.0-alpha.39 → 3.0.0-alpha.41

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 (110) hide show
  1. package/.silex.js +38 -8
  2. package/dist/client/client/config.d.ts +11 -41
  3. package/dist/client/client/grapesjs/LoginDialog.d.ts +13 -0
  4. package/dist/client/client/grapesjs/PublicationManager.d.ts +69 -0
  5. package/dist/client/client/grapesjs/PublicationUi.d.ts +58 -0
  6. package/dist/client/client/grapesjs/index.d.ts +18 -44
  7. package/dist/client/client/grapesjs/storage.d.ts +1 -0
  8. package/dist/client/client/services.d.ts +35 -0
  9. package/dist/client/constants.d.ts +17 -0
  10. package/dist/client/css/admin.css +86 -3
  11. package/dist/client/js/main.js +201 -90
  12. package/dist/client/js/main.js.LICENSE.txt +6 -0
  13. package/dist/client/types.d.ts +200 -29
  14. package/dist/constants.d.ts +21 -0
  15. package/dist/constants.js +38 -1
  16. package/dist/constants.js.map +1 -0
  17. package/dist/events.d.ts +2 -0
  18. package/dist/events.js +17 -0
  19. package/dist/events.js.map +1 -0
  20. package/dist/plugins/AuthPlugin.d.ts +1 -0
  21. package/dist/plugins/AuthPlugin.js +38 -0
  22. package/dist/plugins/AuthPlugin.js.map +1 -0
  23. package/dist/plugins/Cache.d.ts +2 -0
  24. package/dist/plugins/Cache.js +32 -0
  25. package/dist/plugins/Cache.js.map +1 -0
  26. package/dist/plugins/FtpBackend.d.ts +92 -0
  27. package/dist/plugins/FtpBackend.js +604 -0
  28. package/dist/plugins/FtpBackend.js.map +1 -0
  29. package/dist/plugins/HooksPlugin.d.ts +7 -0
  30. package/dist/plugins/HooksPlugin.js +76 -0
  31. package/dist/plugins/HooksPlugin.js.map +1 -0
  32. package/dist/plugins/PublicationPlugin.d.ts +17 -0
  33. package/dist/plugins/PublicationPlugin.js +170 -0
  34. package/dist/plugins/PublicationPlugin.js.map +1 -0
  35. package/dist/plugins/SslPlugin.d.ts +1 -0
  36. package/dist/plugins/SslPlugin.js +86 -0
  37. package/dist/plugins/SslPlugin.js.map +1 -0
  38. package/dist/plugins/StaticPlugin.d.ts +1 -0
  39. package/dist/plugins/StaticPlugin.js +66 -0
  40. package/dist/plugins/StaticPlugin.js.map +1 -0
  41. package/dist/plugins/WebsitePlugin.d.ts +14 -0
  42. package/dist/plugins/WebsitePlugin.js +302 -0
  43. package/dist/plugins/WebsitePlugin.js.map +1 -0
  44. package/dist/server/backends/FsBackend.d.ts +42 -0
  45. package/dist/server/backends/FsBackend.js +269 -0
  46. package/dist/server/backends/FsBackend.js.map +1 -0
  47. package/dist/server/backends/index.d.ts +95 -0
  48. package/dist/server/backends/index.js +255 -0
  49. package/dist/server/backends/index.js.map +1 -0
  50. package/dist/server/cli.js +0 -1
  51. package/dist/server/config.d.ts +58 -0
  52. package/dist/server/config.js +128 -24
  53. package/dist/server/config.js.map +1 -0
  54. package/dist/server/express.js +31 -3
  55. package/dist/server/index.js +9 -20
  56. package/dist/server/jobs.d.ts +6 -0
  57. package/dist/server/jobs.js +75 -0
  58. package/dist/server/jobs.js.map +1 -0
  59. package/dist/server/utils/validation.d.ts +7 -0
  60. package/dist/server/utils/validation.js +37 -0
  61. package/dist/server/utils/validation.js.map +1 -0
  62. package/dist/types.d.ts +270 -0
  63. package/dist/types.js +35 -28
  64. package/dist/types.js.map +1 -0
  65. package/package.json +19 -8
  66. package/public/silex.js +17 -0
  67. package/src/css/dialog.scss +9 -2
  68. package/src/css/grapesjs.scss +79 -0
  69. package/src/css/project-bar.scss +2 -2
  70. package/src/example-client-config.js +17 -0
  71. package/src/html/templates/includes.pug +0 -1
  72. package/src/ts/client/config.ts +7 -6
  73. package/src/ts/client/grapesjs/LoginDialog.ts +190 -0
  74. package/src/ts/client/grapesjs/PublicationManager.ts +333 -0
  75. package/src/ts/client/grapesjs/PublicationUi.ts +320 -0
  76. package/src/ts/client/grapesjs/index.ts +88 -85
  77. package/src/ts/client/grapesjs/storage.ts +110 -0
  78. package/src/ts/client/index.ts +5 -7
  79. package/src/ts/client/services.ts +129 -0
  80. package/src/ts/constants.ts +21 -0
  81. package/src/ts/plugins/AuthPlugin.ts +38 -0
  82. package/src/ts/plugins/Cache.ts +28 -0
  83. package/src/ts/plugins/FtpBackend.ts +689 -0
  84. package/src/ts/plugins/HooksPlugin.ts +79 -0
  85. package/src/ts/plugins/PublicationPlugin.ts +170 -0
  86. package/src/{plugins/SslPlugin.js → ts/plugins/SslPlugin.ts} +24 -6
  87. package/src/ts/plugins/StaticPlugin.ts +68 -0
  88. package/src/ts/plugins/WebsitePlugin.ts +318 -0
  89. package/src/ts/server/backends/FsBackend.ts +266 -0
  90. package/src/ts/server/backends/index.ts +309 -0
  91. package/src/ts/server/cli.ts +0 -2
  92. package/src/ts/server/config.ts +103 -33
  93. package/src/ts/server/express.ts +37 -3
  94. package/src/ts/server/index.ts +24 -14
  95. package/src/ts/server/jobs.test.ts +74 -0
  96. package/src/ts/server/jobs.ts +77 -0
  97. package/src/ts/server/utils/validation.ts +33 -0
  98. package/src/ts/types.ts +167 -59
  99. package/dist/client/client/grapesjs/publish.d.ts +0 -18
  100. package/dist/page.js +0 -15
  101. package/src/plugins/AuthPlugin.js +0 -21
  102. package/src/plugins/Cache.js +0 -11
  103. package/src/plugins/DefaultBackend.js +0 -149
  104. package/src/plugins/ExpressPlugin.js +0 -39
  105. package/src/plugins/HooksPlugin.js +0 -58
  106. package/src/plugins/PublishPlugin.js +0 -69
  107. package/src/plugins/StaticPlugin.js +0 -48
  108. package/src/plugins/WebsitePlugin.js +0 -207
  109. package/src/ts/client/grapesjs/publish.ts +0 -403
  110. /package/.silex/default/{.silex.data.json → website.json} +0 -0
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ /*
3
+ * Silex website builder, free/libre no-code tool for makers.
4
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.WebsiteError = void 0;
23
+ const express_1 = require("express");
24
+ const formidable_1 = __importDefault(require("formidable"));
25
+ const Cache_1 = require("./Cache");
26
+ const constants_1 = require("../constants");
27
+ const fs_1 = require("fs");
28
+ const types_1 = require("../types");
29
+ const backends_1 = require("../server/backends");
30
+ const stream_1 = require("stream");
31
+ const validation_1 = require("../server/utils/validation");
32
+ const path_1 = require("path");
33
+ const events_1 = require("../events");
34
+ /**
35
+ * @fileoverview Website plugin for Silex
36
+ * This plugin provides the website API to Silex server
37
+ */
38
+ /**
39
+ * Error thrown by the website API
40
+ * @param message error message
41
+ * @param code http status code
42
+ */
43
+ class WebsiteError extends Error {
44
+ code;
45
+ constructor(message, code) {
46
+ super(message);
47
+ this.code = code;
48
+ }
49
+ }
50
+ exports.WebsiteError = WebsiteError;
51
+ async function default_1(config, opts = {}) {
52
+ // Options with defaults
53
+ const options = {
54
+ // Default constants
55
+ assetsPath: '/assets',
56
+ // Options
57
+ ...opts
58
+ };
59
+ config.on(events_1.EVENT_STARTUP_START, ({ app }) => {
60
+ // Create a new router
61
+ const router = (0, express_1.Router)();
62
+ app.use(Cache_1.noCache, router);
63
+ // Load website data
64
+ router.get(`/${constants_1.API_WEBSITE_READ}`, async (req, res) => {
65
+ const query = req.query;
66
+ const { id, backendId } = query;
67
+ try {
68
+ if (id) {
69
+ // Get website data
70
+ const websiteData = await readWebsite(req['session'], (0, validation_1.requiredParam)(id, 'Website id'), backendId);
71
+ if (websiteData instanceof stream_1.Readable) {
72
+ websiteData.pipe(res.type('application/json'));
73
+ }
74
+ else {
75
+ res.json(websiteData);
76
+ }
77
+ }
78
+ else {
79
+ // List websites
80
+ const websites = await listWebsites(req['session'], query.backendId);
81
+ res.json(websites);
82
+ }
83
+ }
84
+ catch (e) {
85
+ console.error('Error getting website data', e);
86
+ if (e instanceof WebsiteError) {
87
+ res.status(e.code).json({ message: e.message });
88
+ }
89
+ else {
90
+ res.status(500).json({ message: e.message });
91
+ }
92
+ }
93
+ });
94
+ // Save website data
95
+ router.post(`/${constants_1.API_WEBSITE_WRITE}`, async (req, res) => {
96
+ try {
97
+ const query = req.query;
98
+ const body = req.body;
99
+ const id = (0, validation_1.requiredParam)(query.id, 'Website id');
100
+ const websiteData = (0, validation_1.requiredParam)(body, 'Website data');
101
+ await writeWebsite(req['session'], id, websiteData, query.backendId);
102
+ res.status(200).json({ message: 'Website saved' });
103
+ }
104
+ catch (e) {
105
+ console.error('Error saving website data', e);
106
+ if (e instanceof WebsiteError) {
107
+ res.status(e.code).json({ message: e.message });
108
+ }
109
+ else {
110
+ res.status(500).json({ message: e.message });
111
+ }
112
+ }
113
+ });
114
+ // Delete website
115
+ router.delete(`/${constants_1.API_WEBSITE_DELETE}`, async (req, res) => {
116
+ try {
117
+ const query = req.query;
118
+ const id = (0, validation_1.requiredParam)(query.id, 'Website id');
119
+ await deleteWebsite(req['session'], id, query.backendId);
120
+ res.status(200).json({ message: 'Website deleted' });
121
+ }
122
+ catch (e) {
123
+ console.error('Error deleting website data', e);
124
+ if (e instanceof WebsiteError) {
125
+ res.status(e.code).json({ message: e.message });
126
+ }
127
+ else {
128
+ res.status(500).json({ message: e.message });
129
+ }
130
+ }
131
+ });
132
+ // Load assets
133
+ router.get(`/${constants_1.API_WEBSITE_ASSETS_READ}`, async (req, res) => {
134
+ {
135
+ try {
136
+ const query = req.query;
137
+ const params = req.params;
138
+ const id = (0, validation_1.requiredParam)(query.id, 'Website id');
139
+ const path = (0, validation_1.requiredParam)(params.path, 'path');
140
+ const asset = await readAsset(req['session'], id, path, query.backendId);
141
+ // Set content type
142
+ res.contentType((0, path_1.basename)(asset.path));
143
+ // Send the file
144
+ if (asset.content instanceof stream_1.Readable) {
145
+ // Stream
146
+ asset.content.pipe(res);
147
+ }
148
+ else {
149
+ // Buffer or string
150
+ res.send(asset.content);
151
+ }
152
+ }
153
+ catch (e) {
154
+ console.error('Error getting asset', e);
155
+ if (e instanceof WebsiteError) {
156
+ res.status(e.code).json({ message: e.message });
157
+ }
158
+ else {
159
+ res.status(500).json({ message: e.message });
160
+ }
161
+ }
162
+ }
163
+ });
164
+ // Upload assets
165
+ router.post(`/${constants_1.API_WEBSITE_ASSETS_WRITE}`, async (req, res) => {
166
+ try {
167
+ const query = req.query;
168
+ const id = (0, validation_1.requiredParam)(query.id, 'Website id');
169
+ // Get the file data from the request
170
+ const form = (0, formidable_1.default)({
171
+ filename: (name, ext, part, _form) => `${name}${ext}`,
172
+ multiples: true,
173
+ keepExtensions: true,
174
+ });
175
+ const files = await new Promise((resolve, reject) => {
176
+ form.parse(req, async (err, fields, _files) => {
177
+ if (err) {
178
+ console.error('Error parsing upload data', err);
179
+ reject(new WebsiteError('Error parsing upload data: ' + err.message, 400));
180
+ }
181
+ else {
182
+ const files = [].concat(_files['files[]'])
183
+ .map((file) => ({
184
+ path: `${options.assetsPath}/${file.originalFilename}`,
185
+ content: (0, fs_1.createReadStream)(file.filepath),
186
+ }));
187
+ resolve(files);
188
+ }
189
+ });
190
+ });
191
+ // Write the files
192
+ console.log('Uploading assets', files);
193
+ const data = await writeAssets(req['session'], id, files, query.backendId);
194
+ console.log('Uploaded assets', data);
195
+ // Return the file URLs to insert in the website
196
+ res.json({
197
+ data, // As expected by grapesjs (https://grapesjs.com/docs/modules/Assets.html#uploading-assets)
198
+ });
199
+ }
200
+ catch (e) {
201
+ console.error('Error uploading assets', e);
202
+ if (e instanceof WebsiteError) {
203
+ res.status(e.code).json({ message: e.message });
204
+ }
205
+ else {
206
+ res.status(500).json({ message: e.message });
207
+ }
208
+ }
209
+ });
210
+ });
211
+ /**
212
+ * Get the desired backend
213
+ * Can be the default backend or a specific one
214
+ */
215
+ async function getStorageProvider(session, backendId) {
216
+ const storageProvider = await (0, backends_1.getBackend)(config, session, types_1.BackendType.STORAGE, backendId); // ?? config.getStorageProviders()[0]
217
+ if (!storageProvider) {
218
+ throw new WebsiteError('No storage provider found', 404);
219
+ }
220
+ if (!await storageProvider.isLoggedIn(session)) {
221
+ throw new WebsiteError('Not logged in', 401);
222
+ }
223
+ return storageProvider;
224
+ }
225
+ /**
226
+ * Website a website data or list all websites
227
+ */
228
+ async function readWebsite(session, id, backendId) {
229
+ // Get the desired backend
230
+ const storageProvider = await getStorageProvider(session, backendId);
231
+ // List websites or get a website
232
+ // Get a website data
233
+ const file = await storageProvider.readFile(session, id, constants_1.WEBSITE_DATA_FILE_NAME);
234
+ if (typeof file.content === 'string')
235
+ return JSON.parse(file.content);
236
+ else if (file.content instanceof Buffer)
237
+ return JSON.parse(file.content.toString());
238
+ else if (file.content instanceof stream_1.Readable)
239
+ return file.content;
240
+ throw new WebsiteError('Invalid website data', 500);
241
+ }
242
+ /**
243
+ * List existing websites
244
+ */
245
+ async function listWebsites(session, backendId) {
246
+ // Get the desired backend
247
+ const storageProvider = await getStorageProvider(session, backendId);
248
+ // List websites
249
+ return storageProvider.listWebsites(session);
250
+ }
251
+ /**
252
+ * Write the website data to the backend
253
+ */
254
+ async function writeWebsite(session, id, websiteData, backendId) {
255
+ // Get the desired backend
256
+ const storageProvider = await getStorageProvider(session, backendId);
257
+ // Init the storage for this website (create the folder if it does not exist)
258
+ // FIXME: put this after login
259
+ // await storageProvider.init(session, id)
260
+ // Write the website data
261
+ await storageProvider.writeFiles(session, id, [{
262
+ path: constants_1.WEBSITE_DATA_FILE_NAME,
263
+ content: JSON.stringify(websiteData),
264
+ }]);
265
+ }
266
+ /**
267
+ * Delete a website
268
+ */
269
+ async function deleteWebsite(session, id, backendId) {
270
+ // Get the desired backend
271
+ const storageProvider = await getStorageProvider(session, backendId);
272
+ // Delete the website
273
+ return await storageProvider.deleteDir(session, id, '/');
274
+ }
275
+ /**
276
+ * Read an asset
277
+ */
278
+ async function readAsset(session, id, fileName, backendId) {
279
+ //const { session } = req
280
+ //const id = req.query.id
281
+ //const fileName = req.params[0]
282
+ //const uploadDir = await assetsDir(id)
283
+ //res.sendFile(`${uploadDir}/${fileName}`)
284
+ // Get the desired backend
285
+ const storageProvider = await getStorageProvider(session, backendId);
286
+ // Read the asset from the backend
287
+ return await storageProvider.readFile(session, id, `/${options.assetsPath}/${fileName}`);
288
+ }
289
+ /**
290
+ * Write an asset to the backend
291
+ */
292
+ async function writeAssets(session, id, files, backendId) {
293
+ // Get the desired backend
294
+ const storageProvider = await getStorageProvider(session, backendId);
295
+ // Write the asset to the backend
296
+ await storageProvider.writeFiles(session, id, files);
297
+ // Return the files URLs with the website id
298
+ return files.map(({ path }) => `${path}?id=${id}`);
299
+ }
300
+ }
301
+ exports.default = default_1;
302
+ //# sourceMappingURL=WebsitePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsitePlugin.js","sourceRoot":"","sources":["../../src/ts/plugins/WebsitePlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { File, StorageProvider, HostingProvider, StatusCallback, BackendSession } from '.';
2
+ import { BackendData, BackendUser, WebsiteMeta, FileMeta, JobData, WebsiteId, BackendType } from '../../types';
3
+ import { ServerConfig } from '../config';
4
+ type FsSession = BackendSession;
5
+ interface FsOptions {
6
+ rootPath?: string;
7
+ type: BackendType;
8
+ }
9
+ export declare class FsBackend implements StorageProvider<FsSession>, HostingProvider<FsSession> {
10
+ id: string;
11
+ displayName: string;
12
+ icon: string;
13
+ rootPath: string;
14
+ disableLogout: boolean;
15
+ options: {
16
+ rootPath: string;
17
+ type: BackendType;
18
+ };
19
+ type: BackendType;
20
+ constructor(config: ServerConfig | null, opts: FsOptions);
21
+ updateStatus(filesStatuses: any, status: any, statusCbk: any): void;
22
+ initStatus(files: any): any;
23
+ getAdminUrl(session: FsSession, id: WebsiteId): Promise<string>;
24
+ getAuthorizeURL(session: FsSession): Promise<string>;
25
+ isLoggedIn(session: FsSession): Promise<boolean>;
26
+ login(session: FsSession): Promise<void>;
27
+ logout(session: FsSession): Promise<void>;
28
+ getUserData(session: FsSession): Promise<BackendUser>;
29
+ getSiteMeta(session: FsSession, id: string): Promise<WebsiteMeta>;
30
+ init(session: FsSession, id: WebsiteId): Promise<void>;
31
+ listWebsites(session: any): Promise<WebsiteMeta[]>;
32
+ readFile(session: FsSession, id: WebsiteId, path: string): Promise<File>;
33
+ writeFiles(session: FsSession, id: WebsiteId, files: File[], statusCbk?: StatusCallback): Promise<string[]>;
34
+ deleteFiles(session: FsSession, id: WebsiteId, paths: string[]): Promise<void>;
35
+ listDir(session: FsSession, id: WebsiteId, path: string): Promise<FileMeta[]>;
36
+ createDir(session: FsSession, id: WebsiteId, path: string): Promise<void>;
37
+ deleteDir(session: FsSession, id: WebsiteId, path: string): Promise<void>;
38
+ getFileUrl(session: FsSession, id: WebsiteId, path: string): Promise<string>;
39
+ publish(session: FsSession, id: WebsiteId, backendData: BackendData, files: File[]): Promise<JobData>;
40
+ getWebsiteUrl(session: FsSession, id: WebsiteId): Promise<string>;
41
+ }
42
+ export {};
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ /*
3
+ * Silex website builder, free/libre no-code tool for makers.
4
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.FsBackend = void 0;
46
+ const promises_1 = __importStar(require("fs/promises"));
47
+ const fs_1 = require("fs");
48
+ const fs_extra_1 = __importDefault(require("fs-extra"));
49
+ const path_1 = require("path");
50
+ const types_1 = require("../../types");
51
+ const jobs_1 = require("../jobs");
52
+ const os_1 = require("os");
53
+ const constants_1 = require("../../constants");
54
+ const validation_1 = require("../utils/validation");
55
+ class FsBackend {
56
+ id = 'fs';
57
+ displayName = 'File system';
58
+ icon = 'file';
59
+ rootPath;
60
+ disableLogout = true;
61
+ options;
62
+ type;
63
+ constructor(config, opts) {
64
+ this.options = {
65
+ rootPath: __dirname + '/../../../.silex',
66
+ ...opts,
67
+ };
68
+ this.type = this.options.type;
69
+ }
70
+ // ********************
71
+ // Utils methods
72
+ // ********************
73
+ updateStatus(filesStatuses, status, statusCbk) {
74
+ statusCbk && statusCbk({
75
+ message: `<p>Writing files:<ul><li>${filesStatuses.map(({ file, message }) => `${file.path}: ${message}`).join('</li><li>')}</li></ul></p>`,
76
+ status,
77
+ });
78
+ }
79
+ initStatus(files) {
80
+ return files.map(file => ({
81
+ file,
82
+ message: 'Waiting',
83
+ status: types_1.JobStatus.IN_PROGRESS,
84
+ }));
85
+ }
86
+ // ********************
87
+ // Backend interface
88
+ // ********************
89
+ async getAdminUrl(session, id) {
90
+ return '';
91
+ }
92
+ async getAuthorizeURL(session) {
93
+ return '';
94
+ }
95
+ async isLoggedIn(session) {
96
+ return true;
97
+ }
98
+ async login(session) { }
99
+ async logout(session) { }
100
+ async getUserData(session) {
101
+ const { username, } = (0, os_1.userInfo)();
102
+ return {
103
+ name: username,
104
+ picture: this.icon,
105
+ };
106
+ }
107
+ async getSiteMeta(session, id) {
108
+ const websiteId = (0, validation_1.requiredParam)(id, 'website id');
109
+ const files = await this.listDir(session, websiteId, '/');
110
+ const file = files.find(f => f.name === constants_1.WEBSITE_DATA_FILE_NAME);
111
+ if (!file)
112
+ throw new Error('Website not found');
113
+ return {
114
+ websiteId,
115
+ // url: await this.getFileUrl(session, websiteId, WEBSITE_DATA_FILE_NAME),
116
+ //metadata: {
117
+ // path: session.ftp.path,
118
+ //},
119
+ ...file,
120
+ };
121
+ }
122
+ async init(session, id) {
123
+ await promises_1.default.mkdir((0, path_1.join)(this.options.rootPath, id), { recursive: true });
124
+ }
125
+ // ********************
126
+ // Storage interface
127
+ // ********************
128
+ async listWebsites(session) {
129
+ const list = await promises_1.default.readdir(this.options.rootPath);
130
+ return Promise.all(list.map(async (fileName) => {
131
+ const filePath = (0, path_1.join)(this.options.rootPath, fileName);
132
+ const fileStat = await (0, promises_1.stat)(filePath);
133
+ return {
134
+ websiteId: fileName,
135
+ createdAt: fileStat.birthtime,
136
+ updatedAt: fileStat.mtime,
137
+ metadata: {
138
+ ...fileStat,
139
+ },
140
+ };
141
+ }));
142
+ }
143
+ async readFile(session, id, path) {
144
+ const fullPath = (0, path_1.join)(this.options.rootPath, id, path);
145
+ const content = await promises_1.default.readFile(fullPath);
146
+ console.log('read file', path, fullPath, content.length);
147
+ return { path, content };
148
+ }
149
+ async writeFiles(session, id, files, statusCbk) {
150
+ const filesStatuses = this.initStatus(files);
151
+ let error = false;
152
+ const filePaths = [];
153
+ for (const fileStatus of filesStatuses) {
154
+ const { file } = fileStatus;
155
+ const path = (0, path_1.join)(this.options.rootPath, id, file.path);
156
+ filePaths.push(path);
157
+ if (typeof file.content === 'string') {
158
+ fileStatus.message = 'Writing';
159
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
160
+ try {
161
+ console.log('write file', path, file.content.length);
162
+ await promises_1.default.writeFile(path, file.content);
163
+ }
164
+ catch (err) {
165
+ fileStatus.message = `Error (${err})`;
166
+ console.log('write file stream', path, file.content.length);
167
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
168
+ error = true;
169
+ continue;
170
+ }
171
+ fileStatus.message = 'Success';
172
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
173
+ }
174
+ else {
175
+ fileStatus.message = 'Writing';
176
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
177
+ const writeStream = (0, fs_1.createWriteStream)(path);
178
+ file.content.pipe(writeStream);
179
+ await new Promise((resolve) => {
180
+ writeStream.on('finish', () => {
181
+ fileStatus.message = 'Success';
182
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
183
+ resolve(file);
184
+ });
185
+ writeStream.on('error', err => {
186
+ console.error('writeStream error', err);
187
+ fileStatus.message = `Error (${err})`;
188
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
189
+ error = true;
190
+ resolve(file);
191
+ });
192
+ });
193
+ }
194
+ }
195
+ this.updateStatus(filesStatuses, error ? types_1.JobStatus.ERROR : types_1.JobStatus.SUCCESS, statusCbk);
196
+ return filePaths;
197
+ }
198
+ async deleteFiles(session, id, paths) {
199
+ for (const path of paths) {
200
+ await promises_1.default.unlink((0, path_1.join)(this.options.rootPath, id, path));
201
+ }
202
+ }
203
+ async listDir(session, id, path) {
204
+ const list = await promises_1.default.readdir((0, path_1.join)(this.options.rootPath, id, path));
205
+ return Promise.all(list.map(async (fileName) => {
206
+ const filePath = (0, path_1.join)(this.options.rootPath, id, path, fileName);
207
+ const fileStat = await (0, promises_1.stat)(filePath);
208
+ return {
209
+ name: fileName,
210
+ size: fileStat.size,
211
+ isDir: fileStat.isDirectory(),
212
+ createdAt: fileStat.birthtime,
213
+ updatedAt: fileStat.mtime,
214
+ };
215
+ }));
216
+ }
217
+ // async listDir(session: FsSession, id: string, path: string): Promise<FileMeta[]> {
218
+ // const fileNames = await fs.readdir(this.options.rootPath)
219
+ // // Filter directories only
220
+ // // That's a way to do an async filter
221
+ // const withType = await Promise.all(fileNames.map(async fileName => ({
222
+ // fileName,
223
+ // isDir: (await stat(join(this.options.rootPath, fileName))).isDirectory(),
224
+ // })))
225
+ // return withType
226
+ // .filter(({fileName, isDir}) => isDir)
227
+ // .map(({fileName}) => fileName as WebsiteId)
228
+ // }
229
+ async createDir(session, id, path) {
230
+ await promises_1.default.mkdir((0, path_1.join)(this.options.rootPath, id, path), { recursive: true });
231
+ }
232
+ async deleteDir(session, id, path) {
233
+ await fs_extra_1.default.remove((0, path_1.join)(this.options.rootPath, id, path));
234
+ }
235
+ async getFileUrl(session, id, path) {
236
+ const filePath = (0, path_1.join)(this.options.rootPath, id, path);
237
+ const fileUrl = new URL(filePath, 'file://');
238
+ return fileUrl.toString();
239
+ }
240
+ // ********************
241
+ // Hosting provider interface
242
+ // ********************
243
+ async publish(session, id, backendData, files) {
244
+ const job = (0, jobs_1.startJob)(`Publishing to ${this.displayName}`);
245
+ job.logs = [[`Publishing to ${this.displayName}`]];
246
+ job.errors = [[]];
247
+ this.writeFiles(session, id, files, async ({ status, message }) => {
248
+ // Update the job status
249
+ job.status = status;
250
+ job.message = message;
251
+ job.logs[0].push(message);
252
+ // Add the website url
253
+ job.url = await this.getFileUrl(session, id, 'index.html');
254
+ if (status === types_1.JobStatus.SUCCESS) {
255
+ (0, jobs_1.jobSuccess)(job.jobId, message);
256
+ }
257
+ else if (status === types_1.JobStatus.ERROR) {
258
+ job.errors[0].push(message);
259
+ (0, jobs_1.jobError)(job.jobId, message);
260
+ }
261
+ });
262
+ return job;
263
+ }
264
+ async getWebsiteUrl(session, id) {
265
+ return this.getFileUrl(session, id, '/index.html');
266
+ }
267
+ }
268
+ exports.FsBackend = FsBackend;
269
+ //# sourceMappingURL=FsBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FsBackend.js","sourceRoot":"","sources":["../../../src/ts/server/backends/FsBackend.ts"],"names":[],"mappings":"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"}