@7nohe/openapi-react-query-codegen 0.1.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/README.md +97 -0
- package/dist/node_modules/.bin/openapi +17 -0
- package/dist/node_modules/.bin/tsc +17 -0
- package/dist/node_modules/.bin/tsserver +17 -0
- package/dist/package.json +45 -0
- package/dist/src/cli.js +20 -0
- package/dist/src/common.js +11 -0
- package/dist/src/createExports.js +74 -0
- package/dist/src/createImports.js +57 -0
- package/dist/src/createSource.js +44 -0
- package/dist/src/createUseMutation.js +41 -0
- package/dist/src/createUseQuery.js +81 -0
- package/dist/src/generate.js +67 -0
- package/dist/src/print.js +22 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# OpenAPI React Query Codegen
|
|
2
|
+
|
|
3
|
+
> Node.js library that generates [React Query (also called TanStack Query)](https://tanstack.com/query) hooks based on an OpenAPI specification file.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Supports generation of custom react hooks that use React Query's `useQuery` and `useMutation` hooks
|
|
8
|
+
- Supports the option to use pure TypeScript clients generated by [OpenAPI Typescript Codegen](https://github.com/ferdikoomen/openapi-typescript-codegen)
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
$ npm install -D @7nohe/openapi-react-query-codegen
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
$ openapi-rq --help
|
|
20
|
+
|
|
21
|
+
Usage: openapi-rq [options]
|
|
22
|
+
|
|
23
|
+
Generate React Query code based on OpenAPI
|
|
24
|
+
|
|
25
|
+
Options:
|
|
26
|
+
-V, --version output the version number
|
|
27
|
+
-p, --path <path> Path to OpenAPI file
|
|
28
|
+
-o, --output-dir [directory] Directory to output the generated package (default: "openapi")
|
|
29
|
+
-h, --help display help for command
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Example Usage
|
|
33
|
+
|
|
34
|
+
### Command
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
$ openapi-rq -p ./petstore.yaml
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Output directory structure
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
- openapi
|
|
44
|
+
- queries
|
|
45
|
+
- index.ts <- custom react hooks
|
|
46
|
+
- requests <- output code generated by OpenAPI Typescript Codegen
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### In your app
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
// App.tsx
|
|
53
|
+
import {
|
|
54
|
+
usePetServiceFindPetsByStatus,
|
|
55
|
+
} from "../openapi/queries";
|
|
56
|
+
function App() {
|
|
57
|
+
const { data } = usePetServiceFindPetsByStatus({ status: ["available"] });
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<div className="App">
|
|
61
|
+
<h1>Pet List</h1>
|
|
62
|
+
<ul>
|
|
63
|
+
{data?.map((pet) => (
|
|
64
|
+
<li key={pet.id}>{pet.name}</li>
|
|
65
|
+
))}
|
|
66
|
+
</ul>
|
|
67
|
+
</div>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default App;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
You can also use pure TS clients.
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
import { useQuery } from "@tanstack/react-query";
|
|
78
|
+
import { PetService } from '../openapi/requests/services/PetService';
|
|
79
|
+
function App() {
|
|
80
|
+
const { data } = useQuery(['MyKey'], () => {
|
|
81
|
+
// Do something here
|
|
82
|
+
|
|
83
|
+
return PetService.findPetsByStatus(['available']);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<div className="App">
|
|
88
|
+
{/* .... */}
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export default App;
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## License
|
|
97
|
+
MIT
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
|
6
|
+
esac
|
|
7
|
+
|
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
|
9
|
+
export NODE_PATH="/Users/daiki/Documents/openapi-react-query-codegen/node_modules/.pnpm/node_modules"
|
|
10
|
+
else
|
|
11
|
+
export NODE_PATH="$NODE_PATH:/Users/daiki/Documents/openapi-react-query-codegen/node_modules/.pnpm/node_modules"
|
|
12
|
+
fi
|
|
13
|
+
if [ -x "$basedir/node" ]; then
|
|
14
|
+
exec "$basedir/node" "$basedir/../../../node_modules/.pnpm/openapi-typescript-codegen@0.23.0/node_modules/openapi-typescript-codegen/bin/index.js" "$@"
|
|
15
|
+
else
|
|
16
|
+
exec node "$basedir/../../../node_modules/.pnpm/openapi-typescript-codegen@0.23.0/node_modules/openapi-typescript-codegen/bin/index.js" "$@"
|
|
17
|
+
fi
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
|
6
|
+
esac
|
|
7
|
+
|
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
|
9
|
+
export NODE_PATH="/Users/daiki/Documents/openapi-react-query-codegen/node_modules/.pnpm/node_modules"
|
|
10
|
+
else
|
|
11
|
+
export NODE_PATH="$NODE_PATH:/Users/daiki/Documents/openapi-react-query-codegen/node_modules/.pnpm/node_modules"
|
|
12
|
+
fi
|
|
13
|
+
if [ -x "$basedir/node" ]; then
|
|
14
|
+
exec "$basedir/node" "$basedir/../../../node_modules/.pnpm/typescript@4.7.4/node_modules/typescript/bin/tsc" "$@"
|
|
15
|
+
else
|
|
16
|
+
exec node "$basedir/../../../node_modules/.pnpm/typescript@4.7.4/node_modules/typescript/bin/tsc" "$@"
|
|
17
|
+
fi
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
|
6
|
+
esac
|
|
7
|
+
|
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
|
9
|
+
export NODE_PATH="/Users/daiki/Documents/openapi-react-query-codegen/node_modules/.pnpm/node_modules"
|
|
10
|
+
else
|
|
11
|
+
export NODE_PATH="$NODE_PATH:/Users/daiki/Documents/openapi-react-query-codegen/node_modules/.pnpm/node_modules"
|
|
12
|
+
fi
|
|
13
|
+
if [ -x "$basedir/node" ]; then
|
|
14
|
+
exec "$basedir/node" "$basedir/../../../node_modules/.pnpm/typescript@4.7.4/node_modules/typescript/bin/tsserver" "$@"
|
|
15
|
+
else
|
|
16
|
+
exec node "$basedir/../../../node_modules/.pnpm/typescript@4.7.4/node_modules/typescript/bin/tsserver" "$@"
|
|
17
|
+
fi
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@7nohe/openapi-react-query-codegen",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenAPI React Query Codegen",
|
|
5
|
+
"bin": {
|
|
6
|
+
"openapi-rq": "src/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc -p tsconfig.json",
|
|
10
|
+
"preview": "npm run build && npm -C examples/react-app run generate:api",
|
|
11
|
+
"prepublishOnly": "npm run build",
|
|
12
|
+
"release": "npx git-ensure -a && npx bumpp --commit --tag --push"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/7nohe/openapi-react-query-codegen.git"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/7nohe/openapi-react-query-codegen",
|
|
19
|
+
"bugs": "https://github.com/7nohe/openapi-react-query-codegen/issues",
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"keywords": [
|
|
24
|
+
"codegen",
|
|
25
|
+
"react-query",
|
|
26
|
+
"react",
|
|
27
|
+
"openapi",
|
|
28
|
+
"swagger",
|
|
29
|
+
"typescript",
|
|
30
|
+
"openapi-typescript-codegen"
|
|
31
|
+
],
|
|
32
|
+
"author": "Daiki Urata (@7nohe)",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"commander": "^9.4.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/glob": "^7.2.0",
|
|
39
|
+
"@types/node": "^18.0.6",
|
|
40
|
+
"glob": "^8.0.3",
|
|
41
|
+
"openapi-types": "^12.0.0",
|
|
42
|
+
"openapi-typescript-codegen": "^0.23.0",
|
|
43
|
+
"typescript": "^4.7.4"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
exports.__esModule = true;
|
|
7
|
+
var generate_1 = require("./generate");
|
|
8
|
+
var commander_1 = require("commander");
|
|
9
|
+
var package_json_1 = __importDefault(require("../package.json"));
|
|
10
|
+
var program = new commander_1.Command();
|
|
11
|
+
program
|
|
12
|
+
.name('openapi-rq')
|
|
13
|
+
.version(package_json_1["default"].version)
|
|
14
|
+
.description("Generate React Query code based on OpenAPI")
|
|
15
|
+
.requiredOption("-p, --path <path>", "Path to OpenAPI file")
|
|
16
|
+
.option("-o, --output-dir [directory]", "Directory to output the generated package", "openapi")
|
|
17
|
+
.parse();
|
|
18
|
+
var options = program.opts();
|
|
19
|
+
console.log("Generating React Query code using OpenApi file ".concat(options.path));
|
|
20
|
+
(0, generate_1.generate)(options);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
exports.__esModule = true;
|
|
3
|
+
exports.lowercaseFirstLetter = exports.capitalizeFirstLetter = void 0;
|
|
4
|
+
var capitalizeFirstLetter = function (str) {
|
|
5
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
6
|
+
};
|
|
7
|
+
exports.capitalizeFirstLetter = capitalizeFirstLetter;
|
|
8
|
+
var lowercaseFirstLetter = function (str) {
|
|
9
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
10
|
+
};
|
|
11
|
+
exports.lowercaseFirstLetter = lowercaseFirstLetter;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
+
if (ar || !(i in from)) {
|
|
21
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
+
ar[i] = from[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
+
};
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
exports.__esModule = true;
|
|
31
|
+
exports.createExports = void 0;
|
|
32
|
+
var typescript_1 = __importDefault(require("typescript"));
|
|
33
|
+
var glob_1 = __importDefault(require("glob"));
|
|
34
|
+
var path_1 = require("path");
|
|
35
|
+
var fs_1 = __importDefault(require("fs"));
|
|
36
|
+
var createUseQuery_1 = require("./createUseQuery");
|
|
37
|
+
var createUseMutation_1 = require("./createUseMutation");
|
|
38
|
+
var createExports = function (generatedClientsPath) {
|
|
39
|
+
var services = glob_1["default"].sync("".concat(generatedClientsPath, "/services/*.ts"));
|
|
40
|
+
var nodes = services.map(function (servicePath) {
|
|
41
|
+
return typescript_1["default"].createSourceFile(servicePath, // fileName
|
|
42
|
+
fs_1["default"].readFileSync((0, path_1.join)(process.cwd(), servicePath), "utf8"), typescript_1["default"].ScriptTarget.Latest // langugeVersion
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
return __spreadArray([], __read(nodes
|
|
46
|
+
.map(function (node) {
|
|
47
|
+
var _a;
|
|
48
|
+
var klass = node
|
|
49
|
+
.getChildren()[0]
|
|
50
|
+
.getChildren()
|
|
51
|
+
.find(function (child) { return child.kind === typescript_1["default"].SyntaxKind.ClassDeclaration; });
|
|
52
|
+
var className = (_a = klass.name) === null || _a === void 0 ? void 0 : _a.getText(node);
|
|
53
|
+
var methods = klass.members.filter(function (node) { return node.kind === typescript_1["default"].SyntaxKind.MethodDeclaration; });
|
|
54
|
+
return methods
|
|
55
|
+
.map(function (method) {
|
|
56
|
+
var _a, _b, _c;
|
|
57
|
+
var methodName = (_a = method.name) === null || _a === void 0 ? void 0 : _a.getText(node);
|
|
58
|
+
var methodBlock = method
|
|
59
|
+
.getChildren(node)
|
|
60
|
+
.find(function (child) { return child.kind === typescript_1["default"].SyntaxKind.Block; });
|
|
61
|
+
var returnStatement = methodBlock.statements.find(function (s) { return s.kind === typescript_1["default"].SyntaxKind.ReturnStatement; });
|
|
62
|
+
var callExpression = returnStatement.expression;
|
|
63
|
+
var properties = callExpression.arguments[1].properties;
|
|
64
|
+
var httpMethodName = (_c = (_b = properties
|
|
65
|
+
.find(function (p) { var _a; return ((_a = p.name) === null || _a === void 0 ? void 0 : _a.getText(node)) === "method"; })) === null || _b === void 0 ? void 0 : _b.initializer) === null || _c === void 0 ? void 0 : _c.getText(node);
|
|
66
|
+
return httpMethodName === "'GET'"
|
|
67
|
+
? (0, createUseQuery_1.createUseQuery)(node, className, method)
|
|
68
|
+
: (0, createUseMutation_1.createUseMutation)(node, className, method);
|
|
69
|
+
})
|
|
70
|
+
.flat();
|
|
71
|
+
})
|
|
72
|
+
.flat()), false);
|
|
73
|
+
};
|
|
74
|
+
exports.createExports = createExports;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
+
if (ar || !(i in from)) {
|
|
21
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
+
ar[i] = from[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
+
};
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
exports.__esModule = true;
|
|
31
|
+
exports.createImports = void 0;
|
|
32
|
+
var typescript_1 = __importDefault(require("typescript"));
|
|
33
|
+
var glob_1 = __importDefault(require("glob"));
|
|
34
|
+
var path_1 = require("path");
|
|
35
|
+
var createImports = function (generatedClientsPath) {
|
|
36
|
+
var models = glob_1["default"].sync("".concat(generatedClientsPath, "/models/*.ts"));
|
|
37
|
+
var services = glob_1["default"].sync("".concat(generatedClientsPath, "/services/*.ts"));
|
|
38
|
+
return __spreadArray(__spreadArray([
|
|
39
|
+
typescript_1["default"].factory.createImportDeclaration(undefined, undefined, typescript_1["default"].factory.createImportClause(false, undefined, typescript_1["default"].factory.createNamedImports([
|
|
40
|
+
typescript_1["default"].factory.createImportSpecifier(false, undefined, typescript_1["default"].factory.createIdentifier("useQuery")),
|
|
41
|
+
typescript_1["default"].factory.createImportSpecifier(false, undefined, typescript_1["default"].factory.createIdentifier("useMutation")),
|
|
42
|
+
typescript_1["default"].factory.createImportSpecifier(false, undefined, typescript_1["default"].factory.createIdentifier("UseQueryOptions")),
|
|
43
|
+
typescript_1["default"].factory.createImportSpecifier(false, undefined, typescript_1["default"].factory.createIdentifier("UseMutationOptions")),
|
|
44
|
+
])), typescript_1["default"].factory.createStringLiteral("@tanstack/react-query"), undefined)
|
|
45
|
+
], __read(models.map(function (model) {
|
|
46
|
+
var modelName = model.split("/").pop().split(".")[0];
|
|
47
|
+
return typescript_1["default"].factory.createImportDeclaration(undefined, undefined, typescript_1["default"].factory.createImportClause(false, undefined, typescript_1["default"].factory.createNamedImports([
|
|
48
|
+
typescript_1["default"].factory.createImportSpecifier(false, undefined, typescript_1["default"].factory.createIdentifier(modelName)),
|
|
49
|
+
])), typescript_1["default"].factory.createStringLiteral((0, path_1.join)("../requests/models/", modelName)), undefined);
|
|
50
|
+
})), false), __read(services.map(function (service) {
|
|
51
|
+
var serviceName = service.split("/").pop().split(".")[0];
|
|
52
|
+
return typescript_1["default"].factory.createImportDeclaration(undefined, undefined, typescript_1["default"].factory.createImportClause(false, undefined, typescript_1["default"].factory.createNamedImports([
|
|
53
|
+
typescript_1["default"].factory.createImportSpecifier(false, undefined, typescript_1["default"].factory.createIdentifier(serviceName)),
|
|
54
|
+
])), typescript_1["default"].factory.createStringLiteral((0, path_1.join)("../requests/services", serviceName)), undefined);
|
|
55
|
+
})), false);
|
|
56
|
+
};
|
|
57
|
+
exports.createImports = createImports;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
+
if (ar || !(i in from)) {
|
|
21
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
+
ar[i] = from[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
+
};
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
exports.__esModule = true;
|
|
31
|
+
exports.createSource = void 0;
|
|
32
|
+
var typescript_1 = __importDefault(require("typescript"));
|
|
33
|
+
var createImports_1 = require("./createImports");
|
|
34
|
+
var createExports_1 = require("./createExports");
|
|
35
|
+
var createSourceFile = function (outputPath) {
|
|
36
|
+
return typescript_1["default"].factory.createSourceFile(__spreadArray(__spreadArray([], __read((0, createImports_1.createImports)(outputPath)), false), __read((0, createExports_1.createExports)(outputPath)), false), typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.EndOfFileToken), typescript_1["default"].NodeFlags.None);
|
|
37
|
+
};
|
|
38
|
+
var createSource = function (outputPath) {
|
|
39
|
+
var resultFile = typescript_1["default"].createSourceFile("index.ts", "", typescript_1["default"].ScriptTarget.Latest, false, typescript_1["default"].ScriptKind.TS);
|
|
40
|
+
var printer = typescript_1["default"].createPrinter({ newLine: typescript_1["default"].NewLineKind.LineFeed });
|
|
41
|
+
var result = printer.printNode(typescript_1["default"].EmitHint.Unspecified, createSourceFile(outputPath), resultFile);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
exports.createSource = createSource;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.createUseMutation = void 0;
|
|
7
|
+
var typescript_1 = __importDefault(require("typescript"));
|
|
8
|
+
var common_1 = require("./common");
|
|
9
|
+
var createUseMutation = function (node, className, method) {
|
|
10
|
+
var _a;
|
|
11
|
+
var methodName = (_a = method.name) === null || _a === void 0 ? void 0 : _a.getText(node);
|
|
12
|
+
return typescript_1["default"].factory.createVariableStatement([typescript_1["default"].factory.createModifier(typescript_1["default"].SyntaxKind.ExportKeyword)], typescript_1["default"].factory.createVariableDeclarationList([
|
|
13
|
+
typescript_1["default"].factory.createVariableDeclaration(typescript_1["default"].factory.createIdentifier("use".concat(className).concat((0, common_1.capitalizeFirstLetter)(methodName))), undefined, undefined, typescript_1["default"].factory.createArrowFunction(undefined, undefined, [
|
|
14
|
+
typescript_1["default"].factory.createParameterDeclaration(undefined, undefined, undefined, typescript_1["default"].factory.createIdentifier("options"), typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.QuestionToken), typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("Omit"), [
|
|
15
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("UseMutationOptions"), [
|
|
16
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("Awaited"), [
|
|
17
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("ReturnType"), [
|
|
18
|
+
typescript_1["default"].factory.createTypeQueryNode(typescript_1["default"].factory.createQualifiedName(typescript_1["default"].factory.createIdentifier(className), typescript_1["default"].factory.createIdentifier(methodName)), undefined),
|
|
19
|
+
]),
|
|
20
|
+
]),
|
|
21
|
+
typescript_1["default"].factory.createKeywordTypeNode(typescript_1["default"].SyntaxKind.UnknownKeyword),
|
|
22
|
+
method.parameters.length !== 0 ? typescript_1["default"].factory.createTypeLiteralNode(method.parameters.map(function (param) {
|
|
23
|
+
return typescript_1["default"].factory.createPropertySignature(undefined, typescript_1["default"].factory.createIdentifier(param.name.getText(node)), undefined, param.type);
|
|
24
|
+
})) : typescript_1["default"].factory.createKeywordTypeNode(typescript_1["default"].SyntaxKind.VoidKeyword),
|
|
25
|
+
typescript_1["default"].factory.createKeywordTypeNode(typescript_1["default"].SyntaxKind.UnknownKeyword),
|
|
26
|
+
]),
|
|
27
|
+
typescript_1["default"].factory.createLiteralTypeNode(typescript_1["default"].factory.createStringLiteral("mutationFn")),
|
|
28
|
+
]), undefined),
|
|
29
|
+
], undefined, typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.EqualsGreaterThanToken), typescript_1["default"].factory.createCallExpression(typescript_1["default"].factory.createIdentifier("useMutation"), undefined, [
|
|
30
|
+
typescript_1["default"].factory.createArrowFunction(undefined, undefined, method.parameters.length !== 0 ? [
|
|
31
|
+
typescript_1["default"].factory.createParameterDeclaration(undefined, undefined, undefined, typescript_1["default"].factory.createObjectBindingPattern(method.parameters.map(function (param) {
|
|
32
|
+
return typescript_1["default"].factory.createBindingElement(undefined, undefined, typescript_1["default"].factory.createIdentifier(param.name.getText(node)), undefined);
|
|
33
|
+
})), undefined, undefined, undefined),
|
|
34
|
+
] : [], undefined, typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.EqualsGreaterThanToken), typescript_1["default"].factory.createCallExpression(typescript_1["default"].factory.createPropertyAccessExpression(typescript_1["default"].factory.createIdentifier(className), typescript_1["default"].factory.createIdentifier(methodName)), undefined, method.parameters.map(function (params) {
|
|
35
|
+
return typescript_1["default"].factory.createIdentifier(params.name.getText(node));
|
|
36
|
+
}))),
|
|
37
|
+
typescript_1["default"].factory.createIdentifier("options"),
|
|
38
|
+
]))),
|
|
39
|
+
], typescript_1["default"].NodeFlags.Const));
|
|
40
|
+
};
|
|
41
|
+
exports.createUseMutation = createUseMutation;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
+
if (ar || !(i in from)) {
|
|
21
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
+
ar[i] = from[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
+
};
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
exports.__esModule = true;
|
|
31
|
+
exports.createUseQuery = void 0;
|
|
32
|
+
var typescript_1 = __importDefault(require("typescript"));
|
|
33
|
+
var common_1 = require("./common");
|
|
34
|
+
var createUseQuery = function (node, className, method) {
|
|
35
|
+
var _a;
|
|
36
|
+
var methodName = (_a = method.name) === null || _a === void 0 ? void 0 : _a.getText(node);
|
|
37
|
+
var requestParam = [];
|
|
38
|
+
if (method.parameters.length !== 0) {
|
|
39
|
+
requestParam.push(typescript_1["default"].factory.createParameterDeclaration(undefined, undefined, undefined, typescript_1["default"].factory.createObjectBindingPattern(method.parameters.map(function (param) {
|
|
40
|
+
return typescript_1["default"].factory.createBindingElement(undefined, undefined, typescript_1["default"].factory.createIdentifier(param.name.getText(node)), undefined);
|
|
41
|
+
})), undefined, typescript_1["default"].factory.createTypeLiteralNode(method.parameters.map(function (param) {
|
|
42
|
+
return typescript_1["default"].factory.createPropertySignature(undefined, typescript_1["default"].factory.createIdentifier(param.name.getText(node)), undefined, param.type);
|
|
43
|
+
})), undefined));
|
|
44
|
+
}
|
|
45
|
+
return typescript_1["default"].factory.createVariableStatement([typescript_1["default"].factory.createModifier(typescript_1["default"].SyntaxKind.ExportKeyword)], typescript_1["default"].factory.createVariableDeclarationList([
|
|
46
|
+
typescript_1["default"].factory.createVariableDeclaration(typescript_1["default"].factory.createIdentifier("use".concat(className).concat((0, common_1.capitalizeFirstLetter)(methodName))), undefined, undefined, typescript_1["default"].factory.createArrowFunction(undefined, undefined, __spreadArray(__spreadArray([], __read(requestParam), false), [
|
|
47
|
+
typescript_1["default"].factory.createParameterDeclaration(undefined, undefined, undefined, typescript_1["default"].factory.createIdentifier("queryKey"), undefined, typescript_1["default"].factory.createArrayTypeNode(typescript_1["default"].factory.createKeywordTypeNode(typescript_1["default"].SyntaxKind.StringKeyword)), typescript_1["default"].factory.createArrayLiteralExpression([], false)),
|
|
48
|
+
typescript_1["default"].factory.createParameterDeclaration(undefined, undefined, undefined, typescript_1["default"].factory.createIdentifier("options"), typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.QuestionToken), typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("Omit"), [
|
|
49
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("UseQueryOptions"), [
|
|
50
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("Awaited"), [
|
|
51
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("ReturnType"), [
|
|
52
|
+
typescript_1["default"].factory.createTypeQueryNode(typescript_1["default"].factory.createQualifiedName(typescript_1["default"].factory.createIdentifier(className), typescript_1["default"].factory.createIdentifier(methodName)), undefined),
|
|
53
|
+
]),
|
|
54
|
+
]),
|
|
55
|
+
typescript_1["default"].factory.createKeywordTypeNode(typescript_1["default"].SyntaxKind.UnknownKeyword),
|
|
56
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("Awaited"), [
|
|
57
|
+
typescript_1["default"].factory.createTypeReferenceNode(typescript_1["default"].factory.createIdentifier("ReturnType"), [
|
|
58
|
+
typescript_1["default"].factory.createTypeQueryNode(typescript_1["default"].factory.createQualifiedName(typescript_1["default"].factory.createIdentifier(className), typescript_1["default"].factory.createIdentifier(methodName)), undefined),
|
|
59
|
+
]),
|
|
60
|
+
]),
|
|
61
|
+
typescript_1["default"].factory.createArrayTypeNode(typescript_1["default"].factory.createKeywordTypeNode(typescript_1["default"].SyntaxKind.StringKeyword)),
|
|
62
|
+
]),
|
|
63
|
+
typescript_1["default"].factory.createUnionTypeNode([
|
|
64
|
+
typescript_1["default"].factory.createLiteralTypeNode(typescript_1["default"].factory.createStringLiteral("queryKey")),
|
|
65
|
+
typescript_1["default"].factory.createLiteralTypeNode(typescript_1["default"].factory.createStringLiteral("queryFn")),
|
|
66
|
+
typescript_1["default"].factory.createLiteralTypeNode(typescript_1["default"].factory.createStringLiteral("initialData")),
|
|
67
|
+
]),
|
|
68
|
+
]), undefined),
|
|
69
|
+
], false), undefined, typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.EqualsGreaterThanToken), typescript_1["default"].factory.createCallExpression(typescript_1["default"].factory.createIdentifier("useQuery"), undefined, [
|
|
70
|
+
typescript_1["default"].factory.createArrayLiteralExpression([
|
|
71
|
+
typescript_1["default"].factory.createStringLiteral("".concat(className).concat((0, common_1.capitalizeFirstLetter)(methodName))),
|
|
72
|
+
typescript_1["default"].factory.createSpreadElement(typescript_1["default"].factory.createIdentifier("queryKey"))
|
|
73
|
+
], false),
|
|
74
|
+
typescript_1["default"].factory.createArrowFunction(undefined, undefined, [], undefined, typescript_1["default"].factory.createToken(typescript_1["default"].SyntaxKind.EqualsGreaterThanToken), typescript_1["default"].factory.createCallExpression(typescript_1["default"].factory.createPropertyAccessExpression(typescript_1["default"].factory.createIdentifier(className), typescript_1["default"].factory.createIdentifier(methodName)), undefined, method.parameters.map(function (param) {
|
|
75
|
+
return typescript_1["default"].factory.createIdentifier(param.name.getText(node));
|
|
76
|
+
}))),
|
|
77
|
+
typescript_1["default"].factory.createIdentifier("options"),
|
|
78
|
+
]))),
|
|
79
|
+
], typescript_1["default"].NodeFlags.Const));
|
|
80
|
+
};
|
|
81
|
+
exports.createUseQuery = createUseQuery;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
exports.__esModule = true;
|
|
42
|
+
exports.generate = void 0;
|
|
43
|
+
var openapi_typescript_codegen_1 = require("openapi-typescript-codegen");
|
|
44
|
+
var print_1 = require("./print");
|
|
45
|
+
var path_1 = __importDefault(require("path"));
|
|
46
|
+
var createSource_1 = require("./createSource");
|
|
47
|
+
function generate(options) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
49
|
+
var openApiOutputPath, source;
|
|
50
|
+
return __generator(this, function (_a) {
|
|
51
|
+
switch (_a.label) {
|
|
52
|
+
case 0:
|
|
53
|
+
openApiOutputPath = path_1["default"].join(options.outputDir, "requests");
|
|
54
|
+
return [4 /*yield*/, (0, openapi_typescript_codegen_1.generate)({
|
|
55
|
+
input: options.path,
|
|
56
|
+
output: openApiOutputPath
|
|
57
|
+
})];
|
|
58
|
+
case 1:
|
|
59
|
+
_a.sent();
|
|
60
|
+
source = (0, createSource_1.createSource)(openApiOutputPath);
|
|
61
|
+
(0, print_1.print)(source, options);
|
|
62
|
+
return [2 /*return*/];
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
exports.generate = generate;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.print = void 0;
|
|
7
|
+
var fs_1 = __importDefault(require("fs"));
|
|
8
|
+
var path_1 = __importDefault(require("path"));
|
|
9
|
+
function printGeneratedTS(result, options) {
|
|
10
|
+
var dir = path_1["default"].join(options.outputDir, "queries");
|
|
11
|
+
if (!fs_1["default"].existsSync(dir)) {
|
|
12
|
+
fs_1["default"].mkdirSync(dir, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
fs_1["default"].writeFileSync(path_1["default"].join(dir, 'index.ts'), result);
|
|
15
|
+
}
|
|
16
|
+
function print(result, options) {
|
|
17
|
+
if (!fs_1["default"].existsSync(options.outputDir)) {
|
|
18
|
+
fs_1["default"].mkdirSync(options.outputDir);
|
|
19
|
+
}
|
|
20
|
+
printGeneratedTS(result, options);
|
|
21
|
+
}
|
|
22
|
+
exports.print = print;
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@7nohe/openapi-react-query-codegen",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenAPI React Query Codegen",
|
|
5
|
+
"bin": {
|
|
6
|
+
"openapi-rq": "src/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/7nohe/openapi-react-query-codegen.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/7nohe/openapi-react-query-codegen",
|
|
13
|
+
"bugs": "https://github.com/7nohe/openapi-react-query-codegen/issues",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"keywords": [
|
|
18
|
+
"codegen",
|
|
19
|
+
"react-query",
|
|
20
|
+
"react",
|
|
21
|
+
"openapi",
|
|
22
|
+
"swagger",
|
|
23
|
+
"typescript",
|
|
24
|
+
"openapi-typescript-codegen"
|
|
25
|
+
],
|
|
26
|
+
"author": "Daiki Urata (@7nohe)",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"commander": "^9.4.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/glob": "^7.2.0",
|
|
33
|
+
"@types/node": "^18.0.6",
|
|
34
|
+
"glob": "^8.0.3",
|
|
35
|
+
"openapi-types": "^12.0.0",
|
|
36
|
+
"openapi-typescript-codegen": "^0.23.0",
|
|
37
|
+
"typescript": "^4.7.4"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.json",
|
|
41
|
+
"preview": "npm run build && npm -C examples/react-app run generate:api",
|
|
42
|
+
"release": "npx git-ensure -a && npx bumpp --commit --tag --push"
|
|
43
|
+
}
|
|
44
|
+
}
|