From b5d7afc877123da4b4603ce9c0f6c986885e47f3 Mon Sep 17 00:00:00 2001 From: raveclassic Date: Wed, 6 Apr 2022 18:31:42 +0300 Subject: [PATCH] feat(remote): initial --- packages/remote/.eslintrc.json | 18 ++++++ packages/remote/jest.config.js | 15 +++++ packages/remote/package.json | 30 ++++++++++ packages/remote/project.json | 41 +++++++++++++ packages/remote/src/index.ts | 21 +++++++ packages/remote/src/remote-data/index.ts | 12 ++++ .../remote/src/remote-data/remote-data.ts | 59 +++++++++++++++++++ packages/remote/src/remote-property/index.ts | 1 + .../src/remote-property/remote-property.ts | 25 ++++++++ packages/remote/tsconfig.json | 22 +++++++ packages/remote/tsconfig.lib.json | 10 ++++ packages/remote/tsconfig.spec.json | 9 +++ 12 files changed, 263 insertions(+) create mode 100644 packages/remote/.eslintrc.json create mode 100644 packages/remote/jest.config.js create mode 100644 packages/remote/package.json create mode 100644 packages/remote/project.json create mode 100644 packages/remote/src/index.ts create mode 100644 packages/remote/src/remote-data/index.ts create mode 100644 packages/remote/src/remote-data/remote-data.ts create mode 100644 packages/remote/src/remote-property/index.ts create mode 100644 packages/remote/src/remote-property/remote-property.ts create mode 100644 packages/remote/tsconfig.json create mode 100644 packages/remote/tsconfig.lib.json create mode 100644 packages/remote/tsconfig.spec.json diff --git a/packages/remote/.eslintrc.json b/packages/remote/.eslintrc.json new file mode 100644 index 0000000..d3e61a2 --- /dev/null +++ b/packages/remote/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.js"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/remote/jest.config.js b/packages/remote/jest.config.js new file mode 100644 index 0000000..bcdae8a --- /dev/null +++ b/packages/remote/jest.config.js @@ -0,0 +1,15 @@ +module.exports = { + testRunner: 'jasmine2', + displayName: 'lens', + preset: '../../jest.preset.js', + globals: { + 'ts-jest': { + tsconfig: '/tsconfig.spec.json', + }, + }, + transform: { + '^.+\\.[tj]s$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/lens', +} diff --git a/packages/remote/package.json b/packages/remote/package.json new file mode 100644 index 0000000..5d2fd4f --- /dev/null +++ b/packages/remote/package.json @@ -0,0 +1,30 @@ +{ + "name": "@frp-ts/remote", + "version": "1.0.0-alpha.14", + "description": "Remote Data utilities for frp-ts properties", + "typedocMain": "./src/index.ts", + "author": "raveclassic", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/raveclassic/frp-ts.git" + }, + "bugs": { + "url": "https://github.com/raveclassic/frp-ts/issues" + }, + "homepage": "https://github.com/raveclassic/frp-ts#readme", + "scripts": {}, + "private": false, + "publishConfig": { + "access": "public" + }, + "peerDependencies": { + "tslib": "^2.3.1" + }, + "dependencies": { + "@frp-ts/core": "^1.0.0-alpha.14" + }, + "devDependencies": { + "tslib": "^2.3.1" + } +} diff --git a/packages/remote/project.json b/packages/remote/project.json new file mode 100644 index 0000000..0adfc63 --- /dev/null +++ b/packages/remote/project.json @@ -0,0 +1,41 @@ +{ + "root": "packages/remote", + "sourceRoot": "packages/remote/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/remote", + "main": "packages/remote/src/index.ts", + "tsConfig": "packages/remote/tsconfig.lib.json", + "assets": ["packages/remote/*.md"] + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/remote/**/*.ts"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["coverage/packages/remote"], + "options": { + "jestConfig": "packages/remote/jest.config.js", + "passWithNoTests": true, + "codeCoverage": true + } + }, + "deploy": { + "executor": "ngx-deploy-npm:deploy", + "options": { + "access": "public", + "noBuild": true + } + } + }, + "tags": [] +} diff --git a/packages/remote/src/index.ts b/packages/remote/src/index.ts new file mode 100644 index 0000000..b00247b --- /dev/null +++ b/packages/remote/src/index.ts @@ -0,0 +1,21 @@ +export * as remoteData from './remote-data' +export { + RemotePending, + RemoteFailure, + RemoteSuccess, + RemoteData, + RemoteDataValue, + RemoteDataError, + pending, + failure, + success, + combine as combineRemoteData, +} from './remote-data' + +export * as remoteProperty from './remote-property' +export { + RemoteProperty, + RemotePropertyError, + RemotePropertyValue, + combine as combineRemoteProperty, +} from './remote-property' diff --git a/packages/remote/src/remote-data/index.ts b/packages/remote/src/remote-data/index.ts new file mode 100644 index 0000000..3360b32 --- /dev/null +++ b/packages/remote/src/remote-data/index.ts @@ -0,0 +1,12 @@ +export { + RemotePending, + RemoteFailure, + RemoteSuccess, + RemoteData, + RemoteDataValue, + RemoteDataError, + pending, + failure, + success, + combine, +} from './remote-data' diff --git a/packages/remote/src/remote-data/remote-data.ts b/packages/remote/src/remote-data/remote-data.ts new file mode 100644 index 0000000..b10211d --- /dev/null +++ b/packages/remote/src/remote-data/remote-data.ts @@ -0,0 +1,59 @@ +export interface RemotePending { + readonly kind: 'RemotePending' +} +export const pending: RemoteData = { + kind: 'RemotePending', +} + +export interface RemoteFailure { + readonly kind: 'RemoteFailure' + readonly error: Error +} +export const failure = (error: Error): RemoteData => ({ + kind: 'RemoteFailure', + error, +}) + +export interface RemoteSuccess { + readonly kind: 'RemoteSuccess' + readonly value: Value +} +export const success = (value: Value): RemoteData => ({ + kind: 'RemoteSuccess', + value, +}) + +export type RemoteData = RemotePending | RemoteFailure | RemoteSuccess + +export type RemoteDataError = Target extends RemoteFailure ? Error : never +export type RemoteDataValue = Target extends RemoteSuccess ? Value : never + +export type MapRemoteDataListToValues[]> = { + readonly [Index in keyof Inputs]: RemoteDataValue +} +type MapRemoteDataListToErrors[]> = { + readonly [Index in keyof Inputs]: RemoteDataError +} + +export function combine[], Result>( + ...args: [...Inputs, (...values: MapRemoteDataListToValues) => Result] +): RemoteData[number], Result> { + // eslint-disable-next-line no-restricted-syntax + const inputs: Inputs = args.slice(0, args.length - 1) as never + + if (inputs.length === 0) { + // eslint-disable-next-line no-restricted-syntax + const project = args[args.length - 1] as () => Result + return success(project()) + } + + const values: unknown[] = [] + for (const input of inputs) { + // eslint-disable-next-line no-restricted-syntax + if (input.kind === 'RemotePending' || input.kind === 'RemoteFailure') return input as never + values.push(input.value) + } + // eslint-disable-next-line no-restricted-syntax + const project = args[args.length - 1] as (...args: readonly unknown[]) => Result + return success(project(...values)) +} diff --git a/packages/remote/src/remote-property/index.ts b/packages/remote/src/remote-property/index.ts new file mode 100644 index 0000000..fc04c06 --- /dev/null +++ b/packages/remote/src/remote-property/index.ts @@ -0,0 +1 @@ +export { RemoteProperty, RemotePropertyError, RemotePropertyValue, combine } from './remote-property' diff --git a/packages/remote/src/remote-property/remote-property.ts b/packages/remote/src/remote-property/remote-property.ts new file mode 100644 index 0000000..5fdbac2 --- /dev/null +++ b/packages/remote/src/remote-property/remote-property.ts @@ -0,0 +1,25 @@ +import { Property, combine as combineProperty } from '@frp-ts/core' +import { RemoteData, RemoteFailure, RemoteSuccess, combine as combineRemoteData } from '../remote-data/remote-data' + +export interface RemoteProperty extends Property> {} + +export type RemotePropertyValue = Target extends Property> ? Value : never +export type RemotePropertyError = Target extends Property> ? Error : never + +export type MapRemotePropertiesToValues[]> = { + readonly [Index in keyof Inputs]: RemotePropertyValue +} +export type MapRemotePropertiesToErrors[]> = { + readonly [Index in keyof Inputs]: RemotePropertyError +} + +export function combine[], Result>( + ...args: [...Inputs, (...values: MapRemotePropertiesToValues) => Result] +): RemoteProperty[number], Result> { + // eslint-disable-next-line no-restricted-syntax + const inputs: Inputs = args.slice(0, args.length - 1) as never + // eslint-disable-next-line no-restricted-syntax + const project = args[args.length - 1] as (...values: readonly unknown[]) => Result + // eslint-disable-next-line no-restricted-syntax + return combineProperty(...inputs, (...values) => combineRemoteData(...values, project)) as never +} diff --git a/packages/remote/tsconfig.json b/packages/remote/tsconfig.json new file mode 100644 index 0000000..8b2ad5a --- /dev/null +++ b/packages/remote/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": ["."], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/remote/tsconfig.lib.json b/packages/remote/tsconfig.lib.json new file mode 100644 index 0000000..a8b9431 --- /dev/null +++ b/packages/remote/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": [] + }, + "include": ["**/*.ts"], + "exclude": ["**/*.spec.ts"] +} diff --git a/packages/remote/tsconfig.spec.json b/packages/remote/tsconfig.spec.json new file mode 100644 index 0000000..a18afb6 --- /dev/null +++ b/packages/remote/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] +}