/data-schema-analyzer

🔍 Data Analyzer

Primary LanguageTypeScriptMIT LicenseMIT

data-schema-analyzer

gh-workflow-image npm-image

Warning

This package is primarily published to receive early feedback and for contributors, during this development phase we cannot guarantee the stability of the APIs, consider each release to contain breaking changes.

📦 Installation

To install the module from npm:

npm install data-schema-analyzer

📘 Usage

Generate Schema

// ./examples/stub-type.ts

export type StubType = {
  id: number
  name: string
  /**
   * @minimum 0
   */
  age: number
}

You can use annotations to add more information to the schema :

  • @minimum : Add a minimum value to the number
  • @maximum : Add a maximum value to the number
  • @pattern : Add a RegEx to the string
  • @id : Add a unique identifier to the object
  • @minLength : Add a minimum length to the string
  • @maxLength : Add a maximum length to the string
  • @minItems : Add a minimum number of items to the array
  • @maxItems : Add a maximum number of items to the array

Use the SchemaGenerator to generate the schema from the typescript file.

// ./scripts/generate-schema.ts
import { SchemaGenerator } from 'data-schema-analyzer'

const generator = new SchemaGenerator({
  tsConfigFilePath: './tsconfig.json',
})
const schema = generator.generateFile({
  sourceFiles: ['./examples/stub-type.ts'],
  rootInterfaceName: 'StubType',
  outputFilePath: './examples/stub-type-schema.json', // Typescript interface or JSON File
})

Track the data

import { Tracker } from 'data-schema-analyzer'
import { StubType } from './examples/stub-type'

const tracker = new Tracker<StubType>({
  schema,
})

const analyze = tracker.analyze()

//...
const report = analyze.track({ id: 1, name: 'John Doe', age: 'Not a number' })
// {
//   "properties": [
//     {
//       "type": "TYPE",
//       "property": "age"
//       "message": "age property type is not number",
//       "example": "Not a number"
//     },
//   ]
// }

// ...
const report = analyze.track({ id: 2, name: 'Kevin', age: -5 })
// {
//   "properties": [
//     {
//       "type": "TYPE",
//       "property": "age"
//       "message": "age property must be at least 0",
//       "example": -1
//     },
//   ]
// }

const analyzeReport = analyze.end()
// Other information from the data like the number of records, the number of errors, etc.

And add the script to your package.json:

// package.json
 "scripts": {
  ...
  "generate:schema": "npx tsx ./scripts/generate-schema.ts"
 },

📝 License

MIT