@things-factory/shell 10.1.40 → 10.1.44
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/dist-server/service/directive-transaction/transaction.js +11 -3
- package/dist-server/service/directive-transaction/transaction.js.map +1 -1
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/after-commit.d.ts +15 -0
- package/dist-server/utils/after-commit.js +60 -0
- package/dist-server/utils/after-commit.js.map +1 -0
- package/dist-server/utils/index.d.ts +1 -0
- package/dist-server/utils/index.js +1 -0
- package/dist-server/utils/index.js.map +1 -1
- package/package.json +2 -2
- package/tests/after-commit.test.ts +200 -0
- package/tests/undefined-custom-properties.test.ts +133 -0
- package/translations/en.json +3 -1
- package/translations/ja.json +3 -1
- package/translations/ko.json +3 -1
- package/translations/ms.json +3 -1
- package/translations/zh.json +4 -1
|
@@ -5,7 +5,9 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const graphql_1 = require("graphql");
|
|
6
6
|
const graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
|
|
7
7
|
const utils_1 = require("@graphql-tools/utils");
|
|
8
|
+
const env_1 = require("@things-factory/env");
|
|
8
9
|
const database_js_1 = require("../../initializers/database.js");
|
|
10
|
+
const after_commit_js_1 = require("../../utils/after-commit.js");
|
|
9
11
|
const DIRECTIVE = 'transaction';
|
|
10
12
|
exports.transactionDirectiveTypeDefs = (0, graphql_tag_1.default) `
|
|
11
13
|
directive @${DIRECTIVE} on FIELD_DEFINITION
|
|
@@ -16,17 +18,23 @@ const transactionDirectiveResolver = (schema) => (0, utils_1.mapSchema)(schema,
|
|
|
16
18
|
if (transactionDirective) {
|
|
17
19
|
const { resolve = graphql_1.defaultFieldResolver } = fieldConfig;
|
|
18
20
|
fieldConfig.resolve = async function (source, args, context, info) {
|
|
19
|
-
|
|
21
|
+
/*
|
|
22
|
+
* The resolver gets context.state.afterCommit: steps that cannot be undone wait there and run
|
|
23
|
+
* once the transaction has returned, which is after the commit. On a rollback they are dropped.
|
|
24
|
+
* See utils/after-commit.ts (ruling 2026-09-24, ADR-0091 decision 8).
|
|
25
|
+
*/
|
|
26
|
+
return await (0, after_commit_js_1.runTransaction)(work => (0, database_js_1.getDataSource)('tx').transaction(work), async (tx, afterCommit) => {
|
|
20
27
|
/* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */
|
|
21
28
|
let wrap = context.app.createContext(context.req || {}, context.res || {});
|
|
22
29
|
wrap.state = {
|
|
23
30
|
...context.state,
|
|
24
|
-
tx
|
|
31
|
+
tx,
|
|
32
|
+
afterCommit
|
|
25
33
|
};
|
|
26
34
|
wrap.t = context.t;
|
|
27
35
|
let result = await resolve.call(this, source, args, wrap, info);
|
|
28
36
|
return result;
|
|
29
|
-
});
|
|
37
|
+
}, (message, error) => env_1.logger.error(`${message} (field ${fieldName})`, error));
|
|
30
38
|
};
|
|
31
39
|
return fieldConfig;
|
|
32
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../server/service/directive-transaction/transaction.ts"],"names":[],"mappings":";;;;AAAA,qCAA6D;AAC7D,sEAA6B;AAE7B,gDAA0E;AAE1E,gEAA8D;
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../server/service/directive-transaction/transaction.ts"],"names":[],"mappings":";;;;AAAA,qCAA6D;AAC7D,sEAA6B;AAE7B,gDAA0E;AAE1E,6CAA4C;AAE5C,gEAA8D;AAC9D,iEAA4D;AAE5D,MAAM,SAAS,GAAG,aAAa,CAAA;AAElB,QAAA,4BAA4B,GAAG,IAAA,qBAAG,EAAA;iBAC9B,SAAS;GACvB,CAAA;AACI,MAAM,4BAA4B,GAAG,CAAC,MAAqB,EAAE,EAAE,CACpE,IAAA,iBAAS,EAAC,MAAM,EAAE;IAChB,CAAC,kBAAU,CAAC,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE;QACpD,MAAM,oBAAoB,GAAG,IAAA,oBAAY,EAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9E,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,EAAE,OAAO,GAAG,8BAAoB,EAAE,GAAG,WAAW,CAAA;YAEtD,WAAW,CAAC,OAAO,GAAG,KAAK,WAAW,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;gBAC/D;;;;mBAIG;gBACH,OAAO,MAAM,IAAA,gCAAc,EACzB,IAAI,CAAC,EAAE,CAAC,IAAA,2BAAa,EAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAC7C,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;oBACxB,0FAA0F;oBAC1F,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;oBAE1E,IAAI,CAAC,KAAK,GAAG;wBACX,GAAG,OAAO,CAAC,KAAK;wBAChB,EAAE;wBACF,WAAW;qBACZ,CAAA;oBACD,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAA;oBAElB,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;oBAE/D,OAAO,MAAM,CAAA;gBACf,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,YAAM,CAAC,KAAK,CAAC,GAAG,OAAO,WAAW,SAAS,GAAG,EAAE,KAAK,CAAC,CAC3E,CAAA;YACH,CAAC,CAAA;YAED,OAAO,WAAW,CAAA;QACpB,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AArCS,QAAA,4BAA4B,gCAqCrC","sourcesContent":["import { defaultFieldResolver, GraphQLSchema } from 'graphql'\nimport gql from 'graphql-tag'\n\nimport { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'\n\nimport { logger } from '@things-factory/env'\n\nimport { getDataSource } from '../../initializers/database.js'\nimport { runTransaction } from '../../utils/after-commit.js'\n\nconst DIRECTIVE = 'transaction'\n\nexport const transactionDirectiveTypeDefs = gql`\n directive @${DIRECTIVE} on FIELD_DEFINITION\n `\nexport const transactionDirectiveResolver = (schema: GraphQLSchema) =>\n mapSchema(schema, {\n [MapperKind.OBJECT_FIELD]: (fieldConfig, fieldName) => {\n const transactionDirective = getDirective(schema, fieldConfig, DIRECTIVE)?.[0]\n if (transactionDirective) {\n const { resolve = defaultFieldResolver } = fieldConfig\n\n fieldConfig.resolve = async function (source, args, context, info) {\n /*\n * The resolver gets context.state.afterCommit: steps that cannot be undone wait there and run\n * once the transaction has returned, which is after the commit. On a rollback they are dropped.\n * See utils/after-commit.ts (ruling 2026-09-24, ADR-0091 decision 8).\n */\n return await runTransaction(\n work => getDataSource('tx').transaction(work),\n async (tx, afterCommit) => {\n /* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */\n let wrap = context.app.createContext(context.req || {}, context.res || {})\n\n wrap.state = {\n ...context.state,\n tx,\n afterCommit\n }\n wrap.t = context.t\n\n let result = await resolve.call(this, source, args, wrap, info)\n\n return result\n },\n (message, error) => logger.error(`${message} (field ${fieldName})`, error)\n )\n }\n\n return fieldConfig\n }\n }\n })\n"]}
|
|
@@ -4,12 +4,12 @@ export * from './domain/domain.js';
|
|
|
4
4
|
export * from './domain/domain-types.js';
|
|
5
5
|
export * from './subscription-data/data-types.js';
|
|
6
6
|
export * from './env-var/env-var.js';
|
|
7
|
-
export declare const entities: (typeof import("./
|
|
7
|
+
export declare const entities: (typeof import("./attribute-set/attribute-set.js").AttributeSet | typeof import("./domain/domain.js").Domain | typeof import("./env-var/env-var.js").EnvVar)[];
|
|
8
8
|
export declare const schema: {
|
|
9
9
|
typeDefs: {
|
|
10
10
|
transactionDirectiveTypeDefs: import("graphql").DocumentNode;
|
|
11
11
|
};
|
|
12
|
-
resolverClasses: (typeof import("./
|
|
12
|
+
resolverClasses: (typeof import("./attribute-set/attribute-set-query.js").AttributeSetQuery | typeof import("./attribute-set/attribute-set-mutation.js").AttributeSetMutation | typeof import("./domain/domain-query.js").DomainQuery | typeof import("./domain/domain-mutation.js").DomainMutation | typeof import("./subscription-data/data-resolver.js").DataResolver | typeof import("./env-var/env-var-query.js").EnvVarQuery | typeof import("./env-var/env-var-mutation.js").EnvVarMutation)[];
|
|
13
13
|
directives: {
|
|
14
14
|
transaction: (schema: import("graphql").GraphQLSchema) => import("graphql").GraphQLSchema;
|
|
15
15
|
};
|