@opencrvs/toolkit 2.0.0-rc.fdc585a → 2.0.0-rc.ff04b30

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 (44) hide show
  1. package/create-countryconfig/index.js +73 -0
  2. package/create-countryconfig/package.json +11 -0
  3. package/dist/application-config/index.js +27 -28
  4. package/dist/cli.js +392 -128
  5. package/dist/commons/api/router.d.ts +3301 -247
  6. package/dist/commons/conditionals/validate.d.ts +1 -0
  7. package/dist/commons/events/ActionInput.d.ts +108 -0
  8. package/dist/commons/events/Draft.d.ts +3 -0
  9. package/dist/commons/events/EventIndex.d.ts +0 -3
  10. package/dist/commons/events/EventMetadata.d.ts +0 -7
  11. package/dist/commons/events/WorkqueueConfig.d.ts +146 -146
  12. package/dist/commons/events/locations.d.ts +21 -0
  13. package/dist/commons/events/mocks.test.utils.d.ts +19 -0
  14. package/dist/commons/events/scopes.d.ts +24 -1
  15. package/dist/commons/events/state/index.d.ts +0 -4
  16. package/dist/commons/events/state/utils.d.ts +0 -2
  17. package/dist/commons/events/utils.d.ts +1 -1
  18. package/dist/conditionals/index.js +3 -1
  19. package/dist/events/index.js +109 -76
  20. package/dist/migrations/v2.0/checkout-upstream-files.d.ts +1 -1
  21. package/dist/migrations/v2.0/checkout-upstream-files.d.ts.map +1 -1
  22. package/dist/migrations/v2.0/checkout-upstream-files.js +1 -2
  23. package/dist/migrations/v2.0/delete-infrastructure-directory.d.ts +9 -1
  24. package/dist/migrations/v2.0/delete-infrastructure-directory.d.ts.map +1 -1
  25. package/dist/migrations/v2.0/delete-infrastructure-directory.js +66 -20
  26. package/dist/migrations/v2.0/fix-accept-requested-registration-function-type.d.ts +3 -0
  27. package/dist/migrations/v2.0/fix-accept-requested-registration-function-type.d.ts.map +1 -0
  28. package/dist/migrations/v2.0/fix-accept-requested-registration-function-type.js +110 -0
  29. package/dist/migrations/v2.0/index.d.ts +5 -3
  30. package/dist/migrations/v2.0/index.d.ts.map +1 -1
  31. package/dist/migrations/v2.0/index.js +390 -126
  32. package/dist/migrations/v2.0/merge-infrastructure-directory.d.ts +11 -1
  33. package/dist/migrations/v2.0/merge-infrastructure-directory.d.ts.map +1 -1
  34. package/dist/migrations/v2.0/merge-infrastructure-directory.js +17 -16
  35. package/dist/migrations/v2.0/migrate-scopes.d.ts.map +1 -1
  36. package/dist/migrations/v2.0/migrate-scopes.js +54 -30
  37. package/dist/migrations/v2.0/migrate-workqueue-configs.d.ts.map +1 -1
  38. package/dist/migrations/v2.0/migrate-workqueue-configs.js +140 -59
  39. package/dist/notification/index.js +41 -46
  40. package/dist/scopes/index.js +3 -1
  41. package/opencrvs-toolkit-2.0.0-rc.ff04b30.tgz +0 -0
  42. package/package.json +1 -1
  43. package/tsconfig.tsbuildinfo +1 -1
  44. package/opencrvs-toolkit-2.0.0-rc.fdc585a.tgz +0 -0
@@ -302,12 +302,13 @@ __export(events_exports, {
302
302
  getActionConfig: () => getActionConfig,
303
303
  getActionReview: () => getActionReview,
304
304
  getActionReviewFields: () => getActionReviewFields,
305
+ getAdministrativeAreaHierarchy: () => getAdministrativeAreaHierarchy,
305
306
  getAllUniqueFields: () => getAllUniqueFields,
306
307
  getAnnotationFromDrafts: () => getAnnotationFromDrafts,
307
308
  getAssignedUserFromActions: () => getAssignedUserFromActions,
308
- getAssignedUserSignatureFromActions: () => getAssignedUserSignatureFromActions,
309
309
  getAssignmentStatus: () => getAssignmentStatus,
310
310
  getAvailableActionsForEvent: () => getAvailableActionsForEvent,
311
+ getAvailableRolesForUserUpdatePayload: () => getAvailableRolesForUserUpdatePayload,
311
312
  getCompleteActionAnnotation: () => getCompleteActionAnnotation,
312
313
  getCompleteActionDeclaration: () => getCompleteActionDeclaration,
313
314
  getCurrentEventState: () => getCurrentEventState,
@@ -318,6 +319,7 @@ __export(events_exports, {
318
319
  getDeclarationPages: () => getDeclarationPages,
319
320
  getEventConfigById: () => getEventConfigById,
320
321
  getFilePathsFromEvent: () => getFilePathsFromEvent,
322
+ getLocationHierarchy: () => getLocationHierarchy,
321
323
  getMixedPath: () => getMixedPath,
322
324
  getPendingAction: () => getPendingAction,
323
325
  getPrintCertificatePages: () => getPrintCertificatePages,
@@ -702,7 +704,9 @@ var decodeScope = (query) => {
702
704
  };
703
705
  var DEFAULT_SCOPE_OPTIONS = {
704
706
  placeOfEvent: JurisdictionFilter.enum.all,
705
- accessLevel: JurisdictionFilter.enum.all
707
+ accessLevel: JurisdictionFilter.enum.all,
708
+ registeredIn: JurisdictionFilter.enum.all,
709
+ declaredIn: JurisdictionFilter.enum.all
706
710
  };
707
711
  function getAcceptedScopesByType({
708
712
  acceptedScopes,
@@ -1075,7 +1079,10 @@ var ActionConditional = z7.discriminatedUnion("type", [
1075
1079
  ShowConditional,
1076
1080
  // Action can be shown to the user in the list but as disabled
1077
1081
  EnableConditional
1078
- ]);
1082
+ ]).meta({
1083
+ description: "Action conditional configuration",
1084
+ id: "ActionConditional"
1085
+ });
1079
1086
  var DisplayOnReviewConditional = z7.object({
1080
1087
  type: z7.literal(ConditionalType.DISPLAY_ON_REVIEW),
1081
1088
  conditional: Conditional
@@ -1411,28 +1418,20 @@ function schemaPriority(schema) {
1411
1418
  return idx === -1 ? 9999 : idx;
1412
1419
  }
1413
1420
  function safeUnion(schemas) {
1421
+ const sortedSchemas = [...schemas].sort(
1422
+ (a, b) => schemaPriority(a) - schemaPriority(b)
1423
+ );
1414
1424
  return z12.any().superRefine((val, ctx) => {
1415
- const successful = schemas.filter((s) => s.safeParse(val).success);
1416
- if (successful.length === 1) {
1417
- return;
1418
- }
1419
- if (successful.length === 0) {
1420
- ctx.addIssue({
1421
- code: "invalid_type",
1422
- expected: "custom",
1423
- message: "Value does not match any schema"
1424
- });
1425
- return;
1426
- }
1427
- successful.sort((a, b) => schemaPriority(a) - schemaPriority(b));
1428
- const best = successful[0];
1429
- if (!best.safeParse(val).success) {
1430
- ctx.addIssue({
1431
- expected: "custom",
1432
- code: "invalid_type",
1433
- message: "Value did not match the best schema"
1434
- });
1425
+ for (const schema of sortedSchemas) {
1426
+ if (schema.safeParse(val).success) {
1427
+ return;
1428
+ }
1435
1429
  }
1430
+ ctx.addIssue({
1431
+ code: "invalid_type",
1432
+ expected: "custom",
1433
+ message: "Value does not match any schema"
1434
+ });
1436
1435
  }).meta({
1437
1436
  description: "Value that matches exactly one of the possible schema types (TextValue, DateValue, DateRangeFieldValue). The best matching schema is chosen by priority."
1438
1437
  });
@@ -1742,6 +1741,9 @@ var FlagConfig = z15.object({
1742
1741
  "Indicates if this flag expects an action to be performed to be cleared."
1743
1742
  ),
1744
1743
  label: TranslationConfig.describe("Human readable label of the flag.")
1744
+ }).meta({
1745
+ description: "Flag configuration",
1746
+ id: "FlagConfig"
1745
1747
  });
1746
1748
  var ActionFlagConfig = z15.object({
1747
1749
  id: Flag,
@@ -1749,6 +1751,9 @@ var ActionFlagConfig = z15.object({
1749
1751
  conditional: Conditional.optional().describe(
1750
1752
  "When conditional is met, the operation is performed on the flag. If not provided, the operation is performed unconditionally."
1751
1753
  )
1754
+ }).meta({
1755
+ description: "Action flag configuration",
1756
+ id: "ActionFlagConfig"
1752
1757
  });
1753
1758
 
1754
1759
  // ../commons/src/events/EventMetadata.ts
@@ -1770,8 +1775,7 @@ var ActionCreationMetadata = z16.object({
1770
1775
  ),
1771
1776
  createdByUserType: z16.enum(["user", "system"]).nullish().describe("Whether the user is a normal user or a system."),
1772
1777
  acceptedAt: z16.iso.datetime().describe("Timestamp when the action request was accepted."),
1773
- createdByRole: z16.string().optional().describe("Role of the user at the time of action request creation."),
1774
- createdBySignature: z16.string().nullish().describe("Signature of the user who created the action request.")
1778
+ createdByRole: z16.string().optional().describe("Role of the user at the time of action request creation.")
1775
1779
  });
1776
1780
  var RegistrationCreationMetadata = ActionCreationMetadata.extend({
1777
1781
  registrationNumber: z16.string().describe(
@@ -1799,9 +1803,6 @@ var EventMetadata = z16.object({
1799
1803
  createdAtLocation: UUID.nullish().describe(
1800
1804
  "Location of the user who created the event."
1801
1805
  ),
1802
- createdBySignature: DocumentPath.nullish().describe(
1803
- "Signature of the user who created the event."
1804
- ),
1805
1806
  updatedAtLocation: UUID.nullish().describe(
1806
1807
  "Location of the user who last changed the status."
1807
1808
  ),
@@ -2176,7 +2177,7 @@ var FieldId = import_v43.default.string().superRefine((val, ctx) => {
2176
2177
  }
2177
2178
  }).describe("Unique identifier for the field");
2178
2179
  var FieldReference = import_v43.default.object({
2179
- $$field: FieldId,
2180
+ $$field: FieldId.describe("Id of the field to reference"),
2180
2181
  $$subfield: import_v43.default.array(import_v43.default.string()).optional().default([]).describe(
2181
2182
  'If the FieldValue is an object, subfield can be used to refer to e.g. `["foo", "bar"]` in `{ foo: { bar: 3 } }`'
2182
2183
  )
@@ -2889,10 +2890,10 @@ var VerificationPageConfig = FormPageConfig.extend({
2889
2890
  type: z21.literal(PageTypes.enum.VERIFICATION),
2890
2891
  actions: VerificationActionConfig
2891
2892
  });
2892
- var PageConfig = z21.discriminatedUnion("type", [
2893
- FormPageConfig,
2894
- VerificationPageConfig
2895
- ]);
2893
+ var PageConfig = z21.discriminatedUnion("type", [FormPageConfig, VerificationPageConfig]).meta({
2894
+ description: "Page configuration",
2895
+ id: "PageConfig"
2896
+ });
2896
2897
 
2897
2898
  // ../commons/src/events/FormConfig.ts
2898
2899
  var DeclarationFormConfig = z22.object({
@@ -3801,6 +3802,9 @@ function precompileActionSchemas(eventConfigurations) {
3801
3802
  function isAgeValue(value) {
3802
3803
  return typeof value === "object" && value !== null && "age" in value && typeof value.age === "number";
3803
3804
  }
3805
+ function mergeWithBaseFormState(values, context) {
3806
+ return { ...context.baseFormState, ...values };
3807
+ }
3804
3808
  function validate(schema, data) {
3805
3809
  const validator = ajv.getSchema(schema.$id) || ajv.compile(schema);
3806
3810
  if ("$form" in data) {
@@ -3839,7 +3843,7 @@ function isOnline() {
3839
3843
  }
3840
3844
  function isConditionMet(conditional, values, context, eventIndex) {
3841
3845
  return validate(conditional, {
3842
- $form: values,
3846
+ $form: mergeWithBaseFormState(values, context),
3843
3847
  $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
3844
3848
  $online: isOnline(),
3845
3849
  $user: context.user,
@@ -3868,7 +3872,7 @@ function isFieldConditionMet(field3, form, conditionalType, context) {
3868
3872
  return true;
3869
3873
  }
3870
3874
  const validConditionals = getConditionalActionsForField(field3, {
3871
- $form: form,
3875
+ $form: mergeWithBaseFormState(form, context),
3872
3876
  $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
3873
3877
  $online: isOnline(),
3874
3878
  $user: context.user,
@@ -4060,7 +4064,7 @@ function runFieldValidations({
4060
4064
  return [];
4061
4065
  }
4062
4066
  const conditionalParameters = {
4063
- $form: form,
4067
+ $form: mergeWithBaseFormState(form, context),
4064
4068
  $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
4065
4069
  /**
4066
4070
  * In real use cases, there can be hundreds of thousands of locations.
@@ -4304,17 +4308,16 @@ function isPageVisible(page, formValues, context) {
4304
4308
  }
4305
4309
  return isConditionMet(page.conditional, formValues, context);
4306
4310
  }
4307
- function omitHiddenFields(fields, formValues, validatorContext, includeHiddenFieldsWithNullValues = false, declarationContext) {
4311
+ function omitHiddenFields(fields, formValues, validatorContext, includeHiddenFieldsWithNullValues = false) {
4308
4312
  const base = (0, import_lodash.cloneDeep)(formValues);
4309
4313
  function fn(prevVisibilityContext) {
4310
- const visibilityForm = declarationContext ? { ...declarationContext, ...prevVisibilityContext } : prevVisibilityContext;
4311
4314
  const cleaned = (0, import_lodash.omitBy)(base, (value, fieldId) => {
4312
4315
  const fieldConfig = fields.filter((f) => f.id === fieldId);
4313
4316
  if (!fieldConfig.length) {
4314
4317
  return false;
4315
4318
  }
4316
4319
  const isHidden = fieldConfig.every(
4317
- (f) => !isFieldVisible(f, visibilityForm, validatorContext)
4320
+ (f) => !isFieldVisible(f, prevVisibilityContext, validatorContext)
4318
4321
  );
4319
4322
  if (!isHidden) {
4320
4323
  return false;
@@ -4332,7 +4335,7 @@ function omitHiddenPaginatedFields(formConfig, values, validatorContext, include
4332
4335
  const visibleFields = formConfig.pages.filter((p) => isPageVisible(p, values, validatorContext)).flatMap((p) => p.fields);
4333
4336
  const hiddenFields = formConfig.pages.filter((p) => !isPageVisible(p, values, validatorContext)).flatMap((p) => p.fields);
4334
4337
  const valuesExceptHiddenPage = (0, import_lodash.omitBy)(values, (_2, fieldId) => {
4335
- return hiddenFields.some((f) => f.id === fieldId);
4338
+ return hiddenFields.some((f) => f.id === fieldId) && !visibleFields.some((f) => f.id === fieldId);
4336
4339
  });
4337
4340
  return omitHiddenFields(
4338
4341
  visibleFields,
@@ -4379,13 +4382,10 @@ function getVisibleVerificationPageIds(pages, annotation, context) {
4379
4382
  }
4380
4383
  function omitHiddenAnnotationFields(actionConfig, declaration, annotation, context) {
4381
4384
  const annotationFields = getActionAnnotationFields(actionConfig);
4382
- return omitHiddenFields(
4383
- annotationFields,
4384
- annotation,
4385
- context,
4386
- false,
4387
- declaration
4388
- );
4385
+ return omitHiddenFields(annotationFields, annotation, {
4386
+ ...context,
4387
+ baseFormState: declaration
4388
+ });
4389
4389
  }
4390
4390
  function deepMerge(currentDocument, actionDocument) {
4391
4391
  const currentDocumentClone = (0, import_lodash.cloneDeep)(currentDocument);
@@ -5374,7 +5374,7 @@ var _EventConfigBase = z33.object({
5374
5374
  ),
5375
5375
  label: TranslationConfig.describe("Human-readable label for the event type."),
5376
5376
  actions: z33.array(ActionConfig).describe(
5377
- "Configuration of system-defined actions associated with the event."
5377
+ "Configuration of core and custom actions associated with the event."
5378
5378
  ),
5379
5379
  actionOrder: z33.array(z33.string()).optional().describe(
5380
5380
  "Order of actions in the action menu. Use either the action type for core actions or the customActionType for custom actions."
@@ -5386,7 +5386,7 @@ var _EventConfigBase = z33.object({
5386
5386
  "Configuration of fields available in the advanced search feature."
5387
5387
  ),
5388
5388
  flags: z33.array(FlagConfig).optional().default([]).describe(
5389
- "Configuration of flags associated with the actions of this event type."
5389
+ "Configuration of custom flags associated with the actions of this event type."
5390
5390
  ),
5391
5391
  analytics: z33.boolean().optional().default(true).describe(
5392
5392
  "Indicates whether the records of this event type are included in analytics"
@@ -5825,18 +5825,11 @@ var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
5825
5825
  query: true,
5826
5826
  columns: true
5827
5827
  });
5828
- var WorkqueueConfigInput = z37.object({
5829
- slug: z37.string().describe("Determines the url of the workqueue."),
5830
- name: TranslationConfig.describe(
5831
- "Title of the workflow (both in navigation and on the page)"
5832
- ),
5833
- query: CountryConfigQueryInputType,
5834
- action: z37.object({ type: WorkqueueActionType }).optional().describe(
5835
- "Workqueue call-to-action button configuration. This determines the quick action button shown on each event card and the action taken when the button is clicked."
5836
- ),
5837
- columns: z37.array(WorkqueueColumn).default(mandatoryColumns),
5838
- icon: AvailableIcons,
5839
- emptyMessage: TranslationConfig.optional()
5828
+ var WorkqueueConfigInput = WorkqueueConfig.extend({
5829
+ query: CountryConfigQueryInputType
5830
+ }).meta({
5831
+ description: "Workqueue configuration",
5832
+ id: "WorkqueueConfig"
5840
5833
  });
5841
5834
  function defineWorkqueue(workqueueInput) {
5842
5835
  const queryInput = workqueueInput.query;
@@ -5897,6 +5890,9 @@ var BaseActionInput = z38.object({
5897
5890
  originalActionId: UUID.optional(),
5898
5891
  // should not be part of base action.
5899
5892
  keepAssignment: z38.boolean().optional(),
5893
+ keepAssignmentIfAccepted: z38.boolean().optional(),
5894
+ keepAssignmentIfRejected: z38.boolean().optional(),
5895
+ waitFor: z38.boolean().optional(),
5900
5896
  // For normal users, the createdAtLocation is resolved on the backend from the user's primaryOfficeId.
5901
5897
  // @TODO: createdAtLocation should be limited to actions that system users can perform. For normal users, it should not be part of the base action.
5902
5898
  createdAtLocation: UUID.nullish().describe(
@@ -6150,7 +6146,6 @@ function getDeclarationActionCreationMetadata(actionType, actions) {
6150
6146
  createdAtLocation: requestAction?.createdAtLocation ?? acceptAction.createdAtLocation,
6151
6147
  acceptedAt: acceptAction.createdAt,
6152
6148
  createdByRole: requestAction?.createdByRole ?? acceptAction.createdByRole,
6153
- createdBySignature: requestAction?.createdBySignature ?? acceptAction.createdBySignature,
6154
6149
  registrationNumber
6155
6150
  };
6156
6151
  }
@@ -6364,17 +6359,6 @@ function getAssignedUserFromActions(actions) {
6364
6359
  return user2;
6365
6360
  }, null);
6366
6361
  }
6367
- function getAssignedUserSignatureFromActions(actions) {
6368
- return actions.reduce((signature, action) => {
6369
- if (action.type === ActionType.ASSIGN) {
6370
- return action.createdBySignature || null;
6371
- }
6372
- if (action.type === ActionType.UNASSIGN) {
6373
- return null;
6374
- }
6375
- return signature;
6376
- }, null);
6377
- }
6378
6362
  function deepDropNulls(obj) {
6379
6363
  if (Array.isArray(obj)) {
6380
6364
  return obj.map(deepDropNulls);
@@ -6470,10 +6454,8 @@ function getCurrentEventState(event2, config) {
6470
6454
  createdBy: creationAction.createdBy,
6471
6455
  createdByUserType: creationAction.createdByUserType,
6472
6456
  createdAtLocation: creationAction.createdAtLocation,
6473
- createdBySignature: creationAction.createdBySignature,
6474
6457
  updatedAt: acceptedActionMetadata.createdAt,
6475
6458
  assignedTo: getAssignedUserFromActions(acceptedActions),
6476
- assignedToSignature: getAssignedUserSignatureFromActions(acceptedActions),
6477
6459
  updatedBy: requestActionMetadata.createdBy,
6478
6460
  updatedAtLocation: requestActionMetadata.createdAtLocation,
6479
6461
  declaration,
@@ -9732,7 +9714,6 @@ var eventQueryDataGenerator = (overrides = {}, seed = 1) => {
9732
9714
  createdBy: overrides.createdBy ?? generateUuid(rng),
9733
9715
  createdAtLocation: overrides.createdAtLocation ?? generateUuid(rng),
9734
9716
  updatedAtLocation: overrides.updatedAtLocation ?? generateUuid(rng),
9735
- createdBySignature: overrides.createdBySignature ?? generateRandomSignature(rng),
9736
9717
  updatedAt: overrides.updatedAt ?? (0, import_date_fns4.addDays)(new Date(createdAt), 1).toISOString(),
9737
9718
  assignedTo: overrides.assignedTo ?? null,
9738
9719
  updatedBy: overrides.updatedBy ?? generateUuid(rng),
@@ -10003,6 +9984,39 @@ function userCanAccessEventWithScopes(event2, scopes, user2, customActionType) {
10003
9984
  (scope) => canAccessEventWithScope(event2, scope, user2, customActionType)
10004
9985
  );
10005
9986
  }
9987
+ function getAdministrativeAreaHierarchy(administrativeAreaId, administrativeAreas) {
9988
+ const collectedLocations = [];
9989
+ const parsedAdministrativeAreaId = administrativeAreaId && UUID.safeParse(administrativeAreaId).data;
9990
+ let current = parsedAdministrativeAreaId ? administrativeAreas.get(parsedAdministrativeAreaId) : null;
9991
+ while (current) {
9992
+ collectedLocations.push(current);
9993
+ if (!current.parentId) {
9994
+ break;
9995
+ }
9996
+ const parentId = current.parentId;
9997
+ current = administrativeAreas.get(parentId);
9998
+ }
9999
+ return collectedLocations;
10000
+ }
10001
+ function getLocationHierarchy(selectedId, context) {
10002
+ const { administrativeAreas, locations } = context;
10003
+ const loc = locations.get(selectedId);
10004
+ if (loc) {
10005
+ if (loc.administrativeAreaId) {
10006
+ const hierarchy2 = getAdministrativeAreaHierarchy(
10007
+ loc.administrativeAreaId,
10008
+ administrativeAreas
10009
+ );
10010
+ return [...hierarchy2.reverse().map((area) => area.id), loc.id];
10011
+ }
10012
+ return [loc.id];
10013
+ }
10014
+ const hierarchy = getAdministrativeAreaHierarchy(
10015
+ selectedId,
10016
+ administrativeAreas
10017
+ );
10018
+ return hierarchy.reverse().map((area) => area.id);
10019
+ }
10006
10020
 
10007
10021
  // ../commons/src/events/scopes.ts
10008
10022
  var ACTION_SCOPE_MAP = {
@@ -10077,6 +10091,25 @@ function isActionInScope({
10077
10091
  );
10078
10092
  return canAccess;
10079
10093
  }
10094
+ function getAvailableRolesForUserUpdatePayload({
10095
+ allRoles,
10096
+ userLocation,
10097
+ acceptedScopes,
10098
+ userRequesting
10099
+ }) {
10100
+ const availableRoles = allRoles.filter((role) => {
10101
+ const canAccess = canAccessOtherUserWithScopes({
10102
+ userToAccess: {
10103
+ ...userLocation,
10104
+ role
10105
+ },
10106
+ user: userRequesting,
10107
+ scopes: acceptedScopes
10108
+ });
10109
+ return canAccess;
10110
+ });
10111
+ return availableRoles;
10112
+ }
10080
10113
 
10081
10114
  // ../commons/src/events/serializers/user/deserializer.ts
10082
10115
  function userDeserializer(serializedUserField, user2) {
@@ -1,5 +1,5 @@
1
1
  export declare const UPSTREAM_URL = "https://github.com/opencrvs/opencrvs-countryconfig.git";
2
- export declare const UPSTREAM_BRANCH = "develop";
2
+ export declare const UPSTREAM_BRANCH = "release-v2.0.0";
3
3
  /**
4
4
  * Runs a git command in the country config working directory.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"checkout-upstream-files.d.ts","sourceRoot":"","sources":["../../../src/migrations/v2.0/checkout-upstream-files.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,YAAY,2DACiC,CAAA;AAG1D,eAAO,MAAM,eAAe,YAAY,CAAA;AAcxC;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,MAAc,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAO9C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAID,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDnC;AAED,OAAO,EAAE,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"checkout-upstream-files.d.ts","sourceRoot":"","sources":["../../../src/migrations/v2.0/checkout-upstream-files.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,YAAY,2DACiC,CAAA;AAE1D,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAc/C;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,MAAc,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAO9C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAID,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDnC;AAED,OAAO,EAAE,IAAI,EAAE,CAAA"}
@@ -59,8 +59,7 @@ exports.main = main;
59
59
  */
60
60
  const child_process_1 = require("child_process");
61
61
  exports.UPSTREAM_URL = 'https://github.com/opencrvs/opencrvs-countryconfig.git';
62
- // @TODO: This needs to be changed to 'release-v2.0.0' once the branch is created
63
- exports.UPSTREAM_BRANCH = 'develop';
62
+ exports.UPSTREAM_BRANCH = 'release-v2.0.0';
64
63
  // Remote name used only for the duration of this codemod. Prefixed to avoid
65
64
  // clashing with remotes the user may have (origin, upstream, etc.).
66
65
  const TEMP_REMOTE = 'opencrvs-upgrade-v19-v20-codemod';
@@ -1,3 +1,11 @@
1
- declare function main(): Promise<void>;
1
+ interface DeleteInfrastructureOptions {
2
+ /**
3
+ * Top-level entries directly under `infrastructure/` to preserve. Names
4
+ * match against the basename of each entry (file or directory). When
5
+ * empty (the default), the whole `infrastructure/` directory is deleted.
6
+ */
7
+ keep?: string[];
8
+ }
9
+ declare function main({ keep }?: DeleteInfrastructureOptions): Promise<void>;
2
10
  export { main };
3
11
  //# sourceMappingURL=delete-infrastructure-directory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-infrastructure-directory.d.ts","sourceRoot":"","sources":["../../../src/migrations/v2.0/delete-infrastructure-directory.ts"],"names":[],"mappings":"AA4CA,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCnC;AAED,OAAO,EAAE,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"delete-infrastructure-directory.d.ts","sourceRoot":"","sources":["../../../src/migrations/v2.0/delete-infrastructure-directory.ts"],"names":[],"mappings":"AAoDA,UAAU,2BAA2B;IACnC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,iBAAe,IAAI,CAAC,EAClB,IAAS,EACV,GAAE,2BAAgC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FlD;AAED,OAAO,EAAE,IAAI,EAAE,CAAA"}
@@ -27,20 +27,28 @@ exports.main = main;
27
27
  * via Docker Swarm. In that case the `infrastructure/` directory shipped
28
28
  * with opencrvs-countryconfig is no longer needed and can be removed.
29
29
  *
30
+ * Some non-Swarm deployments still need a small subset of
31
+ * `infrastructure/` (e.g. `postgres/` and `metabase/`). Pass `keep` to
32
+ * preserve those top-level subdirectories — everything else under
33
+ * `infrastructure/` is deleted, and the kept subdirectories can then be
34
+ * refreshed from upstream by `merge-infrastructure-directory.ts` with the
35
+ * matching `subdirs` option.
36
+ *
30
37
  * Usage:
31
38
  * ts-node -r tsconfig-paths/register src/migrations/v2.0/delete-infrastructure-directory.ts
32
39
  *
33
40
  * What it does:
34
41
  * 1. Stages deletion of all tracked files under `infrastructure/` via
35
- * `git rm -rf --ignore-unmatch -- infrastructure/`. This both removes
36
- * the files from the working tree and records the deletion in the
42
+ * `git rm -rf --ignore-unmatch -- <path>`. This both removes the
43
+ * files from the working tree and records the deletion in the
37
44
  * index, so it shows up in the upgrade commit alongside the other
38
- * codemod changes.
45
+ * codemod changes. When `keep` is provided, deletion is scoped to
46
+ * the top-level entries that are NOT in `keep`.
39
47
  * 2. Cleans up any untracked files / empty directory that `git rm` left
40
- * behind, so the path is fully gone from the working tree.
48
+ * behind, so the deleted paths are fully gone from the working tree.
41
49
  *
42
50
  * Caveats:
43
- * - Destructive: any local edits to `infrastructure/` are lost. Run on a
51
+ * - Destructive: any local edits to deleted paths are lost. Run on a
44
52
  * clean working tree (or after committing your local changes).
45
53
  * - If `infrastructure/` doesn't exist, this codemod is a no-op.
46
54
  * - Requires git to be installed and the country config working directory
@@ -51,27 +59,65 @@ const path_1 = require("path");
51
59
  const checkout_upstream_files_1 = require("./checkout-upstream-files");
52
60
  const INFRASTRUCTURE_DIR = 'infrastructure';
53
61
  function main() {
54
- return __awaiter(this, void 0, void 0, function* () {
62
+ return __awaiter(this, arguments, void 0, function* ({ keep = [] } = {}) {
55
63
  const fullPath = (0, path_1.join)(process.cwd(), INFRASTRUCTURE_DIR);
56
64
  if (!(0, fs_1.existsSync)(fullPath)) {
57
65
  console.log(`'${INFRASTRUCTURE_DIR}/' not found in ${process.cwd()} — nothing to delete.`);
58
66
  return;
59
67
  }
60
- console.log(`Deleting '${INFRASTRUCTURE_DIR}/'...\n`);
61
68
  (0, checkout_upstream_files_1.assertIsGitRepo)();
62
- // `git rm -rf --ignore-unmatch` removes tracked files (working tree + index)
63
- // and is a no-op for paths with no tracked entries, so it's safe to run
64
- // even when `infrastructure/` exists only as untracked files.
65
- (0, checkout_upstream_files_1.runGit)(['rm', '-rf', '--ignore-unmatch', '--', `${INFRASTRUCTURE_DIR}/`], {
66
- silent: true
67
- });
68
- console.log(` Staged deletion of tracked files under '${INFRASTRUCTURE_DIR}/'.`);
69
- // `git rm` leaves untracked files (and any now-empty directory) on disk;
70
- // remove whatever's left so the path is fully gone.
71
- if ((0, fs_1.existsSync)(fullPath)) {
72
- (0, fs_1.rmSync)(fullPath, { recursive: true, force: true });
73
- console.log(` Removed remaining untracked files under '${INFRASTRUCTURE_DIR}/'.`);
69
+ // ─── Whole-directory delete (legacy behavior) ────────────────────────
70
+ if (keep.length === 0) {
71
+ console.log(`Deleting '${INFRASTRUCTURE_DIR}/'...\n`);
72
+ // `git rm -rf --ignore-unmatch` removes tracked files (working tree +
73
+ // index) and is a no-op for paths with no tracked entries, so it's
74
+ // safe to run even when `infrastructure/` exists only as untracked
75
+ // files.
76
+ (0, checkout_upstream_files_1.runGit)(['rm', '-rf', '--ignore-unmatch', '--', `${INFRASTRUCTURE_DIR}/`], {
77
+ silent: true
78
+ });
79
+ console.log(` Staged deletion of tracked files under '${INFRASTRUCTURE_DIR}/'.`);
80
+ // `git rm` leaves untracked files (and any now-empty directory) on
81
+ // disk; remove whatever's left so the path is fully gone.
82
+ if ((0, fs_1.existsSync)(fullPath)) {
83
+ (0, fs_1.rmSync)(fullPath, { recursive: true, force: true });
84
+ console.log(` Removed remaining untracked files under '${INFRASTRUCTURE_DIR}/'.`);
85
+ }
86
+ console.log(`\n Done. Review the staged deletion with: git diff --cached -- '${INFRASTRUCTURE_DIR}/'`);
87
+ return;
88
+ }
89
+ // ─── Selective delete: keep listed top-level entries ─────────────────
90
+ const keepSet = new Set(keep);
91
+ console.log(`Deleting contents of '${INFRASTRUCTURE_DIR}/' except: ${[...keepSet]
92
+ .map((name) => `'${name}'`)
93
+ .join(', ')}\n`);
94
+ const topLevelEntries = (0, fs_1.readdirSync)(fullPath, { withFileTypes: true });
95
+ let deleted = 0;
96
+ for (const entry of topLevelEntries) {
97
+ if (keepSet.has(entry.name)) {
98
+ console.log(` Keeping '${INFRASTRUCTURE_DIR}/${entry.name}'.`);
99
+ continue;
100
+ }
101
+ // Append a trailing slash for directories so git treats it as a tree
102
+ // pathspec (matches the recursive behavior of `git rm -rf`).
103
+ const relPath = `${INFRASTRUCTURE_DIR}/${entry.name}${entry.isDirectory() ? '/' : ''}`;
104
+ (0, checkout_upstream_files_1.runGit)(['rm', '-rf', '--ignore-unmatch', '--', relPath], { silent: true });
105
+ const fullEntryPath = (0, path_1.join)(fullPath, entry.name);
106
+ if ((0, fs_1.existsSync)(fullEntryPath)) {
107
+ (0, fs_1.rmSync)(fullEntryPath, { recursive: true, force: true });
108
+ }
109
+ console.log(` Deleted '${relPath}'.`);
110
+ deleted++;
111
+ }
112
+ // Note any requested keeps that weren't actually present, so the dev
113
+ // notices typos / missing directories.
114
+ const presentNames = new Set(topLevelEntries.map((e) => e.name));
115
+ const missingKeeps = [...keepSet].filter((name) => !presentNames.has(name));
116
+ if (missingKeeps.length > 0) {
117
+ console.warn(` [warn] Requested to keep ${missingKeeps
118
+ .map((n) => `'${n}'`)
119
+ .join(', ')} but they don't exist under '${INFRASTRUCTURE_DIR}/'.`);
74
120
  }
75
- console.log(`\n Done. Review the staged deletion with: git diff --cached -- '${INFRASTRUCTURE_DIR}/'`);
121
+ console.log(`\n Done. Deleted ${deleted} top-level entr${deleted === 1 ? 'y' : 'ies'}. Review the staged deletions with: git diff --cached -- '${INFRASTRUCTURE_DIR}/'`);
76
122
  });
77
123
  }
@@ -0,0 +1,3 @@
1
+ declare function main(): Promise<void>;
2
+ export { main };
3
+ //# sourceMappingURL=fix-accept-requested-registration-function-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-accept-requested-registration-function-type.d.ts","sourceRoot":"","sources":["../../../src/migrations/v2.0/fix-accept-requested-registration-function-type.ts"],"names":[],"mappings":"AAuFA,iBAAe,IAAI,kBA6ClB;AAED,OAAO,EAAE,IAAI,EAAE,CAAA"}