@openhi/constructs 0.0.111 → 0.0.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/lib/chunk-23PUSHBV.mjs +24 -0
  2. package/lib/chunk-23PUSHBV.mjs.map +1 -0
  3. package/lib/{chunk-7FUAMZOF.mjs → chunk-53OHXLIL.mjs} +3 -3
  4. package/lib/chunk-6NBGYGFL.mjs +1803 -0
  5. package/lib/chunk-6NBGYGFL.mjs.map +1 -0
  6. package/lib/chunk-7RZHFI77.mjs +22 -0
  7. package/lib/chunk-7RZHFI77.mjs.map +1 -0
  8. package/lib/{chunk-7Q2IJ2J5.mjs → chunk-CUUKXDB2.mjs} +6 -6
  9. package/lib/chunk-FYHBHHWK.mjs +47 -0
  10. package/lib/chunk-FYHBHHWK.mjs.map +1 -0
  11. package/lib/{chunk-MULKGFIJ.mjs → chunk-GBDIGTNV.mjs} +165 -10
  12. package/lib/chunk-GBDIGTNV.mjs.map +1 -0
  13. package/lib/chunk-HQ67J7BP.mjs +199 -0
  14. package/lib/chunk-HQ67J7BP.mjs.map +1 -0
  15. package/lib/{chunk-AJ3G3THO.mjs → chunk-KO64HPWQ.mjs} +2 -2
  16. package/lib/{chunk-BB5MK4L3.mjs → chunk-KSFC72TT.mjs} +3 -3
  17. package/lib/{chunk-2TPJ6HOF.mjs → chunk-NZRW7ROK.mjs} +72 -54
  18. package/lib/chunk-NZRW7ROK.mjs.map +1 -0
  19. package/lib/chunk-QJDHVMKT.mjs +117 -0
  20. package/lib/chunk-QJDHVMKT.mjs.map +1 -0
  21. package/lib/{chunk-IS4VQRI4.mjs → chunk-QMBJ4VHC.mjs} +12 -47
  22. package/lib/chunk-QMBJ4VHC.mjs.map +1 -0
  23. package/lib/chunk-TRY7JGWO.mjs +16 -0
  24. package/lib/chunk-TRY7JGWO.mjs.map +1 -0
  25. package/lib/chunk-W4KR4CSL.mjs +236 -0
  26. package/lib/chunk-W4KR4CSL.mjs.map +1 -0
  27. package/lib/{chunk-AGF3RAAZ.mjs → chunk-WPCBVDFZ.mjs} +2 -2
  28. package/lib/chunk-WQWFVEVX.mjs +66 -0
  29. package/lib/chunk-WQWFVEVX.mjs.map +1 -0
  30. package/lib/{chunk-SYBADQXI.mjs → chunk-ZM4GDHHC.mjs} +77 -2
  31. package/lib/chunk-ZM4GDHHC.mjs.map +1 -0
  32. package/lib/delete-chunk.handler.d.mts +29 -0
  33. package/lib/delete-chunk.handler.d.ts +29 -0
  34. package/lib/delete-chunk.handler.js +2716 -0
  35. package/lib/delete-chunk.handler.js.map +1 -0
  36. package/lib/delete-chunk.handler.mjs +47 -0
  37. package/lib/delete-chunk.handler.mjs.map +1 -0
  38. package/lib/events-CjS-sm0W.d.mts +107 -0
  39. package/lib/events-CjS-sm0W.d.ts +107 -0
  40. package/lib/events-Da_cFgtc.d.mts +208 -0
  41. package/lib/events-Da_cFgtc.d.ts +208 -0
  42. package/lib/finalize.handler.d.mts +35 -0
  43. package/lib/finalize.handler.d.ts +35 -0
  44. package/lib/finalize.handler.js +875 -0
  45. package/lib/finalize.handler.js.map +1 -0
  46. package/lib/finalize.handler.mjs +166 -0
  47. package/lib/finalize.handler.mjs.map +1 -0
  48. package/lib/index.d.mts +189 -2
  49. package/lib/index.d.ts +500 -3
  50. package/lib/index.js +1753 -174
  51. package/lib/index.js.map +1 -1
  52. package/lib/index.mjs +571 -17
  53. package/lib/index.mjs.map +1 -1
  54. package/lib/list-chunks.handler.d.mts +28 -0
  55. package/lib/list-chunks.handler.d.ts +28 -0
  56. package/lib/list-chunks.handler.js +2746 -0
  57. package/lib/list-chunks.handler.js.map +1 -0
  58. package/lib/list-chunks.handler.mjs +54 -0
  59. package/lib/list-chunks.handler.mjs.map +1 -0
  60. package/lib/platform-deploy-bridge.handler.js +76 -1
  61. package/lib/platform-deploy-bridge.handler.js.map +1 -1
  62. package/lib/platform-deploy-bridge.handler.mjs +1 -1
  63. package/lib/pre-token-generation.handler.js +1106 -155
  64. package/lib/pre-token-generation.handler.js.map +1 -1
  65. package/lib/pre-token-generation.handler.mjs +6 -4
  66. package/lib/pre-token-generation.handler.mjs.map +1 -1
  67. package/lib/provision-default-workspace.handler.js +1529 -142
  68. package/lib/provision-default-workspace.handler.js.map +1 -1
  69. package/lib/provision-default-workspace.handler.mjs +8 -4
  70. package/lib/provision-default-workspace.handler.mjs.map +1 -1
  71. package/lib/rename-finalize.handler.d.mts +30 -0
  72. package/lib/rename-finalize.handler.d.ts +30 -0
  73. package/lib/rename-finalize.handler.js +795 -0
  74. package/lib/rename-finalize.handler.js.map +1 -0
  75. package/lib/rename-finalize.handler.mjs +90 -0
  76. package/lib/rename-finalize.handler.mjs.map +1 -0
  77. package/lib/rename-list-targets.handler.d.mts +26 -0
  78. package/lib/rename-list-targets.handler.d.ts +26 -0
  79. package/lib/rename-list-targets.handler.js +2985 -0
  80. package/lib/rename-list-targets.handler.js.map +1 -0
  81. package/lib/rename-list-targets.handler.mjs +431 -0
  82. package/lib/rename-list-targets.handler.mjs.map +1 -0
  83. package/lib/rename-rewrite-chunk.handler.d.mts +35 -0
  84. package/lib/rename-rewrite-chunk.handler.d.ts +35 -0
  85. package/lib/rename-rewrite-chunk.handler.js +2021 -0
  86. package/lib/rename-rewrite-chunk.handler.js.map +1 -0
  87. package/lib/rename-rewrite-chunk.handler.mjs +27 -0
  88. package/lib/rename-rewrite-chunk.handler.mjs.map +1 -0
  89. package/lib/rest-api-lambda.handler.js +4021 -932
  90. package/lib/rest-api-lambda.handler.js.map +1 -1
  91. package/lib/rest-api-lambda.handler.mjs +1786 -80
  92. package/lib/rest-api-lambda.handler.mjs.map +1 -1
  93. package/lib/seed-demo-data.handler.js +1588 -124
  94. package/lib/seed-demo-data.handler.js.map +1 -1
  95. package/lib/seed-demo-data.handler.mjs +10 -6
  96. package/lib/seed-system-data.handler.js +1179 -155
  97. package/lib/seed-system-data.handler.js.map +1 -1
  98. package/lib/seed-system-data.handler.mjs +5 -4
  99. package/lib/seed-system-data.handler.mjs.map +1 -1
  100. package/package.json +3 -3
  101. package/lib/chunk-2TPJ6HOF.mjs.map +0 -1
  102. package/lib/chunk-IS4VQRI4.mjs.map +0 -1
  103. package/lib/chunk-MULKGFIJ.mjs.map +0 -1
  104. package/lib/chunk-QR5JVSCF.mjs +0 -862
  105. package/lib/chunk-QR5JVSCF.mjs.map +0 -1
  106. package/lib/chunk-SYBADQXI.mjs.map +0 -1
  107. /package/lib/{chunk-7FUAMZOF.mjs.map → chunk-53OHXLIL.mjs.map} +0 -0
  108. /package/lib/{chunk-7Q2IJ2J5.mjs.map → chunk-CUUKXDB2.mjs.map} +0 -0
  109. /package/lib/{chunk-AJ3G3THO.mjs.map → chunk-KO64HPWQ.mjs.map} +0 -0
  110. /package/lib/{chunk-BB5MK4L3.mjs.map → chunk-KSFC72TT.mjs.map} +0 -0
  111. /package/lib/{chunk-AGF3RAAZ.mjs.map → chunk-WPCBVDFZ.mjs.map} +0 -0
@@ -3,16 +3,20 @@ import {
3
3
  createRoleAssignmentOperation,
4
4
  createTenantOperation,
5
5
  createWorkspaceOperation
6
- } from "./chunk-MULKGFIJ.mjs";
6
+ } from "./chunk-GBDIGTNV.mjs";
7
+ import "./chunk-HQ67J7BP.mjs";
8
+ import "./chunk-QJDHVMKT.mjs";
7
9
  import {
8
10
  findUserBySubOperation,
9
11
  idFromReference,
10
12
  parseUserResource
11
- } from "./chunk-2TPJ6HOF.mjs";
12
- import "./chunk-IS4VQRI4.mjs";
13
+ } from "./chunk-NZRW7ROK.mjs";
14
+ import "./chunk-QMBJ4VHC.mjs";
15
+ import "./chunk-FYHBHHWK.mjs";
13
16
  import {
14
17
  getDynamoControlService
15
- } from "./chunk-QR5JVSCF.mjs";
18
+ } from "./chunk-6NBGYGFL.mjs";
19
+ import "./chunk-TRY7JGWO.mjs";
16
20
  import "./chunk-LZOMFHX3.mjs";
17
21
 
18
22
  // src/workflows/control-plane/user-onboarding/provision-default-workspace.handler.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/workflows/control-plane/user-onboarding/provision-default-workspace.handler.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { extractSummary, type FhirResourceLike } from \"@openhi/types\";\nimport type { EventBridgeEvent } from \"aws-lambda\";\nimport {\n PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE,\n type ProvisionDefaultWorkspaceRequestedDetail,\n} from \"./events\";\nimport { getDynamoControlService } from \"../../../data/dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../data/openhi-context\";\nimport { createMembershipOperation } from \"../../../data/operations/control/membership/membership-create-operation\";\nimport { createRoleAssignmentOperation } from \"../../../data/operations/control/roleassignment/roleassignment-create-operation\";\nimport { createTenantOperation } from \"../../../data/operations/control/tenant/tenant-create-operation\";\nimport {\n findUserBySubOperation,\n parseUserResource,\n} from \"../../../data/operations/control/user\";\nimport { createWorkspaceOperation } from \"../../../data/operations/control/workspace/workspace-create-operation\";\nimport { idFromReference } from \"../../../data/operations/fhir-reference\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/user-onboarding/provision-default-workspace.handler.md\n *\n * EventBridge workflow handler that provisions the default control-plane\n * records for a newly confirmed Cognito user.\n */\ntype ProvisionDefaultWorkspaceEvent = EventBridgeEvent<\n typeof PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE,\n ProvisionDefaultWorkspaceRequestedDetail\n>;\n\nconst CURRENT_SK = \"CURRENT\";\nconst VID = \"1\";\n\n// Store the same compact summary shape used by control-plane entities.\nconst summaryFor = (resource: Record<string, unknown>): string => {\n return JSON.stringify(extractSummary(resource as FhirResourceLike));\n};\n\n// Make onboarding writes replay-safe by deriving deterministic record ids.\nconst stableOnboardingId = (kind: string, cognitoSub: string): string => {\n return createHash(\"sha256\")\n .update(kind)\n .update(\"\\0\")\n .update(cognitoSub)\n .digest(\"hex\")\n .slice(0, 26)\n .toUpperCase();\n};\n\nexport const handler = async (\n event: ProvisionDefaultWorkspaceEvent,\n): Promise<void> => {\n // Events without a Cognito subject cannot be tied to a stable User.\n const detail = event.detail;\n if (!detail?.cognitoSub) {\n console.warn(\n \"ProvisionDefaultWorkspace: event missing cognitoSub; skipping\",\n );\n return;\n }\n\n // If onboarding already completed, leave existing records untouched.\n // The lookup runs before tenant/workspace exist, so use a synthetic\n // placeholder context — findUserBySubOperation does not read its fields.\n const service = getDynamoControlService();\n const existingUser = await findUserBySubOperation({\n context: {\n tenantId: \"\",\n workspaceId: \"\",\n date: \"\",\n actorId: \"\",\n actorName: \"\",\n actorType: \"internal-system\",\n },\n cognitoSub: detail.cognitoSub,\n });\n const existingResource = existingUser\n ? parseUserResource(existingUser.resource)\n : undefined;\n const existingTenantId = idFromReference(\n existingResource?.currentTenant?.reference,\n \"Tenant/\",\n );\n const existingWorkspaceId = idFromReference(\n existingResource?.currentWorkspace?.reference,\n \"Workspace/\",\n );\n\n if (existingUser && existingTenantId && existingWorkspaceId) {\n return;\n }\n\n const displayName =\n detail.displayName ||\n detail.email ||\n event.resources?.[0] ||\n detail.cognitoSub;\n const userId =\n existingUser?.id ??\n detail.userId ??\n stableOnboardingId(\"user\", detail.cognitoSub);\n const tenantId = stableOnboardingId(\"tenant\", detail.cognitoSub);\n const workspaceId = stableOnboardingId(\"workspace\", detail.cognitoSub);\n const userTenantMembershipId = stableOnboardingId(\n \"tenant-membership\",\n detail.cognitoSub,\n );\n const userWorkspaceMembershipId = stableOnboardingId(\n \"workspace-membership\",\n detail.cognitoSub,\n );\n const roleAssignmentId = stableOnboardingId(\n \"tenant-user-role-assignment\",\n detail.cognitoSub,\n );\n\n const lastUpdated = new Date().toISOString();\n\n // Synthesized OpenHI context for internal-system writes during onboarding.\n const context: OpenHiContext = {\n tenantId,\n workspaceId,\n date: lastUpdated,\n actorId: userId,\n actorName: displayName,\n actorType: \"internal-system\",\n };\n\n const tenantResource = {\n id: tenantId,\n displayName: `${displayName}'s Practice`,\n status: \"active\",\n };\n const workspaceResource = {\n id: workspaceId,\n displayName: \"Default Workspace\",\n status: \"active\",\n tenant: { reference: `Tenant/${tenantId}` },\n };\n const userResource = {\n ...(existingResource ?? {}),\n resourceType: \"User\",\n id: userId,\n name: existingResource?.name ?? [{ text: displayName }],\n status: \"active\",\n currentTenant: { reference: `Tenant/${tenantId}` },\n currentWorkspace: { reference: `Workspace/${workspaceId}` },\n };\n const userTenantMembershipResource = {\n id: userTenantMembershipId,\n status: \"active\",\n user: { reference: `User/${userId}` },\n tenant: { reference: `Tenant/${tenantId}` },\n };\n const userWorkspaceMembershipResource = {\n id: userWorkspaceMembershipId,\n status: \"active\",\n user: { reference: `User/${userId}` },\n tenant: { reference: `Tenant/${tenantId}` },\n workspace: { reference: `Workspace/${workspaceId}` },\n };\n const roleAssignmentResource = {\n id: roleAssignmentId,\n status: \"active\",\n user: { reference: `User/${userId}` },\n tenant: { reference: `Tenant/${tenantId}` },\n role: \"tenant-user\",\n };\n\n await createTenantOperation({\n context,\n body: { id: tenantId, resource: tenantResource },\n });\n\n await createWorkspaceOperation({\n context,\n body: { id: workspaceId, resource: workspaceResource },\n });\n\n // Direct User put/patch: no User operation supports the cognitoSub set or\n // partial-repair flow yet, so onboarding writes the User record inline.\n if (existingUser) {\n await service.entities.user\n .patch({ id: userId, sk: CURRENT_SK })\n .set({\n resource: JSON.stringify(userResource),\n summary: summaryFor(userResource),\n cognitoSub: detail.cognitoSub,\n vid: VID,\n lastUpdated,\n })\n .go();\n } else {\n await service.entities.user\n .put({\n id: userId,\n cognitoSub: detail.cognitoSub,\n resource: JSON.stringify(userResource),\n summary: summaryFor(userResource),\n vid: VID,\n lastUpdated,\n })\n .go();\n }\n\n await createMembershipOperation({\n context,\n body: {\n id: userTenantMembershipId,\n resource: userTenantMembershipResource,\n },\n });\n\n await createMembershipOperation({\n context,\n body: {\n id: userWorkspaceMembershipId,\n resource: userWorkspaceMembershipResource,\n },\n });\n\n await createRoleAssignmentOperation({\n context,\n body: { id: roleAssignmentId, resource: roleAssignmentResource },\n });\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/workflows/control-plane/user-onboarding/provision-default-workspace.handler.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { extractSummary, type FhirResourceLike } from \"@openhi/types\";\nimport type { EventBridgeEvent } from \"aws-lambda\";\nimport {\n PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE,\n type ProvisionDefaultWorkspaceRequestedDetail,\n} from \"./events\";\nimport { getDynamoControlService } from \"../../../data/dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../data/openhi-context\";\nimport { createMembershipOperation } from \"../../../data/operations/control/membership/membership-create-operation\";\nimport { createRoleAssignmentOperation } from \"../../../data/operations/control/roleassignment/roleassignment-create-operation\";\nimport { createTenantOperation } from \"../../../data/operations/control/tenant/tenant-create-operation\";\nimport {\n findUserBySubOperation,\n parseUserResource,\n} from \"../../../data/operations/control/user\";\nimport { createWorkspaceOperation } from \"../../../data/operations/control/workspace/workspace-create-operation\";\nimport { idFromReference } from \"../../../data/operations/fhir-reference\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/user-onboarding/provision-default-workspace.handler.md\n *\n * EventBridge workflow handler that provisions the default control-plane\n * records for a newly confirmed Cognito user.\n */\ntype ProvisionDefaultWorkspaceEvent = EventBridgeEvent<\n typeof PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE,\n ProvisionDefaultWorkspaceRequestedDetail\n>;\n\nconst CURRENT_SK = \"CURRENT\";\nconst VID = \"1\";\n\n// Store the same compact summary shape used by control-plane entities.\nconst summaryFor = (resource: Record<string, unknown>): string => {\n return JSON.stringify(extractSummary(resource as FhirResourceLike));\n};\n\n// Make onboarding writes replay-safe by deriving deterministic record ids.\nconst stableOnboardingId = (kind: string, cognitoSub: string): string => {\n return createHash(\"sha256\")\n .update(kind)\n .update(\"\\0\")\n .update(cognitoSub)\n .digest(\"hex\")\n .slice(0, 26)\n .toUpperCase();\n};\n\nexport const handler = async (\n event: ProvisionDefaultWorkspaceEvent,\n): Promise<void> => {\n // Events without a Cognito subject cannot be tied to a stable User.\n const detail = event.detail;\n if (!detail?.cognitoSub) {\n console.warn(\n \"ProvisionDefaultWorkspace: event missing cognitoSub; skipping\",\n );\n return;\n }\n\n // If onboarding already completed, leave existing records untouched.\n // The lookup runs before tenant/workspace exist, so use a synthetic\n // placeholder context — findUserBySubOperation does not read its fields.\n const service = getDynamoControlService();\n const existingUser = await findUserBySubOperation({\n context: {\n tenantId: \"\",\n workspaceId: \"\",\n date: \"\",\n actorId: \"\",\n actorName: \"\",\n actorType: \"internal-system\",\n },\n cognitoSub: detail.cognitoSub,\n });\n const existingResource = existingUser\n ? parseUserResource(existingUser.resource)\n : undefined;\n const existingTenantId = idFromReference(\n existingResource?.currentTenant?.reference,\n \"Tenant/\",\n );\n const existingWorkspaceId = idFromReference(\n existingResource?.currentWorkspace?.reference,\n \"Workspace/\",\n );\n\n if (existingUser && existingTenantId && existingWorkspaceId) {\n return;\n }\n\n const displayName =\n detail.displayName ||\n detail.email ||\n event.resources?.[0] ||\n detail.cognitoSub;\n const userId =\n existingUser?.id ??\n detail.userId ??\n stableOnboardingId(\"user\", detail.cognitoSub);\n const tenantId = stableOnboardingId(\"tenant\", detail.cognitoSub);\n const workspaceId = stableOnboardingId(\"workspace\", detail.cognitoSub);\n const userTenantMembershipId = stableOnboardingId(\n \"tenant-membership\",\n detail.cognitoSub,\n );\n const userWorkspaceMembershipId = stableOnboardingId(\n \"workspace-membership\",\n detail.cognitoSub,\n );\n const roleAssignmentId = stableOnboardingId(\n \"tenant-user-role-assignment\",\n detail.cognitoSub,\n );\n\n const lastUpdated = new Date().toISOString();\n\n // Synthesized OpenHI context for internal-system writes during onboarding.\n const context: OpenHiContext = {\n tenantId,\n workspaceId,\n date: lastUpdated,\n actorId: userId,\n actorName: displayName,\n actorType: \"internal-system\",\n };\n\n const tenantResource = {\n id: tenantId,\n displayName: `${displayName}'s Practice`,\n status: \"active\",\n };\n const workspaceResource = {\n id: workspaceId,\n displayName: \"Default Workspace\",\n status: \"active\",\n tenant: { reference: `Tenant/${tenantId}` },\n };\n const userResource = {\n ...(existingResource ?? {}),\n resourceType: \"User\",\n id: userId,\n name: existingResource?.name ?? [{ text: displayName }],\n status: \"active\",\n currentTenant: { reference: `Tenant/${tenantId}` },\n currentWorkspace: { reference: `Workspace/${workspaceId}` },\n };\n const userTenantMembershipResource = {\n id: userTenantMembershipId,\n status: \"active\",\n user: { reference: `User/${userId}` },\n tenant: { reference: `Tenant/${tenantId}` },\n };\n const userWorkspaceMembershipResource = {\n id: userWorkspaceMembershipId,\n status: \"active\",\n user: { reference: `User/${userId}` },\n tenant: { reference: `Tenant/${tenantId}` },\n workspace: { reference: `Workspace/${workspaceId}` },\n };\n const roleAssignmentResource = {\n id: roleAssignmentId,\n status: \"active\",\n user: { reference: `User/${userId}` },\n tenant: { reference: `Tenant/${tenantId}` },\n role: \"tenant-user\",\n };\n\n await createTenantOperation({\n context,\n body: { id: tenantId, resource: tenantResource },\n });\n\n await createWorkspaceOperation({\n context,\n body: { id: workspaceId, resource: workspaceResource },\n });\n\n // Direct User put/patch: no User operation supports the cognitoSub set or\n // partial-repair flow yet, so onboarding writes the User record inline.\n if (existingUser) {\n await service.entities.user\n .patch({ id: userId, sk: CURRENT_SK })\n .set({\n resource: JSON.stringify(userResource),\n summary: summaryFor(userResource),\n cognitoSub: detail.cognitoSub,\n vid: VID,\n lastUpdated,\n })\n .go();\n } else {\n await service.entities.user\n .put({\n id: userId,\n cognitoSub: detail.cognitoSub,\n resource: JSON.stringify(userResource),\n summary: summaryFor(userResource),\n vid: VID,\n lastUpdated,\n })\n .go();\n }\n\n await createMembershipOperation({\n context,\n body: {\n id: userTenantMembershipId,\n resource: userTenantMembershipResource,\n },\n });\n\n await createMembershipOperation({\n context,\n body: {\n id: userWorkspaceMembershipId,\n resource: userWorkspaceMembershipResource,\n },\n });\n\n await createRoleAssignmentOperation({\n context,\n body: { id: roleAssignmentId, resource: roleAssignmentResource },\n });\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,30 @@
1
+ import { EventBridgeClient } from '@aws-sdk/client-eventbridge';
2
+ import { f as RenameCascadeFinalizeInput, g as RenameCascadeFinalizeOutput } from './events-Da_cFgtc.mjs';
3
+ export { c as RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR } from './events-Da_cFgtc.mjs';
4
+ import '@openhi/workflows';
5
+
6
+ /**
7
+ * Final step of the TR-023 rename cascade.
8
+ *
9
+ * After the Distributed Map state rewrites every affected projection
10
+ * row, this handler emits `control-plane.rename-complete.v1` on the ops
11
+ * event bus, carrying the cascade's chunk count, items rewritten, and
12
+ * duration. UI subscribers consume the event to refresh stale list
13
+ * views.
14
+ *
15
+ * Unlike the owning-delete cascade's finalize step, this handler does
16
+ * NOT touch the canonical record — the rename is a consumer that only
17
+ * rewrites projections; the canonical Tenant / User / Role row was
18
+ * already updated by the originating PUT that triggered the cascade's
19
+ * upstream `control-plane.rename.v1` event.
20
+ */
21
+
22
+ /** Test seam: per-handler-call EventBridge client + clock. */
23
+ interface FinalizeHandlerDependencies {
24
+ readonly eventBridgeClient?: EventBridgeClient;
25
+ readonly now?: () => Date;
26
+ readonly eventIdGenerator?: () => string;
27
+ }
28
+ declare const handler: (input: RenameCascadeFinalizeInput, deps?: FinalizeHandlerDependencies) => Promise<RenameCascadeFinalizeOutput>;
29
+
30
+ export { type FinalizeHandlerDependencies, handler };
@@ -0,0 +1,30 @@
1
+ import { EventBridgeClient } from '@aws-sdk/client-eventbridge';
2
+ import { f as RenameCascadeFinalizeInput, g as RenameCascadeFinalizeOutput } from './events-Da_cFgtc.js';
3
+ export { c as RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR } from './events-Da_cFgtc.js';
4
+ import '@openhi/workflows';
5
+
6
+ /**
7
+ * Final step of the TR-023 rename cascade.
8
+ *
9
+ * After the Distributed Map state rewrites every affected projection
10
+ * row, this handler emits `control-plane.rename-complete.v1` on the ops
11
+ * event bus, carrying the cascade's chunk count, items rewritten, and
12
+ * duration. UI subscribers consume the event to refresh stale list
13
+ * views.
14
+ *
15
+ * Unlike the owning-delete cascade's finalize step, this handler does
16
+ * NOT touch the canonical record — the rename is a consumer that only
17
+ * rewrites projections; the canonical Tenant / User / Role row was
18
+ * already updated by the originating PUT that triggered the cascade's
19
+ * upstream `control-plane.rename.v1` event.
20
+ */
21
+
22
+ /** Test seam: per-handler-call EventBridge client + clock. */
23
+ interface FinalizeHandlerDependencies {
24
+ readonly eventBridgeClient?: EventBridgeClient;
25
+ readonly now?: () => Date;
26
+ readonly eventIdGenerator?: () => string;
27
+ }
28
+ declare const handler: (input: RenameCascadeFinalizeInput, deps?: FinalizeHandlerDependencies) => Promise<RenameCascadeFinalizeOutput>;
29
+
30
+ export { type FinalizeHandlerDependencies, handler };