@commitspark/graphql-api 1.0.0-beta.4 → 1.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cjs/client.js +16 -14
  3. package/dist/cjs/client.js.map +1 -1
  4. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js +2 -1
  5. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  6. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js +2 -12
  7. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  8. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js +1 -5
  9. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  10. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +6 -8
  11. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  12. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +4 -4
  13. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  14. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +6 -6
  15. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  16. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js +3 -2
  17. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js.map +1 -1
  18. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js +3 -2
  19. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -1
  20. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js +3 -2
  21. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js.map +1 -1
  22. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +1 -1
  23. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  24. package/dist/cjs/graphql/schema-generator.js +1 -1
  25. package/dist/cjs/graphql/schema-generator.js.map +1 -1
  26. package/dist/cjs/graphql/schema-utils/entry-reference-util.js +2 -2
  27. package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
  28. package/dist/cjs/graphql/schema-validator.js +1 -1
  29. package/dist/cjs/graphql/schema-validator.js.map +1 -1
  30. package/dist/cjs/index.js +4 -2
  31. package/dist/cjs/index.js.map +1 -1
  32. package/dist/cjs/persistence/cache.js +92 -0
  33. package/dist/cjs/persistence/cache.js.map +1 -0
  34. package/dist/cjs/persistence/persistence.js +13 -41
  35. package/dist/cjs/persistence/persistence.js.map +1 -1
  36. package/dist/esm/client.js +16 -14
  37. package/dist/esm/client.js.map +1 -1
  38. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js +2 -1
  39. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  40. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js +2 -4
  41. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  42. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js +1 -2
  43. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  44. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +6 -8
  45. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  46. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +4 -4
  47. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  48. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +6 -6
  49. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  50. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js +3 -2
  51. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js.map +1 -1
  52. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js +3 -2
  53. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -1
  54. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js +3 -2
  55. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js.map +1 -1
  56. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +1 -1
  57. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  58. package/dist/esm/graphql/schema-generator.js +1 -1
  59. package/dist/esm/graphql/schema-generator.js.map +1 -1
  60. package/dist/esm/graphql/schema-utils/entry-reference-util.js +2 -2
  61. package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
  62. package/dist/esm/graphql/schema-validator.js +1 -1
  63. package/dist/esm/graphql/schema-validator.js.map +1 -1
  64. package/dist/esm/index.js +4 -2
  65. package/dist/esm/index.js.map +1 -1
  66. package/dist/esm/persistence/cache.js +79 -0
  67. package/dist/esm/persistence/cache.js.map +1 -0
  68. package/dist/esm/persistence/persistence.js +12 -41
  69. package/dist/esm/persistence/persistence.js.map +1 -1
  70. package/dist/tsconfig.build.cjs.tsbuildinfo +1 -1
  71. package/dist/tsconfig.build.esm.tsbuildinfo +1 -1
  72. package/dist/tsconfig.build.types.tsbuildinfo +1 -1
  73. package/dist/types/client.d.ts +6 -4
  74. package/dist/types/client.d.ts.map +1 -1
  75. package/dist/types/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -1
  76. package/dist/types/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -1
  77. package/dist/types/graphql/resolvers/field-resolvers/types.d.ts +3 -4
  78. package/dist/types/graphql/resolvers/field-resolvers/types.d.ts.map +1 -1
  79. package/dist/types/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +1 -1
  80. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
  81. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
  82. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
  83. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +1 -1
  84. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -1
  85. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +1 -1
  86. package/dist/types/graphql/schema-generator.d.ts.map +1 -1
  87. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +1 -1
  88. package/dist/types/index.d.ts.map +1 -1
  89. package/dist/types/persistence/cache.d.ts +13 -0
  90. package/dist/types/persistence/cache.d.ts.map +1 -0
  91. package/dist/types/persistence/persistence.d.ts +6 -5
  92. package/dist/types/persistence/persistence.d.ts.map +1 -1
  93. package/package.json +1 -1
  94. package/src/client.ts +20 -14
  95. package/src/graphql/resolvers/field-resolvers/entry-reference-resolver.ts +2 -5
  96. package/src/graphql/resolvers/field-resolvers/field-default-value-resolver.ts +2 -4
  97. package/src/graphql/resolvers/field-resolvers/types.ts +3 -4
  98. package/src/graphql/resolvers/object-type-field-default-value-resolver-generator.ts +1 -2
  99. package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +6 -21
  100. package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +4 -13
  101. package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +6 -21
  102. package/src/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.ts +3 -7
  103. package/src/graphql/resolvers/query-mutation-resolvers/query-every-resolver.ts +3 -6
  104. package/src/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.ts +3 -2
  105. package/src/graphql/resolvers/query-mutation-resolvers/union-type-resolver.ts +1 -1
  106. package/src/graphql/schema-generator.ts +3 -2
  107. package/src/graphql/schema-utils/entry-reference-util.ts +2 -6
  108. package/src/graphql/schema-validator.ts +1 -1
  109. package/src/index.ts +4 -2
  110. package/src/persistence/cache.ts +123 -0
  111. package/src/persistence/persistence.ts +20 -45
@@ -0,0 +1,123 @@
1
+ import { Entry, GitAdapterError } from '@commitspark/git-adapter'
2
+ import { ApolloContext } from '../client'
3
+ import { createError } from '../graphql/errors'
4
+
5
+ type Ref = string
6
+ type EntriesCache = Map<Ref, EntriesRecord>
7
+ type SchemaCache = Map<Ref, string>
8
+
9
+ interface EntriesRecord {
10
+ byId: Map<string, Entry>
11
+ byType: Map<string, Entry[]>
12
+ }
13
+
14
+ export interface RepositoryCacheHandler {
15
+ getEntriesRecord: (
16
+ context: ApolloContext,
17
+ ref: string,
18
+ ) => Promise<EntriesRecord>
19
+ getSchema: (context: ApolloContext, ref: string) => Promise<string>
20
+ }
21
+
22
+ const MAX_CACHE_ENTRIES = 50
23
+
24
+ const getEntriesRecordByRef = async (
25
+ entriesCache: EntriesCache,
26
+ cacheSize: number,
27
+ context: ApolloContext,
28
+ ref: string,
29
+ ): Promise<EntriesRecord> => {
30
+ const cacheRecord = entriesCache.get(ref)
31
+ if (cacheRecord !== undefined) {
32
+ // move map key back to end of list (newest)
33
+ entriesCache.delete(ref)
34
+ entriesCache.set(ref, cacheRecord)
35
+
36
+ return cacheRecord
37
+ }
38
+
39
+ let allEntries: Entry[]
40
+ try {
41
+ allEntries = await context.gitAdapter.getEntries(ref)
42
+ } catch (err) {
43
+ if (err instanceof GitAdapterError) {
44
+ throw createError(err.message, err.code, {})
45
+ }
46
+ throw err
47
+ }
48
+ const entriesById = new Map(allEntries.map((entry) => [entry.id, entry]))
49
+ const entriesByType = new Map<string, Entry[]>()
50
+ for (const entry of allEntries) {
51
+ const arr = entriesByType.get(entry.metadata.type) || []
52
+ arr.push(entry)
53
+ entriesByType.set(entry.metadata.type, arr)
54
+ }
55
+
56
+ const newCacheRecord = {
57
+ byType: entriesByType,
58
+ byId: entriesById,
59
+ }
60
+
61
+ entriesCache.set(ref, newCacheRecord)
62
+
63
+ if (entriesCache.size > cacheSize) {
64
+ // get first map key (oldest)
65
+ const oldestKey = entriesCache.keys().next().value as Ref | undefined
66
+ if (oldestKey !== undefined) {
67
+ entriesCache.delete(oldestKey)
68
+ }
69
+ }
70
+
71
+ return newCacheRecord
72
+ }
73
+
74
+ const getSchemaStringByRef = async (
75
+ schemaCache: SchemaCache,
76
+ cacheSize: number,
77
+ context: ApolloContext,
78
+ ref: string,
79
+ ): Promise<string> => {
80
+ const schemaCacheRecord = schemaCache.get(ref)
81
+ if (schemaCacheRecord !== undefined) {
82
+ // move map key back to end of list (newest)
83
+ schemaCache.delete(ref)
84
+ schemaCache.set(ref, schemaCacheRecord)
85
+
86
+ return schemaCacheRecord
87
+ }
88
+
89
+ let schemaString
90
+ try {
91
+ schemaString = await context.gitAdapter.getSchema(ref)
92
+ } catch (err) {
93
+ if (err instanceof GitAdapterError) {
94
+ throw createError(err.message, err.code, {})
95
+ }
96
+ throw err
97
+ }
98
+
99
+ schemaCache.set(ref, schemaString)
100
+
101
+ if (schemaCache.size > cacheSize) {
102
+ // get first map key (oldest)
103
+ const oldestKey = schemaCache.keys().next().value as Ref | undefined
104
+ if (oldestKey !== undefined) {
105
+ schemaCache.delete(oldestKey)
106
+ }
107
+ }
108
+
109
+ return schemaString
110
+ }
111
+
112
+ export const createCacheHandler = (
113
+ cacheSize: number = MAX_CACHE_ENTRIES,
114
+ ): RepositoryCacheHandler => {
115
+ const entriesCache: EntriesCache = new Map<Ref, EntriesRecord>()
116
+ const schemaCache: SchemaCache = new Map<Ref, string>()
117
+ return {
118
+ getEntriesRecord: (...args) =>
119
+ getEntriesRecordByRef(entriesCache, cacheSize, ...args),
120
+ getSchema: (...args) =>
121
+ getSchemaStringByRef(schemaCache, cacheSize, ...args),
122
+ }
123
+ }
@@ -1,30 +1,24 @@
1
- import { Entry, GitAdapter, GitAdapterError } from '@commitspark/git-adapter'
1
+ import { Entry } from '@commitspark/git-adapter'
2
2
  import { createError, ErrorCode } from '../graphql/errors'
3
+ import { ApolloContext } from '../client'
3
4
 
4
5
  export async function getTypeById(
5
- gitAdapter: GitAdapter,
6
- commitHash: string,
6
+ context: ApolloContext,
7
7
  id: string,
8
8
  ): Promise<string> {
9
- const requestedEntry = await findById(gitAdapter, commitHash, id)
9
+ const requestedEntry = await findById(context, id)
10
10
  return requestedEntry.metadata.type
11
11
  }
12
12
 
13
13
  export async function findById(
14
- gitAdapter: GitAdapter,
15
- commitHash: string,
14
+ context: ApolloContext,
16
15
  id: string,
17
16
  ): Promise<Entry> {
18
- let allEntries: Entry[]
19
- try {
20
- allEntries = await gitAdapter.getEntries(commitHash)
21
- } catch (err) {
22
- if (err instanceof GitAdapterError) {
23
- throw createError(err.message, err.code, {})
24
- }
25
- throw err
26
- }
27
- const requestedEntry = allEntries.find((entry: Entry) => entry.id === id)
17
+ const entriesRecord = await context.repositoryCache.getEntriesRecord(
18
+ context,
19
+ context.getCurrentHash(),
20
+ )
21
+ const requestedEntry = entriesRecord.byId.get(id)
28
22
  if (requestedEntry === undefined) {
29
23
  throw createError(`No entry with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
30
24
  argumentName: 'id',
@@ -36,42 +30,23 @@ export async function findById(
36
30
  }
37
31
 
38
32
  export async function findByType(
39
- gitAdapter: GitAdapter,
40
- commitHash: string,
33
+ context: ApolloContext,
41
34
  type: string,
42
35
  ): Promise<Entry[]> {
43
- let allEntries: Entry[]
44
- try {
45
- allEntries = await gitAdapter.getEntries(commitHash)
46
- } catch (err) {
47
- if (err instanceof GitAdapterError) {
48
- throw createError(err.message, err.code, {})
49
- }
50
- throw err
51
- }
52
-
53
- return allEntries.filter((entry: Entry) => entry.metadata.type === type)
36
+ const entriesRecord = await context.repositoryCache.getEntriesRecord(
37
+ context,
38
+ context.getCurrentHash(),
39
+ )
40
+ return entriesRecord.byType.get(type) ?? []
54
41
  }
55
42
 
56
43
  export async function findByTypeId(
57
- gitAdapter: GitAdapter,
58
- commitHash: string,
44
+ context: ApolloContext,
59
45
  type: string,
60
46
  id: string,
61
47
  ): Promise<Entry> {
62
- let allEntries: Entry[]
63
- try {
64
- allEntries = await gitAdapter.getEntries(commitHash)
65
- } catch (err) {
66
- if (err instanceof GitAdapterError) {
67
- throw createError(err.message, err.code, {})
68
- }
69
- throw err
70
- }
71
- const requestedEntry = allEntries.find(
72
- (entry: Entry) => entry.id === id && entry.metadata.type === type,
73
- )
74
- if (requestedEntry === undefined) {
48
+ const entryById = await findById(context, id)
49
+ if (entryById === undefined || entryById.metadata.type !== type) {
75
50
  throw createError(
76
51
  `No entry of type "${type}" with ID "${id}" exists.`,
77
52
  ErrorCode.NOT_FOUND,
@@ -83,5 +58,5 @@ export async function findByTypeId(
83
58
  )
84
59
  }
85
60
 
86
- return requestedEntry
61
+ return entryById
87
62
  }