@commitspark/graphql-api 2.0.0-beta.3 → 2.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.
- package/CHANGELOG.md +58 -0
- package/README.md +165 -88
- package/dist/cjs/client.d.ts +1 -0
- package/dist/cjs/graphql/apollo-config-factory.d.ts +1 -0
- package/dist/cjs/graphql/errors.d.ts +4 -2
- package/dist/cjs/graphql/errors.d.ts.map +1 -0
- package/dist/cjs/graphql/errors.js +11 -1
- package/dist/cjs/graphql/errors.js.map +1 -1
- package/dist/cjs/graphql/input-type-generator.d.ts +1 -0
- package/dist/cjs/graphql/input-type-generator.d.ts.map +1 -0
- package/dist/cjs/graphql/input-type-generator.js +5 -10
- package/dist/cjs/graphql/input-type-generator.js.map +1 -1
- package/dist/cjs/graphql/queries-mutations-generator.d.ts +10 -1
- package/dist/cjs/graphql/queries-mutations-generator.d.ts.map +1 -0
- package/dist/cjs/graphql/queries-mutations-generator.js +55 -3
- package/dist/cjs/graphql/queries-mutations-generator.js.map +1 -1
- package/dist/cjs/graphql/resolvers/commit-message.d.ts +11 -0
- package/dist/cjs/graphql/resolvers/commit-message.d.ts.map +1 -0
- package/dist/cjs/graphql/resolvers/commit-message.js +22 -0
- package/dist/cjs/graphql/resolvers/commit-message.js.map +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js +2 -2
- package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js +3 -3
- package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts +3 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts.map +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.js +7 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.js.map +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/types.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.d.ts +3 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.d.ts.map +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.js +7 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.js.map +1 -0
- package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js +1 -1
- package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +1 -0
- package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +33 -42
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +1 -0
- package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +28 -40
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +1 -0
- package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +26 -43
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js +5 -5
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/types.d.ts +14 -2
- package/dist/cjs/graphql/resolvers/types.d.ts.map +1 -0
- package/dist/cjs/graphql/schema-analyzer.d.ts +1 -0
- package/dist/cjs/graphql/schema-generator.d.ts +1 -0
- package/dist/cjs/graphql/schema-generator.d.ts.map +1 -0
- package/dist/cjs/graphql/schema-generator.js +12 -1
- package/dist/cjs/graphql/schema-generator.js.map +1 -1
- package/dist/cjs/graphql/schema-root-type-generator.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/directive-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts +5 -2
- package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts.map +1 -0
- package/dist/cjs/graphql/schema-utils/entry-reference-util.js +94 -121
- package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
- package/dist/cjs/graphql/schema-utils/entry-type-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/searchable-field-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/union-type-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/union-type-util.js +2 -2
- package/dist/cjs/graphql/schema-utils/union-type-util.js.map +1 -1
- package/dist/cjs/graphql/schema-validator.d.ts +1 -0
- package/dist/{types → cjs}/graphql/schema-validator.d.ts.map +1 -1
- package/dist/cjs/graphql/schema-validator.js +16 -0
- package/dist/cjs/graphql/schema-validator.js.map +1 -1
- package/dist/cjs/graphql/util.d.ts +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/persistence/cache.d.ts +4 -1
- package/dist/cjs/persistence/cache.d.ts.map +1 -0
- package/dist/cjs/persistence/cache.js +8 -17
- package/dist/cjs/persistence/cache.js.map +1 -1
- package/dist/cjs/persistence/commit-with-retry.d.ts +16 -0
- package/dist/cjs/persistence/commit-with-retry.d.ts.map +1 -0
- package/dist/cjs/persistence/commit-with-retry.js +39 -0
- package/dist/cjs/persistence/commit-with-retry.js.map +1 -0
- package/dist/cjs/persistence/git-adapter-call.d.ts +10 -0
- package/dist/cjs/persistence/git-adapter-call.d.ts.map +1 -0
- package/dist/cjs/persistence/git-adapter-call.js +29 -0
- package/dist/cjs/persistence/git-adapter-call.js.map +1 -0
- package/dist/cjs/persistence/persistence.d.ts +12 -0
- package/dist/{types → cjs}/persistence/persistence.d.ts.map +1 -1
- package/dist/cjs/persistence/persistence.js +37 -2
- package/dist/cjs/persistence/persistence.js.map +1 -1
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/graphql/apollo-config-factory.d.ts.map +1 -0
- package/dist/{types → esm}/graphql/errors.d.ts +3 -2
- package/dist/esm/graphql/errors.d.ts.map +1 -0
- package/dist/esm/graphql/errors.js +10 -0
- package/dist/esm/graphql/errors.js.map +1 -1
- package/dist/esm/graphql/input-type-generator.d.ts.map +1 -0
- package/dist/esm/graphql/input-type-generator.js +6 -11
- package/dist/esm/graphql/input-type-generator.js.map +1 -1
- package/dist/{types → esm}/graphql/queries-mutations-generator.d.ts +9 -1
- package/dist/esm/graphql/queries-mutations-generator.d.ts.map +1 -0
- package/dist/esm/graphql/queries-mutations-generator.js +53 -3
- package/dist/esm/graphql/queries-mutations-generator.js.map +1 -1
- package/dist/esm/graphql/resolvers/commit-message.d.ts +11 -0
- package/dist/esm/graphql/resolvers/commit-message.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/commit-message.js +19 -0
- package/dist/esm/graphql/resolvers/commit-message.js.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js +3 -3
- package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js +4 -4
- package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts +3 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.js +3 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.js.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/types.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.d.ts +3 -0
- package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.js +3 -0
- package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.js.map +1 -0
- package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js +2 -2
- package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +36 -45
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +31 -43
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +29 -46
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js +6 -6
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +2 -2
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
- package/dist/{types → esm}/graphql/resolvers/types.d.ts +13 -2
- package/dist/esm/graphql/resolvers/types.d.ts.map +1 -0
- package/dist/esm/graphql/schema-analyzer.d.ts.map +1 -0
- package/dist/esm/graphql/schema-generator.d.ts.map +1 -0
- package/dist/esm/graphql/schema-generator.js +14 -3
- package/dist/esm/graphql/schema-generator.js.map +1 -1
- package/dist/esm/graphql/schema-root-type-generator.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/directive-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/entry-reference-util.d.ts +6 -0
- package/dist/esm/graphql/schema-utils/entry-reference-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/entry-reference-util.js +93 -121
- package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
- package/dist/esm/graphql/schema-utils/entry-type-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/searchable-field-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/union-type-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/union-type-util.js +3 -3
- package/dist/esm/graphql/schema-utils/union-type-util.js.map +1 -1
- package/dist/esm/graphql/schema-validator.d.ts.map +1 -0
- package/dist/esm/graphql/schema-validator.js +17 -1
- package/dist/esm/graphql/schema-validator.js.map +1 -1
- package/dist/esm/graphql/util.d.ts.map +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/{types → esm}/persistence/cache.d.ts +3 -1
- package/dist/esm/persistence/cache.d.ts.map +1 -0
- package/dist/esm/persistence/cache.js +6 -15
- package/dist/esm/persistence/cache.js.map +1 -1
- package/dist/esm/persistence/commit-with-retry.d.ts +16 -0
- package/dist/esm/persistence/commit-with-retry.d.ts.map +1 -0
- package/dist/esm/persistence/commit-with-retry.js +35 -0
- package/dist/esm/persistence/commit-with-retry.js.map +1 -0
- package/dist/esm/persistence/git-adapter-call.d.ts +10 -0
- package/dist/esm/persistence/git-adapter-call.d.ts.map +1 -0
- package/dist/esm/persistence/git-adapter-call.js +24 -0
- package/dist/esm/persistence/git-adapter-call.js.map +1 -0
- package/dist/esm/persistence/persistence.d.ts +18 -0
- package/dist/esm/persistence/persistence.d.ts.map +1 -0
- package/dist/esm/persistence/persistence.js +36 -3
- package/dist/esm/persistence/persistence.js.map +1 -1
- package/package.json +27 -18
- package/src/graphql/errors.ts +2 -1
- package/src/graphql/input-type-generator.ts +6 -18
- package/src/graphql/queries-mutations-generator.ts +69 -3
- package/src/graphql/resolvers/commit-message.ts +34 -0
- package/src/graphql/resolvers/field-resolvers/referenced-by-resolver.ts +9 -0
- package/src/graphql/resolvers/field-resolvers/version-resolver.ts +8 -0
- package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +43 -57
- package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +45 -60
- package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +38 -67
- package/src/graphql/resolvers/types.ts +26 -2
- package/src/graphql/schema-generator.ts +19 -0
- package/src/graphql/schema-utils/entry-reference-util.ts +147 -191
- package/src/graphql/schema-validator.ts +21 -0
- package/src/persistence/cache.ts +8 -14
- package/src/persistence/commit-with-retry.ts +47 -0
- package/src/persistence/git-adapter-call.ts +27 -0
- package/src/persistence/persistence.ts +50 -0
- package/dist/types/graphql/errors.d.ts.map +0 -1
- package/dist/types/graphql/input-type-generator.d.ts.map +0 -1
- package/dist/types/graphql/queries-mutations-generator.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/types.d.ts.map +0 -1
- package/dist/types/graphql/schema-generator.d.ts.map +0 -1
- package/dist/types/graphql/schema-utils/entry-reference-util.d.ts +0 -4
- package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +0 -1
- package/dist/types/persistence/cache.d.ts.map +0 -1
- package/dist/types/persistence/persistence.d.ts +0 -7
- /package/dist/{types → cjs}/client.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/apollo-config-factory.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/types.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-analyzer.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-root-type-generator.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/directive-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/entry-type-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/searchable-field-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/union-type-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/util.d.ts.map +0 -0
- /package/dist/{types → cjs}/index.d.ts.map +0 -0
- /package/dist/{types → esm}/client.d.ts +0 -0
- /package/dist/{types → esm}/graphql/apollo-config-factory.d.ts +0 -0
- /package/dist/{types → esm}/graphql/input-type-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/types.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-analyzer.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-root-type-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/directive-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/entry-type-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/searchable-field-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/union-type-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-validator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/util.d.ts +0 -0
- /package/dist/{types → esm}/index.d.ts +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GitAdapterError } from '@commitspark/git-adapter';
|
|
2
|
+
import { createError, ErrorCode } from "../graphql/errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Converts an error thrown by a Git adapter to a GraphQL error, keeping the error code of a `GitAdapterError`.
|
|
5
|
+
*/
|
|
6
|
+
export const toGraphQLError = (err) => {
|
|
7
|
+
if (err instanceof GitAdapterError) {
|
|
8
|
+
return createError(err.message, err.code, {});
|
|
9
|
+
}
|
|
10
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
11
|
+
return createError(message, ErrorCode.INTERNAL_ERROR, {});
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Runs a Git adapter operation and converts thrown errors to GraphQL errors.
|
|
15
|
+
*/
|
|
16
|
+
export const callGitAdapter = async (operation) => {
|
|
17
|
+
try {
|
|
18
|
+
return await operation();
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
throw toGraphQLError(err);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=git-adapter-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-adapter-call.js","sourceRoot":"","sources":["../../../src/persistence/git-adapter-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAY,EAAgB,EAAE;IAC3D,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAChE,OAAO,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,SAA2B,EACf,EAAE;IACd,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Entry } from '@commitspark/git-adapter';
|
|
2
|
+
import { ApolloContext } from '../client.ts';
|
|
3
|
+
export declare function getTypeById(context: ApolloContext, id: string): Promise<string>;
|
|
4
|
+
export declare function findById(context: ApolloContext, id: string): Promise<Entry>;
|
|
5
|
+
export declare function findByType(context: ApolloContext, type: string): Promise<Entry[]>;
|
|
6
|
+
export declare function findByTypeId(context: ApolloContext, type: string, id: string): Promise<Entry>;
|
|
7
|
+
/**
|
|
8
|
+
* Returns the version of an entry, which is the content hash of the entry reported by the Git adapter. It changes
|
|
9
|
+
* whenever the stored entry changes.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getEntryVersion(context: ApolloContext, id: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Throws `CONFLICT` if an expected version is given and the entry has a different version at the current commit of
|
|
14
|
+
* the request. This lets callers detect that an entry was changed by someone else since they read it, e.g. while a
|
|
15
|
+
* user was editing the entry, instead of overwriting these changes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertExpectedVersion(context: ApolloContext, id: string, expectedVersion: string | null | undefined): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/persistence/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,KAAK,CAAC,CAchB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,EAAE,CAAC,CAMlB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,KAAK,CAAC,CAehB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACzC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createError } from "../graphql/errors.js";
|
|
1
|
+
import { createError, ErrorCode } from "../graphql/errors.js";
|
|
2
2
|
export async function getTypeById(context, id) {
|
|
3
3
|
const requestedEntry = await findById(context, id);
|
|
4
4
|
return requestedEntry.metadata.type;
|
|
@@ -7,7 +7,7 @@ export async function findById(context, id) {
|
|
|
7
7
|
const entriesRecord = await context.repositoryCache.getEntriesRecord(context, context.getCurrentHash());
|
|
8
8
|
const requestedEntry = entriesRecord.byId.get(id);
|
|
9
9
|
if (requestedEntry === undefined) {
|
|
10
|
-
throw createError(`No entry with ID "${id}" exists.`,
|
|
10
|
+
throw createError(`No entry with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
|
|
11
11
|
argumentName: 'id',
|
|
12
12
|
argumentValue: id,
|
|
13
13
|
});
|
|
@@ -21,7 +21,7 @@ export async function findByType(context, type) {
|
|
|
21
21
|
export async function findByTypeId(context, type, id) {
|
|
22
22
|
const entryById = await findById(context, id);
|
|
23
23
|
if (entryById === undefined || entryById.metadata.type !== type) {
|
|
24
|
-
throw createError(`No entry of type "${type}" with ID "${id}" exists.`,
|
|
24
|
+
throw createError(`No entry of type "${type}" with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
|
|
25
25
|
typeName: type,
|
|
26
26
|
argumentName: 'id',
|
|
27
27
|
argumentValue: id,
|
|
@@ -29,4 +29,37 @@ export async function findByTypeId(context, type, id) {
|
|
|
29
29
|
}
|
|
30
30
|
return entryById;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the version of an entry, which is the content hash of the entry reported by the Git adapter. It changes
|
|
34
|
+
* whenever the stored entry changes.
|
|
35
|
+
*/
|
|
36
|
+
export async function getEntryVersion(context, id) {
|
|
37
|
+
const entriesRecord = await context.repositoryCache.getEntriesRecord(context, context.getCurrentHash());
|
|
38
|
+
const version = entriesRecord.hashById.get(id);
|
|
39
|
+
if (version === undefined) {
|
|
40
|
+
throw createError(`No entry with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
|
|
41
|
+
argumentName: 'id',
|
|
42
|
+
argumentValue: id,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return version;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Throws `CONFLICT` if an expected version is given and the entry has a different version at the current commit of
|
|
49
|
+
* the request. This lets callers detect that an entry was changed by someone else since they read it, e.g. while a
|
|
50
|
+
* user was editing the entry, instead of overwriting these changes.
|
|
51
|
+
*/
|
|
52
|
+
export async function assertExpectedVersion(context, id, expectedVersion) {
|
|
53
|
+
if (expectedVersion === undefined || expectedVersion === null) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const currentVersion = await getEntryVersion(context, id);
|
|
57
|
+
if (currentVersion !== expectedVersion) {
|
|
58
|
+
throw createError(`Entry with ID "${id}" has been changed: expected version "${expectedVersion}" but current version is ` +
|
|
59
|
+
`"${currentVersion}".`, ErrorCode.CONFLICT, {
|
|
60
|
+
argumentName: 'expectedVersion',
|
|
61
|
+
argumentValue: expectedVersion,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
32
65
|
//# sourceMappingURL=persistence.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/persistence/persistence.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/persistence/persistence.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -9,13 +9,16 @@
|
|
|
9
9
|
"gitops",
|
|
10
10
|
"api"
|
|
11
11
|
],
|
|
12
|
-
"version": "2.0.0-beta.
|
|
12
|
+
"version": "2.0.0-beta.5",
|
|
13
13
|
"license": "ISC",
|
|
14
14
|
"repository": {
|
|
15
15
|
"type": "git",
|
|
16
16
|
"url": "git+https://github.com/commitspark/graphql-api.git"
|
|
17
17
|
},
|
|
18
18
|
"private": false,
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=22.18.0"
|
|
21
|
+
},
|
|
19
22
|
"files": [
|
|
20
23
|
"dist/**",
|
|
21
24
|
"!dist/**/*.tsbuildinfo",
|
|
@@ -27,46 +30,52 @@
|
|
|
27
30
|
],
|
|
28
31
|
"main": "./dist/cjs/index.js",
|
|
29
32
|
"module": "./dist/esm/index.js",
|
|
30
|
-
"types": "./dist/
|
|
33
|
+
"types": "./dist/cjs/index.d.ts",
|
|
31
34
|
"exports": {
|
|
32
35
|
".": {
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
"import": {
|
|
37
|
+
"types": "./dist/esm/index.d.ts",
|
|
38
|
+
"default": "./dist/esm/index.js"
|
|
39
|
+
},
|
|
40
|
+
"require": {
|
|
41
|
+
"types": "./dist/cjs/index.d.ts",
|
|
42
|
+
"default": "./dist/cjs/index.js"
|
|
43
|
+
}
|
|
36
44
|
}
|
|
37
45
|
},
|
|
38
46
|
"scripts": {
|
|
39
|
-
"build": "npm run build:cjs && npm run build:esm
|
|
47
|
+
"build": "npm run build:cjs && npm run build:esm",
|
|
40
48
|
"build:cjs": "tsc --project tsconfig.build.cjs.json",
|
|
41
49
|
"build:esm": "tsc --project tsconfig.build.esm.json && echo '{\"type\":\"module\"}' > dist/esm/package.json",
|
|
42
|
-
"
|
|
43
|
-
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
50
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
44
51
|
"lint": "eslint \"{src,tests}/**/*.ts\"",
|
|
45
52
|
"test": "jest",
|
|
53
|
+
"check:package": "attw --pack . && node -e \"require(process.env.npm_package_name)\" && node --input-type=module -e \"await import(process.env.npm_package_name)\"",
|
|
46
54
|
"knip": "knip",
|
|
47
55
|
"prepublishOnly": "npm run build"
|
|
48
56
|
},
|
|
49
57
|
"dependencies": {
|
|
50
58
|
"@apollo/server": "^5.2.0",
|
|
51
|
-
"@commitspark/git-adapter": "^2.0.0-beta.
|
|
59
|
+
"@commitspark/git-adapter": "^2.0.0-beta.4",
|
|
52
60
|
"@commitspark/search-adapter": "^1.0.0-beta.1",
|
|
53
|
-
"@graphql-tools/schema": "^
|
|
54
|
-
"@graphql-tools/utils": "^
|
|
61
|
+
"@graphql-tools/schema": "^11.0.8",
|
|
62
|
+
"@graphql-tools/utils": "^13.2.1"
|
|
55
63
|
},
|
|
56
64
|
"peerDependencies": {
|
|
57
|
-
"graphql": "^
|
|
65
|
+
"graphql": "^16.11.0"
|
|
58
66
|
},
|
|
59
67
|
"devDependencies": {
|
|
60
|
-
"@
|
|
68
|
+
"@arethetypeswrong/cli": "^0.18.5",
|
|
69
|
+
"@types/jest": "^30.0.0",
|
|
61
70
|
"@types/node": "^22.14.0",
|
|
62
71
|
"eslint": "^9.24.0",
|
|
63
72
|
"eslint-plugin-import": "^2.32.0",
|
|
64
|
-
"globals": "^16.
|
|
65
|
-
"jest": "^
|
|
66
|
-
"jest-mock-extended": "^
|
|
73
|
+
"globals": "^16.5.0",
|
|
74
|
+
"jest": "^30.2.0",
|
|
75
|
+
"jest-mock-extended": "^4.0.1",
|
|
67
76
|
"knip": "^5.46.5",
|
|
68
|
-
"prettier": "^
|
|
69
|
-
"ts-jest": "^29.
|
|
77
|
+
"prettier": "^3.1.1",
|
|
78
|
+
"ts-jest": "^29.4.6",
|
|
70
79
|
"ts-node": "^10.9.2",
|
|
71
80
|
"typescript": "^5.7.0",
|
|
72
81
|
"typescript-eslint": "^8.29.0"
|
package/src/graphql/errors.ts
CHANGED
|
@@ -2,13 +2,14 @@ import { GraphQLError } from 'graphql'
|
|
|
2
2
|
import { ErrorCode as GitAdapterErrorCode } from '@commitspark/git-adapter'
|
|
3
3
|
import { ErrorCode as SearchAdapterErrorCode } from '@commitspark/search-adapter'
|
|
4
4
|
|
|
5
|
-
export
|
|
5
|
+
export enum ErrorCode {
|
|
6
6
|
BAD_USER_INPUT = 'BAD_USER_INPUT',
|
|
7
7
|
NOT_FOUND = 'NOT_FOUND',
|
|
8
8
|
BAD_REPOSITORY_DATA = 'BAD_REPOSITORY_DATA',
|
|
9
9
|
BAD_SCHEMA = 'BAD_SCHEMA',
|
|
10
10
|
INTERNAL_ERROR = 'INTERNAL_ERROR',
|
|
11
11
|
IN_USE = 'IN_USE',
|
|
12
|
+
CONFLICT = 'CONFLICT',
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export interface ErrorMetadata {
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
isListType,
|
|
11
11
|
isNonNullType,
|
|
12
12
|
isObjectType,
|
|
13
|
-
isScalarType,
|
|
14
13
|
isUnionType,
|
|
15
14
|
} from 'graphql'
|
|
16
15
|
import { SchemaAnalyzerResult } from './schema-analyzer.ts'
|
|
@@ -51,9 +50,7 @@ export function generateIdInputTypeStrings(
|
|
|
51
50
|
schemaAnalyzerResult: SchemaAnalyzerResult,
|
|
52
51
|
): string[] {
|
|
53
52
|
let typesWithIdField: (
|
|
54
|
-
|
|
|
55
|
-
| GraphQLInterfaceType
|
|
56
|
-
| GraphQLUnionType
|
|
53
|
+
GraphQLObjectType | GraphQLInterfaceType | GraphQLUnionType
|
|
57
54
|
)[] = []
|
|
58
55
|
typesWithIdField = typesWithIdField.concat(
|
|
59
56
|
schemaAnalyzerResult.entryDirectiveTypes,
|
|
@@ -74,16 +71,13 @@ export function generateObjectInputTypeStrings(
|
|
|
74
71
|
return objectTypes.map((objectType): string => {
|
|
75
72
|
const name = objectType.name
|
|
76
73
|
const inputTypeName = `${name}Input`
|
|
74
|
+
const isEntryType = hasDirective(objectType, ENTRY_DIRECTIVE_NAME)
|
|
77
75
|
let inputType = `input ${inputTypeName} {\n`
|
|
78
76
|
let inputTypeFieldStrings = ''
|
|
79
77
|
for (const fieldsKey in objectType.getFields()) {
|
|
80
78
|
const field = objectType.getFields()[fieldsKey]
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
isScalarType(field.type.ofType) &&
|
|
84
|
-
field.type.ofType.name === 'ID') ||
|
|
85
|
-
(isScalarType(field.type) && field.type.name === 'ID')
|
|
86
|
-
) {
|
|
79
|
+
// the ID of an entry is passed as mutation argument instead of as part of the entry data
|
|
80
|
+
if (isEntryType && field.name === 'id') {
|
|
87
81
|
continue
|
|
88
82
|
}
|
|
89
83
|
const inputTypeString = generateFieldInputTypeString(field.type)
|
|
@@ -105,12 +99,12 @@ export function generateObjectInputTypeStrings(
|
|
|
105
99
|
export function generateUnionInputTypeStrings(
|
|
106
100
|
unionTypes: GraphQLUnionType[],
|
|
107
101
|
): string[] {
|
|
108
|
-
|
|
102
|
+
return unionTypes.map((unionType): string => {
|
|
109
103
|
if (buildsOnTypeWithEntryDirective(unionType)) {
|
|
110
104
|
return ''
|
|
111
105
|
}
|
|
112
106
|
|
|
113
|
-
//
|
|
107
|
+
// `@oneOf` is a directive specified by GraphQL and built into graphql-js since 16.9
|
|
114
108
|
let unionInputType = `input ${unionType.name}Input @oneOf {\n`
|
|
115
109
|
for (const innerType of unionType.getTypes()) {
|
|
116
110
|
unionInputType += ` ${innerType.name}: ${innerType.name}Input\n`
|
|
@@ -118,10 +112,4 @@ export function generateUnionInputTypeStrings(
|
|
|
118
112
|
unionInputType += '}\n'
|
|
119
113
|
return unionInputType
|
|
120
114
|
})
|
|
121
|
-
|
|
122
|
-
if (typeStrings.join('').length > 0) {
|
|
123
|
-
typeStrings.push('directive @oneOf on INPUT_OBJECT\n')
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return typeStrings
|
|
127
115
|
}
|
|
@@ -7,11 +7,17 @@ import { mutationUpdateResolver } from './resolvers/query-mutation-resolvers/mut
|
|
|
7
7
|
import { mutationDeleteResolver } from './resolvers/query-mutation-resolvers/mutation-delete-resolver.ts'
|
|
8
8
|
import { queryTypeByIdResolver } from './resolvers/query-mutation-resolvers/query-type-by-id-resolver.ts'
|
|
9
9
|
import { querySearchResolver } from './resolvers/query-mutation-resolvers/query-search-resolver.ts'
|
|
10
|
+
import { referencedByResolver } from './resolvers/field-resolvers/referenced-by-resolver.ts'
|
|
11
|
+
import { versionResolver } from './resolvers/field-resolvers/version-resolver.ts'
|
|
10
12
|
import {
|
|
11
13
|
QueryMutationResolver,
|
|
14
|
+
ReferencedByResolver,
|
|
12
15
|
SearchQueryResolver,
|
|
16
|
+
VersionResolver,
|
|
13
17
|
} from './resolvers/types.ts'
|
|
14
18
|
|
|
19
|
+
const commitInputTypeName = '_CommitInput'
|
|
20
|
+
|
|
15
21
|
export function generateQueriesAndMutations(
|
|
16
22
|
entryDirectiveTypes: GraphQLObjectType[],
|
|
17
23
|
): GeneratedSchema[] {
|
|
@@ -40,8 +46,20 @@ export function generateQueriesAndMutations(
|
|
|
40
46
|
) => queryByIdResolver(source, args, { ...context, type: objectType }, info)
|
|
41
47
|
|
|
42
48
|
const inputTypeName = `${typeName}Input`
|
|
49
|
+
// mutations are printed with one argument per line, as indented within the generated root type
|
|
50
|
+
const commitArgument = (operation: string): string =>
|
|
51
|
+
' """\n' +
|
|
52
|
+
` Details of the commit. If no message is given, the message is '${operation} ${typeName} "<id>"'.\n` +
|
|
53
|
+
' """\n' +
|
|
54
|
+
` commit: ${commitInputTypeName}\n`
|
|
55
|
+
const expectedVersionArgument =
|
|
56
|
+
' """\n' +
|
|
57
|
+
' Version of the entry (field `_version`) that the change is based on. If given and the entry has a different\n' +
|
|
58
|
+
' version, the mutation fails with error code CONFLICT instead of overwriting changes made since.\n' +
|
|
59
|
+
' """\n' +
|
|
60
|
+
' expectedVersion: String\n'
|
|
43
61
|
const createMutationName = `create${typeName}`
|
|
44
|
-
const createMutationString = `${createMutationName}(id: ID
|
|
62
|
+
const createMutationString = `${createMutationName}(\n id: ID!\n data: ${inputTypeName}!\n${commitArgument('Create')} ): ${typeName}`
|
|
45
63
|
const createMutationResolver: QueryMutationResolver<EntryData> = (
|
|
46
64
|
source,
|
|
47
65
|
args,
|
|
@@ -56,7 +74,7 @@ export function generateQueriesAndMutations(
|
|
|
56
74
|
)
|
|
57
75
|
|
|
58
76
|
const updateMutationName = `update${typeName}`
|
|
59
|
-
const updateMutationString = `${updateMutationName}(id: ID
|
|
77
|
+
const updateMutationString = `${updateMutationName}(\n id: ID!\n data: ${inputTypeName}!\n${expectedVersionArgument}${commitArgument('Update')} ): ${typeName}`
|
|
60
78
|
const updateMutationResolver: QueryMutationResolver<EntryData> = (
|
|
61
79
|
source,
|
|
62
80
|
args,
|
|
@@ -71,7 +89,7 @@ export function generateQueriesAndMutations(
|
|
|
71
89
|
)
|
|
72
90
|
|
|
73
91
|
const deleteMutationName = `delete${typeName}`
|
|
74
|
-
const deleteMutationString = `${deleteMutationName}(id: ID
|
|
92
|
+
const deleteMutationString = `${deleteMutationName}(\n id: ID!\n${expectedVersionArgument}${commitArgument('Delete')} ): ID`
|
|
75
93
|
const deleteMutationResolver: QueryMutationResolver<string> = (
|
|
76
94
|
source,
|
|
77
95
|
args,
|
|
@@ -115,6 +133,24 @@ export function generateQueriesAndMutations(
|
|
|
115
133
|
})
|
|
116
134
|
}
|
|
117
135
|
|
|
136
|
+
export function generateCommitInputType(): string {
|
|
137
|
+
return `"""
|
|
138
|
+
Details of the commit created by a mutation.
|
|
139
|
+
"""
|
|
140
|
+
input ${commitInputTypeName} {
|
|
141
|
+
"""
|
|
142
|
+
Commit message summarizing the change in a single line. Leading and trailing whitespace is removed, and messages
|
|
143
|
+
containing line breaks are rejected with error code BAD_USER_INPUT. If omitted or empty, a message is generated.
|
|
144
|
+
"""
|
|
145
|
+
message: String
|
|
146
|
+
"""
|
|
147
|
+
Optional details of the change, which may span multiple lines. Leading and trailing whitespace is removed.
|
|
148
|
+
"""
|
|
149
|
+
body: String
|
|
150
|
+
}
|
|
151
|
+
`
|
|
152
|
+
}
|
|
153
|
+
|
|
118
154
|
export function generateTypeNameQuery(): GeneratedQuery {
|
|
119
155
|
const entryTypeQueryName = '_typeName'
|
|
120
156
|
const entryTypeQueryString = `${entryTypeQueryName}(id: ID!): String!`
|
|
@@ -145,6 +181,36 @@ export function generateSearchQuery(): GeneratedSearchQuery {
|
|
|
145
181
|
}
|
|
146
182
|
}
|
|
147
183
|
|
|
184
|
+
export function generateEntryFields(
|
|
185
|
+
entryDirectiveTypes: GraphQLObjectType[],
|
|
186
|
+
): GeneratedEntryFields[] {
|
|
187
|
+
const referencedByFieldName = '_referencedBy'
|
|
188
|
+
const versionFieldName = '_version'
|
|
189
|
+
|
|
190
|
+
return entryDirectiveTypes.map((objectType) => ({
|
|
191
|
+
typeName: objectType.name,
|
|
192
|
+
typeExtensionString: `extend type ${objectType.name} {
|
|
193
|
+
${referencedByFieldName}: [ID!]!
|
|
194
|
+
"""
|
|
195
|
+
Version of the entry, which changes whenever the stored entry changes. Pass it as \`expectedVersion\` to update
|
|
196
|
+
and delete mutations to prevent overwriting changes made since the entry was read.
|
|
197
|
+
"""
|
|
198
|
+
${versionFieldName}: String!
|
|
199
|
+
}
|
|
200
|
+
`,
|
|
201
|
+
resolvers: {
|
|
202
|
+
[referencedByFieldName]: referencedByResolver,
|
|
203
|
+
[versionFieldName]: versionResolver,
|
|
204
|
+
},
|
|
205
|
+
}))
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
interface GeneratedEntryFields {
|
|
209
|
+
typeName: string
|
|
210
|
+
typeExtensionString: string
|
|
211
|
+
resolvers: Record<string, ReferencedByResolver | VersionResolver>
|
|
212
|
+
}
|
|
213
|
+
|
|
148
214
|
export interface GeneratedSearchQuery {
|
|
149
215
|
name: string
|
|
150
216
|
schemaString: string
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CommitDraft } from '@commitspark/git-adapter'
|
|
2
|
+
import { createError, ErrorCode } from '../errors.ts'
|
|
3
|
+
import { CommitInput } from './types.ts'
|
|
4
|
+
|
|
5
|
+
type MutationOperation = 'Create' | 'Update' | 'Delete'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Determines message and body of the commit of a mutation from mutation argument `commit`. The message is trimmed and
|
|
9
|
+
* must be a single line; an omitted or empty message is replaced by a message generated from the mutation. The body
|
|
10
|
+
* is trimmed and omitted if empty.
|
|
11
|
+
*/
|
|
12
|
+
export function getCommitMessage(
|
|
13
|
+
commit: CommitInput | null | undefined,
|
|
14
|
+
operation: MutationOperation,
|
|
15
|
+
typeName: string,
|
|
16
|
+
id: string,
|
|
17
|
+
): Pick<CommitDraft, 'message' | 'body'> {
|
|
18
|
+
const message = commit?.message?.trim() ?? ''
|
|
19
|
+
if (/[\r\n]/.test(message)) {
|
|
20
|
+
throw createError(
|
|
21
|
+
'Commit message must be a single line; use field "body" for details.',
|
|
22
|
+
ErrorCode.BAD_USER_INPUT,
|
|
23
|
+
{ argumentName: 'commit.message', argumentValue: commit?.message },
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
const body = commit?.body?.trim() ?? ''
|
|
27
|
+
|
|
28
|
+
const commitMessage =
|
|
29
|
+
message !== '' ? message : `${operation} ${typeName} "${id}"`
|
|
30
|
+
if (body === '') {
|
|
31
|
+
return { message: commitMessage }
|
|
32
|
+
}
|
|
33
|
+
return { message: commitMessage, body: body }
|
|
34
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getReferencingEntryIds } from '../../schema-utils/entry-reference-util.ts'
|
|
2
|
+
import { ReferencedByResolver } from '../types.ts'
|
|
3
|
+
|
|
4
|
+
export const referencedByResolver: ReferencedByResolver = async (
|
|
5
|
+
source,
|
|
6
|
+
_args,
|
|
7
|
+
context,
|
|
8
|
+
info,
|
|
9
|
+
) => getReferencingEntryIds(context, info.schema, source.id)
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { findById, findByTypeId } from '../../../persistence/persistence.ts'
|
|
2
2
|
import { isObjectType } from 'graphql'
|
|
3
|
-
import {
|
|
3
|
+
import { validateEntryReferences } from '../../schema-utils/entry-reference-util.ts'
|
|
4
4
|
import {
|
|
5
|
-
ENTRY_ID_INVALID_CHARACTERS,
|
|
6
5
|
EntryData,
|
|
7
6
|
EntryDraft,
|
|
7
|
+
validateEntryId,
|
|
8
8
|
} from '@commitspark/git-adapter'
|
|
9
9
|
import { QueryMutationResolver } from '../types.ts'
|
|
10
10
|
import { createError, ErrorCode } from '../../errors.ts'
|
|
11
|
+
import { getCommitMessage } from '../commit-message.ts'
|
|
12
|
+
import { commitWithRetry } from '../../../persistence/commit-with-retry.ts'
|
|
11
13
|
|
|
12
14
|
export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
|
|
13
15
|
source,
|
|
@@ -15,6 +17,7 @@ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
|
|
|
15
17
|
context,
|
|
16
18
|
info,
|
|
17
19
|
) => {
|
|
20
|
+
void info
|
|
18
21
|
if (!isObjectType(context.type)) {
|
|
19
22
|
throw createError(
|
|
20
23
|
`Entry of type "${context.type.name}" cannot be created as is not an ObjectType.`,
|
|
@@ -22,28 +25,14 @@ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
|
|
|
22
25
|
{},
|
|
23
26
|
)
|
|
24
27
|
}
|
|
28
|
+
// narrowed type, as narrowing does not apply within the callback below
|
|
29
|
+
const entryType = context.type
|
|
25
30
|
|
|
26
|
-
const idValidationResult = args.id.match(ENTRY_ID_INVALID_CHARACTERS)
|
|
27
|
-
if (idValidationResult) {
|
|
28
|
-
throw createError(
|
|
29
|
-
`Field "id" contains invalid characters "${idValidationResult.join(
|
|
30
|
-
', ',
|
|
31
|
-
)}".`,
|
|
32
|
-
ErrorCode.BAD_USER_INPUT,
|
|
33
|
-
{
|
|
34
|
-
argumentName: 'id',
|
|
35
|
-
argumentValue: args.id,
|
|
36
|
-
},
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
let existingEntry
|
|
41
31
|
try {
|
|
42
|
-
|
|
43
|
-
} catch {
|
|
44
|
-
if (existingEntry) {
|
|
32
|
+
validateEntryId(args.id)
|
|
33
|
+
} catch (err) {
|
|
45
34
|
throw createError(
|
|
46
|
-
|
|
35
|
+
err instanceof Error ? err.message : String(err),
|
|
47
36
|
ErrorCode.BAD_USER_INPUT,
|
|
48
37
|
{
|
|
49
38
|
argumentName: 'id',
|
|
@@ -51,50 +40,47 @@ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
|
|
|
51
40
|
},
|
|
52
41
|
)
|
|
53
42
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
context,
|
|
58
|
-
|
|
59
|
-
info.returnType,
|
|
60
|
-
args.data ?? null,
|
|
43
|
+
const commitMessage = getCommitMessage(
|
|
44
|
+
args.commit,
|
|
45
|
+
'Create',
|
|
46
|
+
context.type.name,
|
|
47
|
+
args.id,
|
|
61
48
|
)
|
|
62
49
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
50
|
+
await commitWithRetry(context, async () => {
|
|
51
|
+
let existingEntry
|
|
52
|
+
try {
|
|
53
|
+
existingEntry = await findById(context, args.id)
|
|
54
|
+
} catch {}
|
|
55
|
+
if (existingEntry) {
|
|
56
|
+
throw createError(
|
|
57
|
+
`An entry with id "${args.id}" already exists.`,
|
|
58
|
+
ErrorCode.BAD_USER_INPUT,
|
|
59
|
+
{
|
|
60
|
+
argumentName: 'id',
|
|
61
|
+
argumentValue: args.id,
|
|
62
|
+
},
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
await validateEntryReferences(entryType, context, args.data ?? null)
|
|
67
|
+
|
|
68
|
+
const newEntryDraft: EntryDraft = {
|
|
69
|
+
id: args.id,
|
|
72
70
|
metadata: {
|
|
73
|
-
|
|
74
|
-
referencedBy: newReferencedEntryIds,
|
|
71
|
+
type: context.type.name,
|
|
75
72
|
},
|
|
73
|
+
data: args.data ?? null,
|
|
76
74
|
deletion: false,
|
|
77
75
|
}
|
|
78
|
-
referencedEntryUpdates.push(newReferencedEntryDraft)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const newEntryDraft: EntryDraft = {
|
|
82
|
-
id: args.id,
|
|
83
|
-
metadata: {
|
|
84
|
-
type: context.type.name,
|
|
85
|
-
referencedBy: [],
|
|
86
|
-
},
|
|
87
|
-
data: args.data ?? null,
|
|
88
|
-
deletion: false,
|
|
89
|
-
}
|
|
90
76
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
77
|
+
return {
|
|
78
|
+
ref: context.branch,
|
|
79
|
+
parentSha: context.getCurrentHash(),
|
|
80
|
+
entries: [newEntryDraft],
|
|
81
|
+
...commitMessage,
|
|
82
|
+
}
|
|
96
83
|
})
|
|
97
|
-
context.setCurrentHash(commit.commitHash)
|
|
98
84
|
|
|
99
85
|
const newEntry = await findByTypeId(context, context.type.name, args.id)
|
|
100
86
|
return { ...newEntry.data, id: newEntry.id }
|