From 0645b5d8f80208b9d2ed38378ec9354abd794d6e Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Tue, 6 Apr 2021 17:13:39 +0100 Subject: [PATCH 1/2] First attempt on query builder --- src/builder.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/builder.ts diff --git a/src/builder.ts b/src/builder.ts new file mode 100644 index 0000000..40a0132 --- /dev/null +++ b/src/builder.ts @@ -0,0 +1,26 @@ +import { onUser } from './nodes' + +export default class QueryBuilder { + private _query: string + private _queryTitleMap: Record string> = { + user: onUser + } + + on (node: string, params: Record) { + this._query.replace(node, this._queryTitleMap[node](params.fields)) + return this + } + + get query () { + return this._query + } +} + +const QB = new QueryBuilder() + +const query = QB.on('users', { + fields: 'id, email, age, projects', + first: 10 +}).on('projects', { + fields: 'name, dateCreated' +}).query From 0eff0173c65bb27a0f31db541e640efece331f02 Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Sun, 30 May 2021 22:13:05 +0100 Subject: [PATCH 2/2] Request queries and include nodes --- src/builder.ts | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/builder.ts b/src/builder.ts index 40a0132..08e1fa8 100644 --- a/src/builder.ts +++ b/src/builder.ts @@ -1,26 +1,55 @@ -import { onUser } from './nodes' +import { onUser, onProject } from './nodes' +import { User, Project } from './queries' +interface INode { + user: (...args: any) => string, + project: (...args: any) => string +} + +interface IQuery { + user: (...args: any) => string, + project: (...args: any) => string +} export default class QueryBuilder { private _query: string - private _queryTitleMap: Record string> = { - user: onUser + private _nodeTitleMap: INode = { + user: onUser, + project: onProject } - on (node: string, params: Record) { - this._query.replace(node, this._queryTitleMap[node](params.fields)) + private _queryTitleMap: IQuery = { + user: User, + project: Project + } + + on (node: keyof INode, params: Record) { + const args = Object.entries(params).map(([, val]) => val) + const nodeFragment = this._nodeTitleMap[node](...args) + const regex = new RegExp(node, 'g') + + this._query = this._query.replace(regex, nodeFragment) return this } get query () { return this._query } + + request (query: keyof IQuery, params: Record) { + const args = Object.entries(params).map(([, val]) => val) + + this._query = this._queryTitleMap[query](...args) + return this + } } const QB = new QueryBuilder() -const query = QB.on('users', { - fields: 'id, email, age, projects', - first: 10 -}).on('projects', { - fields: 'name, dateCreated' +const query = QB.request('user', { + fields: 'id email age project', + login: 'ioedeveloper' +}).on('project', { + fields: 'name dateCreated' }).query + +console.log('query: ', query)