@trapi/metadata
Version:
Generate REST-API metadata scheme from TypeScript Decorators.
174 lines (135 loc) ⢠4.96 kB
Markdown
# @trapi/metadata š
[](https://github.com/Tada5hi/trapi/actions/workflows/main.yml)
[](https://codecov.io/gh/Tada5hi/trapi)
[](https://snyk.io/test/github/Tada5hi/trapi)
[](https://badge.fury.io/js/@trapi%2Fmetadata)
This package is responsible for generating metadata information by analyzing TypeScript REST decorators (self defined or third-party libraries).
The metadata can than be used for generating a documentation according to the OpenAPI Specification or to create route schema/handling for libraries like: express, koa, etc.
Inspect the `CHANGELOG.md` in the repository for breaking changes.
## Public API
The stable public surface is documented in the [API Reference](https://trapi.tada5hi.net/guide/metadata-api-reference). Anything not listed there should be treated as internal even if it is re-exported, and may change without a major version bump.
**Table of Contents**
- [Installation](#installation)
- [Configuration](#configuration)
- [Limitations](#limitations)
- [Usage](#usage)
- [Structure](#structure)
- [License](#license)
## Installation
```bash
npm install --save @trapi/metadata
```
## Configuration
### Metadata
The metadata configuration object (Top-Level) is the main configuration object of this library
and can be defined according the following type scheme:
```typescript
import type {
CacheOptions,
DecoratorConfig,
TsConfig,
} from "@trapi/metadata";
export type EntryPointOptions = {
cwd: string,
pattern: string
};
export type EntryPoint = string |
string[] |
EntryPointOptions |
EntryPointOptions[];
export interface MetadataGenerateOptions {
/**
* The entry point to your API.
*/
entryPoint: EntryPoint;
/**
* Directory to ignore during TypeScript files scan.
* Default: []
*/
ignore?: string[];
/**
* Directory to allow during TypeScript files scan.
* Default: []
*/
allow?: string[],
/**
* Directory to store and cache metadata files.
* Default: false
*/
cache?: string | boolean | Partial<CacheOptions>;
/**
* Manual decorator properties configuration.
*/
decorators?: DecoratorConfig[],
/**
* Load a specific preset configuration.
*/
preset?: string;
/**
* Path to tsconfig.json or a TsConfig object.
*/
tsconfig?: string | TsConfig;
}
```
## Limitations
TRAPI's resolver explicitly handles these TypeScript utility types:
* `NonNullable`
* `Omit`
* `Partial`
* `Readonly`
* `Record`
* `Required`
* `Pick`
Additionally these are delegated to the TypeScript type checker and resolve through the compiler's own computation:
* `Extract`
* `Exclude`
* `ReturnType`
* `Parameters`
* `Awaited`
* `InstanceType`
* `ConstructorParameters`
## Usage
```typescript
import {
generateMetadata,
Metadata
} from "@trapi/metadata";
import path from "node:path";
import process from "node:process";
const metadata : Metadata = await generateMetadata({
entryPoint: ['src/controllers/**/*.ts'],
ignore: ['**/node_modules/**'],
cache: true,
preset: '@trapi/preset-decorators-express'
});
console.log(metadata);
// {controllers: [], referenceTypes: {}}
```
## Structure
The package follows a hexagonal layout:
```
src/
āāā core/ # Domain types, port interfaces, generator contracts
ā āāā types/ # Metadata, Controller, Method, Parameter, Type, ...
ā āāā config/ # MetadataGenerateOptions, MetadataGeneratorOptions, EntryPoint
ā āāā decorator/ # DecoratorID enum, decorator config shapes
ā āāā error/ # MetadataError, GeneratorError, ResolverError
ā āāā metadata/ # IMetadataGenerator, IGeneratorContext
ā āāā utils/ # Internal helpers (hasOwnProperty, normalizePath, ā¦)
ā
āāā adapters/ # Infrastructure adapters
ā āāā typescript/ # TypeScript compiler API adapter (type resolver, JSDoc, AST)
ā āāā decorator/ # Decorator resolver + preset loader
ā āāā filesystem/ # Source file scanner, tsconfig loader
ā āāā cache/ # Metadata cache
ā
āāā app/ # Orchestration / use-cases
ā āāā generate.ts # generateMetadata()
ā āāā generator/ # Controller, Method, Parameter generators
ā
āāā index.ts # Public entry point
```
The dependency rule is strict: `core/` imports nothing from `adapters/` or `app/`, `adapters/` depends only on `core/`, and `app/` wires both together.
## License
Made with š
Published under [MIT License](./LICENSE).