@marsx-dev/launcher 0.0.24 → 0.0.26
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 +37 -4
- package/package.json +1 -1
- package/src/loader.ts +46 -4
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;AAuI/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"));
|
|
@@ -26,6 +28,9 @@ function isImportedBlockFile(filePath) {
|
|
|
26
28
|
const absoluteImportedRoot = path_1.default.resolve(importedBlocksRoot);
|
|
27
29
|
return absoluteFilePath === absoluteImportedRoot || absoluteFilePath.startsWith(`${absoluteImportedRoot}${path_1.default.sep}`);
|
|
28
30
|
}
|
|
31
|
+
function isSettingsBlockFile(filePath) {
|
|
32
|
+
return path_1.default.parse(filePath).name.endsWith('.settings');
|
|
33
|
+
}
|
|
29
34
|
async function downloadFromExternal(externalImport) {
|
|
30
35
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
31
36
|
const url = lodash_1.default.trimEnd(externalImport.url, '/');
|
|
@@ -38,7 +43,16 @@ async function downloadFromExternal(externalImport) {
|
|
|
38
43
|
console.log(`${url} does not support V4, fallback to V3`);
|
|
39
44
|
}
|
|
40
45
|
const v3Resp = await axios_1.default.get(`${url}/api/GetExportedAppBlocks`, { params });
|
|
41
|
-
|
|
46
|
+
const v3BlocksAllRaw = v3Resp.data.reverse();
|
|
47
|
+
const seenNames = new Set();
|
|
48
|
+
const v3Blocks = [];
|
|
49
|
+
for (const block of v3BlocksAllRaw) {
|
|
50
|
+
if (seenNames.has(block.Name))
|
|
51
|
+
continue;
|
|
52
|
+
seenNames.add(block.Name);
|
|
53
|
+
v3Blocks.push((0, v3_1.convertV3ToSfc)(block));
|
|
54
|
+
}
|
|
55
|
+
return { commit: '', hash: '', blocks: v3Blocks };
|
|
42
56
|
}
|
|
43
57
|
async function saveImportedBlocks(externalImport, blocks) {
|
|
44
58
|
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
@@ -50,10 +64,25 @@ async function saveImportedBlocks(externalImport, blocks) {
|
|
|
50
64
|
await (0, fileUtils_1.writeFileMakeDir)(outputPath, serialized.content);
|
|
51
65
|
}
|
|
52
66
|
}
|
|
67
|
+
function getImportCacheFilePath(externalImport) {
|
|
68
|
+
const hash = crypto_1.default.createHash('md5').update((0, json_stable_stringify_1.default)(externalImport)).digest('hex');
|
|
69
|
+
const cacheFileName = `${externalImport.name}_${externalImport.git_commit_ish}_${hash}.json`.replace(/[^\w.]+/g, '_');
|
|
70
|
+
return path_1.default.join(configuration_1.config.cacheDir, 'imports', cacheFileName);
|
|
71
|
+
}
|
|
53
72
|
async function downloadAndSave(externalImport) {
|
|
54
|
-
const
|
|
73
|
+
const cacheFilePath = getImportCacheFilePath(externalImport);
|
|
74
|
+
if (await (0, fileUtils_1.isFile)(cacheFilePath)) {
|
|
75
|
+
const content = await fs_1.promises.readFile(cacheFilePath, 'utf-8');
|
|
76
|
+
console.log(`Loading cached blocks from ${externalImport.url}`);
|
|
77
|
+
return JSON.parse(content);
|
|
78
|
+
}
|
|
79
|
+
const response = await downloadFromExternal(externalImport);
|
|
80
|
+
const blocks = response.blocks;
|
|
55
81
|
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
56
|
-
await
|
|
82
|
+
await (0, fileUtils_1.writeFileMakeDir)(cacheFilePath, JSON.stringify(blocks, null, 2), 'utf-8');
|
|
83
|
+
if (!configuration_1.config.production) {
|
|
84
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
85
|
+
}
|
|
57
86
|
return blocks;
|
|
58
87
|
}
|
|
59
88
|
async function downloadAll(externalImports) {
|
|
@@ -79,6 +108,9 @@ async function downloadSettingsFromDb() {
|
|
|
79
108
|
}
|
|
80
109
|
}
|
|
81
110
|
async function saveSettingsBlocks(blocks) {
|
|
111
|
+
if (configuration_1.config.production) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
82
114
|
for (const block of blocks) {
|
|
83
115
|
const serialized = (0, sfc_1.serializeSfc)(block);
|
|
84
116
|
const outputPath = path_1.default.join(configuration_1.config.blocksDir, serialized.filePath);
|
|
@@ -95,6 +127,7 @@ async function readBlockFiles(blocksDir) {
|
|
|
95
127
|
return await Promise.all(files
|
|
96
128
|
.filter(f => !path_1.default.basename(f).startsWith('.'))
|
|
97
129
|
.filter(f => !isImportedBlockFile(f))
|
|
130
|
+
.filter(f => !isSettingsBlockFile(f))
|
|
98
131
|
.map(f => readBlockFile(blocksDir, f)));
|
|
99
132
|
}
|
|
100
133
|
exports.readBlockFiles = readBlockFiles;
|
|
@@ -105,4 +138,4 @@ async function loadAllBlocks() {
|
|
|
105
138
|
return [...externalBlocks, ...localBlocks];
|
|
106
139
|
}
|
|
107
140
|
exports.loadAllBlocks = loadAllBlocks;
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLDJCQUFvQztBQUNwQyxrRkFBOEM7QUFDOUMscUNBQXNDO0FBQ3RDLG9EQUF1QjtBQUN2QixnREFBd0I7QUFDeEIsbURBQThEO0FBQzlELHFDQUErRDtBQUMvRCxpREFBaUY7QUFDakYsbUNBQTBEO0FBRzFELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBRXhDLFNBQVMscUJBQXFCO0lBQzVCLE9BQU8sY0FBSSxDQUFDLElBQUksQ0FBQyxzQkFBTSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLGNBQW1DO0lBQ2hFLE9BQU8sY0FBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxRQUFnQjtJQUMzQyxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixFQUFFLENBQUM7SUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sb0JBQW9CLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlELE9BQU8sZ0JBQWdCLEtBQUssb0JBQW9CLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEdBQUcsb0JBQW9CLEdBQUcsY0FBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDeEgsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsUUFBZ0I7SUFDM0MsT0FBTyxjQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENB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
|
package/package.json
CHANGED
package/src/loader.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
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[] };
|
|
@@ -26,6 +28,10 @@ function isImportedBlockFile(filePath: string) {
|
|
|
26
28
|
return absoluteFilePath === absoluteImportedRoot || absoluteFilePath.startsWith(`${absoluteImportedRoot}${path.sep}`);
|
|
27
29
|
}
|
|
28
30
|
|
|
31
|
+
function isSettingsBlockFile(filePath: string) {
|
|
32
|
+
return path.parse(filePath).name.endsWith('.settings');
|
|
33
|
+
}
|
|
34
|
+
|
|
29
35
|
async function downloadFromExternal(externalImport: ImportProjectConfig): Promise<V4Response> {
|
|
30
36
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
31
37
|
|
|
@@ -39,7 +45,18 @@ async function downloadFromExternal(externalImport: ImportProjectConfig): Promis
|
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
const v3Resp = await axios.get<V3MongoBlock[]>(`${url}/api/GetExportedAppBlocks`, { params });
|
|
42
|
-
|
|
48
|
+
const v3BlocksAllRaw = v3Resp.data.reverse();
|
|
49
|
+
const seenNames = new Set<string>();
|
|
50
|
+
const v3Blocks: SfcBlock[] = [];
|
|
51
|
+
|
|
52
|
+
for (const block of v3BlocksAllRaw) {
|
|
53
|
+
if (seenNames.has(block.Name)) continue;
|
|
54
|
+
|
|
55
|
+
seenNames.add(block.Name);
|
|
56
|
+
v3Blocks.push(convertV3ToSfc(block));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return { commit: '', hash: '', blocks: v3Blocks };
|
|
43
60
|
}
|
|
44
61
|
|
|
45
62
|
async function saveImportedBlocks(externalImport: ImportProjectConfig, blocks: SfcBlock[]) {
|
|
@@ -54,10 +71,30 @@ async function saveImportedBlocks(externalImport: ImportProjectConfig, blocks: S
|
|
|
54
71
|
}
|
|
55
72
|
}
|
|
56
73
|
|
|
74
|
+
function getImportCacheFilePath(externalImport: ImportProjectConfig) {
|
|
75
|
+
const hash = crypto.createHash('md5').update(stringify(externalImport)).digest('hex');
|
|
76
|
+
const cacheFileName = `${externalImport.name}_${externalImport.git_commit_ish}_${hash}.json`.replace(/[^\w.]+/g, '_');
|
|
77
|
+
return path.join(config.cacheDir, 'imports', cacheFileName);
|
|
78
|
+
}
|
|
79
|
+
|
|
57
80
|
async function downloadAndSave(externalImport: ImportProjectConfig): Promise<SfcBlock[]> {
|
|
58
|
-
const
|
|
81
|
+
const cacheFilePath = getImportCacheFilePath(externalImport);
|
|
82
|
+
|
|
83
|
+
if (await isFile(cacheFilePath)) {
|
|
84
|
+
const content = await fs.readFile(cacheFilePath, 'utf-8');
|
|
85
|
+
console.log(`Loading cached blocks from ${externalImport.url}`);
|
|
86
|
+
return JSON.parse(content) as SfcBlock[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const response = await downloadFromExternal(externalImport);
|
|
90
|
+
const blocks = response.blocks;
|
|
59
91
|
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
60
|
-
await
|
|
92
|
+
await writeFileMakeDir(cacheFilePath, JSON.stringify(blocks, null, 2), 'utf-8');
|
|
93
|
+
|
|
94
|
+
if (!config.production) {
|
|
95
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
96
|
+
}
|
|
97
|
+
|
|
61
98
|
return blocks;
|
|
62
99
|
}
|
|
63
100
|
|
|
@@ -87,6 +124,10 @@ async function downloadSettingsFromDb(): Promise<SfcBlock[]> {
|
|
|
87
124
|
}
|
|
88
125
|
|
|
89
126
|
async function saveSettingsBlocks(blocks: SfcBlock[]) {
|
|
127
|
+
if (config.production) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
90
131
|
for (const block of blocks) {
|
|
91
132
|
const serialized = serializeSfc(block);
|
|
92
133
|
const outputPath = path.join(config.blocksDir, serialized.filePath);
|
|
@@ -106,6 +147,7 @@ export async function readBlockFiles(blocksDir: string) {
|
|
|
106
147
|
files
|
|
107
148
|
.filter(f => !path.basename(f).startsWith('.'))
|
|
108
149
|
.filter(f => !isImportedBlockFile(f))
|
|
150
|
+
.filter(f => !isSettingsBlockFile(f))
|
|
109
151
|
.map(f => readBlockFile(blocksDir, f)),
|
|
110
152
|
);
|
|
111
153
|
}
|