Guest User

Untitled

a guest
Oct 21st, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. import { readFileSync, writeFile } from "fs";
  2. import * as ts from "typescript";
  3.  
  4. interface Method {
  5. name: string;
  6. method: "GET" | "POST";
  7. bodyType?: string;
  8. responseType?: string;
  9. urlParametersType?: string;
  10.  
  11. }
  12. interface Endpoint {
  13. name: string;
  14. methods: Method[];
  15. }
  16.  
  17. export function delint(sourceFile: ts.SourceFile) {
  18. let endpoints: Endpoint[] = [];
  19. delintNode(sourceFile);
  20.  
  21. function delintNode(node: ts.Node) {
  22.  
  23. if (ts.isInterfaceDeclaration(node) && node.name.text !== "Bla") {
  24. endpoints.push({
  25. name: node.name.text,
  26. methods: node.members.map((m)=> {
  27. if (ts.isPropertySignature(m)) {
  28. let type = m.type!;
  29. if (ts.isTypeLiteralNode(type)) {
  30. let params = type.members.reduce((o, m) => {
  31. if (ts.isPropertySignature(m)) {
  32. o[m.name.getText()] = m.type.getText();
  33. return o;
  34. }
  35. }, {} as any);
  36. return {
  37. name: m.name.getText(),
  38. method: params.method,
  39. bodyType: params.bodyType,
  40. responseType: params.responseType || "void",
  41. urlParametersType: params.urlParametersType,
  42. }
  43. }
  44. }
  45. })
  46. });
  47. } else {
  48. ts.forEachChild(node, delintNode);
  49. }
  50. }
  51.  
  52. function fromEndpoint(endpoint: Endpoint) {
  53. function fromMethod(method: Method) {
  54. let parameters = ["urlParametersType", "bodyType"]
  55. .filter(p => !!method[p])
  56. .map(p => [p, method[p]] as [string, string])
  57. .map(p => [p[0].slice(0, p[0].length - 4), p[1]]);
  58.  
  59. let parameterToString = p => `${p[0]}: ${p[1]}`;
  60.  
  61. return `
  62. async ${method.name}(${parameters.map(parameterToString)}): Promise<${method.responseType}> {
  63. let home = await getHome();
  64. let response = await fetch(home.${method.name}, {
  65. method: ${method.method},
  66. headers: new Headers({
  67. 'Content-Type': 'application/json'
  68. }),
  69. ${method.bodyType ? "body: JSON.stringify(body)," : ""}
  70. });
  71.  
  72. return response.json();
  73. }`;
  74. }
  75. return `
  76. export class ${endpoint.name} {
  77. ${endpoint.methods.map(fromMethod).join("\n")}
  78. }
  79. `
  80. }
  81.  
  82. let out = endpoints.map(fromEndpoint);
  83. writeFile("./yolo.ts", out, (err)=> {
  84. console.log({err});
  85. });
  86. }
  87.  
  88. const fileNames = process.argv.slice(2);
  89. fileNames.forEach(fileName => {
  90. // Parse a file
  91. let sourceFile = ts.createSourceFile(
  92. fileName,
  93. readFileSync(fileName).toString(),
  94. ts.ScriptTarget.ES2015,
  95. /*setParentNodes */ true
  96. );
  97.  
  98. // delint it
  99. delint(sourceFile);
  100. });
Add Comment
Please, Sign In to add comment