# guess-parser
This module is used for route extraction by the `GuessPlugin`. The module exports several functions:
## Usage
```bash
npm i guess-parser --save-dev
```
## API
* `detect(path: string)` - Detects the project type and returns metadata. For the currently supported projects see the `ProjectMetadata` interface.
* `parseRoutes(path: string)` - Extracts the routes of the application in `path`. Internally uses the `detect` function.
* `parseAngularRoutes(tsconfig: string)` - Extracts the routes of an Angular application. As arguments the function accepts path to the `tsconfig.json` file of the project.
* `parseReactJSXRoutes(path: string)` - Extracts the routes from React JSX project. See the supported syntax below.
* `parseReactTSXRoutes(tsconfig: string)` - Extracts the routes from React TypeScript projects which uses JSX by `tsconfig.json` file. See the supported syntax below.
```ts
export interface ProjectMetadata {
type: ProjectType;
version: string;
details?: ProjectLayout;
}
export enum ProjectType {
AngularCLI = 'angular-cli',
CreateReactApp = 'create-react-app',
Gatsby = 'gatsby',
CreateReactAppTypeScript = 'create-react-app-typescript'
}
export interface ProjectLayout {
typescript?: string;
tsconfigPath?: string;
sourceDir?: string;
}
```
## Supported Syntax
### Angular
Because of the produced summaries by the Angular compiler the Angular parser supports most Angular CLI applications as well as most starters.
### React
Because of the dynamic nature of React and lack of standard route definition syntax, only applications using the following convention can be successfully parsed:
```jsx
Intro
Main
import('./intro/Intro'))} />
```
Currently, there are several important conventions:
* Support only for JSX syntax
* Support only for `react-router`-like syntax
* The path attribute of the `` element must have value of type string literal.
* The lazy-loaded components should have dynamic import with the following structure of the AST:
* `CallExpression` (e.g. `AsyncComponent`) with a single argument
* The type of the argument should be an `ArrowFunction`
* The arrow function should have an expression as body (e.g. `CallExpression`)
* To the `CallExpression` should be passed a `StringLiteral` which points to the lazy-loaded module
**Contributions aiming to extend the supported syntax are very welcome!**
## License
MIT