@marsx-dev/launcher 0.0.22 → 0.0.24
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/cli/fix-folders.d.ts.map +1 -1
- package/dist/cli/fix-folders.js +2 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -2
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +57 -14
- package/package.json +2 -2
- package/src/cli/fix-folders.ts +1 -0
- package/src/cli/init.ts +5 -1
- package/src/loader.ts +66 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix-folders.d.ts","sourceRoot":"","sources":["../../src/cli/fix-folders.ts"],"names":[],"mappings":"AAWA,wBAAsB,iBAAiB,CAAC,OAAO,UAAO,
|
|
1
|
+
{"version":3,"file":"fix-folders.d.ts","sourceRoot":"","sources":["../../src/cli/fix-folders.ts"],"names":[],"mappings":"AAWA,wBAAsB,iBAAiB,CAAC,OAAO,UAAO,iBA8CrD"}
|
package/dist/cli/fix-folders.js
CHANGED
|
@@ -16,6 +16,7 @@ async function fixDbBlockFolders(safeRun = true) {
|
|
|
16
16
|
console.log(chalk_1.default.red(`Running in ${safeRun ? 'SAFE' : 'WRITE TO DB'} mode!`));
|
|
17
17
|
console.log(`Reading files to migrate from ${configuration_1.config.blocksDir} folder`);
|
|
18
18
|
let localBlocks = await (0, loader_1.readBlockFiles)(configuration_1.config.blocksDir);
|
|
19
|
+
localBlocks = localBlocks.filter(l => l.path.filePath.indexOf('_imported') === -1);
|
|
19
20
|
localBlocks = localBlocks.filter(l => l.path.filePath.indexOf('_forked') === -1);
|
|
20
21
|
console.log(`Got ${localBlocks.length} files to migrate`);
|
|
21
22
|
const db = await getMongoDbConnection();
|
|
@@ -48,4 +49,4 @@ async function fixDbBlockFolders(safeRun = true) {
|
|
|
48
49
|
console.log(chalk_1.default.green('\nFolders fixed complete successfully!'));
|
|
49
50
|
}
|
|
50
51
|
exports.fixDbBlockFolders = fixDbBlockFolders;
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LWZvbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2ZpeC1mb2xkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQixvREFBMEM7QUFDMUMsc0NBQTJDO0FBRTNDLHFDQUFvRDtBQUVwRCxLQUFLLFVBQVUsb0JBQW9CO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxxQkFBVyxDQUFDLHNCQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEUsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDLHNCQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVNLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsSUFBSTtJQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRS9FLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLHNCQUFNLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQztJQUV6RSxJQUFJLFdBQVcsR0FBRyxNQUFNLElBQUEsdUJBQWMsRUFBQyxzQkFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXpELFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sV0FBVyxDQUFDLE1BQU0sbUJBQW1CLENBQUMsQ0FBQztJQUUxRCxNQUFNLEVBQUUsR0FBRyxNQUFNLG9CQUFvQixFQUFFLENBQUM7SUFFeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBZSxRQUFRLENBQUMsQ0FBQztJQUU5RCxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsRUFBRTtRQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUV2RCxJQUFJO1lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFXLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLE1BQU0sR0FBRyxHQUFHLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDekgsT0FBTyxDQUFDLEdBQUcsQ0FDVCxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQzNELEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxhQUNwRCxFQUFFLENBQ0gsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLE9BQU8sRUFBRTtvQkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxTQUFTLE9BQU8sRUFBRSxHQUFHLEtBQUssT0FBTyxFQUFFLE1BQU0sT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ3hIO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLFNBQVMsT0FBTyxhQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDckc7YUFDRjtTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN2RCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBRUQsQ0FBQyxFQUFFLENBQUM7S0FDTDtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQTlDRCw4Q0E4Q0MifQ==
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAyDA,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAyDA,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,iBA6FpD"}
|
package/dist/cli/init.js
CHANGED
|
@@ -107,7 +107,8 @@ async function initProject(projectName) {
|
|
|
107
107
|
};
|
|
108
108
|
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, 'config', 'default.json'), JSON.stringify(config, null, 2));
|
|
109
109
|
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, 'config', 'custom-environment-variables.json'), JSON.stringify(configuration_1.CustomEnvironmentVariables, null, 2));
|
|
110
|
-
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, '.gitignore'), 'node_modules\ndist\n.cache\n');
|
|
110
|
+
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, '.gitignore'), 'node_modules\ndist\n.cache\nblocks/_imported\n');
|
|
111
|
+
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, 'AGENTS.md'), '## Instructions\n- Never manually edit files under `blocks/_imported/`. That directory is generated at runtime from external imports and may be fully rewritten by the launcher.\n- Never edit `*.settings.mars` files. If a settings change is required, describe exactly what the developer should change manually instead of modifying the file.\n- If you need to modify an imported block, do not edit `blocks/_imported/`. Create a local fork under `blocks/_forked/<import_app_name>/...`, keep the block filename and block contents compatible with the imported block you are overriding, and edit the fork there instead.\n- `_forked` is only a local convention. The loader treats it as normal local blocks, so forks override imported blocks because local blocks are loaded after imported ones. There is no automatic fork command in this repo.\n');
|
|
111
112
|
function run(...args) {
|
|
112
113
|
const cmd = args[0];
|
|
113
114
|
(0, textUtils_1.assert)(cmd);
|
|
@@ -130,4 +131,4 @@ async function initProject(projectName) {
|
|
|
130
131
|
console.log(` - Start local server: ${chalk_1.default.underline('npm run start')}`);
|
|
131
132
|
}
|
|
132
133
|
exports.initProject = initProject;
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsaURBQTBDO0FBQzFDLG1DQUFxQztBQUNyQyxnREFBd0I7QUFDeEIsb0RBQXNFO0FBQ3RFLGtEQUFtRTtBQUNuRSxrREFBNEM7QUFDNUMsbUNBQW1DO0FBQ25DLDJCQUFvQztBQUVwQyxNQUFNLFlBQVksR0FBRztJQUNuQixrQkFBa0I7SUFDbEIsU0FBUztJQUNULGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixxQkFBcUI7SUFDckIsU0FBUztJQUNULE9BQU87SUFDUCxlQUFlO0lBQ2YsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsWUFBWTtJQUNaLE1BQU07SUFDTixRQUFRO0NBQ1QsQ0FBQztBQUVGLE1BQU0sT0FBTyxHQUFHO0lBQ2QsWUFBWTtJQUNaLGtDQUFrQztJQUNsQyxRQUFRO0lBQ1IsV0FBVztJQUNYLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixZQUFZO0NBQ2IsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUU1RCxLQUFLLFVBQVUsV0FBVyxDQUFDLFdBQW1CO0lBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsS0FBSyxXQUFXLENB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
|
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":"AAMA,OAAO,EAA0B,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgG/D,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,uBAQrD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAKzD"}
|
package/dist/loader.js
CHANGED
|
@@ -5,15 +5,27 @@ 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"));
|
|
9
8
|
const fs_1 = require("fs");
|
|
10
|
-
const
|
|
9
|
+
const mongodb_1 = require("mongodb");
|
|
11
10
|
const lodash_1 = __importDefault(require("lodash"));
|
|
12
11
|
const path_1 = __importDefault(require("path"));
|
|
13
12
|
const configuration_1 = require("./configuration");
|
|
14
13
|
const sfc_1 = require("./utils/sfc");
|
|
15
14
|
const fileUtils_1 = require("./utils/fileUtils");
|
|
16
15
|
const v3_1 = require("./utils/v3");
|
|
16
|
+
const IMPORTED_BLOCKS_DIR = '_imported';
|
|
17
|
+
function getImportedBlocksRoot() {
|
|
18
|
+
return path_1.default.join(configuration_1.config.blocksDir, IMPORTED_BLOCKS_DIR);
|
|
19
|
+
}
|
|
20
|
+
function getImportedProjectDir(externalImport) {
|
|
21
|
+
return path_1.default.join(getImportedBlocksRoot(), externalImport.name);
|
|
22
|
+
}
|
|
23
|
+
function isImportedBlockFile(filePath) {
|
|
24
|
+
const importedBlocksRoot = getImportedBlocksRoot();
|
|
25
|
+
const absoluteFilePath = path_1.default.resolve(filePath);
|
|
26
|
+
const absoluteImportedRoot = path_1.default.resolve(importedBlocksRoot);
|
|
27
|
+
return absoluteFilePath === absoluteImportedRoot || absoluteFilePath.startsWith(`${absoluteImportedRoot}${path_1.default.sep}`);
|
|
28
|
+
}
|
|
17
29
|
async function downloadFromExternal(externalImport) {
|
|
18
30
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
19
31
|
const url = lodash_1.default.trimEnd(externalImport.url, '/');
|
|
@@ -28,24 +40,51 @@ async function downloadFromExternal(externalImport) {
|
|
|
28
40
|
const v3Resp = await axios_1.default.get(`${url}/api/GetExportedAppBlocks`, { params });
|
|
29
41
|
return { commit: '', hash: '', blocks: v3Resp.data.map(b => (0, v3_1.convertV3ToSfc)(b)) };
|
|
30
42
|
}
|
|
31
|
-
async function
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
async function saveImportedBlocks(externalImport, blocks) {
|
|
44
|
+
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
45
|
+
await fs_1.promises.rm(importedProjectDir, { recursive: true, force: true });
|
|
46
|
+
await fs_1.promises.mkdir(importedProjectDir, { recursive: true });
|
|
47
|
+
for (const block of blocks) {
|
|
48
|
+
const serialized = (0, sfc_1.serializeSfc)(block);
|
|
49
|
+
const outputPath = path_1.default.join(importedProjectDir, serialized.filePath);
|
|
50
|
+
await (0, fileUtils_1.writeFileMakeDir)(outputPath, serialized.content);
|
|
39
51
|
}
|
|
52
|
+
}
|
|
53
|
+
async function downloadAndSave(externalImport) {
|
|
40
54
|
const { blocks } = await downloadFromExternal(externalImport);
|
|
41
55
|
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
42
|
-
await (
|
|
56
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
43
57
|
return blocks;
|
|
44
58
|
}
|
|
45
59
|
async function downloadAll(externalImports) {
|
|
46
|
-
const responses = await Promise.all(externalImports.map(
|
|
60
|
+
const responses = await Promise.all(externalImports.map(downloadAndSave));
|
|
47
61
|
return lodash_1.default.flatten(responses);
|
|
48
62
|
}
|
|
63
|
+
async function downloadSettingsFromDb() {
|
|
64
|
+
console.log('Downloading settings from MongoDB');
|
|
65
|
+
const mongoConn = await new mongodb_1.MongoClient(configuration_1.config.mongoConn).connect();
|
|
66
|
+
try {
|
|
67
|
+
const db = mongoConn.db(configuration_1.config.mongoDbName);
|
|
68
|
+
const settingsBlocks = await db
|
|
69
|
+
.collection('blocks')
|
|
70
|
+
.find({
|
|
71
|
+
Type: 'settings',
|
|
72
|
+
})
|
|
73
|
+
.toArray();
|
|
74
|
+
console.log(`Downloaded ${settingsBlocks.length} settings block(s) from MongoDB`);
|
|
75
|
+
return settingsBlocks.map(block => (0, v3_1.convertV3ToSfc)(block));
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await mongoConn.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function saveSettingsBlocks(blocks) {
|
|
82
|
+
for (const block of blocks) {
|
|
83
|
+
const serialized = (0, sfc_1.serializeSfc)(block);
|
|
84
|
+
const outputPath = path_1.default.join(configuration_1.config.blocksDir, serialized.filePath);
|
|
85
|
+
await (0, fileUtils_1.writeFileMakeDir)(outputPath, serialized.content);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
49
88
|
async function readBlockFile(blocksDir, filePath) {
|
|
50
89
|
const content = await fs_1.promises.readFile(filePath);
|
|
51
90
|
const relPath = path_1.default.relative(blocksDir, filePath);
|
|
@@ -53,13 +92,17 @@ async function readBlockFile(blocksDir, filePath) {
|
|
|
53
92
|
}
|
|
54
93
|
async function readBlockFiles(blocksDir) {
|
|
55
94
|
const files = await (0, fileUtils_1.listFilesRecursive)(blocksDir);
|
|
56
|
-
return await Promise.all(files
|
|
95
|
+
return await Promise.all(files
|
|
96
|
+
.filter(f => !path_1.default.basename(f).startsWith('.'))
|
|
97
|
+
.filter(f => !isImportedBlockFile(f))
|
|
98
|
+
.map(f => readBlockFile(blocksDir, f)));
|
|
57
99
|
}
|
|
58
100
|
exports.readBlockFiles = readBlockFiles;
|
|
59
101
|
async function loadAllBlocks() {
|
|
60
102
|
const externalBlocks = await downloadAll(configuration_1.config.importProjects);
|
|
103
|
+
await saveSettingsBlocks(await downloadSettingsFromDb());
|
|
61
104
|
const localBlocks = await readBlockFiles(configuration_1.config.blocksDir);
|
|
62
105
|
return [...externalBlocks, ...localBlocks];
|
|
63
106
|
}
|
|
64
107
|
exports.loadAllBlocks = loadAllBlocks;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsMkJBQW9DO0FBQ3BDLHFDQUFzQztBQUN0QyxvREFBdUI7QUFDdkIsZ0RBQXdCO0FBQ3hCLG1EQUE4RDtBQUM5RCxxQ0FBK0Q7QUFDL0QsaURBQXlFO0FBQ3pFLG1DQUEwRDtBQUcxRCxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQztBQUV4QyxTQUFTLHFCQUFxQjtJQUM1QixPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsc0JBQU0sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxjQUFtQztJQUNoRSxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsUUFBZ0I7SUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO0lBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLG9CQUFvQixHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM5RCxPQUFPLGdCQUFnQixLQUFLLG9CQUFvQixJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLG9CQUFvQixHQUFHLGNBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hILENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsY0FBbUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUUsQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marsx-dev/launcher",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.24",
|
|
4
4
|
"description": "MarsX launcher",
|
|
5
5
|
"author": "MarsX team <team@marsx.dev>",
|
|
6
6
|
"homepage": "https://marsx.dev/",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"types": "./dist/index.d.ts",
|
|
32
32
|
"scripts": {
|
|
33
33
|
"validate": "npm run validate:prettier && npm run validate:lint && npm run validate:tsc",
|
|
34
|
-
"validate:prettier": "prettier --ignore-path=.gitignore --
|
|
34
|
+
"validate:prettier": "prettier --ignore-path=.gitignore --list-different \"**/*.+(js|ts|json)\"",
|
|
35
35
|
"validate:lint": "eslint --ignore-path=.gitignore --ext=.js,.ts .",
|
|
36
36
|
"validate:tsc": "tsc --noEmit",
|
|
37
37
|
"fix": "npm run fix:prettier && npm run fix:list",
|
package/src/cli/fix-folders.ts
CHANGED
|
@@ -16,6 +16,7 @@ export async function fixDbBlockFolders(safeRun = true) {
|
|
|
16
16
|
|
|
17
17
|
let localBlocks = await readBlockFiles(config.blocksDir);
|
|
18
18
|
|
|
19
|
+
localBlocks = localBlocks.filter(l => l.path.filePath.indexOf('_imported') === -1);
|
|
19
20
|
localBlocks = localBlocks.filter(l => l.path.filePath.indexOf('_forked') === -1);
|
|
20
21
|
|
|
21
22
|
console.log(`Got ${localBlocks.length} files to migrate`);
|
package/src/cli/init.ts
CHANGED
|
@@ -117,7 +117,11 @@ export async function initProject(projectName: string) {
|
|
|
117
117
|
path.join(projectDir, 'config', 'custom-environment-variables.json'),
|
|
118
118
|
JSON.stringify(CustomEnvironmentVariables, null, 2),
|
|
119
119
|
);
|
|
120
|
-
await writeFileMakeDir(path.join(projectDir, '.gitignore'), 'node_modules\ndist\n.cache\n');
|
|
120
|
+
await writeFileMakeDir(path.join(projectDir, '.gitignore'), 'node_modules\ndist\n.cache\nblocks/_imported\n');
|
|
121
|
+
await writeFileMakeDir(
|
|
122
|
+
path.join(projectDir, 'AGENTS.md'),
|
|
123
|
+
'## Instructions\n- Never manually edit files under `blocks/_imported/`. That directory is generated at runtime from external imports and may be fully rewritten by the launcher.\n- Never edit `*.settings.mars` files. If a settings change is required, describe exactly what the developer should change manually instead of modifying the file.\n- If you need to modify an imported block, do not edit `blocks/_imported/`. Create a local fork under `blocks/_forked/<import_app_name>/...`, keep the block filename and block contents compatible with the imported block you are overriding, and edit the fork there instead.\n- `_forked` is only a local convention. The loader treats it as normal local blocks, so forks override imported blocks because local blocks are loaded after imported ones. There is no automatic fork command in this repo.\n',
|
|
124
|
+
);
|
|
121
125
|
|
|
122
126
|
function run(...args: string[]) {
|
|
123
127
|
const cmd = args[0];
|
package/src/loader.ts
CHANGED
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
-
import crypto from 'crypto';
|
|
3
2
|
import { promises as fs } from 'fs';
|
|
4
|
-
import
|
|
3
|
+
import { MongoClient } from 'mongodb';
|
|
5
4
|
import _ from 'lodash';
|
|
6
5
|
import path from 'path';
|
|
7
6
|
import { config, ImportProjectConfig } from './configuration';
|
|
8
|
-
import { parseSFC, SfcBlock } from './utils/sfc';
|
|
9
|
-
import {
|
|
7
|
+
import { parseSFC, serializeSfc, SfcBlock } from './utils/sfc';
|
|
8
|
+
import { listFilesRecursive, writeFileMakeDir } from './utils/fileUtils';
|
|
10
9
|
import { convertV3ToSfc, V3MongoBlock } from './utils/v3';
|
|
11
10
|
|
|
12
11
|
type V4Response = { commit: string; hash: string; blocks: SfcBlock[] };
|
|
12
|
+
const IMPORTED_BLOCKS_DIR = '_imported';
|
|
13
|
+
|
|
14
|
+
function getImportedBlocksRoot() {
|
|
15
|
+
return path.join(config.blocksDir, IMPORTED_BLOCKS_DIR);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getImportedProjectDir(externalImport: ImportProjectConfig) {
|
|
19
|
+
return path.join(getImportedBlocksRoot(), externalImport.name);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isImportedBlockFile(filePath: string) {
|
|
23
|
+
const importedBlocksRoot = getImportedBlocksRoot();
|
|
24
|
+
const absoluteFilePath = path.resolve(filePath);
|
|
25
|
+
const absoluteImportedRoot = path.resolve(importedBlocksRoot);
|
|
26
|
+
return absoluteFilePath === absoluteImportedRoot || absoluteFilePath.startsWith(`${absoluteImportedRoot}${path.sep}`);
|
|
27
|
+
}
|
|
13
28
|
|
|
14
29
|
async function downloadFromExternal(externalImport: ImportProjectConfig): Promise<V4Response> {
|
|
15
30
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
@@ -27,29 +42,58 @@ async function downloadFromExternal(externalImport: ImportProjectConfig): Promis
|
|
|
27
42
|
return { commit: '', hash: '', blocks: v3Resp.data.map(b => convertV3ToSfc(b)) };
|
|
28
43
|
}
|
|
29
44
|
|
|
30
|
-
async function
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
45
|
+
async function saveImportedBlocks(externalImport: ImportProjectConfig, blocks: SfcBlock[]) {
|
|
46
|
+
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
47
|
+
await fs.rm(importedProjectDir, { recursive: true, force: true });
|
|
48
|
+
await fs.mkdir(importedProjectDir, { recursive: true });
|
|
34
49
|
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
50
|
+
for (const block of blocks) {
|
|
51
|
+
const serialized = serializeSfc(block);
|
|
52
|
+
const outputPath = path.join(importedProjectDir, serialized.filePath);
|
|
53
|
+
await writeFileMakeDir(outputPath, serialized.content);
|
|
39
54
|
}
|
|
55
|
+
}
|
|
40
56
|
|
|
57
|
+
async function downloadAndSave(externalImport: ImportProjectConfig): Promise<SfcBlock[]> {
|
|
41
58
|
const { blocks } = await downloadFromExternal(externalImport);
|
|
42
59
|
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
43
|
-
|
|
44
|
-
await writeFileMakeDir(cacheFilePath, JSON.stringify(blocks, null, 2), 'utf-8');
|
|
60
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
45
61
|
return blocks;
|
|
46
62
|
}
|
|
47
63
|
|
|
48
64
|
async function downloadAll(externalImports: ImportProjectConfig[]) {
|
|
49
|
-
const responses = await Promise.all(externalImports.map(
|
|
65
|
+
const responses = await Promise.all(externalImports.map(downloadAndSave));
|
|
50
66
|
return _.flatten(responses);
|
|
51
67
|
}
|
|
52
68
|
|
|
69
|
+
async function downloadSettingsFromDb(): Promise<SfcBlock[]> {
|
|
70
|
+
console.log('Downloading settings from MongoDB');
|
|
71
|
+
const mongoConn = await new MongoClient(config.mongoConn).connect();
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
const db = mongoConn.db(config.mongoDbName);
|
|
75
|
+
const settingsBlocks = await db
|
|
76
|
+
.collection<V3MongoBlock>('blocks')
|
|
77
|
+
.find({
|
|
78
|
+
Type: 'settings',
|
|
79
|
+
})
|
|
80
|
+
.toArray();
|
|
81
|
+
|
|
82
|
+
console.log(`Downloaded ${settingsBlocks.length} settings block(s) from MongoDB`);
|
|
83
|
+
return settingsBlocks.map(block => convertV3ToSfc(block));
|
|
84
|
+
} finally {
|
|
85
|
+
await mongoConn.close();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function saveSettingsBlocks(blocks: SfcBlock[]) {
|
|
90
|
+
for (const block of blocks) {
|
|
91
|
+
const serialized = serializeSfc(block);
|
|
92
|
+
const outputPath = path.join(config.blocksDir, serialized.filePath);
|
|
93
|
+
await writeFileMakeDir(outputPath, serialized.content);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
53
97
|
async function readBlockFile(blocksDir: string, filePath: string): Promise<SfcBlock> {
|
|
54
98
|
const content = await fs.readFile(filePath);
|
|
55
99
|
const relPath = path.relative(blocksDir, filePath);
|
|
@@ -58,11 +102,17 @@ async function readBlockFile(blocksDir: string, filePath: string): Promise<SfcBl
|
|
|
58
102
|
|
|
59
103
|
export async function readBlockFiles(blocksDir: string) {
|
|
60
104
|
const files = await listFilesRecursive(blocksDir);
|
|
61
|
-
return await Promise.all(
|
|
105
|
+
return await Promise.all(
|
|
106
|
+
files
|
|
107
|
+
.filter(f => !path.basename(f).startsWith('.'))
|
|
108
|
+
.filter(f => !isImportedBlockFile(f))
|
|
109
|
+
.map(f => readBlockFile(blocksDir, f)),
|
|
110
|
+
);
|
|
62
111
|
}
|
|
63
112
|
|
|
64
113
|
export async function loadAllBlocks(): Promise<SfcBlock[]> {
|
|
65
114
|
const externalBlocks = await downloadAll(config.importProjects);
|
|
115
|
+
await saveSettingsBlocks(await downloadSettingsFromDb());
|
|
66
116
|
const localBlocks = await readBlockFiles(config.blocksDir);
|
|
67
117
|
return [...externalBlocks, ...localBlocks];
|
|
68
118
|
}
|