Merge branch 'attempt'

This commit is contained in:
Jerko Steiner 2020-01-09 18:27:30 +01:00
commit e6d1e4fbb9
28 changed files with 3003 additions and 3523 deletions

6352
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,14 +9,17 @@
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/logger": "file:../logger",
"express": "^4.17.1", "express": "^4.17.1",
"http-errors": "^1.7.3",
"svg-captcha": "^1.4.0" "svg-captcha": "^1.4.0"
}, },
"main": "lib/index.js", "main": "lib/index.js",
"module": "esm/index.js", "module": "esm/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"devDependencies": { "devDependencies": {
"@rondo.dev/test-utils": "0.0.1", "@rondo.dev/test-utils": "file:../test-utils",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.4", "cookie-parser": "^1.4.4",
"express-session": "^1.17.0", "express-session": "^1.17.0",
"supertest": "^4.0.2" "supertest": "^4.0.2"

View File

@ -5,6 +5,9 @@
"rootDir": "src" "rootDir": "src"
}, },
"references": [ "references": [
{
"path": "../logger"
},
{ {
"path": "../test-utils" "path": "../test-utils"
} }

View File

@ -13,22 +13,23 @@
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"module": "esm/index.js", "module": "esm/index.js",
"dependencies": { "dependencies": {
"@rondo.dev/common": "0.0.1", "@rondo.dev/common": "file:../common",
"@rondo.dev/http-client": "0.0.1", "@rondo.dev/http-client": "file:../http-client",
"@rondo.dev/http-types": "0.0.1", "@rondo.dev/http-types": "file:../http-types",
"@rondo.dev/jsonrpc": "0.0.1", "@rondo.dev/jsonrpc": "file:../jsonrpc",
"@rondo.dev/react-test": "0.0.1", "@rondo.dev/react-captcha": "file:../react-captcha",
"@rondo.dev/redux": "0.0.1", "@rondo.dev/react-test": "file:../react-test",
"bloomer": "^0.6.5", "@rondo.dev/redux": "file:../redux",
"history": "^4.10.1", "history": "^4.10.1",
"react-icons": "^3.8.0", "react-icons": "^3.8.0",
"react-router": "^5.1.2", "react-router": "^5.1.2",
"react-router-dom": "^5.1.2", "react-router-dom": "^5.1.2",
"styled-components": "^4.4.1",
"timeago.js": "^4.0.1" "timeago.js": "^4.0.1"
}, },
"devDependencies": { "devDependencies": {
"@rondo.dev/jsonrpc": "0.0.1", "@rondo.dev/jsonrpc": "file:../jsonrpc",
"@rondo.dev/test-utils": "0.0.1", "@rondo.dev/test-utils": "file:../test-utils",
"react-dom": "^16.11.0" "react-dom": "^16.11.0"
} }
} }

View File

@ -250,12 +250,12 @@ export class CRUDReducer<
} }
} }
reduce = ( reduce = (
state: CRUDState<T> | undefined, _state: CRUDState<T> | undefined,
action: CRUDAction<T, ActionType>, action: CRUDAction<T, ActionType>,
): CRUDState<T> => { ): CRUDState<T> => {
const {defaultState} = this const {defaultState} = this
state = state || defaultState const state = _state || defaultState
if (action.type !== this.actionName) { if (action.type !== this.actionName) {
return state return state

View File

@ -17,6 +17,9 @@
{ {
"path": "../jsonrpc" "path": "../jsonrpc"
}, },
{
"path": "../react-captcha"
},
{ {
"path": "../react-test" "path": "../react-test"
}, },

View File

@ -6,7 +6,7 @@
"module": "esm/index.js", "module": "esm/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"dependencies": { "dependencies": {
"@rondo.dev/jsonrpc": "0.0.1", "@rondo.dev/jsonrpc": "file:../jsonrpc",
"ts-transformer-keys": "^0.3.5" "ts-transformer-keys": "^0.3.5"
}, },
"devDependencies": {} "devDependencies": {}

View File

@ -12,12 +12,14 @@ export interface APIDef {
'post': { 'post': {
body: NewUser & { captcha: string } body: NewUser & { captcha: string }
response: UserProfile response: UserProfile
params: {}
} }
} }
'/auth/login': { '/auth/login': {
'post': { 'post': {
body: Credentials body: Credentials
response: UserProfile response: UserProfile
params: {}
} }
} }
'/auth/logout': { '/auth/logout': {
@ -29,6 +31,7 @@ export interface APIDef {
oldPassword: string oldPassword: string
newPassword: string newPassword: string
} }
params: {}
} }
} }
} }

View File

@ -9,7 +9,7 @@
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/logger": "0.0.1", "@rondo.dev/logger": "file:../logger",
"js-yaml": "^3.13.1" "js-yaml": "^3.13.1"
}, },
"main": "lib/index.js", "main": "lib/index.js",

View File

@ -9,8 +9,8 @@
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/db": "0.0.1", "@rondo.dev/db": "file:../db",
"@rondo.dev/logger": "0.0.1", "@rondo.dev/logger": "file:../logger",
"cls-hooked": "^4.2.2", "cls-hooked": "^4.2.2",
"shortid": "^2.2.15", "shortid": "^2.2.15",
"typeorm": "^0.2.20" "typeorm": "^0.2.20"

View File

@ -9,13 +9,13 @@
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/http-types": "0.0.1", "@rondo.dev/http-types": "file:../http-types",
"axios": "^0.19.0" "axios": "^0.19.0"
}, },
"main": "lib/index.js", "main": "lib/index.js",
"module": "esm/index.js", "module": "esm/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"devDependencies": { "devDependencies": {
"@rondo.dev/test-utils": "0.0.1" "@rondo.dev/test-utils": "file:../test-utils"
} }
} }

View File

@ -9,8 +9,8 @@
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/logger": "0.0.1", "@rondo.dev/logger": "file:../logger",
"@rondo.dev/redux": "0.0.1", "@rondo.dev/redux": "file:../redux",
"axios": "^0.19.0", "axios": "^0.19.0",
"express": "^4.17.1", "express": "^4.17.1",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",

View File

@ -237,7 +237,7 @@ describe('createActions', () => {
method: 'missingMethod', method: 'missingMethod',
status: 'resolved', status: 'resolved',
payload: null, payload: null,
}) } as any)
}) })
}) })
}) })

View File

@ -14,5 +14,8 @@
"main": "lib/index.js", "main": "lib/index.js",
"module": "esm/index.js", "module": "esm/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"devDependencies": {} "devDependencies": {
"@rondo.dev/react-test": "file:../react-test",
"react-dom": "^16.11.0"
}
} }

View File

@ -4,5 +4,9 @@
"outDir": "lib", "outDir": "lib",
"rootDir": "src" "rootDir": "src"
}, },
"references": [] "references": [
{
"path": "../react-test"
}
]
} }

View File

@ -9,11 +9,12 @@
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/redux": "0.0.1", "@rondo.dev/redux": "file:../redux",
"react": "^16.11.0", "react": "^16.11.0",
"react-dom": "^16.11.0", "react-dom": "^16.11.0",
"react-redux": "^7.1.1", "react-redux": "^7.1.1",
"redux": "^4.0.4" "redux": "^4.0.4",
"styled-components": "^4.4.1"
}, },
"main": "lib/index.js", "main": "lib/index.js",
"module": "esm/index.js", "module": "esm/index.js",

View File

@ -17,7 +17,7 @@
"module": "esm/index.js", "module": "esm/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"devDependencies": { "devDependencies": {
"@rondo.dev/test-utils": "0.0.1", "@rondo.dev/test-utils": "file:../test-utils",
"react": "^16.11.0", "react": "^16.11.0",
"react-dom": "^16.11.0" "react-dom": "^16.11.0"
} }

View File

@ -1,4 +1,4 @@
import { Action, applyMiddleware, createStore as create, Middleware, Reducer, DeepPartial } from 'redux' import { Action, applyMiddleware, createStore as create, Middleware, PreloadedState, Reducer } from 'redux'
import { PromiseMiddleware, ReduxLogger } from '../middleware' import { PromiseMiddleware, ReduxLogger } from '../middleware'
export interface CreateStoreParams<State, A extends Action> { export interface CreateStoreParams<State, A extends Action> {
@ -35,7 +35,7 @@ export function createStore<State, A extends Action>(
params.reducer, params.reducer,
// stupid warning about how Partial<State> | undefined cannot be used as // stupid warning about how Partial<State> | undefined cannot be used as
// DeepPartial<State> | undefined // DeepPartial<State> | undefined
params.state as DeepPartial<State> | undefined, params.state as PreloadedState<State> | undefined,
applyMiddleware(...middleware), applyMiddleware(...middleware),
) )
} }

View File

@ -1,4 +0,0 @@
{
"name": "@rondo.dev/scripts",
"lockfileVersion": 1
}

View File

@ -6,14 +6,14 @@
"test": "jest", "test": "jest",
"lint": "tslint --project .", "lint": "tslint --project .",
"compile": "tsc --build .", "compile": "tsc --build .",
"preinstall": "tsc --build .", "preinstall": "node ./preinstall.js",
"clean": "rm -rf lib/" "clean": "rm -rf lib/"
}, },
"bin": { "bin": {
"rondo": "./lib/index.js" "rondo": "./lib/index.js"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/argparse": "0.0.1", "@rondo.dev/argparse": "file:../argparse",
"browser-unpack": "^1.4.2", "browser-unpack": "^1.4.2",
"rimraf": "^3.0.0", "rimraf": "^3.0.0",
"typescript": "^3.6.4" "typescript": "^3.6.4"
@ -22,4 +22,4 @@
"devDependencies": {}, "devDependencies": {},
"module": "esm/index.js", "module": "esm/index.js",
"main": "lib/index.js" "main": "lib/index.js"
} }

View File

@ -0,0 +1,9 @@
const fs = require('fs')
if (!fs.existsSync('lib')) {
fs.mkdirSync('lib')
}
if (!fs.existsSync('lib/index.js')) {
fs.writeFileSync('lib/index.js', '')
}

View File

@ -165,19 +165,19 @@ export function imports(...argv: string[]) {
// eslint-disable-next-line // eslint-disable-next-line
const rootPackage = readJSON<Package>(args.root) const rootPackage = readJSON<Package>(args.root)
function resolveModule(name: string, version?: string) { function resolveModule(
packagesDir: string,
projectDir: string,
name: string,
version?: string,
) {
if (!version) { if (!version) {
throw new Error(`Module "${name}" not found in root package.json`) throw new Error(`Module "${name}" not found in root package.json`)
} }
if (version.startsWith('file:')) { if (version.startsWith('file:')) {
const pkg = readJSON<Package>(join(version.slice(5), 'package.json')) version = 'file:' + relative(projectDir, version.slice(5))
if (!pkg.version) {
throw new Error(`Package.json of referenced module "${name}" ` +
'does not have version field')
}
return {name, version: pkg.version}
} }
name = name.split('/')[0] // name = name.split('/')[0]
return {name: name, version} return {name: name, version}
} }
@ -189,26 +189,34 @@ export function imports(...argv: string[]) {
return folders[0] return folders[0]
} }
function resolveDependencies(dependencies: string[]) { function resolveDependencies(
packagesDir: string,
dependencies: string[],
projectDir: string,
) {
return dependencies return dependencies
.map(resolveModuleName) .map(resolveModuleName)
.reduce((obj, mod) => { .reduce((obj, mod) => {
const versionString = const versionString =
(rootPackage.dependencies || {})[mod] || (rootPackage.dependencies || {})[mod] ||
(rootPackage.devDependencies || {})[mod] (rootPackage.devDependencies || {})[mod]
const resolvedModule = resolveModule(mod, versionString) const resolvedModule = resolveModule(
packagesDir, projectDir, mod, versionString)
obj[resolvedModule.name] = resolvedModule.version obj[resolvedModule.name] = resolvedModule.version
return obj return obj
}, {} as Record<string, string>) }, {} as Record<string, string>)
} }
function organizePackageDependencies( function organizePackageDependencies(
packagesDir: string,
imports: Dependencies, imports: Dependencies,
projectDir: string,
packageFile: string, packageFile: string,
) { ) {
// handle imports // handle imports
const targetPackage = readJSON<Package>(packageFile) const targetPackage = readJSON<Package>(packageFile)
const dependencies = resolveDependencies(imports.dependencies) const dependencies = resolveDependencies(
packagesDir, imports.dependencies, projectDir)
if (targetPackage.peerDependencies) { if (targetPackage.peerDependencies) {
const peerDependencyNames = new Set( const peerDependencyNames = new Set(
Object.keys(targetPackage.peerDependencies), Object.keys(targetPackage.peerDependencies),
@ -227,7 +235,8 @@ export function imports(...argv: string[]) {
} else { } else {
targetPackage.dependencies = dependencies targetPackage.dependencies = dependencies
} }
targetPackage.devDependencies = resolveDependencies(imports.devDependencies) targetPackage.devDependencies = resolveDependencies(
packagesDir, imports.devDependencies, projectDir)
debug('dependencies: %o', targetPackage.dependencies) debug('dependencies: %o', targetPackage.dependencies)
debug('devDependencies: %o', targetPackage.devDependencies) debug('devDependencies: %o', targetPackage.devDependencies)
return {filename: packageFile, json: targetPackage} return {filename: packageFile, json: targetPackage}
@ -273,7 +282,8 @@ export function imports(...argv: string[]) {
const packageFile = join(pkgDir, 'package.json') const packageFile = join(pkgDir, 'package.json')
return [ return [
organizePackageDependencies(imports, packageFile), organizePackageDependencies(
args.packagesDir, imports, pkgDir, packageFile),
organizeProjectReferences( organizeProjectReferences(
args.packagesDir, imports, pkgDir, tsConfigFileName), args.packagesDir, imports, pkgDir, tsConfigFileName),
] ]

View File

@ -15,18 +15,19 @@
"typeorm": "ts-node ./node_modules/.bin/typeorm" "typeorm": "ts-node ./node_modules/.bin/typeorm"
}, },
"dependencies": { "dependencies": {
"@rondo.dev/argparse": "0.0.1", "@rondo.dev/argparse": "file:../argparse",
"@rondo.dev/client": "0.0.1", "@rondo.dev/captcha": "file:../captcha",
"@rondo.dev/common": "0.0.1", "@rondo.dev/client": "file:../client",
"@rondo.dev/config": "0.0.1", "@rondo.dev/common": "file:../common",
"@rondo.dev/db": "0.0.1", "@rondo.dev/config": "file:../config",
"@rondo.dev/db-typeorm": "0.0.1", "@rondo.dev/db": "file:../db",
"@rondo.dev/http-client": "0.0.1", "@rondo.dev/db-typeorm": "file:../db-typeorm",
"@rondo.dev/http-types": "0.0.1", "@rondo.dev/http-client": "file:../http-client",
"@rondo.dev/jsonrpc": "0.0.1", "@rondo.dev/http-types": "file:../http-types",
"@rondo.dev/logger": "0.0.1", "@rondo.dev/jsonrpc": "file:../jsonrpc",
"@rondo.dev/tasq": "0.0.1", "@rondo.dev/logger": "file:../logger",
"@rondo.dev/validator": "0.0.1", "@rondo.dev/tasq": "file:../tasq",
"@rondo.dev/validator": "file:../validator",
"bcrypt": "^3.0.6", "bcrypt": "^3.0.6",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"cls-hooked": "^4.2.2", "cls-hooked": "^4.2.2",

View File

@ -18,7 +18,7 @@ export class CSRFMiddleware implements Middleware {
httpOnly: true, httpOnly: true,
sameSite: true, sameSite: true,
secure: params.baseUrl.protocol === 'https', secure: params.baseUrl.protocol === 'https',
path: params.baseUrl.path, path: params.baseUrl.path !== null ? params.baseUrl.path : undefined,
key: params.cookieName, key: params.cookieName,
}, },
}) })

View File

@ -31,7 +31,7 @@ export class SessionMiddleware implements Middleware {
httpOnly: true, httpOnly: true,
sameSite: true, sameSite: true,
secure: params.baseUrl.protocol === 'https', secure: params.baseUrl.protocol === 'https',
path: params.baseUrl.path, path: params.baseUrl.path !== null ? params.baseUrl.path : undefined,
}, },
store: new SessionStore({ store: new SessionStore({
cleanupDelay: 60 * 1000, cleanupDelay: 60 * 1000,

View File

@ -19,14 +19,12 @@ export class AsyncRouter<R extends Routes> {
TypedHandler<R, P, M>, TypedHandler<R, P, M>,
] ]
) { ) {
const addRoute = this.router[method].bind(this.router as any)
if (handlers.length === 2) { if (handlers.length === 2) {
const middleware = handlers[0] const middleware = handlers[0]
const handler = handlers[1] const handler = handlers[1]
addRoute(path, ...middleware, this.wrapHandler(handler)) this.router[method](path, ...middleware, this.wrapHandler(handler))
} else { } else {
addRoute(path, this.wrapHandler(handlers[0])) this.router[method](path, this.wrapHandler(handlers[0]))
} }
} }

View File

@ -8,6 +8,9 @@
{ {
"path": "../argparse" "path": "../argparse"
}, },
{
"path": "../captcha"
},
{ {
"path": "../client" "path": "../client"
}, },

View File

@ -11,7 +11,7 @@
"dependencies": {}, "dependencies": {},
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"devDependencies": { "devDependencies": {
"@rondo.dev/test-utils": "0.0.1" "@rondo.dev/test-utils": "file:../test-utils"
}, },
"module": "esm/index.js", "module": "esm/index.js",
"main": "lib/index.js" "main": "lib/index.js"