@opra/cli 0.13.0 → 0.14.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/bin/oprimp.mjs CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import '../esm/oprimp.js';
3
+
@@ -2,18 +2,32 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateService = void 0;
4
4
  const tslib_1 = require("tslib");
5
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
+ const console_1 = tslib_1.__importDefault(require("console"));
5
7
  const fs = tslib_1.__importStar(require("fs"));
6
8
  const path_1 = tslib_1.__importDefault(require("path"));
7
9
  const process = tslib_1.__importStar(require("process"));
10
+ const node_client_1 = require("@opra/node-client");
11
+ const ts_file_js_1 = require("../utils/ts-file.js");
12
+ const delete_files_js_1 = require("./delete-files.js");
8
13
  const file_writer_js_1 = require("./file-writer.js");
9
- const generate_resoruces_js_1 = require("./generate-resoruces.js");
10
- const generate_types_js_1 = require("./generate-types.js");
14
+ const process_resoruces_js_1 = require("./process-resoruces.js");
15
+ const process_types_js_1 = require("./process-types.js");
11
16
  async function generateService(config) {
12
17
  const cwd = config.cwd || process.cwd();
13
- const logger = config.logger || console;
18
+ const logger = config.logger || console_1.default;
19
+ console_1.default.log(chalk_1.default.yellow('Fetching service metadata from'), chalk_1.default.whiteBright(config.serviceUrl));
20
+ const client = await node_client_1.OpraHttpClient.create(config.serviceUrl);
21
+ const metadata = client.metadata;
22
+ console_1.default.log(chalk_1.default.yellow('Retrieved service info:'), chalk_1.default.whiteBright(metadata.info.title), '-', chalk_1.default.whiteBright(metadata.info.version));
23
+ console_1.default.log(chalk_1.default.yellow('Removing old files..'));
24
+ (0, delete_files_js_1.deleteFiles)(config.outDir);
25
+ let name = (metadata.info.title || 'Service1').replace(/[^\w_$]*/g, '');
26
+ name = name.charAt(0).toUpperCase() + name.substring(1);
14
27
  const ctx = {
15
28
  serviceUrl: config.serviceUrl,
16
- document: config.document,
29
+ document: client.metadata,
30
+ name,
17
31
  logger,
18
32
  cwd,
19
33
  relativeDir: config.outDir,
@@ -23,7 +37,12 @@ async function generateService(config) {
23
37
  writer: config.writer || new file_writer_js_1.FileWriter()
24
38
  };
25
39
  fs.mkdirSync(ctx.absoluteDir, { recursive: true });
26
- await (0, generate_types_js_1.generateTypes)(ctx);
27
- await (0, generate_resoruces_js_1.generateResources)(ctx);
40
+ await (0, process_types_js_1.processTypes)(ctx);
41
+ await (0, process_resoruces_js_1.processResources)(ctx);
42
+ const indexTs = new ts_file_js_1.TsFile();
43
+ indexTs.header = ctx.fileHeader;
44
+ indexTs.addExport('./' + ctx.name + ctx.extension);
45
+ indexTs.addExport('./types' + ctx.extension);
46
+ await indexTs.writeFile(ctx, path_1.default.join(ctx.absoluteDir, 'index.ts'));
28
47
  }
29
48
  exports.generateService = generateService;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processResources = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const common_1 = require("@opra/common");
8
+ const string_utils_js_1 = require("../utils/string-utils.js");
9
+ const ts_file_js_1 = require("../utils/ts-file.js");
10
+ async function processResources(ctx) {
11
+ const targetDir = ctx.absoluteDir;
12
+ ctx.logger.log(chalk_1.default.yellow('Processing resources'));
13
+ const serviceTs = new ts_file_js_1.TsFile();
14
+ serviceTs.header = ctx.fileHeader;
15
+ serviceTs.addImport('@opra/client', 'OpraHttpClient');
16
+ serviceTs.content = `
17
+ const kClient = Symbol('client');
18
+
19
+ export class ${ctx.name} {
20
+ static kClient = kClient;
21
+ [kClient]: OpraHttpClient;
22
+
23
+ constructor(client: OpraHttpClient) {
24
+ this[kClient] = client;
25
+ }
26
+ `;
27
+ const resourceNames = Array.from(ctx.document.resources.keys()).sort();
28
+ for (const resourceName of resourceNames) {
29
+ const resource = ctx.document.getResource(resourceName);
30
+ serviceTs.content += `\n/**\n * ${(0, string_utils_js_1.wrapJSDocString)(resource.description || resource.name)}
31
+ * @url ${(0, common_1.joinPath)(ctx.serviceUrl, '$metadata/resources/' + resource.name)}
32
+ */`;
33
+ if (resource instanceof common_1.CollectionResourceInfo) {
34
+ serviceTs.addImport('@opra/client', 'HttpCollectionService');
35
+ serviceTs.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
36
+ const methods = resource.getHandlerNames()
37
+ .filter(x => x !== 'count')
38
+ .map(x => `'${x}'`).join(' | ');
39
+ serviceTs.content += `
40
+ get ${resource.name}(): Pick<HttpCollectionService<${resource.dataType.name}, never>, ${methods}> {
41
+ return this[kClient].collection('${resource.name}');
42
+ }\n`;
43
+ }
44
+ else if (resource instanceof common_1.SingletonResourceInfo) {
45
+ serviceTs.addImport('@opra/client', 'HttpSingletonService');
46
+ serviceTs.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
47
+ const methods = resource.getHandlerNames()
48
+ .map(x => `'${x}'`).join(' | ');
49
+ serviceTs.content += `
50
+ get ${resource.name}(): Pick<HttpSingletonService<${resource.dataType.name}, never>, ${methods}> {
51
+ return this[kClient].singleton('${resource.name}');
52
+ }\n`;
53
+ }
54
+ }
55
+ serviceTs.content += `
56
+ }\n`;
57
+ await serviceTs.writeFile(ctx, path_1.default.join(targetDir, ctx.name + '.ts'));
58
+ }
59
+ exports.processResources = processResources;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateTypes = void 0;
3
+ exports.processTypes = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
6
  const fs_1 = tslib_1.__importDefault(require("fs"));
@@ -15,9 +15,9 @@ const builtinsMap = {
15
15
  integer: 'number',
16
16
  date: 'Date'
17
17
  };
18
- async function generateTypes(ctx) {
18
+ async function processTypes(ctx) {
19
19
  const targetDir = path_1.default.join(ctx.absoluteDir, 'types');
20
- ctx.logger.log(chalk_1.default.yellow('Generating types'));
20
+ ctx.logger.log(chalk_1.default.yellow('Processing types'));
21
21
  const typesTs = new ts_file_js_1.TsFile();
22
22
  typesTs.header = ctx.fileHeader;
23
23
  let i = 0;
@@ -54,7 +54,7 @@ async function generateTypes(ctx) {
54
54
  await typesTs.writeFile(ctx, path_1.default.join(ctx.absoluteDir, 'types.ts'));
55
55
  }
56
56
  }
57
- exports.generateTypes = generateTypes;
57
+ exports.processTypes = processTypes;
58
58
  async function generateComplexType(ctx, dataType, tsFile) {
59
59
  tsFile.header = ctx.fileHeader;
60
60
  tsFile.content = `
package/cjs/oprimp.js CHANGED
@@ -7,8 +7,6 @@ const console = tslib_1.__importStar(require("console"));
7
7
  const fs = tslib_1.__importStar(require("fs"));
8
8
  const path_1 = tslib_1.__importDefault(require("path"));
9
9
  const process = tslib_1.__importStar(require("process"));
10
- const node_client_1 = require("@opra/node-client");
11
- const delete_files_js_1 = require("./oprimp/delete-files.js");
12
10
  const generate_service_js_1 = require("./oprimp/generate-service.js");
13
11
  const get_caller_file_util_js_1 = require("./utils/get-caller-file.util.js");
14
12
  const pkgJson = JSON.parse(fs.readFileSync(path_1.default.resolve(path_1.default.dirname((0, get_caller_file_util_js_1.getCallerFile)()), '../package.json'), 'utf-8'));
@@ -16,22 +14,17 @@ commander_1.program
16
14
  .version(pkgJson.version)
17
15
  .argument('<serviceUrl>', 'OPRA service url')
18
16
  .argument('<outDir>', 'Output directory')
17
+ .option('--name <name>', 'Name of the service')
18
+ .option('--ext', 'Adds js extension to imports')
19
19
  .option('--no-color', 'Disables colors in logs messages')
20
- .option('-e, --extension <extension>', 'File extensions of imports')
21
20
  .action(async (serviceUrl, outDir, options) => {
22
21
  if (!options.color)
23
22
  chalk_1.default.level = 0;
24
- console.log(chalk_1.default.yellow('Fetching service metadata from'), chalk_1.default.whiteBright(serviceUrl));
25
- const client = await node_client_1.OpraHttpClient.create(serviceUrl);
26
- const metadata = client.metadata;
27
- console.log(chalk_1.default.yellow('Retrieved service info:'), chalk_1.default.whiteBright(metadata.info.title), '-', chalk_1.default.whiteBright(metadata.info.version));
28
- console.log(chalk_1.default.yellow('Removing old files..'));
29
- (0, delete_files_js_1.deleteFiles)(outDir);
30
23
  await (0, generate_service_js_1.generateService)({
31
24
  serviceUrl,
32
- document: metadata,
33
25
  outDir,
34
- extension: (options.extension ? '.' + options.extension : ''),
26
+ name: options.name,
27
+ extension: (options.ext ? '.js' : ''),
35
28
  fileHeader: '/*\n' +
36
29
  ' * Generated by OPRA Service Generator \n' +
37
30
  ' * Version: ' + pkgJson.version + '\n' +
@@ -4,6 +4,7 @@ import { ILogger } from './logger.interface.js';
4
4
  export interface ServiceGenerationContext {
5
5
  serviceUrl: string;
6
6
  document: OpraDocument;
7
+ name: string;
7
8
  cwd: string;
8
9
  logger: ILogger;
9
10
  relativeDir: string;
@@ -1,10 +1,9 @@
1
- import { OpraDocument } from '@opra/common';
2
1
  import { IFileWriter } from '../interfaces/file-writer.interface.js';
3
2
  import { ILogger } from '../interfaces/logger.interface.js';
4
3
  export interface ServiceGenerateConfig {
5
4
  serviceUrl: string;
6
- document: OpraDocument;
7
5
  outDir: string;
6
+ name?: string;
8
7
  cwd?: string;
9
8
  logger?: ILogger;
10
9
  writer?: IFileWriter;
@@ -1,15 +1,29 @@
1
+ import chalk from 'chalk';
2
+ import console from 'console';
1
3
  import * as fs from 'fs';
2
4
  import path from 'path';
3
5
  import * as process from 'process';
6
+ import { OpraHttpClient } from '@opra/node-client';
7
+ import { TsFile } from '../utils/ts-file.js';
8
+ import { deleteFiles } from './delete-files.js';
4
9
  import { FileWriter } from './file-writer.js';
5
- import { generateResources } from './generate-resoruces.js';
6
- import { generateTypes } from './generate-types.js';
10
+ import { processResources } from './process-resoruces.js';
11
+ import { processTypes } from './process-types.js';
7
12
  export async function generateService(config) {
8
13
  const cwd = config.cwd || process.cwd();
9
14
  const logger = config.logger || console;
15
+ console.log(chalk.yellow('Fetching service metadata from'), chalk.whiteBright(config.serviceUrl));
16
+ const client = await OpraHttpClient.create(config.serviceUrl);
17
+ const metadata = client.metadata;
18
+ console.log(chalk.yellow('Retrieved service info:'), chalk.whiteBright(metadata.info.title), '-', chalk.whiteBright(metadata.info.version));
19
+ console.log(chalk.yellow('Removing old files..'));
20
+ deleteFiles(config.outDir);
21
+ let name = (metadata.info.title || 'Service1').replace(/[^\w_$]*/g, '');
22
+ name = name.charAt(0).toUpperCase() + name.substring(1);
10
23
  const ctx = {
11
24
  serviceUrl: config.serviceUrl,
12
- document: config.document,
25
+ document: client.metadata,
26
+ name,
13
27
  logger,
14
28
  cwd,
15
29
  relativeDir: config.outDir,
@@ -19,6 +33,11 @@ export async function generateService(config) {
19
33
  writer: config.writer || new FileWriter()
20
34
  };
21
35
  fs.mkdirSync(ctx.absoluteDir, { recursive: true });
22
- await generateTypes(ctx);
23
- await generateResources(ctx);
36
+ await processTypes(ctx);
37
+ await processResources(ctx);
38
+ const indexTs = new TsFile();
39
+ indexTs.header = ctx.fileHeader;
40
+ indexTs.addExport('./' + ctx.name + ctx.extension);
41
+ indexTs.addExport('./types' + ctx.extension);
42
+ await indexTs.writeFile(ctx, path.join(ctx.absoluteDir, 'index.ts'));
24
43
  }
@@ -1,2 +1,2 @@
1
1
  import { ServiceGenerationContext } from '../interfaces/service-generation-context.interface.js';
2
- export declare function generateResources(ctx: ServiceGenerationContext): Promise<void>;
2
+ export declare function processResources(ctx: ServiceGenerationContext): Promise<void>;
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import path from 'path';
3
+ import { CollectionResourceInfo, joinPath, SingletonResourceInfo } from '@opra/common';
4
+ import { wrapJSDocString } from '../utils/string-utils.js';
5
+ import { TsFile } from '../utils/ts-file.js';
6
+ export async function processResources(ctx) {
7
+ const targetDir = ctx.absoluteDir;
8
+ ctx.logger.log(chalk.yellow('Processing resources'));
9
+ const serviceTs = new TsFile();
10
+ serviceTs.header = ctx.fileHeader;
11
+ serviceTs.addImport('@opra/client', 'OpraHttpClient');
12
+ serviceTs.content = `
13
+ const kClient = Symbol('client');
14
+
15
+ export class ${ctx.name} {
16
+ static kClient = kClient;
17
+ [kClient]: OpraHttpClient;
18
+
19
+ constructor(client: OpraHttpClient) {
20
+ this[kClient] = client;
21
+ }
22
+ `;
23
+ const resourceNames = Array.from(ctx.document.resources.keys()).sort();
24
+ for (const resourceName of resourceNames) {
25
+ const resource = ctx.document.getResource(resourceName);
26
+ serviceTs.content += `\n/**\n * ${wrapJSDocString(resource.description || resource.name)}
27
+ * @url ${joinPath(ctx.serviceUrl, '$metadata/resources/' + resource.name)}
28
+ */`;
29
+ if (resource instanceof CollectionResourceInfo) {
30
+ serviceTs.addImport('@opra/client', 'HttpCollectionService');
31
+ serviceTs.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
32
+ const methods = resource.getHandlerNames()
33
+ .filter(x => x !== 'count')
34
+ .map(x => `'${x}'`).join(' | ');
35
+ serviceTs.content += `
36
+ get ${resource.name}(): Pick<HttpCollectionService<${resource.dataType.name}, never>, ${methods}> {
37
+ return this[kClient].collection('${resource.name}');
38
+ }\n`;
39
+ }
40
+ else if (resource instanceof SingletonResourceInfo) {
41
+ serviceTs.addImport('@opra/client', 'HttpSingletonService');
42
+ serviceTs.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
43
+ const methods = resource.getHandlerNames()
44
+ .map(x => `'${x}'`).join(' | ');
45
+ serviceTs.content += `
46
+ get ${resource.name}(): Pick<HttpSingletonService<${resource.dataType.name}, never>, ${methods}> {
47
+ return this[kClient].singleton('${resource.name}');
48
+ }\n`;
49
+ }
50
+ }
51
+ serviceTs.content += `
52
+ }\n`;
53
+ await serviceTs.writeFile(ctx, path.join(targetDir, ctx.name + '.ts'));
54
+ }
@@ -1,2 +1,2 @@
1
1
  import { ServiceGenerationContext } from '../interfaces/service-generation-context.interface.js';
2
- export declare function generateTypes(ctx: ServiceGenerationContext): Promise<void>;
2
+ export declare function processTypes(ctx: ServiceGenerationContext): Promise<void>;
@@ -11,9 +11,9 @@ const builtinsMap = {
11
11
  integer: 'number',
12
12
  date: 'Date'
13
13
  };
14
- export async function generateTypes(ctx) {
14
+ export async function processTypes(ctx) {
15
15
  const targetDir = path.join(ctx.absoluteDir, 'types');
16
- ctx.logger.log(chalk.yellow('Generating types'));
16
+ ctx.logger.log(chalk.yellow('Processing types'));
17
17
  const typesTs = new TsFile();
18
18
  typesTs.header = ctx.fileHeader;
19
19
  let i = 0;
package/esm/oprimp.js CHANGED
@@ -4,8 +4,6 @@ import * as console from 'console';
4
4
  import * as fs from 'fs';
5
5
  import path from 'path';
6
6
  import * as process from 'process';
7
- import { OpraHttpClient } from '@opra/node-client';
8
- import { deleteFiles } from './oprimp/delete-files.js';
9
7
  import { generateService } from './oprimp/generate-service.js';
10
8
  import { getCallerFile } from './utils/get-caller-file.util.js';
11
9
  const pkgJson = JSON.parse(fs.readFileSync(path.resolve(path.dirname(getCallerFile()), '../package.json'), 'utf-8'));
@@ -13,22 +11,17 @@ program
13
11
  .version(pkgJson.version)
14
12
  .argument('<serviceUrl>', 'OPRA service url')
15
13
  .argument('<outDir>', 'Output directory')
14
+ .option('--name <name>', 'Name of the service')
15
+ .option('--ext', 'Adds js extension to imports')
16
16
  .option('--no-color', 'Disables colors in logs messages')
17
- .option('-e, --extension <extension>', 'File extensions of imports')
18
17
  .action(async (serviceUrl, outDir, options) => {
19
18
  if (!options.color)
20
19
  chalk.level = 0;
21
- console.log(chalk.yellow('Fetching service metadata from'), chalk.whiteBright(serviceUrl));
22
- const client = await OpraHttpClient.create(serviceUrl);
23
- const metadata = client.metadata;
24
- console.log(chalk.yellow('Retrieved service info:'), chalk.whiteBright(metadata.info.title), '-', chalk.whiteBright(metadata.info.version));
25
- console.log(chalk.yellow('Removing old files..'));
26
- deleteFiles(outDir);
27
20
  await generateService({
28
21
  serviceUrl,
29
- document: metadata,
30
22
  outDir,
31
- extension: (options.extension ? '.' + options.extension : ''),
23
+ name: options.name,
24
+ extension: (options.ext ? '.js' : ''),
32
25
  fileHeader: '/*\n' +
33
26
  ' * Generated by OPRA Service Generator \n' +
34
27
  ' * Version: ' + pkgJson.version + '\n' +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opra/cli",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Opra CLI tools",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
@@ -28,10 +28,11 @@
28
28
  "clean:cover": "rimraf ../../coverage/client"
29
29
  },
30
30
  "dependencies": {
31
- "@opra/node-client": "^0.13.0",
31
+ "@opra/node-client": "^0.14.0",
32
32
  "chalk": "^5.2.0",
33
33
  "commander": "^10.0.0",
34
34
  "putil-flattentext": "^2.1.1",
35
+ "putil-varhelpers": "^1.6.5",
35
36
  "js-string-escape": "^1.0.1"
36
37
  },
37
38
  "devDependencies": {},
@@ -1,72 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateResources = void 0;
4
- const tslib_1 = require("tslib");
5
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
- const fs_1 = tslib_1.__importDefault(require("fs"));
7
- const path_1 = tslib_1.__importDefault(require("path"));
8
- const common_1 = require("@opra/common");
9
- const string_utils_js_1 = require("../utils/string-utils.js");
10
- const ts_file_js_1 = require("../utils/ts-file.js");
11
- async function generateResources(ctx) {
12
- const targetDir = path_1.default.join(ctx.absoluteDir, 'resources');
13
- ctx.logger.log(chalk_1.default.yellow('Generating resources'));
14
- const resourcesTs = new ts_file_js_1.TsFile();
15
- resourcesTs.header = ctx.fileHeader;
16
- let i = 0;
17
- fs_1.default.mkdirSync(targetDir, { recursive: true });
18
- const resourceNames = Array.from(ctx.document.resources.keys()).sort();
19
- for (const resourceName of resourceNames) {
20
- const resource = ctx.document.getResource(resourceName);
21
- const tsFile = new ts_file_js_1.TsFile();
22
- tsFile.header = ctx.fileHeader;
23
- tsFile.content = `\n/**\n * ${(0, string_utils_js_1.wrapJSDocString)(resource.description || resource.name)}
24
- * @type ${resource.name}
25
- * @kind ${resource.kind}
26
- * @url ${(0, common_1.joinPath)(ctx.serviceUrl, '$metadata/resources/' + resource.name)}
27
- */\n`;
28
- const filename = `./resources/${resource.name}`;
29
- if (resource instanceof common_1.CollectionResourceInfo) {
30
- await generateCollectionResource(ctx, resource, tsFile);
31
- await tsFile.writeFile(ctx, path_1.default.join(targetDir, resource.name + '.ts'));
32
- resourcesTs.addExport(`${filename}` + ctx.extension);
33
- i++;
34
- }
35
- else if (resource instanceof common_1.SingletonResourceInfo) {
36
- await generateSingletonResource(ctx, resource, tsFile);
37
- await tsFile.writeFile(ctx, path_1.default.join(targetDir, resource.name + '.ts'));
38
- resourcesTs.addExport(`${filename}${ctx.extension}`);
39
- i++;
40
- }
41
- }
42
- if (i) {
43
- await resourcesTs.writeFile(ctx, path_1.default.join(ctx.absoluteDir, 'resources.ts'));
44
- }
45
- }
46
- exports.generateResources = generateResources;
47
- async function generateCollectionResource(ctx, resource, tsFile) {
48
- tsFile.header = ctx.fileHeader;
49
- tsFile.addImport('@opra/client', 'OpraHttpClient', 'HttpCollectionService');
50
- tsFile.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
51
- const methods = resource.getHandlerNames()
52
- .filter(x => x !== 'count')
53
- .map(x => `'${x}'`).join(' | ');
54
- tsFile.content = `
55
- export function ${resource.name}(
56
- client: OpraHttpClient
57
- ): Pick<HttpCollectionService<${resource.dataType.name}, never>, ${methods}> {
58
- return client.collection('${resource.name}');
59
- }
60
- `;
61
- }
62
- async function generateSingletonResource(ctx, resource, tsFile) {
63
- tsFile.header = ctx.fileHeader;
64
- tsFile.addImport('@opra/client', 'OpraHttpClient', 'HttpSingletonService');
65
- tsFile.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
66
- const methods = resource.getHandlerNames().map(x => `'${x}'`).join(' | ');
67
- tsFile.content = `
68
- export function ${resource.name}(client: OpraHttpClient): Pick<HttpSingletonService<${resource.dataType.name}, never>, ${methods}> {
69
- return client.singleton('${resource.name}');
70
- }
71
- `;
72
- }
@@ -1,67 +0,0 @@
1
- import chalk from 'chalk';
2
- import fs from 'fs';
3
- import path from 'path';
4
- import { CollectionResourceInfo, joinPath, SingletonResourceInfo } from '@opra/common';
5
- import { wrapJSDocString } from '../utils/string-utils.js';
6
- import { TsFile } from '../utils/ts-file.js';
7
- export async function generateResources(ctx) {
8
- const targetDir = path.join(ctx.absoluteDir, 'resources');
9
- ctx.logger.log(chalk.yellow('Generating resources'));
10
- const resourcesTs = new TsFile();
11
- resourcesTs.header = ctx.fileHeader;
12
- let i = 0;
13
- fs.mkdirSync(targetDir, { recursive: true });
14
- const resourceNames = Array.from(ctx.document.resources.keys()).sort();
15
- for (const resourceName of resourceNames) {
16
- const resource = ctx.document.getResource(resourceName);
17
- const tsFile = new TsFile();
18
- tsFile.header = ctx.fileHeader;
19
- tsFile.content = `\n/**\n * ${wrapJSDocString(resource.description || resource.name)}
20
- * @type ${resource.name}
21
- * @kind ${resource.kind}
22
- * @url ${joinPath(ctx.serviceUrl, '$metadata/resources/' + resource.name)}
23
- */\n`;
24
- const filename = `./resources/${resource.name}`;
25
- if (resource instanceof CollectionResourceInfo) {
26
- await generateCollectionResource(ctx, resource, tsFile);
27
- await tsFile.writeFile(ctx, path.join(targetDir, resource.name + '.ts'));
28
- resourcesTs.addExport(`${filename}` + ctx.extension);
29
- i++;
30
- }
31
- else if (resource instanceof SingletonResourceInfo) {
32
- await generateSingletonResource(ctx, resource, tsFile);
33
- await tsFile.writeFile(ctx, path.join(targetDir, resource.name + '.ts'));
34
- resourcesTs.addExport(`${filename}${ctx.extension}`);
35
- i++;
36
- }
37
- }
38
- if (i) {
39
- await resourcesTs.writeFile(ctx, path.join(ctx.absoluteDir, 'resources.ts'));
40
- }
41
- }
42
- async function generateCollectionResource(ctx, resource, tsFile) {
43
- tsFile.header = ctx.fileHeader;
44
- tsFile.addImport('@opra/client', 'OpraHttpClient', 'HttpCollectionService');
45
- tsFile.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
46
- const methods = resource.getHandlerNames()
47
- .filter(x => x !== 'count')
48
- .map(x => `'${x}'`).join(' | ');
49
- tsFile.content = `
50
- export function ${resource.name}(
51
- client: OpraHttpClient
52
- ): Pick<HttpCollectionService<${resource.dataType.name}, never>, ${methods}> {
53
- return client.collection('${resource.name}');
54
- }
55
- `;
56
- }
57
- async function generateSingletonResource(ctx, resource, tsFile) {
58
- tsFile.header = ctx.fileHeader;
59
- tsFile.addImport('@opra/client', 'OpraHttpClient', 'HttpSingletonService');
60
- tsFile.addImport('../types/' + resource.dataType.name + ctx.extension, resource.dataType.name);
61
- const methods = resource.getHandlerNames().map(x => `'${x}'`).join(' | ');
62
- tsFile.content = `
63
- export function ${resource.name}(client: OpraHttpClient): Pick<HttpSingletonService<${resource.dataType.name}, never>, ${methods}> {
64
- return client.singleton('${resource.name}');
65
- }
66
- `;
67
- }