Skip to content

Commit

Permalink
Merge pull request #4 from anchan828/release-first-version
Browse files Browse the repository at this point in the history
feat:  first version
  • Loading branch information
anchan828 authored Oct 4, 2023
2 parents 4611186 + d14d306 commit 469afd6
Show file tree
Hide file tree
Showing 40 changed files with 10,455 additions and 26,506 deletions.
13 changes: 0 additions & 13 deletions .codeclimate.yml

This file was deleted.

4 changes: 0 additions & 4 deletions .compodocrc.json

This file was deleted.

14 changes: 6 additions & 8 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,23 @@
const path = require("path");
module.exports = {
env: {
jest: true,
node: true,
jest: true,
},
extends: ["plugin:@typescript-eslint/recommended", "prettier"],
parser: "@typescript-eslint/parser",
parserOptions: {
project: path.resolve(__dirname, "tsconfig.eslint.json"),
sourceType: "module",
project: path.resolve(__dirname, "tsconfig.json"),
},
plugins: ["@typescript-eslint", "sort-keys-fix"],
plugins: ["@typescript-eslint"],
rules: {
"no-unused-vars": "off",
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "error",
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-explicit-any": "off",
"lines-between-class-members": ["error", "always"],
"no-unused-vars": "off",
"no-useless-constructor": "off",
"sort-keys-fix/sort-keys-fix": "error",
},
};
27 changes: 27 additions & 0 deletions .github/workflows/major-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Major Release

on:
workflow_dispatch:

jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4
- name: Checkout master
run: git checkout main
- uses: actions/setup-node@v3
with:
node-version: 20
cache: npm
- name: Install npm packages
run: npm ci
- name: Build
run: npm run build
- name: Publish monorepo packages
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY
npx lerna publish --yes major
27 changes: 27 additions & 0 deletions .github/workflows/minor-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Minor Release

on:
workflow_dispatch:

jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4
- name: Checkout master
run: git checkout main
- uses: actions/setup-node@v3
with:
node-version: 20
cache: npm
- name: Install npm packages
run: npm ci
- name: Build
run: npm run build
- name: Publish monorepo packages
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY
npx lerna publish --yes minor
31 changes: 31 additions & 0 deletions .github/workflows/patch-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Patch Release

on:
schedule:
- cron: "0 4 * * 0"
branches:
- master
workflow_dispatch:

jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4
- name: Checkout master
run: git checkout main
- uses: actions/setup-node@v3
with:
node-version: 20
cache: npm
- name: Install npm packages
run: npm ci
- name: Build
run: npm run build
- name: Publish monorepo packages
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY
npx lerna publish --yes patch
3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,3 @@ typings/
dist
.idea
.DS_Store
packages/**/LICENSE
packages/cache-dependency/README.md
.turbo
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2020 anchan828
Copyright (c) 2018-2022 anchan828

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
156 changes: 154 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,155 @@
# @anchan828/nest-lerna-template
# @anchan828/nest-kysely

This repository is template for nestjs with lerna.
![npm](https://img.shields.io/npm/v/@anchan828/nest-kysely.svg)

This is a [Nest](https://github.com/nestjs/nest) implementation of the redlock algorithm for distributed redis locks.

This package uses [node-redlock](https://github.com/mike-marcacci/node-redlock).

## Installation

```bash
$ npm i --save @anchan828/nest-kysely ioredis
```

## Quick Start

### 1. Import module

```ts
import { RedlockModule } from "@anchan828/nest-kysely";
import Redis from "ioredis";

@Module({
imports: [
RedlockModule.register({
// See https://github.com/mike-marcacci/node-redlock#configuration
clients: [new Redis({ host: "localhost" })],
settings: {
driftFactor: 0.01,
retryCount: 10,
retryDelay: 200,
retryJitter: 200,
automaticExtensionThreshold: 500,
},
// Default duratiuon to use with Redlock decorator
duration: 1000,
}),
],
})
export class AppModule {}
```

### 2. Add `Redlock` decorator

```ts
import { Redlock } from "@anchan828/nest-kysely";

@Injectable()
export class ExampleService {
@Redlock("lock-key")
public async addComment(projectId: number, comment: string): Promise<void> {}
}
```

This is complete. redlock is working correctly!
See [node-redlock](https://github.com/mike-marcacci/node-redlock) for more information on redlock.

## Define complex resources (lock keys)

Using constants causes the same lock key to be used for all calls. Let's reduce the scope a bit more.

In this example, only certain projects are now locked.

```ts
import { Redlock } from "@anchan828/nest-kysely";

@Injectable()
export class ExampleService {
// The arguments define the class object to which the decorator is being added and the method arguments in order.
@Redlock<ExampleService["addComment"]>(
(target: ExampleService, projectId: number, comment: string) => `projects/${projectId}/comments`,
)
public async addComment(projectId: number, comment: string): Promise<void> {}
}
```

Of course, you can lock multiple keys.

```ts
@Injectable()
export class ExampleService {
@Redlock<ExampleService["updateComments"]>(
(target: ExampleService, projectId: number, args: Array<{ commentId: number; comment: string }>) =>
args.map((arg) => `projects/${projectId}/comments/${arg.commentId}`),
)
public async updateComments(projectId: number, args: Array<{ commentId: number; comment: string }>): Promise<void> {}
}
```

## Using Redlock service

If you want to use node-redlock as is, use RedlockService.

```ts
import { RedlockService } from "@anchan828/nest-kysely";

@Injectable()
export class ExampleService {
constructor(private readonly redlock: RedlockService) {}

public async addComment(projectId: number, comment: string): Promise<void> {
await this.redlock.using([`projects/${projectId}/comments`], 5000, (signal) => {
// Do something...

if (signal.aborted) {
throw signal.error;
}
});
}
}
```

## Using fake RedlockService

If you do not want to use Redis in your Unit tests, define the fake class as RedlockService.

```ts
const app = await Test.createTestingModule({
providers: [TestService, { provide: RedlockService, useClass: FakeRedlockService }],
}).compile();
```

## Troubleshooting

### Nest can't resolve dependencies of the XXX. Please make sure that the "@redlockService" property is available in the current context.

This is the error output when using the Redlock decorator without importing the RedlockModule.

```ts
import { RedlockModule } from "@anchan828/nest-kysely";
import Redis from "ioredis";

@Module({
imports: [
RedlockModule.register({
clients: [new Redis({ host: "localhost" })],
}),
],
})
export class AppModule {}
```

#### What should I do with Unit tests, I don't want to use Redis.

Use `FakeRedlockService` class. Register FakeRedlockService with the provider as RedlockService.

```ts
const app = await Test.createTestingModule({
providers: [TestService, { provide: RedlockService, useClass: FakeRedlockService }],
}).compile();
```

## License

[MIT](LICENSE)
28 changes: 28 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
version: "3.4"

services:
mysql:
image: mysql:8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test
command:
[
"mysqld",
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_bin",
"--default-authentication-plugin=mysql_native_password",
"--sync-binlog=0",
"--innodb-flush-log-at-trx-commit=2",
"--innodb-use-native-aio=0",
]
postgres:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: test
File renamed without changes.
12 changes: 8 additions & 4 deletions lerna.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
{
"packages": ["packages/*"],
"packages": [
"packages/*"
],
"command": {
"publish": {
"ignoreChanges": ["**/dist/**/*"],
"message": "chore: publish %s [ci skip]"
"ignoreChanges": [
"dist/**/*"
],
"message": "chore(release): publish %s"
}
},
"version": "0.0.0"
}
}
Loading

0 comments on commit 469afd6

Please sign in to comment.