declastruct 1.0.0

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 (168) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__test_assets__/getExampleContext.d.ts +33 -0
  3. package/dist/__test_assets__/getExampleContext.js +87 -0
  4. package/dist/__test_assets__/getExampleContext.js.map +1 -0
  5. package/dist/contract/commands/command.apply.d.ts +6 -0
  6. package/dist/contract/commands/command.apply.js +20 -0
  7. package/dist/contract/commands/command.apply.js.map +1 -0
  8. package/dist/contract/commands/command.plan.d.ts +6 -0
  9. package/dist/contract/commands/command.plan.js +20 -0
  10. package/dist/contract/commands/command.plan.js.map +1 -0
  11. package/dist/contract/commands/utils/resolveCommandInputs.d.ts +17 -0
  12. package/dist/contract/commands/utils/resolveCommandInputs.js +23 -0
  13. package/dist/contract/commands/utils/resolveCommandInputs.js.map +1 -0
  14. package/dist/contract/sdk/index.d.ts +3 -0
  15. package/dist/contract/sdk/index.js +20 -0
  16. package/dist/contract/sdk/index.js.map +1 -0
  17. package/dist/contract/sdk/refs.d.ts +2 -0
  18. package/dist/contract/sdk/refs.js +19 -0
  19. package/dist/contract/sdk/refs.js.map +1 -0
  20. package/dist/contract/sdk/sync/apply.d.ts +22 -0
  21. package/dist/contract/sdk/sync/apply.js +29 -0
  22. package/dist/contract/sdk/sync/apply.js.map +1 -0
  23. package/dist/contract/sdk/sync/plan.d.ts +22 -0
  24. package/dist/contract/sdk/sync/plan.js +30 -0
  25. package/dist/contract/sdk/sync/plan.js.map +1 -0
  26. package/dist/domain/DeclaredResource.d.ts +2 -0
  27. package/dist/domain/DeclaredResource.js +3 -0
  28. package/dist/domain/DeclaredResource.js.map +1 -0
  29. package/dist/domain/DeclaredResourceReference.d.ts +66 -0
  30. package/dist/domain/DeclaredResourceReference.js +42 -0
  31. package/dist/domain/DeclaredResourceReference.js.map +1 -0
  32. package/dist/domain/DeclastructChangeProposal.d.ts +61 -0
  33. package/dist/domain/DeclastructChangeProposal.js +37 -0
  34. package/dist/domain/DeclastructChangeProposal.js.map +1 -0
  35. package/dist/domain/DeclastructContext.d.ts +24 -0
  36. package/dist/domain/DeclastructContext.js +3 -0
  37. package/dist/domain/DeclastructContext.js.map +1 -0
  38. package/dist/domain/DeclastructProvider.d.ts +58 -0
  39. package/dist/domain/DeclastructProvider.js +3 -0
  40. package/dist/domain/DeclastructProvider.js.map +1 -0
  41. package/dist/domain/DeclastructProviderContext.d.ts +30 -0
  42. package/dist/domain/DeclastructProviderContext.js +3 -0
  43. package/dist/domain/DeclastructProviderContext.js.map +1 -0
  44. package/dist/domain/DeclastructProviderResourceRemoteStateInterface.d.ts +156 -0
  45. package/dist/domain/DeclastructProviderResourceRemoteStateInterface.js +3 -0
  46. package/dist/domain/DeclastructProviderResourceRemoteStateInterface.js.map +1 -0
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.js +18 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/logic/actions/execute/canUpdateResource.d.ts +5 -0
  51. package/dist/logic/actions/execute/canUpdateResource.js +12 -0
  52. package/dist/logic/actions/execute/canUpdateResource.js.map +1 -0
  53. package/dist/logic/actions/execute/executeProposal.d.ts +5 -0
  54. package/dist/logic/actions/execute/executeProposal.js +52 -0
  55. package/dist/logic/actions/execute/executeProposal.js.map +1 -0
  56. package/dist/logic/actions/propose/getColoredActionToken.d.ts +4 -0
  57. package/dist/logic/actions/propose/getColoredActionToken.js +22 -0
  58. package/dist/logic/actions/propose/getColoredActionToken.js.map +1 -0
  59. package/dist/logic/actions/propose/getColoredProposalTitle.d.ts +4 -0
  60. package/dist/logic/actions/propose/getColoredProposalTitle.js +34 -0
  61. package/dist/logic/actions/propose/getColoredProposalTitle.js.map +1 -0
  62. package/dist/logic/actions/propose/proposeChangeForResource.d.ts +7 -0
  63. package/dist/logic/actions/propose/proposeChangeForResource.js +65 -0
  64. package/dist/logic/actions/propose/proposeChangeForResource.js.map +1 -0
  65. package/dist/logic/actions/propose/proposeChangeForResource.test.d.ts +1 -0
  66. package/dist/logic/actions/propose/proposeChangeForResource.test.js +48 -0
  67. package/dist/logic/actions/propose/proposeChangeForResource.test.js.map +1 -0
  68. package/dist/logic/commands/command.apply.d.ts +8 -0
  69. package/dist/logic/commands/command.apply.js +77 -0
  70. package/dist/logic/commands/command.apply.js.map +1 -0
  71. package/dist/logic/commands/command.plan.d.ts +13 -0
  72. package/dist/logic/commands/command.plan.js +155 -0
  73. package/dist/logic/commands/command.plan.js.map +1 -0
  74. package/dist/logic/commands/execute.d.ts +15 -0
  75. package/dist/logic/commands/execute.js +63 -0
  76. package/dist/logic/commands/execute.js.map +1 -0
  77. package/dist/logic/tools/compare/castReferenceToGrokableString.d.ts +16 -0
  78. package/dist/logic/tools/compare/castReferenceToGrokableString.js +66 -0
  79. package/dist/logic/tools/compare/castReferenceToGrokableString.js.map +1 -0
  80. package/dist/logic/tools/compare/castReferenceToGrokableString.test.d.ts +1 -0
  81. package/dist/logic/tools/compare/castReferenceToGrokableString.test.js +111 -0
  82. package/dist/logic/tools/compare/castReferenceToGrokableString.test.js.map +1 -0
  83. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.d.ts +11 -0
  84. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.js +61 -0
  85. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.js.map +1 -0
  86. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.d.ts +1 -0
  87. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.js +31 -0
  88. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.js.map +1 -0
  89. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.d.ts +21 -0
  90. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.js +53 -0
  91. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.js.map +1 -0
  92. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.d.ts +1 -0
  93. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.js +31 -0
  94. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.js.map +1 -0
  95. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.d.ts +10 -0
  96. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.js +41 -0
  97. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.js.map +1 -0
  98. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.d.ts +1 -0
  99. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.js +174 -0
  100. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.js.map +1 -0
  101. package/dist/logic/tools/context/createDeclastructContext.d.ts +10 -0
  102. package/dist/logic/tools/context/createDeclastructContext.js +12 -0
  103. package/dist/logic/tools/context/createDeclastructContext.js.map +1 -0
  104. package/dist/logic/tools/context/destroyDeclastructContext.d.ts +4 -0
  105. package/dist/logic/tools/context/destroyDeclastructContext.js +10 -0
  106. package/dist/logic/tools/context/destroyDeclastructContext.js.map +1 -0
  107. package/dist/logic/tools/provider/castProviderContextToGlobalContext.d.ts +4 -0
  108. package/dist/logic/tools/provider/castProviderContextToGlobalContext.js +10 -0
  109. package/dist/logic/tools/provider/castProviderContextToGlobalContext.js.map +1 -0
  110. package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.d.ts +13 -0
  111. package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.js +29 -0
  112. package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.js.map +1 -0
  113. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.d.ts +13 -0
  114. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js +24 -0
  115. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js.map +1 -0
  116. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.d.ts +10 -0
  117. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js +21 -0
  118. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js.map +1 -0
  119. package/dist/logic/tools/reference/buildPrimaryKeyTo.d.ts +5 -0
  120. package/dist/logic/tools/reference/buildPrimaryKeyTo.js +40 -0
  121. package/dist/logic/tools/reference/buildPrimaryKeyTo.js.map +1 -0
  122. package/dist/logic/tools/reference/buildReferenceTo.d.ts +28 -0
  123. package/dist/logic/tools/reference/buildReferenceTo.js +92 -0
  124. package/dist/logic/tools/reference/buildReferenceTo.js.map +1 -0
  125. package/dist/logic/tools/reference/buildReferenceTo.test.d.ts +1 -0
  126. package/dist/logic/tools/reference/buildReferenceTo.test.js +119 -0
  127. package/dist/logic/tools/reference/buildReferenceTo.test.js.map +1 -0
  128. package/dist/logic/tools/reference/buildUniqueKeyTo.d.ts +5 -0
  129. package/dist/logic/tools/reference/buildUniqueKeyTo.js +40 -0
  130. package/dist/logic/tools/reference/buildUniqueKeyTo.js.map +1 -0
  131. package/dist/logic/tools/reference/defineReferenceClassOf.d.ts +5 -0
  132. package/dist/logic/tools/reference/defineReferenceClassOf.js +25 -0
  133. package/dist/logic/tools/reference/defineReferenceClassOf.js.map +1 -0
  134. package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.d.ts +13 -0
  135. package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.js +36 -0
  136. package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.js.map +1 -0
  137. package/dist/logic/tools/reference/getByReference.d.ts +15 -0
  138. package/dist/logic/tools/reference/getByReference.js +55 -0
  139. package/dist/logic/tools/reference/getByReference.js.map +1 -0
  140. package/dist/logic/tools/reference/getByReference.test.d.ts +1 -0
  141. package/dist/logic/tools/reference/getByReference.test.js +92 -0
  142. package/dist/logic/tools/reference/getByReference.test.js.map +1 -0
  143. package/dist/logic/tools/reference/getByReferencedPrimaryKey.d.ts +6 -0
  144. package/dist/logic/tools/reference/getByReferencedPrimaryKey.js +17 -0
  145. package/dist/logic/tools/reference/getByReferencedPrimaryKey.js.map +1 -0
  146. package/dist/logic/tools/reference/getByReferencedUniqueKey.d.ts +7 -0
  147. package/dist/logic/tools/reference/getByReferencedUniqueKey.js +42 -0
  148. package/dist/logic/tools/reference/getByReferencedUniqueKey.js.map +1 -0
  149. package/dist/logic/tools/reference/getPrimaryKeyByReference.d.ts +15 -0
  150. package/dist/logic/tools/reference/getPrimaryKeyByReference.js +36 -0
  151. package/dist/logic/tools/reference/getPrimaryKeyByReference.js.map +1 -0
  152. package/dist/logic/tools/reference/getReferenceTo.d.ts +18 -0
  153. package/dist/logic/tools/reference/getReferenceTo.js +55 -0
  154. package/dist/logic/tools/reference/getReferenceTo.js.map +1 -0
  155. package/dist/logic/tools/reference/getReferenceTo.test.d.ts +1 -0
  156. package/dist/logic/tools/reference/getReferenceTo.test.js +95 -0
  157. package/dist/logic/tools/reference/getReferenceTo.test.js.map +1 -0
  158. package/dist/logic/tools/reference/getUniqueKeyByReference.d.ts +15 -0
  159. package/dist/logic/tools/reference/getUniqueKeyByReference.js +36 -0
  160. package/dist/logic/tools/reference/getUniqueKeyByReference.js.map +1 -0
  161. package/dist/logic/tools/reference/isPrimaryKeyReference.d.ts +6 -0
  162. package/dist/logic/tools/reference/isPrimaryKeyReference.js +7 -0
  163. package/dist/logic/tools/reference/isPrimaryKeyReference.js.map +1 -0
  164. package/dist/logic/tools/reference/isUniqueKeyReference.d.ts +6 -0
  165. package/dist/logic/tools/reference/isUniqueKeyReference.js +7 -0
  166. package/dist/logic/tools/reference/isUniqueKeyReference.js.map +1 -0
  167. package/package.json +100 -0
  168. package/readme.md +56 -0
@@ -0,0 +1,13 @@
1
+ import { DomainEntity } from 'domain-objects';
2
+ import { DeclastructContext } from '../../../domain/DeclastructContext';
3
+ import { DeclastructProviderContext } from '../../../domain/DeclastructProviderContext';
4
+ import { DeclastructProviderResourceRemoteStateInterface } from '../../../domain/DeclastructProviderResourceRemoteStateInterface';
5
+ /**
6
+ * returns everything required to execute operations against the remote-state-interface for a resource
7
+ */
8
+ export declare const getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource: <R extends DomainEntity<any>>({ resource }: {
9
+ resource: R;
10
+ }, context: DeclastructContext) => {
11
+ remoteStateInterface: DeclastructProviderResourceRemoteStateInterface<R, any, any, any>;
12
+ providerContext: DeclastructProviderContext<any>;
13
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource = void 0;
4
+ const error_fns_1 = require("@ehmpathy/error-fns");
5
+ const domain_objects_1 = require("domain-objects");
6
+ const getProviderContextFromGlobalContextForResourceClass_1 = require("./getProviderContextFromGlobalContextForResourceClass");
7
+ const getProviderResourceRemoteStateInterfaceFromContextForResourceClass_1 = require("./getProviderResourceRemoteStateInterfaceFromContextForResourceClass");
8
+ /**
9
+ * returns everything required to execute operations against the remote-state-interface for a resource
10
+ */
11
+ const getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource = ({ resource }, context) => {
12
+ // sanity check that resource is a domain entity (otherwise, it cant be created)
13
+ if (!(resource instanceof domain_objects_1.DomainEntity))
14
+ throw new error_fns_1.UnexpectedCodePathError('can not createResource on a non DomainEntity object', { resource });
15
+ const resourceClassName = resource.constructor.name;
16
+ // lookup the interface
17
+ const remoteStateInterface = (0, getProviderResourceRemoteStateInterfaceFromContextForResourceClass_1.getProviderResourceRemoteStateInterfaceFromContextForResourceClass)({ resourceClassName }, context);
18
+ // lookup the provider context
19
+ const providerContext = (0, getProviderContextFromGlobalContextForResourceClass_1.getProviderContextFromGlobalContextForResourceClass)({ resourceClassName }, context);
20
+ // return the dependencies
21
+ return { remoteStateInterface, providerContext };
22
+ };
23
+ exports.getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource = getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource;
24
+ //# sourceMappingURL=getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js","sourceRoot":"","sources":["../../../../src/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAC9D,mDAA8C;AAK9C,+HAA4H;AAC5H,6JAA0J;AAE1J;;GAEG;AACI,MAAM,uEAAuE,GAClF,CACE,EAAE,QAAQ,EAAmB,EAC7B,OAA2B,EAS3B,EAAE;IACF,gFAAgF;IAChF,IAAI,CAAC,CAAC,QAAQ,YAAY,6BAAY,CAAC;QACrC,MAAM,IAAI,mCAAuB,CAC/B,qDAAqD,EACrD,EAAE,QAAQ,EAAE,CACb,CAAC;IACJ,MAAM,iBAAiB,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IAEpD,uBAAuB;IACvB,MAAM,oBAAoB,GACxB,IAAA,uIAAkE,EAKhE,EAAE,iBAAiB,EAAE,EAAE,OAAO,CAAC,CAAC;IAEpC,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAA,yGAAmD,EACzE,EAAE,iBAAiB,EAAE,EACrB,OAAO,CACR,CAAC;IAEF,0BAA0B;IAC1B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,CAAC;AACnD,CAAC,CAAC;AAtCS,QAAA,uEAAuE,2EAsChF"}
@@ -0,0 +1,10 @@
1
+ import { DeclaredResource } from '../../../domain/DeclaredResource';
2
+ import { DeclastructContext } from '../../../domain/DeclastructContext';
3
+ import { DeclastructProviderAgentOptions } from '../../../domain/DeclastructProvider';
4
+ import { DeclastructProviderResourceRemoteStateInterface } from '../../../domain/DeclastructProviderResourceRemoteStateInterface';
5
+ /**
6
+ * grabs the appropriate interface for managing resources of this class, by resource class name
7
+ */
8
+ export declare const getProviderResourceRemoteStateInterfaceFromContextForResourceClass: <R extends DeclaredResource, AO extends DeclastructProviderAgentOptions, P extends keyof R, U extends keyof R>({ resourceClassName }: {
9
+ resourceClassName: string;
10
+ }, context: DeclastructContext) => DeclastructProviderResourceRemoteStateInterface<R, AO, P, U>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProviderResourceRemoteStateInterfaceFromContextForResourceClass = void 0;
4
+ const error_fns_1 = require("@ehmpathy/error-fns");
5
+ /**
6
+ * grabs the appropriate interface for managing resources of this class, by resource class name
7
+ */
8
+ const getProviderResourceRemoteStateInterfaceFromContextForResourceClass = ({ resourceClassName }, context) => {
9
+ // lookup the provider for this resource
10
+ const provider = context.providers.find((thisProvider) => resourceClassName in thisProvider.interfaces);
11
+ if (!provider)
12
+ throw new error_fns_1.UnexpectedCodePathError('could not find provider for resource', {
13
+ resourceClassName,
14
+ });
15
+ // grab the interface
16
+ const resourceInterface = provider.interfaces[resourceClassName];
17
+ // return it
18
+ return resourceInterface;
19
+ };
20
+ exports.getProviderResourceRemoteStateInterfaceFromContextForResourceClass = getProviderResourceRemoteStateInterfaceFromContextForResourceClass;
21
+ //# sourceMappingURL=getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js","sourceRoot":"","sources":["../../../../src/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAO9D;;GAEG;AACI,MAAM,kEAAkE,GAC7E,CAME,EAAE,iBAAiB,EAAiC,EACpD,OAA2B,EACmC,EAAE;IAChE,wCAAwC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CACrC,CAAC,YAAY,EAAE,EAAE,CAAC,iBAAiB,IAAI,YAAY,CAAC,UAAU,CAC/D,CAAC;IACF,IAAI,CAAC,QAAQ;QACX,MAAM,IAAI,mCAAuB,CAC/B,sCAAsC,EACtC;YACE,iBAAiB;SAClB,CACF,CAAC;IAEJ,qBAAqB;IACrB,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAC3C,iBAAiB,CACqD,CAAC;IAEzE,YAAY;IACZ,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AA7BS,QAAA,kEAAkE,sEA6B3E"}
@@ -0,0 +1,5 @@
1
+ import { DomainObject } from 'domain-objects';
2
+ /**
3
+ * build the primary key of a resource
4
+ */
5
+ export declare const buildPrimaryKeyTo: <T extends DomainObject<any>, C extends new (props: T) => T, P extends keyof T, K extends Partial<T>>(to: C, using: K) => Required<Pick<T, P>>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildPrimaryKeyTo = void 0;
4
+ const buildReferenceTo_1 = require("./buildReferenceTo");
5
+ const defineReferenceKeyConstituentsOf_1 = require("./defineReferenceKeyConstituentsOf");
6
+ /**
7
+ * build the primary key of a resource
8
+ */
9
+ const buildPrimaryKeyTo = (
10
+ /**
11
+ * the class this is a reference to
12
+ */
13
+ to,
14
+ /**
15
+ * the data to build the reference with
16
+ */
17
+ using) => {
18
+ const referenceOf = to;
19
+ const referenceInput = using;
20
+ // get the primary key defs for the class
21
+ const { primary } = (0, defineReferenceKeyConstituentsOf_1.defineReferenceKeyConstituentsOf)({
22
+ class: referenceOf,
23
+ });
24
+ // assert that the resource has a primary key defined on it
25
+ const hasPrimaryKey = primary.every((key) => key in referenceInput);
26
+ if (!hasPrimaryKey)
27
+ throw new buildReferenceTo_1.CanNotBuildReferenceError({
28
+ referenceOf,
29
+ referenceInput,
30
+ reason: 'the primary key is not present in the reference input',
31
+ });
32
+ // extract the primary key value
33
+ const primaryKey = primary.reduce((summary, thisKeyKey) => {
34
+ const thisKeyValue = referenceInput[thisKeyKey];
35
+ return { ...summary, [thisKeyKey]: thisKeyValue };
36
+ }, {});
37
+ return primaryKey;
38
+ };
39
+ exports.buildPrimaryKeyTo = buildPrimaryKeyTo;
40
+ //# sourceMappingURL=buildPrimaryKeyTo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPrimaryKeyTo.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/buildPrimaryKeyTo.ts"],"names":[],"mappings":";;;AAEA,yDAA+D;AAC/D,yFAAsF;AAEtF;;GAEG;AACI,MAAM,iBAAiB,GAAG;AAkB/B;;GAEG;AACH,EAAK;AAEL;;GAEG;AACH,KAAQ,EACc,EAAE;IACxB,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,MAAM,cAAc,GAAG,KAAK,CAAC;IAE7B,yCAAyC;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,mEAAgC,EAAC;QACnD,KAAK,EAAE,WAAW;KACnB,CAAC,CAAC;IAEH,2DAA2D;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IACpE,IAAI,CAAC,aAAa;QAChB,MAAM,IAAI,4CAAyB,CAAC;YAClC,WAAW;YACX,cAAc;YACd,MAAM,EAAE,uDAAuD;SAChE,CAAC,CAAC;IAEL,gCAAgC;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE;QACxD,MAAM,YAAY,GAChB,cAAc,CAAC,UAAyC,CAAC,CAAC;QAC5D,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IACpD,CAAC,EAAE,EAA0B,CAAC,CAAC;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AApDW,QAAA,iBAAiB,qBAoD5B"}
@@ -0,0 +1,28 @@
1
+ import { DomainObject } from 'domain-objects';
2
+ import { DeclaredResourceReference } from '../../../domain/DeclaredResourceReference';
3
+ export declare class CanNotReferenceDeclaredResourceClassError extends Error {
4
+ constructor({ class: ofClass, reason, }: {
5
+ class: typeof DomainObject;
6
+ reason: string;
7
+ });
8
+ }
9
+ export declare class CanNotBuildReferenceError extends Error {
10
+ constructor({ referenceInput, referenceOf, reason, }: {
11
+ referenceInput: any;
12
+ referenceOf: any;
13
+ reason: string;
14
+ });
15
+ }
16
+ /**
17
+ * build a reference to a resource of a particular class using a supported key
18
+ * - uses the unique key if possible
19
+ * - uses the primary key otherwise
20
+ *
21
+ * note
22
+ * - we prefer unique key over primary key because
23
+ * - it encodes the most information
24
+ * - it is always available for resources
25
+ * - it is the common comparable form of reference
26
+ */
27
+ export declare const buildReferenceTo: <T extends DomainObject<any>, C extends new (props: T) => T, P extends keyof T, U extends keyof T, K extends Partial<T>>(to: C, using: K, as?: new (props: DeclaredResourceReference<T, P, U>) => DeclaredResourceReference<T, P, U>) => DeclaredResourceReference<T, P, U>;
28
+ export { buildReferenceTo as buildRef };
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildRef = exports.buildReferenceTo = exports.CanNotBuildReferenceError = exports.CanNotReferenceDeclaredResourceClassError = void 0;
4
+ const DeclaredResourceReference_1 = require("../../../domain/DeclaredResourceReference");
5
+ const buildPrimaryKeyTo_1 = require("./buildPrimaryKeyTo");
6
+ const buildUniqueKeyTo_1 = require("./buildUniqueKeyTo");
7
+ const defineReferenceClassOf_1 = require("./defineReferenceClassOf");
8
+ const defineReferenceKeyConstituentsOf_1 = require("./defineReferenceKeyConstituentsOf");
9
+ class CanNotReferenceDeclaredResourceClassError extends Error {
10
+ constructor({ class: ofClass, reason, }) {
11
+ super(`
12
+ Can not reference declared resource of class '${ofClass.name}'. Instances of the class '${ofClass.name}' can not be referenced because ${reason}.
13
+ `.trim());
14
+ }
15
+ }
16
+ exports.CanNotReferenceDeclaredResourceClassError = CanNotReferenceDeclaredResourceClassError;
17
+ class CanNotBuildReferenceError extends Error {
18
+ constructor({ referenceInput, referenceOf, reason, }) {
19
+ super(`
20
+ Can not build reference ${referenceOf?.name ? `to class '${referenceOf.name}'` : ''} because ${reason}.
21
+
22
+ referenceInput
23
+ ${JSON.stringify(referenceInput, null, 2)}
24
+ `.trim());
25
+ }
26
+ }
27
+ exports.CanNotBuildReferenceError = CanNotBuildReferenceError;
28
+ /**
29
+ * build a reference to a resource of a particular class using a supported key
30
+ * - uses the unique key if possible
31
+ * - uses the primary key otherwise
32
+ *
33
+ * note
34
+ * - we prefer unique key over primary key because
35
+ * - it encodes the most information
36
+ * - it is always available for resources
37
+ * - it is the common comparable form of reference
38
+ */
39
+ const buildReferenceTo = (
40
+ /**
41
+ * the class this is a reference to
42
+ */
43
+ to,
44
+ /**
45
+ * the data to build the reference with
46
+ */
47
+ using,
48
+ /**
49
+ * the class to instantiate the reference with
50
+ * - defaults to the generic DeclaredResourceReference class
51
+ * - allows using a more specific subclass if one was created
52
+ */
53
+ as) => {
54
+ const referenceOf = to;
55
+ const referenceInput = using;
56
+ const ReferenceConstructor = as ??
57
+ (0, defineReferenceClassOf_1.defineReferenceClassOf)({ class: referenceOf }) ??
58
+ DeclaredResourceReference_1.DeclaredResourceReference; // todo: start throwing errors if reference is not explicitly declared on the source class; using DeclaredResourceError produces hydration and serialization errors for "alternatives" types
59
+ // get the unique and unique key defs for the class
60
+ const { unique, primary } = (0, defineReferenceKeyConstituentsOf_1.defineReferenceKeyConstituentsOf)({
61
+ class: referenceOf,
62
+ });
63
+ // if unique key is defined, reference by unique key
64
+ const hasUniqueKey = unique.every((key) => key in referenceInput);
65
+ if (hasUniqueKey)
66
+ return new ReferenceConstructor({
67
+ referenceOf: referenceOf.name,
68
+ identifiedBy: {
69
+ key: DeclaredResourceReference_1.DeclaredResourceReferenceKeyType.UNIQUE_KEY,
70
+ value: (0, buildUniqueKeyTo_1.buildUniqueKeyTo)(referenceOf, referenceInput),
71
+ },
72
+ });
73
+ // if primary key is defined, reference by primary key
74
+ const hasPrimaryKey = primary.every((key) => key in referenceInput);
75
+ if (hasPrimaryKey)
76
+ return new ReferenceConstructor({
77
+ referenceOf: referenceOf.name,
78
+ identifiedBy: {
79
+ key: DeclaredResourceReference_1.DeclaredResourceReferenceKeyType.PRIMARY_KEY,
80
+ value: (0, buildPrimaryKeyTo_1.buildPrimaryKeyTo)(referenceOf, referenceInput),
81
+ },
82
+ });
83
+ // if has neither, then the reference can not be made
84
+ throw new CanNotBuildReferenceError({
85
+ referenceOf,
86
+ referenceInput,
87
+ reason: 'neither the primary key nor unique key is present in the reference key',
88
+ });
89
+ };
90
+ exports.buildReferenceTo = buildReferenceTo;
91
+ exports.buildRef = exports.buildReferenceTo;
92
+ //# sourceMappingURL=buildReferenceTo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildReferenceTo.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/buildReferenceTo.ts"],"names":[],"mappings":";;;AAEA,yFAGmD;AACnD,2DAAwD;AACxD,yDAAsD;AACtD,qEAAkE;AAClE,yFAAsF;AAEtF,MAAa,yCAA0C,SAAQ,KAAK;IAClE,YAAY,EACV,KAAK,EAAE,OAAO,EACd,MAAM,GAIP;QACC,KAAK,CACH;gDAC0C,OAAO,CAAC,IAAI,8BAA8B,OAAO,CAAC,IAAI,mCAAmC,MAAM;KAC1I,CAAC,IAAI,EAAE,CACP,CAAC;IACJ,CAAC;CACF;AAdD,8FAcC;AAED,MAAa,yBAA0B,SAAQ,KAAK;IAClD,YAAY,EACV,cAAc,EACd,WAAW,EACX,MAAM,GAKP;QACC,KAAK,CACH;0BAEE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EACzD,YAAY,MAAM;;;EAGtB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;KACpC,CAAC,IAAI,EAAE,CACP,CAAC;IACJ,CAAC;CACF;AArBD,8DAqBC;AAED;;;;;;;;;;GAUG;AACI,MAAM,gBAAgB,GAAG;AAsB9B;;GAEG;AACH,EAAK;AAEL;;GAEG;AACH,KAAQ;AAER;;;;GAIG;AACH,EAEuC,EACH,EAAE;IACtC,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,MAAM,cAAc,GAAG,KAAK,CAAC;IAC7B,MAAM,oBAAoB,GACxB,EAAE;QACF,IAAA,+CAAsB,EAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC9C,qDAAyB,CAAC,CAAC,4LAA4L;IAEzN,mDAAmD;IACnD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,mEAAgC,EAAC;QAC3D,KAAK,EAAE,WAAW;KACnB,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IAClE,IAAI,YAAY;QACd,OAAO,IAAI,oBAAoB,CAAC;YAC9B,WAAW,EAAE,WAAW,CAAC,IAAI;YAC7B,YAAY,EAAE;gBACZ,GAAG,EAAE,4DAAgC,CAAC,UAAU;gBAChD,KAAK,EAAE,IAAA,mCAAgB,EAAC,WAAW,EAAE,cAAc,CAAC;aACrD;SACF,CAAuC,CAAC;IAE3C,sDAAsD;IACtD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IACpE,IAAI,aAAa;QACf,OAAO,IAAI,oBAAoB,CAAC;YAC9B,WAAW,EAAE,WAAW,CAAC,IAAI;YAC7B,YAAY,EAAE;gBACZ,GAAG,EAAE,4DAAgC,CAAC,WAAW;gBACjD,KAAK,EAAE,IAAA,qCAAiB,EAAC,WAAW,EAAE,cAAc,CAAC;aACtD;SACF,CAAuC,CAAC;IAE3C,qDAAqD;IACrD,MAAM,IAAI,yBAAyB,CAAC;QAClC,WAAW;QACX,cAAc;QACd,MAAM,EACJ,wEAAwE;KAC3E,CAAC,CAAC;AACL,CAAC,CAAC;AAlFW,QAAA,gBAAgB,oBAkF3B;AAE2B,mBApFhB,wBAAgB,CAoFQ"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const domain_objects_1 = require("domain-objects");
4
+ const DeclaredResourceReference_1 = require("../../../domain/DeclaredResourceReference");
5
+ const buildReferenceTo_1 = require("./buildReferenceTo");
6
+ // todo: remove the declastruct references in favor of domain-object references
7
+ describe.skip('getReferenceTo', () => {
8
+ it('should throw a helpful error the class does not have unique key defined', () => {
9
+ class CNCMachine extends domain_objects_1.DomainObject {
10
+ }
11
+ CNCMachine.primary = ['uuid'];
12
+ try {
13
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
14
+ const ref = (0, buildReferenceTo_1.buildReferenceTo)(CNCMachine, new CNCMachine({
15
+ serialNumber: '821',
16
+ size: 'big',
17
+ location: 'basement',
18
+ }));
19
+ throw new Error('should not reach here');
20
+ }
21
+ catch (error) {
22
+ expect(error).toBeInstanceOf(buildReferenceTo_1.CanNotReferenceDeclaredResourceClassError);
23
+ expect(error.message).toContain(`the static property 'unique' was not defined as an array of strings`);
24
+ expect(error).toMatchSnapshot();
25
+ }
26
+ });
27
+ it('should throw a helpful error the class does not have primary key defined correctly', () => {
28
+ class CNCMachine extends domain_objects_1.DomainObject {
29
+ }
30
+ CNCMachine.primary = 'uuid';
31
+ try {
32
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
33
+ const ref = (0, buildReferenceTo_1.buildReferenceTo)(CNCMachine, new CNCMachine({
34
+ serialNumber: '821',
35
+ size: 'big',
36
+ location: 'basement',
37
+ }));
38
+ throw new Error('should not reach here');
39
+ }
40
+ catch (error) {
41
+ expect(error).toBeInstanceOf(buildReferenceTo_1.CanNotReferenceDeclaredResourceClassError);
42
+ expect(error.message).toContain(`the static property 'primary' was not defined as an array of strings`);
43
+ expect(error).toMatchSnapshot();
44
+ }
45
+ });
46
+ it('should be able to reference by unique key', () => {
47
+ class CNCMachine extends domain_objects_1.DomainObject {
48
+ }
49
+ CNCMachine.primary = ['uuid'];
50
+ CNCMachine.unique = ['serialNumber'];
51
+ const reference = (0, buildReferenceTo_1.buildReferenceTo)(CNCMachine, new CNCMachine({
52
+ serialNumber: '821',
53
+ size: 'big',
54
+ location: 'basement',
55
+ }));
56
+ expect(reference).toEqual({
57
+ referenceOf: 'CNCMachine',
58
+ identifiedBy: {
59
+ key: 'UNIQUE_KEY',
60
+ value: { serialNumber: '821' },
61
+ },
62
+ });
63
+ expect(reference).toMatchSnapshot(); // log for viewing
64
+ });
65
+ it('should be able to reference by primary key', () => {
66
+ class CNCMachine extends domain_objects_1.DomainObject {
67
+ }
68
+ CNCMachine.primary = ['uuid'];
69
+ CNCMachine.unique = ['serialNumber'];
70
+ const reference = (0, buildReferenceTo_1.buildReferenceTo)(CNCMachine, {
71
+ uuid: '__UUID__',
72
+ });
73
+ expect(reference).toEqual({
74
+ referenceOf: 'CNCMachine',
75
+ identifiedBy: {
76
+ key: 'PRIMARY_KEY',
77
+ value: { uuid: '__UUID__' },
78
+ },
79
+ });
80
+ expect(reference).toMatchSnapshot(); // log for viewing
81
+ });
82
+ it('should reference by unique key if both are available', () => {
83
+ class CNCMachine extends domain_objects_1.DomainObject {
84
+ }
85
+ CNCMachine.primary = ['uuid'];
86
+ CNCMachine.unique = ['serialNumber'];
87
+ const reference = (0, buildReferenceTo_1.buildReferenceTo)(CNCMachine, new CNCMachine({
88
+ uuid: 'de0e34ca-ce61-4884-ace5-093a1a32ff92',
89
+ serialNumber: '821',
90
+ size: 'big',
91
+ location: 'basement',
92
+ }));
93
+ expect(reference).toEqual({
94
+ referenceOf: 'CNCMachine',
95
+ identifiedBy: {
96
+ key: 'UNIQUE_KEY',
97
+ value: { serialNumber: '821' },
98
+ },
99
+ });
100
+ expect(reference).toMatchSnapshot(); // log for viewing
101
+ });
102
+ it('should be able to instantiate with more specific reference class if one exists', () => {
103
+ class CNCMachine extends domain_objects_1.DomainObject {
104
+ }
105
+ CNCMachine.primary = ['uuid'];
106
+ CNCMachine.unique = ['serialNumber'];
107
+ class CNCMachineReference extends DeclaredResourceReference_1.DeclaredResourceReference {
108
+ }
109
+ const reference = (0, buildReferenceTo_1.buildReferenceTo)(CNCMachine, new CNCMachine({
110
+ uuid: 'de0e34ca-ce61-4884-ace5-093a1a32ff92',
111
+ serialNumber: '821',
112
+ size: 'big',
113
+ location: 'basement',
114
+ }), CNCMachineReference);
115
+ expect(reference).toBeInstanceOf(CNCMachineReference);
116
+ expect(reference).toMatchSnapshot(); // log for viewing
117
+ });
118
+ });
119
+ //# sourceMappingURL=buildReferenceTo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildReferenceTo.test.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/buildReferenceTo.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { DomainObject } from 'domain-objects';
2
+ /**
3
+ * build the unique key of the resource
4
+ */
5
+ export declare const buildUniqueKeyTo: <T extends DomainObject<any>, C extends new (props: T) => T, U extends keyof T, K extends Partial<T> | Required<Pick<T, U>>>(to: C, using: K) => Required<Pick<T, U>>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildUniqueKeyTo = void 0;
4
+ const buildReferenceTo_1 = require("./buildReferenceTo");
5
+ const defineReferenceKeyConstituentsOf_1 = require("./defineReferenceKeyConstituentsOf");
6
+ /**
7
+ * build the unique key of the resource
8
+ */
9
+ const buildUniqueKeyTo = (
10
+ /**
11
+ * the class this is a reference to
12
+ */
13
+ to,
14
+ /**
15
+ * the data to build the reference with
16
+ */
17
+ using) => {
18
+ const referenceOf = to;
19
+ const referenceInput = using;
20
+ // get the unique key defs for the class
21
+ const { unique } = (0, defineReferenceKeyConstituentsOf_1.defineReferenceKeyConstituentsOf)({
22
+ class: referenceOf,
23
+ });
24
+ // assert that the resource has a unique key defined on it
25
+ const hasUniqueKey = unique.every((key) => key in referenceInput);
26
+ if (!hasUniqueKey)
27
+ throw new buildReferenceTo_1.CanNotBuildReferenceError({
28
+ referenceOf,
29
+ referenceInput,
30
+ reason: 'the unique key is not present in the reference input',
31
+ });
32
+ // extract the unique key value
33
+ const uniqueKey = unique.reduce((summary, thisKeyKey) => {
34
+ const thisKeyValue = referenceInput[thisKeyKey];
35
+ return { ...summary, [thisKeyKey]: thisKeyValue };
36
+ }, {});
37
+ return uniqueKey;
38
+ };
39
+ exports.buildUniqueKeyTo = buildUniqueKeyTo;
40
+ //# sourceMappingURL=buildUniqueKeyTo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildUniqueKeyTo.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/buildUniqueKeyTo.ts"],"names":[],"mappings":";;;AAEA,yDAA+D;AAC/D,yFAAsF;AAEtF;;GAEG;AACI,MAAM,gBAAgB,GAAG;AAkB9B;;GAEG;AACH,EAAK;AAEL;;GAEG;AACH,KAAQ,EACc,EAAE;IACxB,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,MAAM,cAAc,GAAG,KAAK,CAAC;IAE7B,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,mEAAgC,EAAC;QAClD,KAAK,EAAE,WAAW;KACnB,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IAClE,IAAI,CAAC,YAAY;QACf,MAAM,IAAI,4CAAyB,CAAC;YAClC,WAAW;YACX,cAAc;YACd,MAAM,EAAE,sDAAsD;SAC/D,CAAC,CAAC;IAEL,+BAA+B;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE;QACtD,MAAM,YAAY,GAChB,cAAc,CAAC,UAAyC,CAAC,CAAC;QAC5D,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IACpD,CAAC,EAAE,EAA0B,CAAC,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AApDW,QAAA,gBAAgB,oBAoD3B"}
@@ -0,0 +1,5 @@
1
+ import { DomainObject } from 'domain-objects';
2
+ import { DeclaredResourceReference } from '../../../domain/DeclaredResourceReference';
3
+ export declare const defineReferenceClassOf: <T extends DomainObject<any>, C extends new (props: T) => T, P extends keyof T, U extends keyof T>({ class: ofClass, }: {
4
+ class: C;
5
+ }) => (new (props: DeclaredResourceReference<T, P, U>) => DeclaredResourceReference<T, P, U>) | null;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineReferenceClassOf = void 0;
4
+ const type_fns_1 = require("type-fns");
5
+ const DeclaredResourceReference_1 = require("../../../domain/DeclaredResourceReference");
6
+ const defineReferenceKeyConstituentsOf_1 = require("./defineReferenceKeyConstituentsOf");
7
+ const defineReferenceClassOf = ({ class: ofClass, }) => {
8
+ // grab the reference spec, if any
9
+ const referenceSpec = ofClass.reference;
10
+ if (!referenceSpec)
11
+ return null;
12
+ // if its a function, call it to get the reference spec
13
+ const referenceSpecResolved = (0, type_fns_1.isAFunction)(referenceSpec)
14
+ ? referenceSpec()
15
+ : referenceSpec;
16
+ // assert that the reference spec is a valid reference spec
17
+ if (!(referenceSpecResolved.prototype instanceof DeclaredResourceReference_1.DeclaredResourceReference))
18
+ throw new defineReferenceKeyConstituentsOf_1.CanNotReferenceDeclaredResourceClassError({
19
+ class: ofClass,
20
+ reason: `${ofClass.name}.reference was defined but not as an instance of DeclaredResourceReference`,
21
+ });
22
+ return referenceSpecResolved;
23
+ };
24
+ exports.defineReferenceClassOf = defineReferenceClassOf;
25
+ //# sourceMappingURL=defineReferenceClassOf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineReferenceClassOf.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/defineReferenceClassOf.ts"],"names":[],"mappings":";;;AACA,uCAAuC;AAEvC,yFAAsF;AACtF,yFAA+F;AAExF,MAAM,sBAAsB,GAAG,CAiBpC,EACA,KAAK,EAAE,OAAO,GAGf,EAIQ,EAAE;IACT,kCAAkC;IAClC,MAAM,aAAa,GAAI,OAAe,CAAC,SAAS,CAAC;IACjD,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEhC,uDAAuD;IACvD,MAAM,qBAAqB,GAAG,IAAA,sBAAW,EAAC,aAAa,CAAC;QACtD,CAAC,CAAC,aAAa,EAAE;QACjB,CAAC,CAAC,aAAa,CAAC;IAElB,2DAA2D;IAC3D,IAAI,CAAC,CAAC,qBAAqB,CAAC,SAAS,YAAY,qDAAyB,CAAC;QACzE,MAAM,IAAI,4EAAyC,CAAC;YAClD,KAAK,EAAE,OAAqC;YAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,4EAA4E;SACpG,CAAC,CAAC;IAEL,OAAO,qBAAqB,CAAC;AAC/B,CAAC,CAAC;AA3CW,QAAA,sBAAsB,0BA2CjC"}
@@ -0,0 +1,13 @@
1
+ import { DomainObject } from 'domain-objects';
2
+ export declare class CanNotReferenceDeclaredResourceClassError extends Error {
3
+ constructor({ class: ofClass, reason, }: {
4
+ class: typeof DomainObject;
5
+ reason: string;
6
+ });
7
+ }
8
+ export declare const defineReferenceKeyConstituentsOf: ({ class: ofClass, }: {
9
+ class: any;
10
+ }) => {
11
+ primary: string[];
12
+ unique: string[];
13
+ };
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineReferenceKeyConstituentsOf = exports.CanNotReferenceDeclaredResourceClassError = void 0;
4
+ class CanNotReferenceDeclaredResourceClassError extends Error {
5
+ constructor({ class: ofClass, reason, }) {
6
+ super(`
7
+ Can not reference declared resource of class '${ofClass.name}'. Instances of the class '${ofClass.name}' can not be referenced because ${reason}.
8
+ `.trim());
9
+ }
10
+ }
11
+ exports.CanNotReferenceDeclaredResourceClassError = CanNotReferenceDeclaredResourceClassError;
12
+ const isArrayOfStrings = (value) => {
13
+ if (!value)
14
+ return false;
15
+ if (!Array.isArray(value))
16
+ return false;
17
+ return value.every((element) => typeof element === 'string');
18
+ };
19
+ const defineReferenceKeyConstituentsOf = ({ class: ofClass, }) => {
20
+ if (!isArrayOfStrings(ofClass.primary))
21
+ throw new CanNotReferenceDeclaredResourceClassError({
22
+ class: ofClass,
23
+ reason: `the static property 'primary' was not defined as an array of strings`,
24
+ });
25
+ if (!isArrayOfStrings(ofClass.unique))
26
+ throw new CanNotReferenceDeclaredResourceClassError({
27
+ class: ofClass,
28
+ reason: `the static property 'unique' was not defined as an array of strings`,
29
+ });
30
+ return {
31
+ primary: ofClass.primary,
32
+ unique: ofClass.unique,
33
+ };
34
+ };
35
+ exports.defineReferenceKeyConstituentsOf = defineReferenceKeyConstituentsOf;
36
+ //# sourceMappingURL=defineReferenceKeyConstituentsOf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineReferenceKeyConstituentsOf.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/defineReferenceKeyConstituentsOf.ts"],"names":[],"mappings":";;;AAEA,MAAa,yCAA0C,SAAQ,KAAK;IAClE,YAAY,EACV,KAAK,EAAE,OAAO,EACd,MAAM,GAIP;QACC,KAAK,CACH;gDAC0C,OAAO,CAAC,IAAI,8BAA8B,OAAO,CAAC,IAAI,mCAAmC,MAAM;KAC1I,CAAC,IAAI,EAAE,CACP,CAAC;IACJ,CAAC;CACF;AAdD,8FAcC;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAU,EAAqB,EAAE;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEK,MAAM,gCAAgC,GAAG,CAAC,EAC/C,KAAK,EAAE,OAAO,GAGf,EAAE,EAAE;IACH,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;QACpC,MAAM,IAAI,yCAAyC,CAAC;YAClD,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,sEAAsE;SAC/E,CAAC,CAAC;IACL,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,IAAI,yCAAyC,CAAC;YAClD,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,qEAAqE;SAC9E,CAAC,CAAC;IACL,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAmB;QACpC,MAAM,EAAE,OAAO,CAAC,MAAkB;KACnC,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,gCAAgC,oCAmB3C"}
@@ -0,0 +1,15 @@
1
+ import { VisualogicContext } from 'visualogic';
2
+ import { DeclaredResource } from '../../../domain/DeclaredResource';
3
+ import { DeclaredResourceReference } from '../../../domain/DeclaredResourceReference';
4
+ import { DeclastructContext } from '../../../domain/DeclastructContext';
5
+ export declare class InvalidReferenceError extends Error {
6
+ constructor({ reference, }: {
7
+ reference: DeclaredResourceReference<any, any, any>;
8
+ });
9
+ }
10
+ /**
11
+ * resolves references into the referenced resource
12
+ */
13
+ export declare const getByReference: <T extends DeclaredResource, P extends keyof T, U extends keyof T>({ reference, }: {
14
+ reference: DeclaredResourceReference<T, P, U>;
15
+ }, context: DeclastructContext & VisualogicContext) => Promise<Required<T> | null>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getByReference = exports.InvalidReferenceError = void 0;
4
+ const error_fns_1 = require("@ehmpathy/error-fns");
5
+ const domain_objects_1 = require("domain-objects");
6
+ const simple_in_memory_cache_1 = require("simple-in-memory-cache");
7
+ const with_simple_caching_1 = require("with-simple-caching");
8
+ const DeclaredResourceReference_1 = require("../../../domain/DeclaredResourceReference");
9
+ const getByReferencedPrimaryKey_1 = require("./getByReferencedPrimaryKey");
10
+ const getByReferencedUniqueKey_1 = require("./getByReferencedUniqueKey");
11
+ class InvalidReferenceError extends Error {
12
+ constructor({ reference, }) {
13
+ super(`Invalid reference of '${reference.referenceOf}' detected. Could not find an instance identified by ${JSON.stringify(reference.identifiedBy)}`);
14
+ }
15
+ }
16
+ exports.InvalidReferenceError = InvalidReferenceError;
17
+ /**
18
+ * resolves references into the referenced resource
19
+ */
20
+ exports.getByReference = (0, with_simple_caching_1.withSimpleCaching)(
21
+ // withLogTrail(
22
+ async ({ reference, }, context) => {
23
+ // if reference is by primary key, lookup the resource by primary key
24
+ if (reference.identifiedBy.key ===
25
+ DeclaredResourceReference_1.DeclaredResourceReferenceKeyType.PRIMARY_KEY) {
26
+ return await (0, getByReferencedPrimaryKey_1.getByReferencedPrimaryKey)({
27
+ referenceOf: reference.referenceOf,
28
+ primaryKey: reference.identifiedBy.value,
29
+ }, context);
30
+ }
31
+ // if reference is by primary key, lookup the resource by primary key
32
+ if (reference.identifiedBy.key === DeclaredResourceReference_1.DeclaredResourceReferenceKeyType.UNIQUE_KEY) {
33
+ return await (0, getByReferencedUniqueKey_1.getByReferencedUniqueKey)({
34
+ referenceOf: reference.referenceOf,
35
+ uniqueKey: reference.identifiedBy.value,
36
+ }, context);
37
+ }
38
+ // otherwise, resource reference was declared incorrectly. this should not happen due to types
39
+ throw new error_fns_1.UnexpectedCodePathError('invalid resource reference declaration', {
40
+ reference,
41
+ });
42
+ },
43
+ // {
44
+ // name: getResourceNameFromFileName(__filename),
45
+ // },
46
+ // ),
47
+ {
48
+ cache: (0, simple_in_memory_cache_1.createCache)({
49
+ expiration: { seconds: 60 }, // cache up to 60 sec. no operation will both .get, .set, and .get again (read-after-write) within 60 sec
50
+ }),
51
+ serialize: {
52
+ key: ({ forInput }) => (0, domain_objects_1.serialize)(forInput[0]), // omit the context
53
+ },
54
+ });
55
+ //# sourceMappingURL=getByReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getByReference.js","sourceRoot":"","sources":["../../../../src/logic/tools/reference/getByReference.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAC9D,mDAA2C;AAC3C,mEAAqD;AAErD,6DAAwD;AAGxD,yFAGmD;AAEnD,2EAAwE;AACxE,yEAAsE;AAEtE,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,EACV,SAAS,GAGV;QACC,KAAK,CACH,yBACE,SAAS,CAAC,WACZ,wDAAwD,IAAI,CAAC,SAAS,CACpE,SAAS,CAAC,YAAY,CACvB,EAAE,CACJ,CAAC;IACJ,CAAC;CACF;AAdD,sDAcC;AAED;;GAEG;AACU,QAAA,cAAc,GAAG,IAAA,uCAAiB;AAC7C,gBAAgB;AAChB,KAAK,EACH,EACE,SAAS,GAGV,EACD,OAA+C,EAClB,EAAE;IAC/B,qEAAqE;IACrE,IACE,SAAS,CAAC,YAAY,CAAC,GAAG;QAC1B,4DAAgC,CAAC,WAAW,EAC5C,CAAC;QACD,OAAO,MAAM,IAAA,qDAAyB,EACpC;YACE,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK;SACzC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,IACE,SAAS,CAAC,YAAY,CAAC,GAAG,KAAK,4DAAgC,CAAC,UAAU,EAC1E,CAAC;QACD,OAAO,MAAM,IAAA,mDAAwB,EACnC;YACE,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK;SACxC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,8FAA8F;IAC9F,MAAM,IAAI,mCAAuB,CAC/B,wCAAwC,EACxC;QACE,SAAS;KACV,CACF,CAAC;AACJ,CAAC;AACD,IAAI;AACJ,mDAAmD;AACnD,KAAK;AACL,KAAK;AACL;IACE,KAAK,EAAE,IAAA,oCAAW,EAAC;QACjB,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,yGAAyG;KACvI,CAAC;IACF,SAAS,EAAE;QACT,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAA,0BAAS,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB;KACnE;CACF,CACF,CAAC"}