@foal/cli 5.1.3 → 5.2.0
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/lib/cli.d.ts +6 -0
- package/lib/cli.js +208 -0
- package/lib/commands/connectors/connect-angular/connect-angular-command.service.d.ts +15 -0
- package/lib/commands/connectors/connect-angular/connect-angular-command.service.js +66 -0
- package/lib/commands/connectors/connect-angular/index.d.ts +1 -0
- package/lib/commands/connectors/connect-angular/index.js +5 -0
- package/lib/commands/connectors/connect-react/connect-react-command.service.d.ts +15 -0
- package/lib/commands/connectors/connect-react/connect-react-command.service.js +47 -0
- package/lib/commands/connectors/connect-react/index.d.ts +1 -0
- package/lib/commands/connectors/connect-react/index.js +5 -0
- package/lib/commands/connectors/connect-vue/connect-vue-command.service.d.ts +15 -0
- package/lib/commands/connectors/connect-vue/connect-vue-command.service.js +51 -0
- package/lib/commands/connectors/connect-vue/index.d.ts +1 -0
- package/lib/commands/connectors/connect-vue/index.js +5 -0
- package/lib/commands/connectors/index.d.ts +3 -0
- package/lib/commands/connectors/index.js +9 -0
- package/lib/commands/create-secret/create-secret-command.service.d.ts +7 -0
- package/lib/commands/create-secret/create-secret-command.service.js +16 -0
- package/lib/commands/create-secret/index.d.ts +1 -0
- package/lib/commands/create-secret/index.js +5 -0
- package/lib/commands/generators/create-app/create-app-command.service.d.ts +25 -0
- package/lib/commands/generators/create-app/create-app-command.service.js +151 -0
- package/lib/commands/generators/create-app/index.d.ts +1 -0
- package/lib/commands/generators/create-app/index.js +5 -0
- package/lib/commands/generators/create-controller/create-controller-command.service.d.ts +19 -0
- package/lib/commands/generators/create-controller/create-controller-command.service.js +53 -0
- package/lib/commands/generators/create-controller/index.d.ts +1 -0
- package/lib/commands/generators/create-controller/index.js +5 -0
- package/lib/commands/generators/create-entity/create-entity-command.service.d.ts +17 -0
- package/lib/commands/generators/create-entity/create-entity-command.service.js +42 -0
- package/lib/commands/generators/create-entity/index.d.ts +1 -0
- package/lib/commands/generators/create-entity/index.js +5 -0
- package/lib/commands/generators/create-hook/create-hook-command.service.d.ts +17 -0
- package/lib/commands/generators/create-hook/create-hook-command.service.js +40 -0
- package/lib/commands/generators/create-hook/index.d.ts +1 -0
- package/lib/commands/generators/create-hook/index.js +5 -0
- package/lib/commands/generators/create-rest-api/create-rest-api-command.service.d.ts +21 -0
- package/lib/commands/generators/create-rest-api/create-rest-api-command.service.js +80 -0
- package/lib/commands/generators/create-rest-api/index.d.ts +1 -0
- package/lib/commands/generators/create-rest-api/index.js +5 -0
- package/lib/commands/generators/create-script/create-script-command.service.d.ts +17 -0
- package/lib/commands/generators/create-script/create-script-command.service.js +28 -0
- package/lib/commands/generators/create-script/index.d.ts +1 -0
- package/lib/commands/generators/create-script/index.js +5 -0
- package/lib/commands/generators/create-service/create-service-command.service.d.ts +17 -0
- package/lib/commands/generators/create-service/create-service-command.service.js +40 -0
- package/lib/commands/generators/create-service/index.d.ts +1 -0
- package/lib/commands/generators/create-service/index.js +5 -0
- package/lib/commands/generators/index.d.ts +7 -0
- package/lib/commands/generators/index.js +17 -0
- package/lib/commands/index.d.ts +6 -0
- package/lib/commands/index.js +23 -0
- package/lib/commands/rmdir/index.d.ts +1 -0
- package/lib/commands/rmdir/index.js +5 -0
- package/lib/commands/rmdir/rmdir-command.service.d.ts +12 -0
- package/lib/commands/rmdir/rmdir-command.service.js +29 -0
- package/lib/commands/run-script/index.d.ts +1 -0
- package/lib/commands/run-script/index.js +5 -0
- package/lib/commands/run-script/run-script-command.service.d.ts +10 -0
- package/lib/commands/run-script/run-script-command.service.js +79 -0
- package/lib/commands/upgrade/index.d.ts +1 -0
- package/lib/commands/upgrade/index.js +5 -0
- package/lib/commands/upgrade/upgrade-command.service.d.ts +24 -0
- package/lib/commands/upgrade/upgrade-command.service.js +49 -0
- package/lib/index.d.ts +1 -6
- package/lib/index.js +1 -157
- package/lib/services/crypto/crypto.service.d.ts +11 -0
- package/lib/services/crypto/crypto.service.js +20 -0
- package/lib/services/crypto/index.d.ts +1 -0
- package/lib/services/crypto/index.js +5 -0
- package/lib/services/file-system/file-system.service.d.ts +24 -0
- package/lib/services/file-system/file-system.service.js +89 -0
- package/lib/services/file-system/index.d.ts +1 -0
- package/lib/services/file-system/index.js +5 -0
- package/lib/{generate/file-system.d.ts → services/generator/generator.d.ts} +34 -41
- package/lib/{generate/file-system.js → services/generator/generator.js} +82 -112
- package/lib/services/generator/index.d.ts +1 -0
- package/lib/services/generator/index.js +6 -0
- package/lib/services/index.d.ts +5 -0
- package/lib/services/index.js +14 -0
- package/lib/services/logger/index.d.ts +1 -0
- package/lib/services/logger/index.js +5 -0
- package/lib/services/logger/logger.service.d.ts +8 -0
- package/lib/services/logger/logger.service.js +39 -0
- package/lib/services/util/index.d.ts +1 -0
- package/lib/services/util/index.js +5 -0
- package/lib/services/util/util.service.d.ts +12 -0
- package/lib/services/util/util.service.js +33 -0
- package/package.json +5 -8
- package/templates/file-system/test-template.txt +1 -0
- package/lib/create-secret/create-secret.d.ts +0 -7
- package/lib/create-secret/create-secret.js +0 -15
- package/lib/create-secret/index.d.ts +0 -1
- package/lib/create-secret/index.js +0 -5
- package/lib/generate/generators/angular/connect-angular.d.ts +0 -1
- package/lib/generate/generators/angular/connect-angular.js +0 -52
- package/lib/generate/generators/angular/index.d.ts +0 -1
- package/lib/generate/generators/angular/index.js +0 -5
- package/lib/generate/generators/app/create-app.d.ts +0 -7
- package/lib/generate/generators/app/create-app.js +0 -134
- package/lib/generate/generators/app/index.d.ts +0 -1
- package/lib/generate/generators/app/index.js +0 -5
- package/lib/generate/generators/controller/create-controller.d.ts +0 -4
- package/lib/generate/generators/controller/create-controller.js +0 -39
- package/lib/generate/generators/controller/index.d.ts +0 -1
- package/lib/generate/generators/controller/index.js +0 -5
- package/lib/generate/generators/entity/create-entity.d.ts +0 -3
- package/lib/generate/generators/entity/create-entity.js +0 -28
- package/lib/generate/generators/entity/index.d.ts +0 -1
- package/lib/generate/generators/entity/index.js +0 -5
- package/lib/generate/generators/hook/create-hook.d.ts +0 -3
- package/lib/generate/generators/hook/create-hook.js +0 -26
- package/lib/generate/generators/hook/index.d.ts +0 -1
- package/lib/generate/generators/hook/index.js +0 -5
- package/lib/generate/generators/index.d.ts +0 -11
- package/lib/generate/generators/index.js +0 -27
- package/lib/generate/generators/react/connect-react.d.ts +0 -1
- package/lib/generate/generators/react/connect-react.js +0 -33
- package/lib/generate/generators/react/index.d.ts +0 -1
- package/lib/generate/generators/react/index.js +0 -5
- package/lib/generate/generators/rest-api/create-rest-api.d.ts +0 -5
- package/lib/generate/generators/rest-api/create-rest-api.js +0 -63
- package/lib/generate/generators/rest-api/index.d.ts +0 -1
- package/lib/generate/generators/rest-api/index.js +0 -5
- package/lib/generate/generators/script/create-script.d.ts +0 -3
- package/lib/generate/generators/script/create-script.js +0 -15
- package/lib/generate/generators/script/index.d.ts +0 -1
- package/lib/generate/generators/script/index.js +0 -5
- package/lib/generate/generators/service/create-service.d.ts +0 -3
- package/lib/generate/generators/service/create-service.js +0 -26
- package/lib/generate/generators/service/index.d.ts +0 -1
- package/lib/generate/generators/service/index.js +0 -5
- package/lib/generate/generators/upgrade/index.d.ts +0 -1
- package/lib/generate/generators/upgrade/index.js +0 -5
- package/lib/generate/generators/upgrade/upgrade.d.ts +0 -8
- package/lib/generate/generators/upgrade/upgrade.js +0 -34
- package/lib/generate/generators/vue/connect-vue.d.ts +0 -1
- package/lib/generate/generators/vue/connect-vue.js +0 -37
- package/lib/generate/generators/vue/index.d.ts +0 -1
- package/lib/generate/generators/vue/index.js +0 -5
- package/lib/generate/index.d.ts +0 -1
- package/lib/generate/index.js +0 -17
- package/lib/rmdir/index.d.ts +0 -1
- package/lib/rmdir/index.js +0 -5
- package/lib/rmdir/rmdir.util.d.ts +0 -8
- package/lib/rmdir/rmdir.util.js +0 -24
- package/lib/run/get-command-line-arguments.util.d.ts +0 -1
- package/lib/run/get-command-line-arguments.util.js +0 -21
- package/lib/run/index.d.ts +0 -1
- package/lib/run/index.js +0 -5
- package/lib/run/run-script.d.ts +0 -7
- package/lib/run/run-script.js +0 -76
- /package/lib/{generate → commands/generators}/utils/get-names.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/get-names.js +0 -0
- /package/lib/{generate → commands/generators}/utils/index.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/index.js +0 -0
- /package/lib/{generate → commands/generators}/utils/init-git-repo.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/init-git-repo.js +0 -0
- /package/lib/{generate → commands/generators}/utils/install-dependencies.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/install-dependencies.js +0 -0
- /package/lib/{generate → commands/generators}/utils/logger.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/logger.js +0 -0
- /package/lib/{generate → commands/generators}/utils/mkdir-if-does-not-exist.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/mkdir-if-does-not-exist.js +0 -0
- /package/lib/{generate → commands/generators}/utils/rm-dir-and-files-if-exist.d.ts +0 -0
- /package/lib/{generate → commands/generators}/utils/rm-dir-and-files-if-exist.js +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateServiceCommandService = exports.CreateScriptCommandService = exports.CreateRestApiCommandService = exports.CreateHookCommandService = exports.CreateEntityCommandService = exports.CreateControllerCommandService = exports.CreateAppCommandService = void 0;
|
|
4
|
+
var create_app_1 = require("./create-app");
|
|
5
|
+
Object.defineProperty(exports, "CreateAppCommandService", { enumerable: true, get: function () { return create_app_1.CreateAppCommandService; } });
|
|
6
|
+
var create_controller_1 = require("./create-controller");
|
|
7
|
+
Object.defineProperty(exports, "CreateControllerCommandService", { enumerable: true, get: function () { return create_controller_1.CreateControllerCommandService; } });
|
|
8
|
+
var create_entity_1 = require("./create-entity");
|
|
9
|
+
Object.defineProperty(exports, "CreateEntityCommandService", { enumerable: true, get: function () { return create_entity_1.CreateEntityCommandService; } });
|
|
10
|
+
var create_hook_1 = require("./create-hook");
|
|
11
|
+
Object.defineProperty(exports, "CreateHookCommandService", { enumerable: true, get: function () { return create_hook_1.CreateHookCommandService; } });
|
|
12
|
+
var create_rest_api_1 = require("./create-rest-api");
|
|
13
|
+
Object.defineProperty(exports, "CreateRestApiCommandService", { enumerable: true, get: function () { return create_rest_api_1.CreateRestApiCommandService; } });
|
|
14
|
+
var create_script_1 = require("./create-script");
|
|
15
|
+
Object.defineProperty(exports, "CreateScriptCommandService", { enumerable: true, get: function () { return create_script_1.CreateScriptCommandService; } });
|
|
16
|
+
var create_service_1 = require("./create-service");
|
|
17
|
+
Object.defineProperty(exports, "CreateServiceCommandService", { enumerable: true, get: function () { return create_service_1.CreateServiceCommandService; } });
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ConnectAngularCommandService, ConnectReactCommandService, ConnectVueCommandService, } from './connectors';
|
|
2
|
+
export { CreateAppCommandService, CreateControllerCommandService, CreateEntityCommandService, CreateHookCommandService, CreateRestApiCommandService, CreateScriptCommandService, CreateServiceCommandService, } from './generators';
|
|
3
|
+
export { CreateSecretCommandService } from './create-secret';
|
|
4
|
+
export { RmdirCommandService } from './rmdir';
|
|
5
|
+
export { RunScriptCommandService } from './run-script';
|
|
6
|
+
export { UpgradeCommandService } from './upgrade';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UpgradeCommandService = exports.RunScriptCommandService = exports.RmdirCommandService = exports.CreateSecretCommandService = exports.CreateServiceCommandService = exports.CreateScriptCommandService = exports.CreateRestApiCommandService = exports.CreateHookCommandService = exports.CreateEntityCommandService = exports.CreateControllerCommandService = exports.CreateAppCommandService = exports.ConnectVueCommandService = exports.ConnectReactCommandService = exports.ConnectAngularCommandService = void 0;
|
|
4
|
+
var connectors_1 = require("./connectors");
|
|
5
|
+
Object.defineProperty(exports, "ConnectAngularCommandService", { enumerable: true, get: function () { return connectors_1.ConnectAngularCommandService; } });
|
|
6
|
+
Object.defineProperty(exports, "ConnectReactCommandService", { enumerable: true, get: function () { return connectors_1.ConnectReactCommandService; } });
|
|
7
|
+
Object.defineProperty(exports, "ConnectVueCommandService", { enumerable: true, get: function () { return connectors_1.ConnectVueCommandService; } });
|
|
8
|
+
var generators_1 = require("./generators");
|
|
9
|
+
Object.defineProperty(exports, "CreateAppCommandService", { enumerable: true, get: function () { return generators_1.CreateAppCommandService; } });
|
|
10
|
+
Object.defineProperty(exports, "CreateControllerCommandService", { enumerable: true, get: function () { return generators_1.CreateControllerCommandService; } });
|
|
11
|
+
Object.defineProperty(exports, "CreateEntityCommandService", { enumerable: true, get: function () { return generators_1.CreateEntityCommandService; } });
|
|
12
|
+
Object.defineProperty(exports, "CreateHookCommandService", { enumerable: true, get: function () { return generators_1.CreateHookCommandService; } });
|
|
13
|
+
Object.defineProperty(exports, "CreateRestApiCommandService", { enumerable: true, get: function () { return generators_1.CreateRestApiCommandService; } });
|
|
14
|
+
Object.defineProperty(exports, "CreateScriptCommandService", { enumerable: true, get: function () { return generators_1.CreateScriptCommandService; } });
|
|
15
|
+
Object.defineProperty(exports, "CreateServiceCommandService", { enumerable: true, get: function () { return generators_1.CreateServiceCommandService; } });
|
|
16
|
+
var create_secret_1 = require("./create-secret");
|
|
17
|
+
Object.defineProperty(exports, "CreateSecretCommandService", { enumerable: true, get: function () { return create_secret_1.CreateSecretCommandService; } });
|
|
18
|
+
var rmdir_1 = require("./rmdir");
|
|
19
|
+
Object.defineProperty(exports, "RmdirCommandService", { enumerable: true, get: function () { return rmdir_1.RmdirCommandService; } });
|
|
20
|
+
var run_script_1 = require("./run-script");
|
|
21
|
+
Object.defineProperty(exports, "RunScriptCommandService", { enumerable: true, get: function () { return run_script_1.RunScriptCommandService; } });
|
|
22
|
+
var upgrade_1 = require("./upgrade");
|
|
23
|
+
Object.defineProperty(exports, "UpgradeCommandService", { enumerable: true, get: function () { return upgrade_1.UpgradeCommandService; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RmdirCommandService } from './rmdir-command.service';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RmdirCommandService = void 0;
|
|
4
|
+
var rmdir_command_service_1 = require("./rmdir-command.service");
|
|
5
|
+
Object.defineProperty(exports, "RmdirCommandService", { enumerable: true, get: function () { return rmdir_command_service_1.RmdirCommandService; } });
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for removing directories and all their contents.
|
|
3
|
+
*/
|
|
4
|
+
export declare class RmdirCommandService {
|
|
5
|
+
/**
|
|
6
|
+
* Remove a directory and all its contents, including any subdirectories and files.
|
|
7
|
+
*
|
|
8
|
+
* @param {string} path - The path of the directory
|
|
9
|
+
* @returns {Promise<void>}
|
|
10
|
+
*/
|
|
11
|
+
run(path: string): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RmdirCommandService = void 0;
|
|
4
|
+
// std
|
|
5
|
+
const promises_1 = require("node:fs/promises");
|
|
6
|
+
/**
|
|
7
|
+
* Service for removing directories and all their contents.
|
|
8
|
+
*/
|
|
9
|
+
class RmdirCommandService {
|
|
10
|
+
/**
|
|
11
|
+
* Remove a directory and all its contents, including any subdirectories and files.
|
|
12
|
+
*
|
|
13
|
+
* @param {string} path - The path of the directory
|
|
14
|
+
* @returns {Promise<void>}
|
|
15
|
+
*/
|
|
16
|
+
async run(path) {
|
|
17
|
+
try {
|
|
18
|
+
await (0, promises_1.readdir)(path);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error.code === 'ENOENT') {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
await (0, promises_1.rm)(path, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.RmdirCommandService = RmdirCommandService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RunScriptCommandService } from './run-script-command.service';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunScriptCommandService = void 0;
|
|
4
|
+
var run_script_command_service_1 = require("./run-script-command.service");
|
|
5
|
+
Object.defineProperty(exports, "RunScriptCommandService", { enumerable: true, get: function () { return run_script_command_service_1.RunScriptCommandService; } });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Logger, ServiceManager } from '@foal/core';
|
|
2
|
+
import { UtilService } from '../../services';
|
|
3
|
+
export declare class RunScriptCommandService {
|
|
4
|
+
private utilService;
|
|
5
|
+
constructor(utilService: UtilService);
|
|
6
|
+
run(name: string, argv: string[]): Promise<void>;
|
|
7
|
+
execScript({ name }: {
|
|
8
|
+
name: string;
|
|
9
|
+
}, argv: string[], services: ServiceManager, logger: Logger): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunScriptCommandService = void 0;
|
|
4
|
+
// std
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
// 3p
|
|
8
|
+
const ajv_1 = require("ajv");
|
|
9
|
+
const ajv_formats_1 = require("ajv-formats");
|
|
10
|
+
class RunScriptCommandService {
|
|
11
|
+
utilService;
|
|
12
|
+
constructor(utilService) {
|
|
13
|
+
this.utilService = utilService;
|
|
14
|
+
}
|
|
15
|
+
async run(name, argv) {
|
|
16
|
+
try {
|
|
17
|
+
const { Logger, ServiceManager } = require(require.resolve('@foal/core', {
|
|
18
|
+
paths: [process.cwd()],
|
|
19
|
+
}));
|
|
20
|
+
const services = new ServiceManager();
|
|
21
|
+
const logger = services.get(Logger);
|
|
22
|
+
logger.initLogContext(() => this.execScript({ name }, argv, services, logger).catch(error => console.error(error)));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code === 'MODULE_NOT_FOUND') {
|
|
26
|
+
console.error('@foal/core module not found. Are you sure you are in a FoalTS project?');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async execScript({ name }, argv, services, logger) {
|
|
33
|
+
logger.addLogContext({
|
|
34
|
+
scriptId: (0, crypto_1.randomUUID)(),
|
|
35
|
+
scriptName: name
|
|
36
|
+
});
|
|
37
|
+
if (!(0, fs_1.existsSync)(`build/scripts/${name}.js`)) {
|
|
38
|
+
if ((0, fs_1.existsSync)(`src/scripts/${name}.ts`)) {
|
|
39
|
+
logger.error(`Script "${name}" not found in build/scripts/ but found in src/scripts/. Did you forget to build it?`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
logger.error(`Script "${name}" not found.`);
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const { main, schema } = require(require.resolve(`./build/scripts/${name}`, {
|
|
47
|
+
paths: [process.cwd()],
|
|
48
|
+
}));
|
|
49
|
+
if (!main) {
|
|
50
|
+
logger.error(`No "main" function found in script "${name}".`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const args = this.utilService.getCommandLineArguments(argv);
|
|
54
|
+
if (schema) {
|
|
55
|
+
const ajv = new ajv_1.default({ useDefaults: true, allErrors: true });
|
|
56
|
+
(0, ajv_formats_1.default)(ajv);
|
|
57
|
+
if (!ajv.validate(schema, args)) {
|
|
58
|
+
ajv.errors.forEach(err => {
|
|
59
|
+
if (err.instancePath) {
|
|
60
|
+
logger.error(`Script argument "${err.instancePath.split('/')[1]}" ${err.message}.`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
logger.error(`Script arguments ${err.message}.`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
await main(args, services, logger);
|
|
71
|
+
logger.info(`Script "${name}" completed.`);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.error(error.message, { error });
|
|
75
|
+
logger.error(`Script "${name}" failed.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.RunScriptCommandService = RunScriptCommandService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { UpgradeCommandService } from './upgrade-command.service';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UpgradeCommandService = void 0;
|
|
4
|
+
var upgrade_command_service_1 = require("./upgrade-command.service");
|
|
5
|
+
Object.defineProperty(exports, "UpgradeCommandService", { enumerable: true, get: function () { return upgrade_command_service_1.UpgradeCommandService; } });
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Generator } from '../../services';
|
|
2
|
+
declare function getLatestVersion(): Promise<string>;
|
|
3
|
+
/**
|
|
4
|
+
* Service for upgrading FoalTS dependencies.
|
|
5
|
+
*/
|
|
6
|
+
export declare class UpgradeCommandService {
|
|
7
|
+
private generator;
|
|
8
|
+
constructor(generator: Generator);
|
|
9
|
+
/**
|
|
10
|
+
* Upgrade all @foal/* dependencies to the specified version (or latest if not specified).
|
|
11
|
+
*
|
|
12
|
+
* @param {string} version - Optional specific version to upgrade to
|
|
13
|
+
* @param {boolean} autoInstall - Whether to automatically install dependencies
|
|
14
|
+
* @param {() => Promise<string>} getLatestVersionFn - Optional function to get latest version (for testing)
|
|
15
|
+
* @returns {Promise<void>}
|
|
16
|
+
*/
|
|
17
|
+
run({ version, autoInstall }: {
|
|
18
|
+
version?: string;
|
|
19
|
+
autoInstall?: boolean;
|
|
20
|
+
}, options?: {
|
|
21
|
+
getLatestVersion: typeof getLatestVersion;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UpgradeCommandService = void 0;
|
|
4
|
+
const utils_1 = require("../generators/utils");
|
|
5
|
+
async function getLatestVersion() {
|
|
6
|
+
const response = await fetch('https://registry.npmjs.org/@foal/core/latest');
|
|
7
|
+
const { version } = await response.json();
|
|
8
|
+
return version;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Service for upgrading FoalTS dependencies.
|
|
12
|
+
*/
|
|
13
|
+
class UpgradeCommandService {
|
|
14
|
+
generator;
|
|
15
|
+
constructor(generator) {
|
|
16
|
+
this.generator = generator;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Upgrade all @foal/* dependencies to the specified version (or latest if not specified).
|
|
20
|
+
*
|
|
21
|
+
* @param {string} version - Optional specific version to upgrade to
|
|
22
|
+
* @param {boolean} autoInstall - Whether to automatically install dependencies
|
|
23
|
+
* @param {() => Promise<string>} getLatestVersionFn - Optional function to get latest version (for testing)
|
|
24
|
+
* @returns {Promise<void>}
|
|
25
|
+
*/
|
|
26
|
+
async run({ version, autoInstall }, options = { getLatestVersion }) {
|
|
27
|
+
version ??= await options.getLatestVersion();
|
|
28
|
+
utils_1.logger.log();
|
|
29
|
+
utils_1.logger.log(` Upgrading @foal/* dependencies to version ${version}...`);
|
|
30
|
+
utils_1.logger.log();
|
|
31
|
+
const dependencies = this.generator.getProjectDependencies();
|
|
32
|
+
for (const dependency of dependencies) {
|
|
33
|
+
if (dependency.name.startsWith('@foal/')) {
|
|
34
|
+
this.generator.setOrUpdateProjectDependency(dependency.name, version);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const devDependencies = this.generator.getProjectDevDependencies();
|
|
38
|
+
for (const devDependency of devDependencies) {
|
|
39
|
+
if (devDependency.name.startsWith('@foal/')) {
|
|
40
|
+
this.generator.setOrUpdateProjectDevDependency(devDependency.name, version);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (autoInstall) {
|
|
44
|
+
await (0, utils_1.installDependencies)();
|
|
45
|
+
utils_1.logger.log();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.UpgradeCommandService = UpgradeCommandService;
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1,160 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* FoalTS
|
|
5
|
-
* Copyright(c) 2017-2025 Loïc Poullain
|
|
6
|
-
* Released under the MIT License.
|
|
7
|
-
*/
|
|
8
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
|
|
10
|
-
const safe_1 = require("colors/safe");
|
|
11
|
-
const commander_1 = require("commander");
|
|
12
|
-
// FoalTS
|
|
13
|
-
const create_secret_1 = require("./create-secret");
|
|
14
|
-
const generate_1 = require("./generate");
|
|
15
|
-
const file_system_1 = require("./generate/file-system");
|
|
16
|
-
const rmdir_1 = require("./rmdir");
|
|
17
|
-
const run_1 = require("./run");
|
|
18
|
-
function displayError(...lines) {
|
|
19
|
-
console.error();
|
|
20
|
-
lines.forEach(line => console.error((0, safe_1.red)(line)));
|
|
21
|
-
console.error();
|
|
22
|
-
process.exitCode = 1;
|
|
23
|
-
}
|
|
24
|
-
// tslint:disable-next-line:no-var-requires
|
|
25
|
-
const pkg = require('../package.json');
|
|
26
|
-
commander_1.program
|
|
27
|
-
.version(pkg.version, '-v, --version');
|
|
28
|
-
commander_1.program
|
|
29
|
-
.command('createapp')
|
|
30
|
-
.argument('<name>', 'Name of the application')
|
|
31
|
-
.description('Create a new project.')
|
|
32
|
-
.option('-G, --no-git', 'Don\'t initialize a git repository')
|
|
33
|
-
.option('-I, --no-install', 'Don\'t autoinstall packages using yarn or npm (uses first available)')
|
|
34
|
-
.option('-m, --mongodb', 'Generate a new project using MongoDB instead of SQLite', false)
|
|
35
|
-
.option('-y, --yaml', 'Generate a new project using YAML configuration instead of JSON', false)
|
|
36
|
-
.action((name, options) => {
|
|
37
|
-
(0, generate_1.createApp)({
|
|
38
|
-
autoInstall: options.install,
|
|
39
|
-
initRepo: options.git,
|
|
40
|
-
mongodb: options.mongodb,
|
|
41
|
-
name,
|
|
42
|
-
yaml: options.yaml
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
commander_1.program
|
|
46
|
-
.command('createsecret')
|
|
47
|
-
.description('Create a 256-bit random secret encoded in base64.')
|
|
48
|
-
.action(() => (0, create_secret_1.createSecret)().then(secret => console.log(secret)));
|
|
49
|
-
commander_1.program
|
|
50
|
-
.command('run')
|
|
51
|
-
.argument('<name>', 'Name of the script to run')
|
|
52
|
-
.argument('[args...]', 'Script arguments (key=value format)')
|
|
53
|
-
.description('Run a shell script.')
|
|
54
|
-
.action((name) => {
|
|
55
|
-
(0, run_1.runScript)({ name }, process.argv);
|
|
56
|
-
});
|
|
57
|
-
commander_1.program
|
|
58
|
-
.command('connect')
|
|
59
|
-
.argument('<framework>', 'Frontend framework to connect to')
|
|
60
|
-
.argument('<path>', 'Path to the frontend project')
|
|
61
|
-
.description('Configure your frontend to interact with your application.')
|
|
62
|
-
.addHelpText('after', `
|
|
63
|
-
Available frameworks:
|
|
64
|
-
- angular
|
|
65
|
-
- react
|
|
66
|
-
- vue
|
|
67
|
-
`)
|
|
68
|
-
.action(async (framework, path) => {
|
|
69
|
-
switch (framework) {
|
|
70
|
-
case 'angular':
|
|
71
|
-
(0, generate_1.connectAngular)(path);
|
|
72
|
-
break;
|
|
73
|
-
case 'react':
|
|
74
|
-
(0, generate_1.connectReact)(path);
|
|
75
|
-
break;
|
|
76
|
-
case 'vue':
|
|
77
|
-
(0, generate_1.connectVue)(path);
|
|
78
|
-
break;
|
|
79
|
-
default:
|
|
80
|
-
displayError(`Unknown framework ${(0, safe_1.yellow)(framework)}. Please provide a valid one:`, '', ' - angular', ' - react', ' - vue');
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
const generateTypes = [
|
|
84
|
-
'controller', 'entity', 'rest-api', 'hook', 'script', 'service'
|
|
85
|
-
];
|
|
86
|
-
commander_1.program
|
|
87
|
-
.command('generate')
|
|
88
|
-
.argument('<type>', 'Type of the file to generate')
|
|
89
|
-
.argument('<name>', 'Name of the file to generate')
|
|
90
|
-
.description('Generate and/or modify files.')
|
|
91
|
-
.option('-r, --register', 'Register the controller into app.controller.ts (only available if type=controller|rest-api)', false)
|
|
92
|
-
.option('-a, --auth', 'Add an owner to the entities of the generated REST API (only available if type=rest-api)', false)
|
|
93
|
-
.alias('g')
|
|
94
|
-
.addHelpText('after', `
|
|
95
|
-
Available types:
|
|
96
|
-
${generateTypes.map(t => ` - ${t}`).join('\n')}
|
|
97
|
-
`)
|
|
98
|
-
.action(async (type, name, options) => {
|
|
99
|
-
try {
|
|
100
|
-
switch (type) {
|
|
101
|
-
case 'controller':
|
|
102
|
-
(0, generate_1.createController)({ name, register: options.register });
|
|
103
|
-
break;
|
|
104
|
-
case 'entity':
|
|
105
|
-
(0, generate_1.createEntity)({ name });
|
|
106
|
-
break;
|
|
107
|
-
case 'rest-api':
|
|
108
|
-
(0, generate_1.createRestApi)({ name, register: options.register, auth: options.auth });
|
|
109
|
-
break;
|
|
110
|
-
case 'hook':
|
|
111
|
-
(0, generate_1.createHook)({ name });
|
|
112
|
-
break;
|
|
113
|
-
case 'script':
|
|
114
|
-
(0, generate_1.createScript)({ name });
|
|
115
|
-
break;
|
|
116
|
-
case 'service':
|
|
117
|
-
(0, generate_1.createService)({ name });
|
|
118
|
-
break;
|
|
119
|
-
default:
|
|
120
|
-
displayError(`Unknown type ${(0, safe_1.yellow)(type)}. Please provide a valid one:`, '', ...generateTypes.map(t => ` - ${t}`));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
if (error instanceof file_system_1.ClientError) {
|
|
125
|
-
displayError(error.message);
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
throw error;
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
commander_1.program
|
|
132
|
-
.command('rmdir')
|
|
133
|
-
.argument('<name>', 'Name of the directory to remove')
|
|
134
|
-
.description('Remove a directory and all its contents, including any subdirectories and files.')
|
|
135
|
-
.action(async (name) => {
|
|
136
|
-
try {
|
|
137
|
-
await (0, rmdir_1.rmdir)(name);
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
if (error.code === 'ENOTDIR') {
|
|
141
|
-
displayError(error.message);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
throw error;
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
commander_1.program
|
|
148
|
-
.command('upgrade')
|
|
149
|
-
.argument('[version]', 'Name of the specific version to upgrade to')
|
|
150
|
-
.description('Upgrade the project to the latest version of FoalTS. If a version is provided, upgrade to that version.')
|
|
151
|
-
.option('-I, --no-install', 'Don\'t autoinstall packages using yarn or npm (uses first available)')
|
|
152
|
-
.action(async (version, options) => {
|
|
153
|
-
await (0, generate_1.upgrade)({ version, autoInstall: options.install });
|
|
154
|
-
});
|
|
155
|
-
commander_1.program
|
|
156
|
-
.on('command:*', (commands) => {
|
|
157
|
-
commander_1.program.outputHelp();
|
|
158
|
-
displayError(`Unknown command ${(0, safe_1.yellow)(commands[0])}.`);
|
|
159
|
-
});
|
|
160
|
-
commander_1.program.parse(process.argv);
|
|
4
|
+
require("./cli");
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CryptoService = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
/**
|
|
7
|
+
* Service for cryptographic operations.
|
|
8
|
+
*/
|
|
9
|
+
class CryptoService {
|
|
10
|
+
/**
|
|
11
|
+
* Create a random 256-bit secret encoded in base64.
|
|
12
|
+
*
|
|
13
|
+
* @returns {Promise<string>} The base64 string.
|
|
14
|
+
*/
|
|
15
|
+
async createSecret() {
|
|
16
|
+
const buff = await (0, util_1.promisify)(crypto_1.randomBytes)(32);
|
|
17
|
+
return buff.toString('base64');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.CryptoService = CryptoService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CryptoService } from './crypto.service';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CryptoService = void 0;
|
|
4
|
+
var crypto_service_1 = require("./crypto.service");
|
|
5
|
+
Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class FileSystemService {
|
|
2
|
+
private readonly testDir;
|
|
3
|
+
private isTestingEnvironment;
|
|
4
|
+
setUp(): void;
|
|
5
|
+
tearDown(): void;
|
|
6
|
+
computePath(path: string): string;
|
|
7
|
+
mkdir(path: string): void;
|
|
8
|
+
rmdir(path: string): void;
|
|
9
|
+
writeFile(path: string, content: string): void;
|
|
10
|
+
readFile(path: string): string;
|
|
11
|
+
readBinaryFile(path: string): Buffer;
|
|
12
|
+
readFileFromTemplates(path: string): string;
|
|
13
|
+
readFileFromSpecs(path: string): string;
|
|
14
|
+
readBinaryFileFromSpecs(path: string): Buffer;
|
|
15
|
+
deleteFile(path: string): void;
|
|
16
|
+
copyFile(src: string, dest: string): void;
|
|
17
|
+
copyFileFromTemplates(src: string, dest: string): void;
|
|
18
|
+
copyFileFromFixtures(src: string, dest: string): void;
|
|
19
|
+
exists(path: string): boolean;
|
|
20
|
+
existsTemplate(path: string): boolean;
|
|
21
|
+
existsFixture(path: string): boolean;
|
|
22
|
+
existsSpec(path: string): boolean;
|
|
23
|
+
isDirectoryEmpty(path: string): boolean;
|
|
24
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileSystemService = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class FileSystemService {
|
|
7
|
+
testDir = 'test-generators/subdir';
|
|
8
|
+
isTestingEnvironment() {
|
|
9
|
+
return process.env.P1Z7kEbSUUPMxF8GqPwD8Gx_FOAL_CLI_TEST === 'true';
|
|
10
|
+
}
|
|
11
|
+
setUp() {
|
|
12
|
+
if (!this.isTestingEnvironment()) {
|
|
13
|
+
throw new Error('Impossible to create the test directory in a non-testing environment.');
|
|
14
|
+
}
|
|
15
|
+
(0, fs_1.mkdirSync)(this.testDir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
tearDown() {
|
|
18
|
+
if (!this.isTestingEnvironment()) {
|
|
19
|
+
throw new Error('Impossible to remove the test directory in a non-testing environment.');
|
|
20
|
+
}
|
|
21
|
+
const [firstDir] = this.testDir.split('/');
|
|
22
|
+
(0, fs_1.rmSync)(firstDir, { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
computePath(path) {
|
|
25
|
+
if (!this.isTestingEnvironment()) {
|
|
26
|
+
return path;
|
|
27
|
+
}
|
|
28
|
+
if (!(0, fs_1.existsSync)(this.testDir)) {
|
|
29
|
+
throw new Error('The testing environment is not set up.');
|
|
30
|
+
}
|
|
31
|
+
return (0, path_1.join)(this.testDir, path);
|
|
32
|
+
}
|
|
33
|
+
mkdir(path) {
|
|
34
|
+
(0, fs_1.mkdirSync)(this.computePath(path), { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
rmdir(path) {
|
|
37
|
+
(0, fs_1.rmSync)(this.computePath(path), { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
writeFile(path, content) {
|
|
40
|
+
(0, fs_1.writeFileSync)(this.computePath(path), content, 'utf8');
|
|
41
|
+
}
|
|
42
|
+
readFile(path) {
|
|
43
|
+
return (0, fs_1.readFileSync)(this.computePath(path), 'utf8');
|
|
44
|
+
}
|
|
45
|
+
readBinaryFile(path) {
|
|
46
|
+
return (0, fs_1.readFileSync)(this.computePath(path));
|
|
47
|
+
}
|
|
48
|
+
readFileFromTemplates(path) {
|
|
49
|
+
return (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../..', 'templates', path), 'utf8');
|
|
50
|
+
}
|
|
51
|
+
readFileFromSpecs(path) {
|
|
52
|
+
return (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../..', 'specs', path), 'utf8');
|
|
53
|
+
}
|
|
54
|
+
readBinaryFileFromSpecs(path) {
|
|
55
|
+
return (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../..', 'specs', path));
|
|
56
|
+
}
|
|
57
|
+
deleteFile(path) {
|
|
58
|
+
(0, fs_1.unlinkSync)(this.computePath(path));
|
|
59
|
+
}
|
|
60
|
+
copyFile(src, dest) {
|
|
61
|
+
(0, fs_1.copyFileSync)(this.computePath(src), this.computePath(dest));
|
|
62
|
+
}
|
|
63
|
+
copyFileFromTemplates(src, dest) {
|
|
64
|
+
(0, fs_1.copyFileSync)((0, path_1.join)(__dirname, '../../..', 'templates', src), this.computePath(dest));
|
|
65
|
+
}
|
|
66
|
+
copyFileFromFixtures(src, dest) {
|
|
67
|
+
(0, fs_1.copyFileSync)((0, path_1.join)(__dirname, '../../..', 'fixtures', src), this.computePath(dest));
|
|
68
|
+
}
|
|
69
|
+
exists(path) {
|
|
70
|
+
return (0, fs_1.existsSync)(this.computePath(path));
|
|
71
|
+
}
|
|
72
|
+
existsTemplate(path) {
|
|
73
|
+
return (0, fs_1.existsSync)((0, path_1.join)(__dirname, '../../..', 'templates', path));
|
|
74
|
+
}
|
|
75
|
+
existsFixture(path) {
|
|
76
|
+
return (0, fs_1.existsSync)((0, path_1.join)(__dirname, '../../..', 'fixtures', path));
|
|
77
|
+
}
|
|
78
|
+
existsSpec(path) {
|
|
79
|
+
return (0, fs_1.existsSync)((0, path_1.join)(__dirname, '../../..', 'specs', path));
|
|
80
|
+
}
|
|
81
|
+
isDirectoryEmpty(path) {
|
|
82
|
+
const dirPath = this.computePath(path);
|
|
83
|
+
if (!(0, fs_1.existsSync)(dirPath)) {
|
|
84
|
+
throw new Error(`Directory does not exist: ${path}`);
|
|
85
|
+
}
|
|
86
|
+
return (0, fs_1.readdirSync)(dirPath).length === 0;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.FileSystemService = FileSystemService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { FileSystemService } from './file-system.service';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileSystemService = void 0;
|
|
4
|
+
var file_system_service_1 = require("./file-system.service");
|
|
5
|
+
Object.defineProperty(exports, "FileSystemService", { enumerable: true, get: function () { return file_system_service_1.FileSystemService; } });
|