Skip to content

Latest commit

 

History

History
265 lines (241 loc) · 6.16 KB

README.md

File metadata and controls

265 lines (241 loc) · 6.16 KB

Typescript AST Parser

A parser to convert .ts files into human readable objects.


  1. Example file to parse
  2. Calling the parse function
  3. Example output from parse

1.

Example file to parse.

Given the following file path/to/my-component.ts

import {Component, EventEmitter, Input, Output} from "@angular/core";
import {NgFor, NgIf} from "@angular/common";
import {Observable} from "rxjs";


@Component({
  selector: 'my-component',
  templateUrl: 'my-component.html',
  styleUrls: ['my-component.css'],
  standalone: true,
  imports: [
    NgIf,
    NgFor
  ]
})
class MyComponent {

  @Input({required: true}) myRequiredInput?: string;
  @Input('alias') myAliasedInput?: string;

  @Output() myOutput = new EventEmitter<string>();

  public someValue?: Observable<boolean>;

  public myMethod() {
    return 'myMethod';
  }
}

2.

Calling the parse function

import {
  CommonPathHandler,
  NgPathHandler,
  NodeModulesPathHandler,
  RxjsPathHandler,
  Parser,
  defaultDeclarationDefinitionMap,
  parse
} from "@jamesbenrobb/ts-ast-parser";


const pathHandlers = [
  new CommonPathHandler(),
  new NodeModulesPathHandler(),
  new NgPathHandler(),
  new RxjsPathHandler()
]

const sourcePath = 'path/to/my-component.ts';

const parser = new Parser(defaultDeclarationDefinitionMap);

const source = parse(
  sourcePath,
  parser,
  pathHandlers, {
    walk: false,
    debug: false
  }
);

console.log(source);

3.

Example output from parse

{
  "fileName": "my-component.ts",
  "path": "/path/to/",
  "imports": [
    {
      "name": "Component",
      "module": "@angular/core",
      "resolvedModulePath": "@angular/core",
      "convertedModulePath": "https://angular.dev/api/core/Component"
    },
    {
      "name": "EventEmitter",
      "module": "@angular/core",
      "resolvedModulePath": "@angular/core",
      "convertedModulePath": "https://angular.dev/api/core/EventEmitter"
    },
    {
      "name": "Input",
      "module": "@angular/core",
      "resolvedModulePath": "@angular/core",
      "convertedModulePath": "https://angular.dev/api/core/Input"
    },
    {
      "name": "Output",
      "module": "@angular/core",
      "resolvedModulePath": "@angular/core",
      "convertedModulePath": "https://angular.dev/api/core/Output"
    },
    {
      "name": "NgFor",
      "module": "@angular/common",
      "resolvedModulePath": "@angular/common",
      "convertedModulePath": "https://angular.dev/api/common/NgFor"
    },
    {
      "name": "NgIf",
      "module": "@angular/common",
      "resolvedModulePath": "@angular/common",
      "convertedModulePath": "https://angular.dev/api/common/NgIf"
    },
    {
      "name": "Observable",
      "module": "rxjs",
      "resolvedModulePath": "rxjs",
      "convertedModulePath": "https://rxjs.dev/api/index/class/Observable"
    }
  ],
  "exports": [
    {
      "kind": "ClassDeclaration",
      "name": "MyComponent",
      "modifiers": {
        "decorators": [
          {
            "type": "Component",
            "metadata": {
              "selector": "my-component",
              "templateUrl": "my-component.html",
              "styleUrls": [
                "my-component.css"
              ],
              "standalone": true,
              "imports": [
                "NgIf",
                "NgFor"
              ]
            },
            "signature": "@Component({selector: my-component, templateUrl: my-component.html, styleUrls: my-component.css, standalone: true, imports: NgIf,NgFor})"
          }
        ],
        "keywords": [
          "export"
        ]
      },
      "properties": [
        {
          "kind": "PropertyDeclaration",
          "name": "myRequiredInput",
          "type": "string",
          "optional": true,
          "modifiers": {
            "decorators": [
              {
                "type": "Input",
                "metadata": {
                  "required": true
                },
                "signature": "@Input({required: true})"
              }
            ]
          },
          "access": "public",
          "signature": "@Input({required: true})\nmyRequiredInput?: string"
        },
        {
          "kind": "PropertyDeclaration",
          "name": "myAliasedInput",
          "type": "string",
          "optional": true,
          "modifiers": {
            "decorators": [
              {
                "type": "Input",
                "metadata": "alias",
                "signature": "@Input('alias')"
              }
            ]
          },
          "access": "public",
          "signature": "@Input('alias')\nmyAliasedInput?: string"
        },
        {
          "kind": "PropertyDeclaration",
          "name": "myOutput",
          "initializedValue": {
            "expression": "EventEmitter",
            "typeArguments": [
              "string"
            ],
            "arguments": [],
            "signature": "new EventEmitter()"
          },
          "modifiers": {
            "decorators": [
              {
                "type": "Output",
                "signature": "@Output()"
              }
            ]
          },
          "access": "public",
          "signature": "@Output()\nmyOutput = new EventEmitter<string>()"
        },
        {
          "kind": "PropertyDeclaration",
          "name": "someValue",
          "type": {
            "kind": "TypeReference",
            "name": "Observable",
            "typeArguments": [
              "boolean"
            ],
            "resolvedPath": "https://rxjs.dev/api/index/class/Observable",
            "signature": "Observable<boolean>"
          },
          "optional": true,
          "modifiers": {
            "keywords": [
              "public"
            ]
          },
          "access": "public",
          "signature": " someValue?: Observable<boolean>"
        }
      ],
      "methods": [
        {
          "kind": "MethodDeclaration",
          "name": "myMethod",
          "parameters": [],
          "modifiers": {
            "keywords": [
              "public"
            ]
          },
          "access": "public",
          "returnType": "string",
          "signature": " myMethod(): string"
        }
      ]
    }
  ]
}