gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-docs] 01/03: tsdef extraction for wallet-core


From: gnunet
Subject: [taler-docs] 01/03: tsdef extraction for wallet-core
Date: Tue, 04 Oct 2022 15:56:24 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository docs.

commit 37901b68aa7e96e00c7bb6baa031a0c1c152b2b4
Author: Florian Dold <florian@dold.me>
AuthorDate: Tue Oct 4 13:41:37 2022 +0200

    tsdef extraction for wallet-core
---
 extract-tsdefs/extract.ts    | 166 +++++++++++++++++++++++++++++++++++++++++++
 extract-tsdefs/package.json  |  18 +++++
 extract-tsdefs/tsconfig.json | 103 +++++++++++++++++++++++++++
 3 files changed, 287 insertions(+)

diff --git a/extract-tsdefs/extract.ts b/extract-tsdefs/extract.ts
new file mode 100644
index 0000000..5012df9
--- /dev/null
+++ b/extract-tsdefs/extract.ts
@@ -0,0 +1,166 @@
+import * as ts from "typescript";
+import * as fs from "fs/promises";
+import * as path from "path";
+import * as prettier from "prettier";
+
+const currentDir = ".";
+
+const configFile = ts.findConfigFile(
+  currentDir,
+  ts.sys.fileExists,
+  "tsconfig.json"
+);
+if (!configFile) throw Error("tsconfig.json not found");
+const { config } = ts.readConfigFile(configFile, ts.sys.readFile);
+
+const { options, fileNames, errors } = ts.parseJsonConfigFileContent(
+  config,
+  ts.sys,
+  currentDir
+);
+
+const program = ts.createProgram({
+  options,
+  rootNames: fileNames,
+  configFileParsingDiagnostics: errors,
+});
+
+const checker = program.getTypeChecker();
+
+const sourceFile = program.getSourceFile("src/wallet-api-types.ts");
+
+if (!sourceFile) {
+  throw Error();
+}
+
+const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
+
+const fileSymbol = program.getTypeChecker().getSymbolAtLocation(sourceFile);
+
+//console.log(sourceFile.referencedFiles);
+
+// for (const f of program.getSourceFiles()) {
+//   console.log(f.fileName);
+// }
+
+const expo = fileSymbol?.exports;
+if (!expo) {
+  throw Error();
+}
+
+interface GatherState {
+  opName: string;
+  nameSet: Set<string>;
+  decls: ts.Declaration[];
+  texts: string[];
+}
+
+const builtin = new Set<string>("Array");
+
+function gatherDecls(node: ts.Node, gatherState: GatherState): void {
+  switch (node.kind) {
+    case ts.SyntaxKind.TypeReference: {
+      console.log(`typeref ${node.getText()}`);
+      const type = checker.getTypeAtLocation(node);
+      if (type.flags === ts.TypeFlags.String) {
+        console.log("string!");
+        break;
+      }
+      const symbol = type.symbol || type.aliasSymbol;
+      if (!symbol) {
+        console.log(`no symbol for ${node.getText()}`);
+        break;
+      }
+      const name = symbol.name;
+      if (gatherState.nameSet.has(name)) {
+        break;
+      }
+      gatherState.nameSet.add(name);
+      const decls = symbol.getDeclarations();
+      decls?.forEach((decl) => {
+        console.log(`decl kind ${ts.SyntaxKind[node.kind]}`);
+        console.log(`decl for ${node.getText()}`);
+        const sourceFilename = decl.getSourceFile().fileName;
+        if (path.basename(sourceFilename).startsWith("lib.")) {
+          return;
+        }
+        console.log(`decl source ${decl.getSourceFile().fileName}`);
+        console.log(`mod name ${decl.getSourceFile().moduleName}`);
+        switch (decl.kind) {
+          case ts.SyntaxKind.InterfaceDeclaration:
+          case ts.SyntaxKind.TypeAliasDeclaration: {
+            const declText = printer.printNode(
+              ts.EmitHint.Unspecified,
+              decl,
+              decl.getSourceFile()!
+            );
+            gatherState.texts.push(declText);
+            console.log(declText);
+            break;
+          }
+          default:
+            console.log(`unknown decl kind ${ts.SyntaxKind[decl.kind]}`);
+            break;
+        }
+        gatherDecls(decl, gatherState);
+      });
+      break;
+    }
+    default:
+      node.forEachChild((child) => {
+        gatherDecls(child, gatherState);
+      });
+      //console.log(`// unknown node kind ${ts.SyntaxKind[node.kind]}`);
+      return;
+  }
+}
+
+const main = async () => {
+  const f = await fs.open("out.md", "w");
+
+  const gathers: GatherState[] = [];
+
+  expo.forEach((v, k) => {
+    if (!v.name.endsWith("Op")) {
+      return;
+    }
+    const decls = v.getDeclarations();
+    decls?.forEach((decl) => {
+      const gatherState: GatherState = {
+        opName: v.name,
+        decls: [],
+        texts: [],
+        nameSet: new Set<string>(),
+      };
+      const declText = printer.printNode(
+        ts.EmitHint.Unspecified,
+        decl,
+        decl.getSourceFile()!
+      );
+      gatherState.texts.push(declText);
+      gatherDecls(decl, gatherState);
+      gathers.push(gatherState);
+    });
+  });
+
+  await f.write(`# Wallet API Documentation\n`);
+
+  await f.write(`## Operation Reference\n`);
+  for (const g of gathers) {
+    await f.write(`### ${g.opName}\n`);
+    for (const text of g.texts) {
+      await f.write("```typescript\n");
+      const formatted = prettier.format(text, {
+        semi: true,
+        parser: "typescript",
+      });
+      await f.write(`${formatted}\n`);
+      await f.write("```\n");
+    }
+    await f.write("\n");
+  }
+
+  await f.close();
+};
+
+main();
diff --git a/extract-tsdefs/package.json b/extract-tsdefs/package.json
new file mode 100644
index 0000000..8eca5ac
--- /dev/null
+++ b/extract-tsdefs/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "extract-tsdefs",
+  "version": "0.0.1",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "GPL-3.0",
+  "devDependencies": {
+    "@types/node": "^18.8.1",
+    "@types/prettier": "^2.7.1",
+    "prettier": "^2.7.1",
+    "typescript": "^4.8.4"
+  }
+}
diff --git a/extract-tsdefs/tsconfig.json b/extract-tsdefs/tsconfig.json
new file mode 100644
index 0000000..75dcaea
--- /dev/null
+++ b/extract-tsdefs/tsconfig.json
@@ -0,0 +1,103 @@
+{
+  "compilerOptions": {
+    /* Visit https://aka.ms/tsconfig to read more about this file */
+
+    /* Projects */
+    // "incremental": true,                              /* Save .tsbuildinfo 
files to allow for incremental compilation of projects. */
+    // "composite": true,                                /* Enable constraints 
that allow a TypeScript project to be used with project references. */
+    // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path 
to .tsbuildinfo incremental compilation file. */
+    // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring 
source files instead of declaration files when referencing composite projects. 
*/
+    // "disableSolutionSearching": true,                 /* Opt a project out 
of multi-project reference checking when editing. */
+    // "disableReferencedProjectLoad": true,             /* Reduce the number 
of projects loaded automatically by TypeScript. */
+
+    /* Language and Environment */
+    "target": "es2016",                                  /* Set the JavaScript 
language version for emitted JavaScript and include compatible library 
declarations. */
+    // "lib": [],                                        /* Specify a set of 
bundled library declaration files that describe the target runtime environment. 
*/
+    // "jsx": "preserve",                                /* Specify what JSX 
code is generated. */
+    // "experimentalDecorators": true,                   /* Enable 
experimental support for TC39 stage 2 draft decorators. */
+    // "emitDecoratorMetadata": true,                    /* Emit design-type 
metadata for decorated declarations in source files. */
+    // "jsxFactory": "",                                 /* Specify the JSX 
factory function used when targeting React JSX emit, e.g. 'React.createElement' 
or 'h'. */
+    // "jsxFragmentFactory": "",                         /* Specify the JSX 
Fragment reference used for fragments when targeting React JSX emit e.g. 
'React.Fragment' or 'Fragment'. */
+    // "jsxImportSource": "",                            /* Specify module 
specifier used to import the JSX factory functions when using 'jsx: 
react-jsx*'. */
+    // "reactNamespace": "",                             /* Specify the object 
invoked for 'createElement'. This only applies when targeting 'react' JSX emit. 
*/
+    // "noLib": true,                                    /* Disable including 
any library files, including the default lib.d.ts. */
+    // "useDefineForClassFields": true,                  /* Emit 
ECMAScript-standard-compliant class fields. */
+    // "moduleDetection": "auto",                        /* Control what 
method is used to detect module-format JS files. */
+
+    /* Modules */
+    "module": "commonjs",                                /* Specify what 
module code is generated. */
+    // "rootDir": "./",                                  /* Specify the root 
folder within your source files. */
+    // "moduleResolution": "node",                       /* Specify how 
TypeScript looks up a file from a given module specifier. */
+    // "baseUrl": "./",                                  /* Specify the base 
directory to resolve non-relative module names. */
+    // "paths": {},                                      /* Specify a set of 
entries that re-map imports to additional lookup locations. */
+    // "rootDirs": [],                                   /* Allow multiple 
folders to be treated as one when resolving modules. */
+    // "typeRoots": [],                                  /* Specify multiple 
folders that act like './node_modules/@types'. */
+    // "types": [],                                      /* Specify type 
package names to be included without being referenced in a source file. */
+    // "allowUmdGlobalAccess": true,                     /* Allow accessing 
UMD globals from modules. */
+    // "moduleSuffixes": [],                             /* List of file name 
suffixes to search when resolving a module. */
+    // "resolveJsonModule": true,                        /* Enable importing 
.json files. */
+    // "noResolve": true,                                /* Disallow 
'import's, 'require's or '<reference>'s from expanding the number of files 
TypeScript should add to a project. */
+
+    /* JavaScript Support */
+    // "allowJs": true,                                  /* Allow JavaScript 
files to be a part of your program. Use the 'checkJS' option to get errors from 
these files. */
+    // "checkJs": true,                                  /* Enable error 
reporting in type-checked JavaScript files. */
+    // "maxNodeModuleJsDepth": 1,                        /* Specify the 
maximum folder depth used for checking JavaScript files from 'node_modules'. 
Only applicable with 'allowJs'. */
+
+    /* Emit */
+    // "declaration": true,                              /* Generate .d.ts 
files from TypeScript and JavaScript files in your project. */
+    // "declarationMap": true,                           /* Create sourcemaps 
for d.ts files. */
+    // "emitDeclarationOnly": true,                      /* Only output d.ts 
files and not JavaScript files. */
+    // "sourceMap": true,                                /* Create source map 
files for emitted JavaScript files. */
+    // "outFile": "./",                                  /* Specify a file 
that bundles all outputs into one JavaScript file. If 'declaration' is true, 
also designates a file that bundles all .d.ts output. */
+    // "outDir": "./",                                   /* Specify an output 
folder for all emitted files. */
+    // "removeComments": true,                           /* Disable emitting 
comments. */
+    // "noEmit": true,                                   /* Disable emitting 
files from a compilation. */
+    // "importHelpers": true,                            /* Allow importing 
helper functions from tslib once per project, instead of including them 
per-file. */
+    // "importsNotUsedAsValues": "remove",               /* Specify 
emit/checking behavior for imports that are only used for types. */
+    // "downlevelIteration": true,                       /* Emit more 
compliant, but verbose and less performant JavaScript for iteration. */
+    // "sourceRoot": "",                                 /* Specify the root 
path for debuggers to find the reference source code. */
+    // "mapRoot": "",                                    /* Specify the 
location where debugger should locate map files instead of generated locations. 
*/
+    // "inlineSourceMap": true,                          /* Include sourcemap 
files inside the emitted JavaScript. */
+    // "inlineSources": true,                            /* Include source 
code in the sourcemaps inside the emitted JavaScript. */
+    // "emitBOM": true,                                  /* Emit a UTF-8 Byte 
Order Mark (BOM) in the beginning of output files. */
+    // "newLine": "crlf",                                /* Set the newline 
character for emitting files. */
+    // "stripInternal": true,                            /* Disable emitting 
declarations that have '@internal' in their JSDoc comments. */
+    // "noEmitHelpers": true,                            /* Disable generating 
custom helper functions like '__extends' in compiled output. */
+    // "noEmitOnError": true,                            /* Disable emitting 
files if any type checking errors are reported. */
+    // "preserveConstEnums": true,                       /* Disable erasing 
'const enum' declarations in generated code. */
+    // "declarationDir": "./",                           /* Specify the output 
directory for generated declaration files. */
+    // "preserveValueImports": true,                     /* Preserve unused 
imported values in the JavaScript output that would otherwise be removed. */
+
+    /* Interop Constraints */
+    // "isolatedModules": true,                          /* Ensure that each 
file can be safely transpiled without relying on other imports. */
+    // "allowSyntheticDefaultImports": true,             /* Allow 'import x 
from y' when a module doesn't have a default export. */
+    "esModuleInterop": true,                             /* Emit additional 
JavaScript to ease support for importing CommonJS modules. This enables 
'allowSyntheticDefaultImports' for type compatibility. */
+    // "preserveSymlinks": true,                         /* Disable resolving 
symlinks to their realpath. This correlates to the same flag in node. */
+    "forceConsistentCasingInFileNames": true,            /* Ensure that casing 
is correct in imports. */
+
+    /* Type Checking */
+    "strict": true,                                      /* Enable all strict 
type-checking options. */
+    // "noImplicitAny": true,                            /* Enable error 
reporting for expressions and declarations with an implied 'any' type. */
+    // "strictNullChecks": true,                         /* When type 
checking, take into account 'null' and 'undefined'. */
+    // "strictFunctionTypes": true,                      /* When assigning 
functions, check to ensure parameters and the return values are 
subtype-compatible. */
+    // "strictBindCallApply": true,                      /* Check that the 
arguments for 'bind', 'call', and 'apply' methods match the original function. 
*/
+    // "strictPropertyInitialization": true,             /* Check for class 
properties that are declared but not set in the constructor. */
+    // "noImplicitThis": true,                           /* Enable error 
reporting when 'this' is given the type 'any'. */
+    // "useUnknownInCatchVariables": true,               /* Default catch 
clause variables as 'unknown' instead of 'any'. */
+    // "alwaysStrict": true,                             /* Ensure 'use 
strict' is always emitted. */
+    // "noUnusedLocals": true,                           /* Enable error 
reporting when local variables aren't read. */
+    // "noUnusedParameters": true,                       /* Raise an error 
when a function parameter isn't read. */
+    // "exactOptionalPropertyTypes": true,               /* Interpret optional 
property types as written, rather than adding 'undefined'. */
+    // "noImplicitReturns": true,                        /* Enable error 
reporting for codepaths that do not explicitly return in a function. */
+    // "noFallthroughCasesInSwitch": true,               /* Enable error 
reporting for fallthrough cases in switch statements. */
+    // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to 
a type when accessed using an index. */
+    // "noImplicitOverride": true,                       /* Ensure overriding 
members in derived classes are marked with an override modifier. */
+    // "noPropertyAccessFromIndexSignature": true,       /* Enforces using 
indexed accessors for keys declared using an indexed type. */
+    // "allowUnusedLabels": true,                        /* Disable error 
reporting for unused labels. */
+    // "allowUnreachableCode": true,                     /* Disable error 
reporting for unreachable code. */
+
+    /* Completeness */
+    // "skipDefaultLibCheck": true,                      /* Skip type checking 
.d.ts files that are included with TypeScript. */
+    "skipLibCheck": true                                 /* Skip type checking 
all .d.ts files. */
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]