@marsx-dev/launcher 0.0.20 → 0.0.23
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 +4 -2
- package/dist/configuration.d.ts +1 -0
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js +15 -3
- package/dist/loader.d.ts +2 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +64 -16
- package/package.json +1 -1
- package/src/cli/fix-folders.ts +1 -0
- package/src/cli/init.ts +6 -1
- package/src/configuration.ts +19 -2
- package/src/loader.ts +72 -17
|
@@ -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
|
@@ -95,6 +95,7 @@ async function initProject(projectName) {
|
|
|
95
95
|
webRecentFilesTable: 'webRecentFiles',
|
|
96
96
|
webFilesBlob: 'web-files',
|
|
97
97
|
secret: (await (0, crypto_1.randomBytes)(32)).toString('hex'),
|
|
98
|
+
resetKey: (await (0, crypto_1.randomBytes)(32)).toString('hex'),
|
|
98
99
|
importProjects: [
|
|
99
100
|
{
|
|
100
101
|
name: 'marsx-core',
|
|
@@ -106,7 +107,8 @@ async function initProject(projectName) {
|
|
|
106
107
|
};
|
|
107
108
|
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, 'config', 'default.json'), JSON.stringify(config, null, 2));
|
|
108
109
|
await (0, fileUtils_1.writeFileMakeDir)(path_1.default.join(projectDir, 'config', 'custom-environment-variables.json'), JSON.stringify(configuration_1.CustomEnvironmentVariables, null, 2));
|
|
109
|
-
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');
|
|
110
112
|
function run(...args) {
|
|
111
113
|
const cmd = args[0];
|
|
112
114
|
(0, textUtils_1.assert)(cmd);
|
|
@@ -129,4 +131,4 @@ async function initProject(projectName) {
|
|
|
129
131
|
console.log(` - Start local server: ${chalk_1.default.underline('npm run start')}`);
|
|
130
132
|
}
|
|
131
133
|
exports.initProject = initProject;
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsaURBQTBDO0FBQzFDLG1DQUFxQztBQUNyQyxnREFBd0I7QUFDeEIsb0RBQXNFO0FBQ3RFLGtEQUFtRTtBQUNuRSxrREFBNEM7QUFDNUMsbUNBQW1DO0FBQ25DLDJCQUFvQztBQUVwQyxNQUFNLFlBQVksR0FBRztJQUNuQixrQkFBa0I7SUFDbEIsU0FBUztJQUNULGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixxQkFBcUI7SUFDckIsU0FBUztJQUNULE9BQU87SUFDUCxlQUFlO0lBQ2YsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsWUFBWTtJQUNaLE1BQU07SUFDTixRQUFRO0NBQ1QsQ0FBQztBQUVGLE1BQU0sT0FBTyxHQUFHO0lBQ2QsWUFBWTtJQUNaLGtDQUFrQztJQUNsQyxRQUFRO0lBQ1IsV0FBVztJQUNYLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixZQUFZO0NBQ2IsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUU1RCxLQUFLLFVBQVUsV0FBVyxDQUFDLFdBQW1CO0lBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsS0FBSyxXQUFXLENB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
|
package/dist/configuration.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,mBAAmB,EAAE,CAAC;CACvC;AAED,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAiHzC,eAAO,MAAM,MAAM,QAAmB,CAAC;AAevC,eAAO,MAAM,0BAA0B;YAZW,MAAM;cAAY,MAAM;EAYd,CAAC"}
|
package/dist/configuration.js
CHANGED
|
@@ -34,6 +34,7 @@ const lodash_1 = __importDefault(require("lodash"));
|
|
|
34
34
|
const path_1 = __importDefault(require("path"));
|
|
35
35
|
const yup = __importStar(require("yup"));
|
|
36
36
|
const yup_1 = require("yup");
|
|
37
|
+
const defaultResetKey = 'reset-app-key-123';
|
|
37
38
|
class ConfigError extends Error {
|
|
38
39
|
}
|
|
39
40
|
exports.ConfigError = ConfigError;
|
|
@@ -63,6 +64,7 @@ const ConfigSchema = yup.object().shape({
|
|
|
63
64
|
webFilesTable: yup.string().required(),
|
|
64
65
|
webRecentFilesTable: yup.string().required(),
|
|
65
66
|
webFilesBlob: yup.string().required(),
|
|
67
|
+
resetKey: yup.string().required(),
|
|
66
68
|
importProjects: yup.array().of(ImportProjectSchema).required(),
|
|
67
69
|
});
|
|
68
70
|
function ErrorThrowingConfig(errorMessage) {
|
|
@@ -81,7 +83,14 @@ function validateConfig() {
|
|
|
81
83
|
if (keys.length) {
|
|
82
84
|
console.log(chalk_1.default.yellow(`ENV variables "${keys.join('", "')}" would be used over config file`));
|
|
83
85
|
}
|
|
84
|
-
const configObject = {
|
|
86
|
+
const configObject = {
|
|
87
|
+
resetKey: defaultResetKey,
|
|
88
|
+
...config_1.default.util.toObject(),
|
|
89
|
+
...envConfigObject,
|
|
90
|
+
};
|
|
91
|
+
if (configObject.resetKey === defaultResetKey) {
|
|
92
|
+
console.log(chalk_1.default.red(`resetKey ENV variable require to be updated from default value to prevent unauthorized app resets`));
|
|
93
|
+
}
|
|
85
94
|
try {
|
|
86
95
|
return ConfigSchema.validateSync(configObject, { abortEarly: false, stripUnknown: false });
|
|
87
96
|
}
|
|
@@ -109,7 +118,10 @@ function getKeyValues(prefix, omitPrefix = true) {
|
|
|
109
118
|
function getConfigFromEnv() {
|
|
110
119
|
let envConfigObject = {};
|
|
111
120
|
// cleanup
|
|
112
|
-
const env = {
|
|
121
|
+
const env = {
|
|
122
|
+
...process.env,
|
|
123
|
+
...getKeyValues('APPSETTINGS_'),
|
|
124
|
+
};
|
|
113
125
|
try {
|
|
114
126
|
envConfigObject = ConfigSchema.cast(env, { stripUnknown: true });
|
|
115
127
|
}
|
|
@@ -135,4 +147,4 @@ function getEnvVarMapping() {
|
|
|
135
147
|
return result;
|
|
136
148
|
}
|
|
137
149
|
exports.CustomEnvironmentVariables = getEnvVarMapping();
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQTBCO0FBRTFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDbkQsb0RBQWtDO0FBQ2xDLG9EQUF1QjtBQUN2QixnREFBd0I7QUFDeEIseUNBQTJCO0FBQzNCLDZCQUFzQztBQUV0QyxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztBQTJCNUMsTUFBYSxXQUFZLFNBQVEsS0FBSztDQUFHO0FBQXpDLGtDQUF5QztBQUV6QyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDckMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDeEMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQztJQUN0QyxVQUFVLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRTtJQUNsRCxTQUFTLEVBQUUsR0FBRztTQUNYLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxD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
|
package/dist/loader.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { ImportProjectConfig } from './configuration';
|
|
1
2
|
import { SfcBlock } from './utils/sfc';
|
|
2
3
|
export declare function readBlockFiles(blocksDir: string): Promise<SfcBlock[]>;
|
|
4
|
+
export declare function readImportedBlockFiles(externalImport: ImportProjectConfig): Promise<SfcBlock[]>;
|
|
3
5
|
export declare function loadAllBlocks(): Promise<SfcBlock[]>;
|
|
4
6
|
//# sourceMappingURL=loader.d.ts.map
|
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":"AAKA,OAAO,EAAU,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAA0B,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2F/D,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,uBAQrD;AAED,wBAAsB,sBAAsB,CAAC,cAAc,EAAE,mBAAmB,uBAO/E;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMzD"}
|
package/dist/loader.js
CHANGED
|
@@ -3,17 +3,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.loadAllBlocks = exports.readBlockFiles = void 0;
|
|
6
|
+
exports.loadAllBlocks = exports.readImportedBlockFiles = 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
|
+
}
|
|
17
23
|
async function downloadFromExternal(externalImport) {
|
|
18
24
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
19
25
|
const url = lodash_1.default.trimEnd(externalImport.url, '/');
|
|
@@ -28,24 +34,52 @@ async function downloadFromExternal(externalImport) {
|
|
|
28
34
|
const v3Resp = await axios_1.default.get(`${url}/api/GetExportedAppBlocks`, { params });
|
|
29
35
|
return { commit: '', hash: '', blocks: v3Resp.data.map(b => (0, v3_1.convertV3ToSfc)(b)) };
|
|
30
36
|
}
|
|
31
|
-
async function
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
async function saveImportedBlocks(externalImport, blocks) {
|
|
38
|
+
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
39
|
+
await fs_1.promises.rm(importedProjectDir, { recursive: true, force: true });
|
|
40
|
+
await fs_1.promises.mkdir(importedProjectDir, { recursive: true });
|
|
41
|
+
for (const block of blocks) {
|
|
42
|
+
const serialized = (0, sfc_1.serializeSfc)(block);
|
|
43
|
+
const outputPath = path_1.default.join(importedProjectDir, serialized.filePath);
|
|
44
|
+
await (0, fileUtils_1.writeFileMakeDir)(outputPath, serialized.content);
|
|
39
45
|
}
|
|
46
|
+
}
|
|
47
|
+
async function downloadAndSave(externalImport) {
|
|
40
48
|
const { blocks } = await downloadFromExternal(externalImport);
|
|
41
49
|
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
42
|
-
await (
|
|
50
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
43
51
|
return blocks;
|
|
44
52
|
}
|
|
45
53
|
async function downloadAll(externalImports) {
|
|
46
|
-
const responses = await Promise.all(externalImports.map(
|
|
54
|
+
const responses = await Promise.all(externalImports.map(downloadAndSave));
|
|
47
55
|
return lodash_1.default.flatten(responses);
|
|
48
56
|
}
|
|
57
|
+
async function downloadSettingsFromDb() {
|
|
58
|
+
console.log('Downloading settings from MongoDB');
|
|
59
|
+
const mongoConn = await new mongodb_1.MongoClient(configuration_1.config.mongoConn).connect();
|
|
60
|
+
try {
|
|
61
|
+
const db = mongoConn.db(configuration_1.config.mongoDbName);
|
|
62
|
+
const settingsBlocks = await db
|
|
63
|
+
.collection('blocks')
|
|
64
|
+
.find({
|
|
65
|
+
Type: 'settings',
|
|
66
|
+
})
|
|
67
|
+
.toArray();
|
|
68
|
+
console.log(`Downloaded ${settingsBlocks.length} settings block(s) from MongoDB`);
|
|
69
|
+
return settingsBlocks.map(block => (0, v3_1.convertV3ToSfc)(block));
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await mongoConn.close();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function saveSettingsBlocks(blocks) {
|
|
76
|
+
await fs_1.promises.rm(path_1.default.join(configuration_1.config.blocksDir, '_settings'), { recursive: true, force: true });
|
|
77
|
+
for (const block of blocks) {
|
|
78
|
+
const serialized = (0, sfc_1.serializeSfc)(block);
|
|
79
|
+
const outputPath = path_1.default.join(configuration_1.config.blocksDir, serialized.filePath);
|
|
80
|
+
await (0, fileUtils_1.writeFileMakeDir)(outputPath, serialized.content);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
49
83
|
async function readBlockFile(blocksDir, filePath) {
|
|
50
84
|
const content = await fs_1.promises.readFile(filePath);
|
|
51
85
|
const relPath = path_1.default.relative(blocksDir, filePath);
|
|
@@ -53,13 +87,27 @@ async function readBlockFile(blocksDir, filePath) {
|
|
|
53
87
|
}
|
|
54
88
|
async function readBlockFiles(blocksDir) {
|
|
55
89
|
const files = await (0, fileUtils_1.listFilesRecursive)(blocksDir);
|
|
56
|
-
return await Promise.all(files
|
|
90
|
+
return await Promise.all(files
|
|
91
|
+
.filter(f => !path_1.default.basename(f).startsWith('.'))
|
|
92
|
+
.filter(f => path_1.default.relative(blocksDir, f).split(path_1.default.sep)[0] !== IMPORTED_BLOCKS_DIR)
|
|
93
|
+
.map(f => readBlockFile(blocksDir, f)));
|
|
57
94
|
}
|
|
58
95
|
exports.readBlockFiles = readBlockFiles;
|
|
96
|
+
async function readImportedBlockFiles(externalImport) {
|
|
97
|
+
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
98
|
+
if (!(await (0, fileUtils_1.isDirectory)(importedProjectDir))) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
const files = await (0, fileUtils_1.listFilesRecursive)(importedProjectDir);
|
|
102
|
+
return await Promise.all(files.filter(f => !path_1.default.basename(f).startsWith('.')).map(f => readBlockFile(importedProjectDir, f)));
|
|
103
|
+
}
|
|
104
|
+
exports.readImportedBlockFiles = readImportedBlockFiles;
|
|
59
105
|
async function loadAllBlocks() {
|
|
60
|
-
|
|
106
|
+
await downloadAll(configuration_1.config.importProjects);
|
|
107
|
+
await saveSettingsBlocks(await downloadSettingsFromDb());
|
|
108
|
+
const externalBlocks = lodash_1.default.flatten(await Promise.all(configuration_1.config.importProjects.map(readImportedBlockFiles)));
|
|
61
109
|
const localBlocks = await readBlockFiles(configuration_1.config.blocksDir);
|
|
62
110
|
return [...externalBlocks, ...localBlocks];
|
|
63
111
|
}
|
|
64
112
|
exports.loadAllBlocks = loadAllBlocks;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsMkJBQW9DO0FBQ3BDLHFDQUFzQztBQUN0QyxvREFBdUI7QUFDdkIsZ0RBQXdCO0FBQ3hCLG1EQUE4RDtBQUM5RCxxQ0FBK0Q7QUFDL0QsaURBQXNGO0FBQ3RGLG1DQUEwRDtBQUcxRCxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQztBQUV4QyxTQUFTLHFCQUFxQjtJQUM1QixPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsc0JBQU0sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxjQUFtQztJQUNoRSxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxjQUFtQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBRXhHLE1BQU0sR0FBRyxHQUFHLGdCQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFhLEdBQUcsR0FBRyw2QkFBNkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUYsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0tBQ3BCO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFP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
|
package/package.json
CHANGED
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
|
@@ -101,6 +101,7 @@ export async function initProject(projectName: string) {
|
|
|
101
101
|
webRecentFilesTable: 'webRecentFiles',
|
|
102
102
|
webFilesBlob: 'web-files',
|
|
103
103
|
secret: (await randomBytes(32)).toString('hex'),
|
|
104
|
+
resetKey: (await randomBytes(32)).toString('hex'),
|
|
104
105
|
importProjects: [
|
|
105
106
|
{
|
|
106
107
|
name: 'marsx-core',
|
|
@@ -116,7 +117,11 @@ export async function initProject(projectName: string) {
|
|
|
116
117
|
path.join(projectDir, 'config', 'custom-environment-variables.json'),
|
|
117
118
|
JSON.stringify(CustomEnvironmentVariables, null, 2),
|
|
118
119
|
);
|
|
119
|
-
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
|
+
);
|
|
120
125
|
|
|
121
126
|
function run(...args: string[]) {
|
|
122
127
|
const cmd = args[0];
|
package/src/configuration.ts
CHANGED
|
@@ -7,6 +7,8 @@ import path from 'path';
|
|
|
7
7
|
import * as yup from 'yup';
|
|
8
8
|
import { ValidationError } from 'yup';
|
|
9
9
|
|
|
10
|
+
const defaultResetKey = 'reset-app-key-123';
|
|
11
|
+
|
|
10
12
|
export interface ImportProjectConfig {
|
|
11
13
|
name: string;
|
|
12
14
|
url: string;
|
|
@@ -27,6 +29,7 @@ export interface Config {
|
|
|
27
29
|
secret: string;
|
|
28
30
|
webFilesTable: string;
|
|
29
31
|
webRecentFilesTable: string;
|
|
32
|
+
resetKey: string;
|
|
30
33
|
webFilesBlob: string;
|
|
31
34
|
importProjects: ImportProjectConfig[];
|
|
32
35
|
}
|
|
@@ -60,6 +63,7 @@ const ConfigSchema = yup.object().shape({
|
|
|
60
63
|
webFilesTable: yup.string().required(),
|
|
61
64
|
webRecentFilesTable: yup.string().required(),
|
|
62
65
|
webFilesBlob: yup.string().required(),
|
|
66
|
+
resetKey: yup.string().required(),
|
|
63
67
|
importProjects: yup.array().of(ImportProjectSchema).required(),
|
|
64
68
|
});
|
|
65
69
|
|
|
@@ -82,7 +86,16 @@ function validateConfig(): Config {
|
|
|
82
86
|
console.log(chalk.yellow(`ENV variables "${keys.join('", "')}" would be used over config file`));
|
|
83
87
|
}
|
|
84
88
|
|
|
85
|
-
const configObject = {
|
|
89
|
+
const configObject = {
|
|
90
|
+
resetKey: defaultResetKey,
|
|
91
|
+
...configModule.util.toObject(),
|
|
92
|
+
...envConfigObject,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (configObject.resetKey === defaultResetKey) {
|
|
96
|
+
console.log(chalk.red(`resetKey ENV variable require to be updated from default value to prevent unauthorized app resets`));
|
|
97
|
+
}
|
|
98
|
+
|
|
86
99
|
try {
|
|
87
100
|
return ConfigSchema.validateSync(configObject, { abortEarly: false, stripUnknown: false });
|
|
88
101
|
} catch (e) {
|
|
@@ -114,7 +127,11 @@ function getConfigFromEnv(): Partial<Config> {
|
|
|
114
127
|
let envConfigObject: Partial<Config> = {};
|
|
115
128
|
|
|
116
129
|
// cleanup
|
|
117
|
-
const env = {
|
|
130
|
+
const env = {
|
|
131
|
+
...process.env,
|
|
132
|
+
...getKeyValues('APPSETTINGS_'),
|
|
133
|
+
};
|
|
134
|
+
|
|
118
135
|
try {
|
|
119
136
|
envConfigObject = ConfigSchema.cast(env, { stripUnknown: true }) as Partial<Config>;
|
|
120
137
|
} catch (err) {
|
package/src/loader.ts
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
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 { isDirectory, 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
|
+
}
|
|
13
21
|
|
|
14
22
|
async function downloadFromExternal(externalImport: ImportProjectConfig): Promise<V4Response> {
|
|
15
23
|
const params = { api_key: externalImport.api_key, git_commit_ish: externalImport.git_commit_ish || '' };
|
|
@@ -27,29 +35,60 @@ async function downloadFromExternal(externalImport: ImportProjectConfig): Promis
|
|
|
27
35
|
return { commit: '', hash: '', blocks: v3Resp.data.map(b => convertV3ToSfc(b)) };
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
async function
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
async function saveImportedBlocks(externalImport: ImportProjectConfig, blocks: SfcBlock[]) {
|
|
39
|
+
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
40
|
+
await fs.rm(importedProjectDir, { recursive: true, force: true });
|
|
41
|
+
await fs.mkdir(importedProjectDir, { recursive: true });
|
|
34
42
|
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
for (const block of blocks) {
|
|
44
|
+
const serialized = serializeSfc(block);
|
|
45
|
+
const outputPath = path.join(importedProjectDir, serialized.filePath);
|
|
46
|
+
await writeFileMakeDir(outputPath, serialized.content);
|
|
39
47
|
}
|
|
48
|
+
}
|
|
40
49
|
|
|
50
|
+
async function downloadAndSave(externalImport: ImportProjectConfig): Promise<SfcBlock[]> {
|
|
41
51
|
const { blocks } = await downloadFromExternal(externalImport);
|
|
42
52
|
console.log(`Downloaded ${blocks.length} blocks from ${externalImport.url}`);
|
|
43
|
-
|
|
44
|
-
await writeFileMakeDir(cacheFilePath, JSON.stringify(blocks, null, 2), 'utf-8');
|
|
53
|
+
await saveImportedBlocks(externalImport, blocks);
|
|
45
54
|
return blocks;
|
|
46
55
|
}
|
|
47
56
|
|
|
48
57
|
async function downloadAll(externalImports: ImportProjectConfig[]) {
|
|
49
|
-
const responses = await Promise.all(externalImports.map(
|
|
58
|
+
const responses = await Promise.all(externalImports.map(downloadAndSave));
|
|
50
59
|
return _.flatten(responses);
|
|
51
60
|
}
|
|
52
61
|
|
|
62
|
+
async function downloadSettingsFromDb(): Promise<SfcBlock[]> {
|
|
63
|
+
console.log('Downloading settings from MongoDB');
|
|
64
|
+
const mongoConn = await new MongoClient(config.mongoConn).connect();
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
const db = mongoConn.db(config.mongoDbName);
|
|
68
|
+
const settingsBlocks = await db
|
|
69
|
+
.collection<V3MongoBlock>('blocks')
|
|
70
|
+
.find({
|
|
71
|
+
Type: 'settings',
|
|
72
|
+
})
|
|
73
|
+
.toArray();
|
|
74
|
+
|
|
75
|
+
console.log(`Downloaded ${settingsBlocks.length} settings block(s) from MongoDB`);
|
|
76
|
+
return settingsBlocks.map(block => convertV3ToSfc(block));
|
|
77
|
+
} finally {
|
|
78
|
+
await mongoConn.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function saveSettingsBlocks(blocks: SfcBlock[]) {
|
|
83
|
+
await fs.rm(path.join(config.blocksDir, '_settings'), { recursive: true, force: true });
|
|
84
|
+
|
|
85
|
+
for (const block of blocks) {
|
|
86
|
+
const serialized = serializeSfc(block);
|
|
87
|
+
const outputPath = path.join(config.blocksDir, serialized.filePath);
|
|
88
|
+
await writeFileMakeDir(outputPath, serialized.content);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
53
92
|
async function readBlockFile(blocksDir: string, filePath: string): Promise<SfcBlock> {
|
|
54
93
|
const content = await fs.readFile(filePath);
|
|
55
94
|
const relPath = path.relative(blocksDir, filePath);
|
|
@@ -58,11 +97,27 @@ async function readBlockFile(blocksDir: string, filePath: string): Promise<SfcBl
|
|
|
58
97
|
|
|
59
98
|
export async function readBlockFiles(blocksDir: string) {
|
|
60
99
|
const files = await listFilesRecursive(blocksDir);
|
|
61
|
-
return await Promise.all(
|
|
100
|
+
return await Promise.all(
|
|
101
|
+
files
|
|
102
|
+
.filter(f => !path.basename(f).startsWith('.'))
|
|
103
|
+
.filter(f => path.relative(blocksDir, f).split(path.sep)[0] !== IMPORTED_BLOCKS_DIR)
|
|
104
|
+
.map(f => readBlockFile(blocksDir, f)),
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export async function readImportedBlockFiles(externalImport: ImportProjectConfig) {
|
|
109
|
+
const importedProjectDir = getImportedProjectDir(externalImport);
|
|
110
|
+
if (!(await isDirectory(importedProjectDir))) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const files = await listFilesRecursive(importedProjectDir);
|
|
114
|
+
return await Promise.all(files.filter(f => !path.basename(f).startsWith('.')).map(f => readBlockFile(importedProjectDir, f)));
|
|
62
115
|
}
|
|
63
116
|
|
|
64
117
|
export async function loadAllBlocks(): Promise<SfcBlock[]> {
|
|
65
|
-
|
|
118
|
+
await downloadAll(config.importProjects);
|
|
119
|
+
await saveSettingsBlocks(await downloadSettingsFromDb());
|
|
120
|
+
const externalBlocks = _.flatten(await Promise.all(config.importProjects.map(readImportedBlockFiles)));
|
|
66
121
|
const localBlocks = await readBlockFiles(config.blocksDir);
|
|
67
122
|
return [...externalBlocks, ...localBlocks];
|
|
68
123
|
}
|