Skip to content

Commit 865c085

Browse files
authored
Export RecordShape type (#1117)
This type is the base type used to define the shape of the Record. Exporting this type enables user to use it for defining custom generic function to work with result and records without have to redefine the shape type. The type was renamed from `Dict` to `RecordShape` for having a more meaningful name for external consumers.
1 parent abae164 commit 865c085

22 files changed

+108
-83
lines changed

packages/core/src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import {
5454
PathSegment,
5555
isPathSegment
5656
} from './graph-types'
57-
import Record from './record'
57+
import Record, { RecordShape } from './record'
5858
import { isPoint, Point } from './spatial-types'
5959
import ResultSummary, {
6060
queryType,
@@ -259,6 +259,7 @@ export type {
259259
SessionConfig,
260260
QueryConfig,
261261
RoutingControl,
262+
RecordShape,
262263
ResultTransformer,
263264
NotificationCategory,
264265
NotificationSeverityLevel,

packages/core/src/record.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@
1919

2020
import { newError } from './error'
2121

22-
type Dict<Key extends PropertyKey = PropertyKey, Value = any> = {
22+
type RecordShape<Key extends PropertyKey = PropertyKey, Value = any> = {
2323
[K in Key]: Value
2424
}
2525

2626
type Visitor<
27-
Entries extends Dict = Dict,
27+
Entries extends RecordShape = RecordShape,
2828
Key extends keyof Entries = keyof Entries
2929
> = MapVisitor<void, Entries, Key>
3030

3131
type MapVisitor<
3232
ReturnType,
33-
Entries extends Dict = Dict,
33+
Entries extends RecordShape = RecordShape,
3434
Key extends keyof Entries = keyof Entries
3535
> = (value: Entries[Key], key: Key, record: Record<Entries>) => ReturnType
3636

3737
function generateFieldLookup<
38-
Entries extends Dict = Dict,
38+
Entries extends RecordShape = RecordShape,
3939
Key extends keyof Entries = keyof Entries,
40-
FieldLookup extends Dict<string, number> = Dict<string, number>
40+
FieldLookup extends RecordShape<string, number> = RecordShape<string, number>
4141
> (keys: Key[]): FieldLookup {
42-
const lookup: Dict<string, number> = {}
42+
const lookup: RecordShape<string, number> = {}
4343
keys.forEach((name, idx) => {
4444
lookup[name as string] = idx
4545
})
@@ -66,9 +66,9 @@ function generateFieldLookup<
6666
* @access public
6767
*/
6868
class Record<
69-
Entries extends Dict = Dict,
69+
Entries extends RecordShape = RecordShape,
7070
Key extends keyof Entries = keyof Entries,
71-
FieldLookup extends Dict<keyof Entries, number> = Dict<keyof Entries, number>
71+
FieldLookup extends RecordShape<keyof Entries, number> = RecordShape<keyof Entries, number>
7272
> {
7373
keys: Key[]
7474
length: number
@@ -240,4 +240,4 @@ class Record<
240240
}
241241

242242
export default Record
243-
export type { Dict }
243+
export type { RecordShape }

packages/core/src/result-eager.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
* limitations under the License.
1818
*/
1919

20-
import Record, { Dict } from './record'
20+
import Record, { RecordShape } from './record'
2121
import ResultSummary from './result-summary'
2222

2323
/**
2424
* Represents the fully streamed result
2525
*/
26-
export default class EagerResult<Entries extends Dict = Dict> {
26+
export default class EagerResult<Entries extends RecordShape = RecordShape> {
2727
keys: string[]
2828
records: Array<Record<Entries>>
2929
summary: ResultSummary

packages/core/src/result-transformers.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
* limitations under the License.
1818
*/
1919

20-
import Record, { Dict } from './record'
20+
import Record, { RecordShape } from './record'
2121
import Result from './result'
2222
import EagerResult from './result-eager'
2323
import ResultSummary from './result-summary'
2424
import { newError } from './error'
2525

26-
async function createEagerResultFromResult<Entries extends Dict> (result: Result): Promise<EagerResult<Entries>> {
26+
async function createEagerResultFromResult<Entries extends RecordShape> (result: Result): Promise<EagerResult<Entries>> {
2727
const { summary, records } = await result
2828
const keys = await result.keys()
2929
return new EagerResult<Entries>(keys, records, summary)
@@ -59,7 +59,7 @@ class ResultTransformers {
5959
*
6060
* @returns {ResultTransformer<EagerResult<Entries>>} The result transformer
6161
*/
62-
eagerResultTransformer<Entries extends Dict = Dict>(): ResultTransformer<EagerResult<Entries>> {
62+
eagerResultTransformer<Entries extends RecordShape = RecordShape>(): ResultTransformer<EagerResult<Entries>> {
6363
return createEagerResultFromResult
6464
}
6565

packages/core/src/result.ts

+17-17
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
/* eslint-disable @typescript-eslint/promise-function-async */
2121

2222
import ResultSummary from './result-summary'
23-
import Record, { Dict } from './record'
23+
import Record, { RecordShape } from './record'
2424
import { Query, PeekableAsyncIterator } from './types'
2525
import { observer, util, connectionHolder } from './internal'
2626
import { newError, PROTOCOL_ERROR } from './error'
@@ -56,16 +56,16 @@ const DEFAULT_ON_KEYS = (keys: string[]): void => {}
5656
* The query result is the combination of the {@link ResultSummary} and
5757
* the array {@link Record[]} produced by the query
5858
*/
59-
interface QueryResult<RecordShape extends Dict = Dict> {
60-
records: Array<Record<RecordShape>>
59+
interface QueryResult<R extends RecordShape = RecordShape> {
60+
records: Array<Record<R>>
6161
summary: ResultSummary
6262
}
6363

6464
/**
6565
* Interface to observe updates on the Result which is being produced.
6666
*
6767
*/
68-
interface ResultObserver<RecordShape extends Dict =Dict> {
68+
interface ResultObserver<R extends RecordShape = RecordShape> {
6969
/**
7070
* Receive the keys present on the record whenever this information is available
7171
*
@@ -77,7 +77,7 @@ interface ResultObserver<RecordShape extends Dict =Dict> {
7777
* Receive the each record present on the {@link @Result}
7878
* @param {Record} record The {@link Record} produced
7979
*/
80-
onNext?: (record: Record<RecordShape>) => void
80+
onNext?: (record: Record<R>) => void
8181

8282
/**
8383
* Called when the result is fully received
@@ -86,7 +86,7 @@ interface ResultObserver<RecordShape extends Dict =Dict> {
8686
onCompleted?: (summary: ResultSummary) => void
8787

8888
/**
89-
* Called when some error occurs during the result proccess or query execution
89+
* Called when some error occurs during the result processing or query execution
9090
* @param {Error} error The error ocurred
9191
*/
9292
onError?: (error: Error) => void
@@ -111,7 +111,7 @@ interface QueuedResultObserver extends ResultObserver {
111111
* Alternatively can be consumed lazily using {@link Result#subscribe} function.
112112
* @access public
113113
*/
114-
class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<RecordShape>> {
114+
class Result<R extends RecordShape = RecordShape> implements Promise<QueryResult<R>> {
115115
private readonly _stack: string | null
116116
private readonly _streamObserverPromise: Promise<observer.ResultStreamObserver>
117117
private _p: Promise<QueryResult> | null
@@ -212,12 +212,12 @@ class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<Rec
212212
* @private
213213
* @return {Promise} new Promise.
214214
*/
215-
private _getOrCreatePromise (): Promise<QueryResult<RecordShape>> {
215+
private _getOrCreatePromise (): Promise<QueryResult<R>> {
216216
if (this._p == null) {
217217
this._p = new Promise((resolve, reject) => {
218-
const records: Record[] = []
218+
const records: Array<Record<R>> = []
219219
const observer = {
220-
onNext: (record: Record) => {
220+
onNext: (record: Record<R>) => {
221221
records.push(record)
222222
},
223223
onCompleted: (summary: ResultSummary) => {
@@ -240,9 +240,9 @@ class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<Rec
240240
* *Should not be combined with {@link Result#subscribe} or ${@link Result#then} functions.*
241241
*
242242
* @public
243-
* @returns {PeekableAsyncIterator<Record<RecordShape>, ResultSummary>} The async iterator for the Results
243+
* @returns {PeekableAsyncIterator<Record<R>, ResultSummary>} The async iterator for the Results
244244
*/
245-
[Symbol.asyncIterator] (): PeekableAsyncIterator<Record<RecordShape>, ResultSummary> {
245+
[Symbol.asyncIterator] (): PeekableAsyncIterator<Record<R>, ResultSummary> {
246246
if (!this.isOpen()) {
247247
const error = newError('Result is already consumed')
248248
return {
@@ -345,9 +345,9 @@ class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<Rec
345345
* @param {function(error: {message:string, code:string})} onRejected - function to be called upon errors.
346346
* @return {Promise} promise.
347347
*/
348-
then<TResult1 = QueryResult<RecordShape>, TResult2 = never>(
348+
then<TResult1 = QueryResult<R>, TResult2 = never>(
349349
onFulfilled?:
350-
| ((value: QueryResult<RecordShape>) => TResult1 | PromiseLike<TResult1>)
350+
| ((value: QueryResult<R>) => TResult1 | PromiseLike<TResult1>)
351351
| null,
352352
onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
353353
): Promise<TResult1 | TResult2> {
@@ -364,7 +364,7 @@ class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<Rec
364364
*/
365365
catch <TResult = never>(
366366
onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null
367-
): Promise<QueryResult<RecordShape> | TResult> {
367+
): Promise<QueryResult<R> | TResult> {
368368
return this._getOrCreatePromise().catch(onRejected)
369369
}
370370

@@ -376,7 +376,7 @@ class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<Rec
376376
* @return {Promise} promise.
377377
*/
378378
[Symbol.toStringTag]: string
379-
finally (onfinally?: (() => void) | null): Promise<QueryResult<RecordShape>> {
379+
finally (onfinally?: (() => void) | null): Promise<QueryResult<R>> {
380380
return this._getOrCreatePromise().finally(onfinally)
381381
}
382382

@@ -391,7 +391,7 @@ class Result<RecordShape extends Dict = Dict> implements Promise<QueryResult<Rec
391391
* @param {function(error: {message:string, code:string})} observer.onError - handle errors.
392392
* @return {void}
393393
*/
394-
subscribe (observer: ResultObserver<RecordShape>): void {
394+
subscribe (observer: ResultObserver<R>): void {
395395
this._subscribe(observer)
396396
.catch(() => {})
397397
}

packages/core/src/session.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { NumberOrInteger } from './graph-types'
3636
import TransactionPromise from './transaction-promise'
3737
import ManagedTransaction from './transaction-managed'
3838
import BookmarkManager from './bookmark-manager'
39-
import { Dict } from './record'
39+
import { RecordShape } from './record'
4040
import NotificationFilter from './notification-filter'
4141
import { Logger } from './internal/logger'
4242

@@ -171,11 +171,11 @@ class Session {
171171
* @param {TransactionConfig} [transactionConfig] - Configuration for the new auto-commit transaction.
172172
* @return {Result} New Result.
173173
*/
174-
run<RecordShape extends Dict = Dict> (
174+
run<R extends RecordShape = RecordShape> (
175175
query: Query,
176176
parameters?: any,
177177
transactionConfig?: TransactionConfig
178-
): Result<RecordShape> {
178+
): Result<R> {
179179
const { validatedQuery, params } = validateQueryAndParameters(
180180
query,
181181
parameters

packages/core/src/transaction-managed.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
import Result from './result'
2121
import Transaction from './transaction'
2222
import { Query } from './types'
23-
import { Dict } from './record'
23+
import { RecordShape } from './record'
2424

25-
type Run = (query: Query, parameters?: any) => Result
25+
type Run<R extends RecordShape = RecordShape> = (query: Query, parameters?: any) => Result<R>
2626

2727
/**
2828
* Represents a transaction that is managed by the transaction executor.
@@ -61,7 +61,7 @@ class ManagedTransaction {
6161
* @param {Object} parameters - Map with parameters to use in query
6262
* @return {Result} New Result
6363
*/
64-
run<RecordShape extends Dict =Dict> (query: Query, parameters?: any): Result<RecordShape> {
64+
run<R extends RecordShape = RecordShape> (query: Query, parameters?: any): Result<R> {
6565
return this._run(query, parameters)
6666
}
6767
}

packages/core/src/transaction.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import {
3737
import { newError } from './error'
3838
import Result from './result'
3939
import { Query } from './types'
40-
import { Dict } from './record'
40+
import { RecordShape } from './record'
4141
import NotificationFilter from './notification-filter'
4242

4343
/**
@@ -183,7 +183,7 @@ class Transaction {
183183
* @param {Object} parameters - Map with parameters to use in query
184184
* @return {Result} New Result
185185
*/
186-
run<RecordShape extends Dict = Dict> (query: Query, parameters?: any): Result<RecordShape> {
186+
run<R extends RecordShape = RecordShape> (query: Query, parameters?: any): Result<R> {
187187
const { validatedQuery, params } = validateQueryAndParameters(
188188
query,
189189
parameters

packages/core/test/driver.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import QueryExecutor from '../src/internal/query-executor'
2525
import { ConfiguredCustomResolver } from '../src/internal/resolver'
2626
import { LogLevel } from '../src/types'
2727
import resultTransformers from '../src/result-transformers'
28-
import Record, { Dict } from '../src/record'
28+
import Record, { RecordShape } from '../src/record'
2929
import { validNotificationFilters } from './utils/notification-filters.fixtures'
3030

3131
describe('Driver', () => {
@@ -543,7 +543,7 @@ describe('Driver', () => {
543543
await expect(output).rejects.toThrow(expectedError)
544544
})
545545

546-
function extendsDefaultWith<T = EagerResult<Dict>> (config: QueryConfig<T>) {
546+
function extendsDefaultWith<T = EagerResult<RecordShape>> (config: QueryConfig<T>) {
547547
return () => {
548548
const defaultConfig = {
549549
resultTransformer: resultTransformers.eagerResultTransformer(),

packages/neo4j-driver-deno/lib/core/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import {
5454
PathSegment,
5555
isPathSegment
5656
} from './graph-types.ts'
57-
import Record from './record.ts'
57+
import Record, { RecordShape } from './record.ts'
5858
import { isPoint, Point } from './spatial-types.ts'
5959
import ResultSummary, {
6060
queryType,
@@ -259,6 +259,7 @@ export type {
259259
SessionConfig,
260260
QueryConfig,
261261
RoutingControl,
262+
RecordShape,
262263
ResultTransformer,
263264
NotificationCategory,
264265
NotificationSeverityLevel,

packages/neo4j-driver-deno/lib/core/record.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@
1919

2020
import { newError } from './error.ts'
2121

22-
type Dict<Key extends PropertyKey = PropertyKey, Value = any> = {
22+
type RecordShape<Key extends PropertyKey = PropertyKey, Value = any> = {
2323
[K in Key]: Value
2424
}
2525

2626
type Visitor<
27-
Entries extends Dict = Dict,
27+
Entries extends RecordShape = RecordShape,
2828
Key extends keyof Entries = keyof Entries
2929
> = MapVisitor<void, Entries, Key>
3030

3131
type MapVisitor<
3232
ReturnType,
33-
Entries extends Dict = Dict,
33+
Entries extends RecordShape = RecordShape,
3434
Key extends keyof Entries = keyof Entries
3535
> = (value: Entries[Key], key: Key, record: Record<Entries>) => ReturnType
3636

3737
function generateFieldLookup<
38-
Entries extends Dict = Dict,
38+
Entries extends RecordShape = RecordShape,
3939
Key extends keyof Entries = keyof Entries,
40-
FieldLookup extends Dict<string, number> = Dict<string, number>
40+
FieldLookup extends RecordShape<string, number> = RecordShape<string, number>
4141
> (keys: Key[]): FieldLookup {
42-
const lookup: Dict<string, number> = {}
42+
const lookup: RecordShape<string, number> = {}
4343
keys.forEach((name, idx) => {
4444
lookup[name as string] = idx
4545
})
@@ -66,9 +66,9 @@ function generateFieldLookup<
6666
* @access public
6767
*/
6868
class Record<
69-
Entries extends Dict = Dict,
69+
Entries extends RecordShape = RecordShape,
7070
Key extends keyof Entries = keyof Entries,
71-
FieldLookup extends Dict<keyof Entries, number> = Dict<keyof Entries, number>
71+
FieldLookup extends RecordShape<keyof Entries, number> = RecordShape<keyof Entries, number>
7272
> {
7373
keys: Key[]
7474
length: number
@@ -240,4 +240,4 @@ class Record<
240240
}
241241

242242
export default Record
243-
export type { Dict }
243+
export type { RecordShape }

packages/neo4j-driver-deno/lib/core/result-eager.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
* limitations under the License.
1818
*/
1919

20-
import Record, { Dict } from './record.ts'
20+
import Record, { RecordShape } from './record.ts'
2121
import ResultSummary from './result-summary.ts'
2222

2323
/**
2424
* Represents the fully streamed result
2525
*/
26-
export default class EagerResult<Entries extends Dict = Dict> {
26+
export default class EagerResult<Entries extends RecordShape = RecordShape> {
2727
keys: string[]
2828
records: Array<Record<Entries>>
2929
summary: ResultSummary

0 commit comments

Comments
 (0)