# Hapn ORM for Planet Scale

This package contains repositories and entities to connect to Planet Scale database using typeorm

## How to use?

### Installing

Clone the project locally with `git clone` to the desired folder and run `npm i` to install all the dependencies

### Linting and Formatting

Linting allows to run few code checks

Run `npm run lint`
_for any strict rule that can be followed, go to `tslint.json` and modify_

Run `npm run format` to update the code formatting

### Building

Building will generate a new folder with the source code and the type definitions
ready to be consumed as a package

Run `npm run build` to build all the content into the distribution folder ( `dist` in our case, although in can be changed to any other folder )

# SYNC the entities definition with Planet Scale schema:

1- Modify the url value for the data source in the file data-source.ts to use the dev branch connection string

2- Run the command npm run schema-sync

### Usage

Go to the project you want to use the new package and either remove the package reference in dependencies from `package.json` or just update the version number matching the latest version just published to npm

Delete the @spytecgps/nova-orm folder from the node_modules folder to make sure the package will be using the lastest code

After that run `npm i @spytecgps/nova-orm` if you removed the dependency completely and this will bring the latest package, or run `npm i` if you just updated the version

### Tagging queries with `queryTags()`

Use `queryTags()` to attach sqlcommenter-formatted metadata to a QueryBuilder so
PlanetScale Vitess Query Insights can group queries by controller/action, and so
the mysql2 OTel auto-instrumentation span gets a useful name (via the
`installMysqlSpanRenamer()` processor).

```ts
import { queryTags } from '@spytecgps/nova-orm'

repo
  .createQueryBuilder('alertType')
  .comment(queryTags({ controller: 'AlertTypesRepository', action: 'getAlertTypes' }))
  .select()
  .getMany()
```

`queryTags()` auto-injects `application` from `process.env.OTEL_SERVICE_NAME`
and `traceparent` from the active OTel span (if any). Caller-supplied keys
override the auto-injected values. Output keys are alphabetically sorted for
deterministic grouping in PlanetScale Insights.

### Copy Distribution folder to local project ((local testing))

when making changes and would like to avoid commiting and publishing changes.

1. Run `npm run build-prod` to build all the content into the distribution folder
2. Run `npm run copydistfolder -- {destPath}` to copy distribution folder to local project
   ex: `npm run copydistfolder -- ../api-reports` copies dist folder to folder -> `api-reports/node_modules/@spytecgps/nova-orm/dist`
3. In order for VSCode to reload and get udpated nova-orm copied to node_modules dist folder -> On PC you can do Ctrl + Shift + P (mac: Cmd + Shift + P) then type "Reload Window"git