@marsx-dev/launcher 0.0.25 → 0.0.28
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/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +55 -7
- package/package.json +1 -1
- package/src/loader.ts +65 -7
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAQA,OAAO,EAA0B,QAAQ,EAAE,MAAM,aAAa,CAAC;AA4J/D,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,uBASrD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAKzD"}
|
package/dist/loader.js
CHANGED
|
@@ -5,7 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.loadAllBlocks = exports.readBlockFiles = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
9
|
const fs_1 = require("fs");
|
|
10
|
+
const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
|
|
9
11
|
const mongodb_1 = require("mongodb");
|
|
10
12
|
const lodash_1 = __importDefault(require("lodash"));
|
|
11
13
|
const path_1 = __importDefault(require("path"));
|
|
@@ -14,6 +16,7 @@ const sfc_1 = require("./utils/sfc");
|
|
|
14
16
|
const fileUtils_1 = require("./utils/fileUtils");
|
|
15
17
|
const v3_1 = require("./utils/v3");
|
|
16
18
|
const IMPORTED_BLOCKS_DIR = '_imported';
|
|
19
|
+
let downloadedExternalBlockNames = new Set();
|
|
17
20
|
function getImportedBlocksRoot() {
|
|
18
21
|
return path_1.default.join(configuration_1.config.blocksDir, IMPORTED_BLOCKS_DIR);
|
|
19
22
|
}
|
|
@@ -29,19 +32,41 @@ function isImportedBlockFile(filePath) {
|
|
|
29
32
|
function isSettingsBlockFile(filePath) {
|
|
30
33
|
return path_1.default.parse(filePath).name.endsWith('.settings');
|
|
31
34
|
}
|
|
35
|
+
function rememberExternalBlocks(blocks) {
|
|
36
|
+
for (const block of blocks) {
|
|
37
|
+
downloadedExternalBlockNames.add(block.path.name);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function filterFreshExternalBlocks(blocks) {
|
|
41
|
+
const result = [];
|
|
42
|
+
for (const block of blocks) {
|
|
43
|
+
if (downloadedExternalBlockNames.has(block.path.name))
|
|
44
|
+
continue;
|
|
45
|
+
downloadedExternalBlockNames.add(block.path.name);
|
|
46
|
+
result.push(block);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
32
50
|
async function downloadFromExternal(externalImport) {
|
|
33
51
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
34
52
|
const url = lodash_1.default.trimEnd(externalImport.url, '/');
|
|
35
53
|
console.log(`Downloading blocks from ${url}`);
|
|
36
54
|
try {
|
|
37
55
|
const v4Resp = await axios_1.default.get(`${url}/api/GetExportedAppBlocksV4`, { params });
|
|
38
|
-
return v4Resp.data;
|
|
56
|
+
return { ...v4Resp.data, blocks: filterFreshExternalBlocks(v4Resp.data.blocks) };
|
|
39
57
|
}
|
|
40
58
|
catch (e) {
|
|
41
59
|
console.log(`${url} does not support V4, fallback to V3`);
|
|
42
60
|
}
|
|
43
61
|
const v3Resp = await axios_1.default.get(`${url}/api/GetExportedAppBlocks`, { params });
|
|
44
|
-
|
|
62
|
+
const v3Blocks = [];
|
|
63
|
+
for (const block of v3Resp.data.reverse()) {
|
|
64
|
+
if (downloadedExternalBlockNames.has(block.Name))
|
|
65
|
+
continue;
|
|
66
|
+
downloadedExternalBlockNames.add(block.Name);
|
|
67
|
+
v3Blocks.push((0, v3_1.convertV3ToSfc)(block));
|
|
68
|
+
}
|
|
69
|
+
return { commit: '', hash: '', blocks: v3Blocks };
|
|
45
70
|
}
|
|
46
71
|
async function saveImportedBlocks(externalImport, blocks) {
|
|
47
72
|
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
@@ -53,14 +78,34 @@ async function saveImportedBlocks(externalImport, blocks) {
|
|
|
53
78
|
await (0, fileUtils_1.writeFileMakeDir)(outputPath, serialized.content);
|
|
54
79
|
}
|
|
55
80
|
}
|
|
81
|
+
function getImportCacheFilePath(externalImport) {
|
|
82
|
+
const hash = crypto_1.default.createHash('md5').update((0, json_stable_stringify_1.default)(externalImport)).digest('hex');
|
|
83
|
+
const cacheFileName = `${externalImport.name}_${externalImport.git_commit_ish}_${hash}.json`.replace(/[^\w.]+/g, '_');
|
|
84
|
+
return path_1.default.join(configuration_1.config.cacheDir, 'imports', cacheFileName);
|
|
85
|
+
}
|
|
56
86
|
async function downloadAndSave(externalImport) {
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
await
|
|
87
|
+
const cacheFilePath = getImportCacheFilePath(externalImport);
|
|
88
|
+
let blocks = [];
|
|
89
|
+
if (await (0, fileUtils_1.isFile)(cacheFilePath)) {
|
|
90
|
+
const content = await fs_1.promises.readFile(cacheFilePath, 'utf-8');
|
|
91
|
+
blocks = JSON.parse(content);
|
|
92
|
+
console.log(`Loaded ${blocks.length} cached blocks from ${externalImport.url}`);
|
|
93
|
+
rememberExternalBlocks(blocks);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const response = await downloadFromExternal(externalImport);
|
|
97
|
+
blocks = response.blocks;
|
|
98
|
+
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
99
|
+
await (0, fileUtils_1.writeFileMakeDir)(cacheFilePath, JSON.stringify(blocks, null, 2), 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
if (!configuration_1.config.production) {
|
|
102
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
103
|
+
}
|
|
60
104
|
return blocks;
|
|
61
105
|
}
|
|
62
106
|
async function downloadAll(externalImports) {
|
|
63
|
-
|
|
107
|
+
downloadedExternalBlockNames = new Set();
|
|
108
|
+
const responses = await Promise.all([...externalImports].reverse().map(downloadAndSave));
|
|
64
109
|
return lodash_1.default.flatten(responses);
|
|
65
110
|
}
|
|
66
111
|
async function downloadSettingsFromDb() {
|
|
@@ -82,6 +127,9 @@ async function downloadSettingsFromDb() {
|
|
|
82
127
|
}
|
|
83
128
|
}
|
|
84
129
|
async function saveSettingsBlocks(blocks) {
|
|
130
|
+
if (configuration_1.config.production) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
85
133
|
for (const block of blocks) {
|
|
86
134
|
const serialized = (0, sfc_1.serializeSfc)(block);
|
|
87
135
|
const outputPath = path_1.default.join(configuration_1.config.blocksDir, serialized.filePath);
|
|
@@ -109,4 +157,4 @@ async function loadAllBlocks() {
|
|
|
109
157
|
return [...externalBlocks, ...localBlocks];
|
|
110
158
|
}
|
|
111
159
|
exports.loadAllBlocks = loadAllBlocks;
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLDJCQUFvQztBQUNwQyxrRkFBOEM7QUFDOUMscUNBQXNDO0FBQ3RDLG9EQUF1QjtBQUN2QixnREFBd0I7QUFDeEIsbURBQThEO0FBQzlELHFDQUErRDtBQUMvRCxpREFBaUY7QUFDakYsbUNBQTBEO0FBRzFELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBQ3hDLElBQUksNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUVyRCxTQUFTLHFCQUFxQjtJQUM1QixPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsc0JBQU0sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxjQUFtQztJQUNoRSxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsUUFBZ0I7SUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO0lBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLG9CQUFvQixHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM5RCxPQUFPLGdCQUFnQixLQUFLLG9CQUFvQixJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLG9CQUFvQixHQUFHLGNBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLFFBQWdCO0lBQzNDLE9BQU8sY0FBSSxDQUFDLEtBQUssQ0FBQyxRQUFR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
|
package/package.json
CHANGED
package/src/loader.ts
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import crypto from 'crypto';
|
|
2
3
|
import { promises as fs } from 'fs';
|
|
4
|
+
import stringify from 'json-stable-stringify';
|
|
3
5
|
import { MongoClient } from 'mongodb';
|
|
4
6
|
import _ from 'lodash';
|
|
5
7
|
import path from 'path';
|
|
6
8
|
import { config, ImportProjectConfig } from './configuration';
|
|
7
9
|
import { parseSFC, serializeSfc, SfcBlock } from './utils/sfc';
|
|
8
|
-
import { listFilesRecursive, writeFileMakeDir } from './utils/fileUtils';
|
|
10
|
+
import { isFile, listFilesRecursive, writeFileMakeDir } from './utils/fileUtils';
|
|
9
11
|
import { convertV3ToSfc, V3MongoBlock } from './utils/v3';
|
|
10
12
|
|
|
11
13
|
type V4Response = { commit: string; hash: string; blocks: SfcBlock[] };
|
|
12
14
|
const IMPORTED_BLOCKS_DIR = '_imported';
|
|
15
|
+
let downloadedExternalBlockNames = new Set<string>();
|
|
13
16
|
|
|
14
17
|
function getImportedBlocksRoot() {
|
|
15
18
|
return path.join(config.blocksDir, IMPORTED_BLOCKS_DIR);
|
|
@@ -30,6 +33,25 @@ function isSettingsBlockFile(filePath: string) {
|
|
|
30
33
|
return path.parse(filePath).name.endsWith('.settings');
|
|
31
34
|
}
|
|
32
35
|
|
|
36
|
+
function rememberExternalBlocks(blocks: SfcBlock[]) {
|
|
37
|
+
for (const block of blocks) {
|
|
38
|
+
downloadedExternalBlockNames.add(block.path.name);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function filterFreshExternalBlocks(blocks: SfcBlock[]) {
|
|
43
|
+
const result: SfcBlock[] = [];
|
|
44
|
+
|
|
45
|
+
for (const block of blocks) {
|
|
46
|
+
if (downloadedExternalBlockNames.has(block.path.name)) continue;
|
|
47
|
+
|
|
48
|
+
downloadedExternalBlockNames.add(block.path.name);
|
|
49
|
+
result.push(block);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
33
55
|
async function downloadFromExternal(externalImport: ImportProjectConfig): Promise<V4Response> {
|
|
34
56
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
35
57
|
|
|
@@ -37,13 +59,22 @@ async function downloadFromExternal(externalImport: ImportProjectConfig): Promis
|
|
|
37
59
|
console.log(`Downloading blocks from ${url}`);
|
|
38
60
|
try {
|
|
39
61
|
const v4Resp = await axios.get<V4Response>(`${url}/api/GetExportedAppBlocksV4`, { params });
|
|
40
|
-
return v4Resp.data;
|
|
62
|
+
return { ...v4Resp.data, blocks: filterFreshExternalBlocks(v4Resp.data.blocks) };
|
|
41
63
|
} catch (e) {
|
|
42
64
|
console.log(`${url} does not support V4, fallback to V3`);
|
|
43
65
|
}
|
|
44
66
|
|
|
45
67
|
const v3Resp = await axios.get<V3MongoBlock[]>(`${url}/api/GetExportedAppBlocks`, { params });
|
|
46
|
-
|
|
68
|
+
const v3Blocks: SfcBlock[] = [];
|
|
69
|
+
|
|
70
|
+
for (const block of v3Resp.data.reverse()) {
|
|
71
|
+
if (downloadedExternalBlockNames.has(block.Name)) continue;
|
|
72
|
+
|
|
73
|
+
downloadedExternalBlockNames.add(block.Name);
|
|
74
|
+
v3Blocks.push(convertV3ToSfc(block));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return { commit: '', hash: '', blocks: v3Blocks };
|
|
47
78
|
}
|
|
48
79
|
|
|
49
80
|
async function saveImportedBlocks(externalImport: ImportProjectConfig, blocks: SfcBlock[]) {
|
|
@@ -58,15 +89,38 @@ async function saveImportedBlocks(externalImport: ImportProjectConfig, blocks: S
|
|
|
58
89
|
}
|
|
59
90
|
}
|
|
60
91
|
|
|
92
|
+
function getImportCacheFilePath(externalImport: ImportProjectConfig) {
|
|
93
|
+
const hash = crypto.createHash('md5').update(stringify(externalImport)).digest('hex');
|
|
94
|
+
const cacheFileName = `${externalImport.name}_${externalImport.git_commit_ish}_${hash}.json`.replace(/[^\w.]+/g, '_');
|
|
95
|
+
return path.join(config.cacheDir, 'imports', cacheFileName);
|
|
96
|
+
}
|
|
97
|
+
|
|
61
98
|
async function downloadAndSave(externalImport: ImportProjectConfig): Promise<SfcBlock[]> {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
99
|
+
const cacheFilePath = getImportCacheFilePath(externalImport);
|
|
100
|
+
let blocks: SfcBlock[] = [];
|
|
101
|
+
|
|
102
|
+
if (await isFile(cacheFilePath)) {
|
|
103
|
+
const content = await fs.readFile(cacheFilePath, 'utf-8');
|
|
104
|
+
blocks = JSON.parse(content) as SfcBlock[];
|
|
105
|
+
console.log(`Loaded ${blocks.length} cached blocks from ${externalImport.url}`);
|
|
106
|
+
rememberExternalBlocks(blocks);
|
|
107
|
+
} else {
|
|
108
|
+
const response = await downloadFromExternal(externalImport);
|
|
109
|
+
blocks = response.blocks;
|
|
110
|
+
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
111
|
+
await writeFileMakeDir(cacheFilePath, JSON.stringify(blocks, null, 2), 'utf-8');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (!config.production) {
|
|
115
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
116
|
+
}
|
|
117
|
+
|
|
65
118
|
return blocks;
|
|
66
119
|
}
|
|
67
120
|
|
|
68
121
|
async function downloadAll(externalImports: ImportProjectConfig[]) {
|
|
69
|
-
|
|
122
|
+
downloadedExternalBlockNames = new Set<string>();
|
|
123
|
+
const responses = await Promise.all([...externalImports].reverse().map(downloadAndSave));
|
|
70
124
|
return _.flatten(responses);
|
|
71
125
|
}
|
|
72
126
|
|
|
@@ -91,6 +145,10 @@ async function downloadSettingsFromDb(): Promise<SfcBlock[]> {
|
|
|
91
145
|
}
|
|
92
146
|
|
|
93
147
|
async function saveSettingsBlocks(blocks: SfcBlock[]) {
|
|
148
|
+
if (config.production) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
94
152
|
for (const block of blocks) {
|
|
95
153
|
const serialized = serializeSfc(block);
|
|
96
154
|
const outputPath = path.join(config.blocksDir, serialized.filePath);
|