-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Angular Signal Store #195
Merged
Merged
Angular Signal Store #195
Changes from all commits
Commits
Show all changes
110 commits
Select commit
Hold shift + click to select a range
fb319fb
feat(signal-store): create publishable library
mini-rx 6b6c068
feat(signal-store): signal store
mini-rx d1c8091
feat(signal-store-angular-demo): signal-store-angular-demo
mini-rx a9f8f0f
feat(signal-store): signal store
mini-rx 68271b2
feat(signal-store): signal store: Signal Selector specs
mini-rx b275e15
feat(signal-store): signal store: specs
mini-rx 80cda3e
feat(signal-store): signal store: specs
mini-rx 637c18b
feat(signal-store): signal store: specs
mini-rx 9020ede
feat(signal-store): signal store: specs
mini-rx 302b59f
feat(signal-store): signal store: specs
mini-rx 7255cc4
feat(signal-store): signal store: specs
mini-rx 821a2d0
feat(signal-store): signal store: specs
mini-rx 0b5cb7a
npx nx migrate --run-migrations
mini-rx 1d7a142
feat(signal-store): signal store: specs
mini-rx a8fb620
feat(signal-store): signal store: specs
mini-rx fd83ca2
feat(signal-store): signal store: specs
mini-rx f4c4cb7
Add npm task
spierala fe6d943
Fix signal store demo
spierala 6770902
feat(signal-store): fix demo
mini-rx 5cccc1e
feat(signal-store): fix demo
mini-rx 3eda308
Merge branch 'signal-store-tests' of github.com:spierala/mini-rx-stor…
mini-rx 54cfc99
feat(signal-store): signal store: specs
mini-rx 61dd5c7
Merge pull request #191 from spierala/signal-store-tests
spierala 3655bd5
feat(signal-store): signal store: specs
mini-rx 825b996
feat(signal-store): signal store: specs
mini-rx fe1f692
feat(signal-store): signal store: specs
mini-rx 72a06f7
feat(signal-store): signal store: specs
mini-rx 7665723
feat(signal-store): signal store: specs fix demo src link
mini-rx 05caa4d
feat(signal-store): signal store: providers
mini-rx fac802e
feat(signal-store): signal store: ng-modules tests
mini-rx 19db071
feat(signal-store): signal store: ng-modules tests
mini-rx a8e694e
feat(signal-store): signal store: providers tests
mini-rx db1aad4
feat(signal-store): signal store: create reducer inside initStore
mini-rx 8f3950e
feat(signal-store): signal store: package json
mini-rx 97c4b41
Merge pull request #196 from spierala/signal-store--providers
spierala e78e890
feat(signal-store): signal store: remove demo code
mini-rx b2ea321
feat(signal-store): signal store: adjust build all
mini-rx 160018f
feat(signal-store): signal store: cleanups
mini-rx baa19de
feat(signal-store): signal store: cleanups
mini-rx 17e9894
feat(signal-store): signal store: cleanups public API
mini-rx 5850e87
feat(signal-store): signal store: refactor hasOwnProperty
mini-rx ef3ecbc
feat(signal-store): signal store: small refactors and cleanups
mini-rx 9555778
feat(signal-store): signal store: select with default equality fn
mini-rx 0b3ed25
feat(signal-store): signal store: ES2021
mini-rx 094de84
feat(signal-store): signal store: ES2022
mini-rx b99e727
feat(signal-store): signal store: connect method
mini-rx ec6744d
feat(signal-store): signal store: connect method, refactor actions
mini-rx 7fcb5d7
feat(signal-store): signal store: connect method, refactor actions
mini-rx 1aa4459
feat(signal-store): common
mini-rx 784920b
feat(signal-store): common: refactor actions, tests
mini-rx ebb1fdd
feat(signal-store): common: refactor actions, tests
mini-rx a61309f
feat(signal-store): common: tests: combineReducers
mini-rx a1fc51e
feat(signal-store): common: tests: ActionsOnQueue
mini-rx 462a729
feat(signal-store): common: tests: createRxEffect
mini-rx b9a3a37
feat(signal-store): common: tests: deepFreeze, defaultEffectsErrorHan…
mini-rx 6871420
feat(signal-store): common: tests
mini-rx f04c081
feat(signal-store): common: tests
mini-rx f2b2454
feat(signal-store): common: tests
mini-rx 2c6d7da
feat(signal-store): common: tests: logger extension
mini-rx f591624
feat(signal-store): common: tests: logger extension, immutable ext
mini-rx 8315169
feat(signal-store): common: tests: undo extension etx
mini-rx d95b6f8
feat(signal-store): common: tests: redux devtools
mini-rx c1663a8
feat(signal-store): common: tests
mini-rx 5b450f5
feat(signal-store): common
mini-rx b9b854e
feat(signal-store): common: reducerManager
mini-rx 7e15160
feat(signal-store): common: createActionsOnQueue
mini-rx 8cafb14
feat(signal-store): common: selectableSignalState
mini-rx 1a790a2
feat(signal-store): common: createBaseStore
mini-rx 3153682
feat(signal-store): common: createBaseStore, component store config
mini-rx a9c0e78
feat(signal-store): common
mini-rx a9f26e5
feat(signal-store): common
mini-rx bbf40eb
feat(signal-store): common
mini-rx 5b0611d
feat(signal-store): common
mini-rx d5b551e
feat(signal-store): common: ComponentStoreLike interface
mini-rx ab70153
feat(signal-store): common
mini-rx 61cb939
Merge pull request #203 from spierala/signal-store--common
spierala 1c0289e
feat(signal-store): remove takeUntilDestroyed, use classic sub.add
mini-rx 58791d4
feat(signal-store): package versions++, fix import
mini-rx e3be99a
Merge branch 'signal-store--common' into signal-store
mini-rx 2a46759
Revert "feat(signal-store): remove takeUntilDestroyed, use classic su…
mini-rx b177427
feat(signal-store): optimise imports
mini-rx 4005107
feat(signal-store): reimplement toObservable with Subject instead of …
mini-rx b7420e8
feat(signal-store): subsink
mini-rx f733196
feat(signal-store): rx effect injector
mini-rx 50af7b4
feat(signal-store): improve tests
mini-rx ee50ec0
feat(signal-store): improve tests
4e0d287
feat(signal-store): improve tests
mini-rx d12bf4c
feat(signal-store): improve tests
mini-rx b5060a3
feat(signal-store): deps
mini-rx e83f65c
feat(signal-store): inc dep versions
mini-rx f6fcff6
feat(signal-store, common): more lightweight injection tokens
mini-rx 139ab38
feat(signal-store, common): better component store config error
mini-rx 0a87042
feat(signal-store, common): reduce bundle size
mini-rx a41044f
feat(common): isFunction
mini-rx 7b3f9e5
feat(common): easier calculate extensions and more minor bundle size …
mini-rx db082fa
feat(signal-store): rename dispatcher => updateState
mini-rx 369c177
fix(common): add reducer manager default reducer
mini-rx a8dd587
feat(common): improve test describe
portofantwerpbruges 6996eac
chore(all): relax jest dependencies
portofantwerpbruges d47b646
chore(all): use yarn
mini-rx 511d9dd
chore(all): use yarn, node 18
mini-rx cbbf12d
Merge remote-tracking branch 'origin/master' into signal-store
mini-rx 42f1a14
feat(common): better typing of reducer
mini-rx 2c69c39
feat(common): better comment
mini-rx c306f7b
feat(common): remove not useful comments
mini-rx c369b4f
feat(common): retryAttemptsLeft
mini-rx 0cefb28
Merge branch 'master' of github.com:spierala/mini-rx-store into signa…
mini-rx 52b53e4
refactor(common, signal-store): use UpdateStateCallback
mini-rx cd90166
refactor(signal-store): remove obsolete wrapper fn for isSignal
mini-rx 6008062
docs(common, signal-store): add comments
mini-rx File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,3 +4,5 @@ | |
/coverage | ||
*.md | ||
/docs | ||
|
||
.angular |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,17 @@ | ||
{ | ||
"extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], | ||
"ignorePatterns": ["!**/*"], | ||
"overrides": [ | ||
{ | ||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"], | ||
"rules": {} | ||
}, | ||
{ | ||
"files": ["src/plugins/index.js"], | ||
"rules": { | ||
"@typescript-eslint/no-var-requires": "off", | ||
"no-undef": "off" | ||
} | ||
} | ||
] | ||
"extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], | ||
"ignorePatterns": ["!**/*"], | ||
"overrides": [ | ||
{ | ||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"], | ||
"rules": {} | ||
}, | ||
{ | ||
"files": ["src/plugins/index.js"], | ||
"rules": { | ||
"@typescript-eslint/no-var-requires": "off", | ||
"no-undef": "off" | ||
} | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
{ | ||
"extends": ["../../.eslintrc.json"], | ||
"ignorePatterns": ["!**/*"], | ||
"overrides": [ | ||
{ | ||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"], | ||
"rules": {} | ||
}, | ||
{ | ||
"files": ["*.ts", "*.tsx"], | ||
"rules": {} | ||
}, | ||
{ | ||
"files": ["*.js", "*.jsx"], | ||
"rules": {} | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# common | ||
|
||
This library was generated with [Nx](https://nx.dev). | ||
|
||
## Building | ||
|
||
Run `nx build common` to build the library. | ||
|
||
## Running unit tests | ||
|
||
Run `nx test common` to execute the unit tests via [Jest](https://jestjs.io). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
/* eslint-disable */ | ||
export default { | ||
displayName: 'common', | ||
preset: '../../jest.preset.js', | ||
globals: {}, | ||
transform: { | ||
'^.+\\.[tj]s$': [ | ||
'ts-jest', | ||
{ | ||
tsconfig: '<rootDir>/tsconfig.spec.json', | ||
}, | ||
], | ||
}, | ||
moduleFileExtensions: ['ts', 'js', 'html'], | ||
coverageDirectory: '../../coverage/libs/common', | ||
testRunner: 'jest-jasmine2', | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
{ | ||
"name": "@mini-rx/common", | ||
"version": "0.0.8", | ||
"peerDependencies": { | ||
"rxjs": "^6.4.0 || ^7.0.0" | ||
}, | ||
"sideEffects": false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
{ | ||
"name": "common", | ||
"$schema": "../../node_modules/nx/schemas/project-schema.json", | ||
"sourceRoot": "libs/common/src", | ||
"projectType": "library", | ||
"targets": { | ||
"build": { | ||
"executor": "@nx/rollup:rollup", | ||
"outputs": ["{options.outputPath}"], | ||
"options": { | ||
"outputPath": "dist/libs/common", | ||
"main": "libs/common/src/index.ts", | ||
"tsConfig": "libs/common/tsconfig.lib.json", | ||
"assets": [], | ||
"project": "libs/common/package.json", | ||
"format": ["esm", "cjs"], | ||
"globals": [ | ||
{ | ||
"global": "Rx", | ||
"moduleId": "rxjs" | ||
}, | ||
{ | ||
"global": "Rx", | ||
"moduleId": "rxjs/operators" | ||
} | ||
] | ||
} | ||
}, | ||
"publish": { | ||
"command": "node tools/scripts/publish.mjs common {args.ver} {args.tag}", | ||
"dependsOn": ["build"] | ||
}, | ||
"lint": { | ||
"executor": "@nx/linter:eslint", | ||
"outputs": ["{options.outputFile}"], | ||
"options": { | ||
"lintFilePatterns": ["libs/common/**/*.ts"] | ||
} | ||
}, | ||
"test": { | ||
"executor": "@nx/jest:jest", | ||
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], | ||
"options": { | ||
"jestConfig": "libs/common/jest.config.ts", | ||
"passWithNoTests": true | ||
}, | ||
"configurations": { | ||
"ci": { | ||
"ci": true, | ||
"codeCoverage": true | ||
} | ||
} | ||
} | ||
}, | ||
"tags": [] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
export { miniRxNameSpace } from './lib/constants'; | ||
export { createSubSink } from './lib/sub-sink'; | ||
export { createMiniRxActionType } from './lib/create-mini-rx-action-type'; | ||
export { combineMetaReducers } from './lib/combine-meta-reducers'; | ||
export { miniRxError } from './lib/mini-rx-error'; | ||
export { sortExtensions } from './lib/sort-extensions'; | ||
export { mapResponse } from './lib/map-response'; | ||
export { tapResponse } from './lib/tap-response'; | ||
export { ofType } from './lib/of-type'; | ||
export { createActionsOnQueue } from './lib/actions-on-queue'; | ||
export { defaultEffectsErrorHandler } from './lib/default-effects-error-handler'; | ||
export { | ||
createRxEffect, | ||
hasEffectMetaData, | ||
HasEffectMetadata, | ||
EffectConfig, | ||
EFFECT_METADATA_KEY, | ||
} from './lib/create-rx-effect'; | ||
export { LoggerExtension } from './lib/extensions/logger/logger.extension'; | ||
export { UndoExtension } from './lib/extensions/undo/undo-extension'; | ||
export { undo } from './lib/extensions/undo/undo'; | ||
export { ImmutableStateExtension } from './lib/extensions/immutable-state/immutable-state.extension'; | ||
export { | ||
AbstractReduxDevtoolsExtension, | ||
ReduxDevtoolsOptions, | ||
} from './lib/extensions/redux-devtools/abstract-redux-devtools-extension'; | ||
export { createFeatureStoreReducer } from './lib/create-feature-store-reducer'; | ||
export { createComponentStoreReducer } from './lib/create-component-store-reducer'; | ||
export { generateId } from './lib/generate-id'; | ||
export { calculateExtensions } from './lib/calculate-extensions'; | ||
export { createReducerManager, ReducerManager } from './lib/reducer-manager'; | ||
export { componentStoreConfig } from './lib/component-store-config'; | ||
export { ExtensionId } from './lib/enums'; | ||
export { | ||
Action, | ||
Actions, | ||
FeatureStoreConfig, | ||
Reducer, | ||
StateOrCallback, | ||
MiniRxAction, | ||
StoreExtension, | ||
StoreConfig, | ||
FeatureConfig, | ||
MetaReducer, | ||
ComponentStoreConfig, | ||
ComponentStoreExtension, | ||
AppState, | ||
ReducerDictionary, | ||
ReducerState, | ||
UpdateStateCallback, | ||
OperationType, | ||
} from './lib/models'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import { createActionsOnQueue } from './actions-on-queue'; | ||
import { take } from 'rxjs'; | ||
|
||
describe('ActionsOnQueue', () => { | ||
it('should dispatch actions', () => { | ||
const spy = jest.fn(); | ||
|
||
const actionsOnQueue = createActionsOnQueue(); | ||
actionsOnQueue.actions$.subscribe(spy); | ||
|
||
const action = { type: 'someAction' }; | ||
actionsOnQueue.dispatch(action); | ||
|
||
expect(spy).toHaveBeenCalledWith(action); | ||
}); | ||
it('should queue actions', () => { | ||
// Without queueScheduler this test would fail because of stack overflow (Read more here: https://blog.cloudboost.io/so-how-does-rx-js-queuescheduler-actually-work-188c1b46526e) | ||
|
||
const callLimit = 5000; | ||
|
||
const actionsOnQueue = createActionsOnQueue(); | ||
|
||
const spy = jest.fn().mockImplementation(() => { | ||
// Every received action dispatches another action | ||
actionsOnQueue.dispatch({ type: 'someAction' }); | ||
}); | ||
|
||
actionsOnQueue.actions$.pipe(take(callLimit)).subscribe(spy); | ||
|
||
actionsOnQueue.dispatch({ type: 'someInitialAction' }); // Dispatch an action to start the whole thing | ||
|
||
expect(spy).toHaveBeenCalledTimes(callLimit); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import { queueScheduler, Subject, observeOn } from 'rxjs'; | ||
import { Action } from './models'; | ||
|
||
export function createActionsOnQueue() { | ||
const actionsSource = new Subject<Action>(); | ||
|
||
return { | ||
actions$: actionsSource.asObservable().pipe( | ||
observeOn(queueScheduler) // Prevent stack overflow: https://blog.cloudboost.io/so-how-does-rx-js-queuescheduler-actually-work-188c1b46526e | ||
), | ||
dispatch: <T extends Action>(action: T): T => { | ||
actionsSource.next(action); | ||
return action; | ||
}, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
import { beautifyAction } from './beautify-action'; | ||
import { MiniRxAction, OperationType } from './models'; | ||
import { createMiniRxActionType } from './create-mini-rx-action-type'; | ||
|
||
describe('beautifyAction', () => { | ||
it('should remove extra fields from FeatureStore/ComponentStore Actions', () => { | ||
const csAction: MiniRxAction<any> = { | ||
type: createMiniRxActionType(OperationType.SET_STATE, 'todos'), | ||
stateOrCallback: {}, | ||
}; | ||
|
||
expect(beautifyAction(csAction)).toEqual({ | ||
type: '@mini-rx/todos/set-state', | ||
payload: {}, | ||
}); | ||
|
||
const fsAction: MiniRxAction<any> = { | ||
type: createMiniRxActionType(OperationType.SET_STATE, 'todos'), | ||
stateOrCallback: {}, | ||
featureId: 'someFeatureId', | ||
}; | ||
|
||
expect(beautifyAction(fsAction)).toEqual({ | ||
type: '@mini-rx/todos/set-state', | ||
payload: {}, | ||
}); | ||
}); | ||
it('should not touch other normal Actions', () => { | ||
const action = { type: 'someAction' }; | ||
|
||
expect(beautifyAction(action)).toBe(action); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
import { Action, MiniRxAction } from '../lib/models'; | ||
import { isMiniRxAction } from './is-mini-rx-action'; | ||
|
||
// Only display type and payload in the LoggingExtension and Redux DevTools | ||
export function beautifyAction(action: Action | MiniRxAction<any>): Action { | ||
return isMiniRxAction(action) | ||
? { | ||
type: action.type, | ||
payload: action.stateOrCallback, | ||
} | ||
: action; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import { calcNextState } from './calc-next-state'; | ||
|
||
describe('calcNextState', () => { | ||
it('should calculate next state', () => { | ||
const currentState = { count: 1 }; | ||
expect(calcNextState(currentState, { count: 2 })).toEqual({ count: 2 }); | ||
|
||
// Witch callback | ||
expect(calcNextState(currentState, (state) => ({ count: state.count + 2 }))).toEqual({ | ||
count: 3, | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import { StateOrCallback } from './models'; | ||
import { isFunction } from './is-function'; | ||
|
||
export function calcNextState<T>(state: T, stateOrCallback: StateOrCallback<T>): T { | ||
return { | ||
...state, | ||
...(isFunction(stateOrCallback) ? stateOrCallback(state) : stateOrCallback), // new partial state | ||
}; | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better README still has to come in another PR.