Skip to content

Commit

Permalink
fix: fn call logic fix
Browse files Browse the repository at this point in the history
  • Loading branch information
lvqq committed Sep 6, 2022
1 parent eed0500 commit 27e5cea
Show file tree
Hide file tree
Showing 11 changed files with 139 additions and 93 deletions.
23 changes: 23 additions & 0 deletions __tests__/core.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { describe, test, expect } from '@jest/globals';
import path from 'node:path';
import { generateOptionsAndSwagger } from '../src/core';

const cwd = process.cwd();
const url = path.resolve(cwd, './__tests__/input/swagger.json');

describe('core_test', () => {
test('generate_swagger_options', async () => {
const result = await generateOptionsAndSwagger({
url,
});
expect(result).toBeDefined();
});

test('generate_swagger_rcconfig', async () => {
const result = await generateOptionsAndSwagger({
url,
useRcConfig: true,
});
expect(result).toBeDefined();
});
});
78 changes: 2 additions & 76 deletions bin/aries.ts
Original file line number Diff line number Diff line change
@@ -1,83 +1,9 @@
#!/usr/bin/env node
import { program } from 'commander';
import { version } from '../package.json';
import { toTs, toMd, toMock, mockServer, toRequest } from '../src';
import { createProgram } from './command';

process.on('unhandledRejection', (err) => {
throw err;
});

program.version(version).usage('<command> [options]');

program.arguments('<command>').action(() => {
program.outputHelp();
});

program
.command('to-ts')
.description('Convert swagger to typescript declaration')
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.types.ts')
.option(
'--no-autoRequired',
'Do not generate the property as required automatically when there is no required array in definitions'
)
.action(async (options) => {
await toTs(options);
});

program
.command('to-request')
.description(
'Convert swagger to request function, generate <output> file and <output>.types file'
)
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.request.ts')
.option(
'--no-autoRequired',
'Do not generate the property as required automatically when there is no required array in definitions'
)
.action(async (options) => {
await toRequest(options);
});

program
.command('to-md')
.description('Convert swagger to markdown docs')
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.docs.md')
.option(
'--no-autoMock',
'Do not generate the mock samples automatically when there is no example in schema'
)
.action(async (options) => {
await toMd(options);
});

program
.command('to-mock')
.description('Convert swagger to mock json')
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.mock.json')
.option(
'--no-autoMock',
'Do not generate the mock response automatically when there is no example in schema'
)
.action(async (options) => {
await toMock(options);
});

program
.command('mock-server')
.description('Start a local server to return the mock interface')
.option('-u, --url <url>', 'Swagger link, support relative path or remote url')
.option('-p, --port <port>', 'Mock server port', '3000')
.option(
'--no-autoMock',
'Do not generate the mock response automatically when there is no example in schema'
)
.action(async (options) => {
await mockServer(options);
});

const program = createProgram();
program.parse(process.argv);
85 changes: 85 additions & 0 deletions bin/command.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { Command } from 'commander';
import * as pkg from '../package.json';
import { toTs, toRequest, toMd, toMock, mockServer } from '../src';

const createProgram = () => {
const program = new Command();

program.version(pkg.version);
program.usage('<command> [options]');

program.arguments('<command>').action(() => {
program.outputHelp();
});

program
.command('to-ts')
.description('Convert swagger to typescript declaration')
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.types.ts')
.option(
'--no-autoRequired',
'Do not generate the property as required automatically when there is no required array in definitions'
)
.action(async (options) => {
await toTs(options, true);
});

program
.command('to-request')
.description(
'Convert swagger to request function, generate <output> file and <output>.types file'
)
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.request.ts')
.option(
'--no-autoRequired',
'Do not generate the property as required automatically when there is no required array in definitions'
)
.action(async (options) => {
await toRequest(options, true);
});

program
.command('to-md')
.description('Convert swagger to markdown docs')
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.docs.md')
.option(
'--no-autoMock',
'Do not generate the mock samples automatically when there is no example in schema'
)
.action(async (options) => {
await toMd(options, true);
});

program
.command('to-mock')
.description('Convert swagger to mock json')
.option('-u, --url <url>', 'Swagger link to generate, support relative path or remote url')
.option('-o --output <output>', 'Specify output file path', './swagger.mock.json')
.option(
'--no-autoMock',
'Do not generate the mock response automatically when there is no example in schema'
)
.action(async (options) => {
await toMock(options, true);
});

program
.command('mock-server')
.description('Start a local server to return the mock interface')
.option('-u, --url <url>', 'Swagger link, support relative path or remote url')
.option('-p, --port <port>', 'Mock server port', '3000')
.option(
'--no-autoMock',
'Do not generate the mock response automatically when there is no example in schema'
)
.action(async (options) => {
await mockServer(options, true);
});

return program;
};

export { createProgram };
3 changes: 2 additions & 1 deletion jest.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ const config = {
},
verbose: true,
injectGlobals: true,
testMatch: ['**/__tests__/**/server.test.[jt]s'],
testMatch: ['**/__tests__/**/*.test.[jt]s'],
testPathIgnorePatterns: ['/__tests__/output/'],
collectCoverage: false,
collectCoverageFrom: ['./src/**/*'],
coverageDirectory: './coverage',
maxWorkers: 10,
};

export default config;
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@
"build": "rimraf dist && tsup --sourcemap",
"build:production": "rimraf dist && tsup --treeshake",
"prepare": "husky install",
"prepublish": "pnpm build:production",
"prepublish": "pnpm typecheck && pnpm build:production",
"typecheck": "tsc",
"lint": "eslint --fix --quiet --ext .ts src bin",
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --silent",
"test:ci": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
"test-gen:ts": "aries to-ts -o ./dev/typescript.dev.ts",
"test-gen:request": "aries to-request -o ./dev/request.dev.ts",
"test-gen:md": "aries to-md -o ./dev/markdown.dev.md",
"test-gen:mock": "aries to-mock -o ./dev/mock.dev.json",
"test-gen:mockserver": "aries mock-server"
"test-dev:ts": "aries to-ts -o ./dev/typescript.dev.ts",
"test-dev:request": "aries to-request -o ./dev/request.dev.ts",
"test-dev:md": "aries to-md -o ./dev/markdown.dev.md",
"test-dev:mock": "aries to-mock -o ./dev/mock.dev.json",
"test-dev:mockserver": "aries mock-server"
},
"repository": {
"type": "git",
Expand Down
12 changes: 8 additions & 4 deletions src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { DEFAULT_CONFIG_FILES, DEFAULT_CONFIG_OPTION_TRUE } from '../constants';
const cwd = process.cwd();
const _require = import.meta.url ? createRequire(import.meta.url) : require;
const dynamicImport = new Function('file', 'return import(file)');
type OptionalConfig = Partial<AriesConfig>;
export type OptionalConfig = Partial<AriesConfig>;

const loadConfigFromBundle = async (
fileName: string,
Expand Down Expand Up @@ -125,8 +125,12 @@ const __dirname = path.dirname(__filename);
* generate swagger json and config from command options
* @param {*} options command options
*/
export const generateOptionsAndSwagger = async (options: OptionalConfig) => {
const params = await mergeOptionsFromRc(options);
export const generateOptionsAndSwagger = async (
options: OptionalConfig & { useRcConfig?: boolean }
) => {
// use config from .ariesrc, default is true
const { useRcConfig } = options;
const params = useRcConfig ? await mergeOptionsFromRc(options) : options;
const { url } = params;
// validate url
if (!url) {
Expand Down Expand Up @@ -171,7 +175,7 @@ export const generateOptionsAndSwagger = async (options: OptionalConfig) => {
*/
export const generateOutputByPlugin = async (
fn: Plugin.Function,
options: OptionalConfig
options: OptionalConfig & { useRcConfig?: boolean }
): Promise<void> => {
let params: Plugin.Params;
let spinner = ora(chalk.blueBright('Fetch swagger json start')).start();
Expand Down
7 changes: 5 additions & 2 deletions src/mock-server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@ export type MockServerReturns = Partial<{
app: Express;
}>;

export const mockServer = async (originOptions: MockServerOptions): Promise<MockServerReturns> => {
export const mockServer = async (
originOptions: MockServerOptions,
useRcConfig = false
): Promise<MockServerReturns> => {
let params;
try {
params = await generateOptionsAndSwagger(originOptions);
params = await generateOptionsAndSwagger({ ...originOptions, useRcConfig });
if (params) {
// parse swagger
const { swagger, options } = params;
Expand Down
3 changes: 2 additions & 1 deletion src/to-md/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,5 @@ export const genMd: Plugin.Function = ({ swagger, options }) => {

export type ToMdOptions = Pick<AriesConfig, 'url' | 'output' | 'autoMock' | 'formatMock'>;

export const toMd = async (options: ToMdOptions) => generateOutputByPlugin(genMd, options);
export const toMd = async (options: ToMdOptions, useRcConfig = false) =>
generateOutputByPlugin(genMd, { ...options, useRcConfig });
3 changes: 2 additions & 1 deletion src/to-mock/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ export const genMock: Plugin.Function = ({ swagger, options }) => {

export type ToMockOptions = Pick<AriesConfig, 'url' | 'output' | 'autoMock' | 'formatMock'>;

export const toMock = async (options: ToMockOptions) => generateOutputByPlugin(genMock, options);
export const toMock = async (options: ToMockOptions, useRcConfig = false) =>
generateOutputByPlugin(genMock, { ...options, useRcConfig });
3 changes: 2 additions & 1 deletion src/to-request/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,5 @@ export const genRequest: Plugin.Function = async ({ swagger, options }) => {

export type ToRequestOptions = Pick<AriesConfig, 'url' | 'output' | 'autoRequired' | 'formatProp'>;

export const toRequest = (options: ToRequestOptions) => generateOutputByPlugin(genRequest, options);
export const toRequest = (options: ToRequestOptions, useRcConfig = false) =>
generateOutputByPlugin(genRequest, { ...options, useRcConfig });
3 changes: 2 additions & 1 deletion src/to-ts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@ export const genTs: Plugin.Function = async ({ swagger, options }) => {

export type ToTsOptions = Pick<AriesConfig, 'url' | 'output' | 'autoRequired' | 'formatProp'>;

export const toTs = (options: ToTsOptions) => generateOutputByPlugin(genTs, options);
export const toTs = (options: ToTsOptions, useRcConfig = false) =>
generateOutputByPlugin(genTs, { ...options, useRcConfig });

0 comments on commit 27e5cea

Please sign in to comment.