@zeniai/client-epic-state 5.2.19-betaAK0 → 5.2.20-betaRD0

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.
@@ -102,11 +102,22 @@ export interface AiCfoAnswerPayload {
102
102
  artifact?: string | null;
103
103
  artifact_host_url?: string | null;
104
104
  artifact_title?: string | null;
105
+ capability_promo?: AiCfoCapabilityPromoPayload | null;
105
106
  exports?: AiCfoExportPayload[] | null;
106
107
  follow_up_questions?: string[];
107
108
  suggested_reply?: string | null;
108
109
  table?: AiCfoVisualizationPayload | null;
109
110
  }
111
+ export interface AiCfoCapabilityPromoPayload {
112
+ copy: string;
113
+ id: string;
114
+ surface: string;
115
+ cta?: AiCfoCapabilityPromoCtaPayload | null;
116
+ }
117
+ export interface AiCfoCapabilityPromoCtaPayload {
118
+ label: string;
119
+ prefill: string;
120
+ }
110
121
  export interface AiCfoExportPayload {
111
122
  export_id: ID;
112
123
  name: string;
@@ -114,6 +114,7 @@ function chatHistoryToQA(history) {
114
114
  ? parsedAgentMessage.follow_up_questions
115
115
  : [],
116
116
  suggestedReply: parsedAgentMessage.suggested_reply ?? undefined,
117
+ capabilityPromo: toCapabilityPromo(parsedAgentMessage.capability_promo),
117
118
  assumptions: parsedAgentMessage.assumptions ?? '',
118
119
  insights: parsedAgentMessage.insights ?? '',
119
120
  summarizedTitle: parsedAgentMessage.summarized_title ?? undefined,
@@ -374,8 +375,37 @@ const toAiCfoVisualizationData = (data) => {
374
375
  columns,
375
376
  };
376
377
  };
378
+ const AI_CFO_CAPABILITY_PROMO_SURFACES = [
379
+ 'banner',
380
+ 'inline',
381
+ ];
382
+ const toAiCfoCapabilityPromoSurface = (value) => AI_CFO_CAPABILITY_PROMO_SURFACES.find((surface) => surface === value);
383
+ const toCapabilityPromo = (payload) => {
384
+ // Runtime payloads can miss fields regardless of the wire type — drop the
385
+ // promo on a missing/empty id or copy, and narrow surface to the union.
386
+ if (payload == null || !payload.id || !payload.copy) {
387
+ return undefined;
388
+ }
389
+ const surface = toAiCfoCapabilityPromoSurface(payload.surface);
390
+ if (surface == null) {
391
+ return undefined;
392
+ }
393
+ const cta = toCapabilityPromoCta(payload.cta);
394
+ return {
395
+ copy: payload.copy,
396
+ id: payload.id,
397
+ surface,
398
+ ...(cta != null && { cta }),
399
+ };
400
+ };
401
+ const toCapabilityPromoCta = (payload) => {
402
+ if (payload == null || !payload.label || !payload.prefill) {
403
+ return undefined;
404
+ }
405
+ return { label: payload.label, prefill: payload.prefill };
406
+ };
377
407
  const toResponseBlockType = (answer, userId) => {
378
- const { metadata, state, type, text, visualization, table, follow_up_questions, suggested_reply, assumptions, insights, summarized_title, artifact, artifact_title, artifact_host_url, exports, } = answer;
408
+ const { metadata, state, type, text, visualization, table, follow_up_questions, suggested_reply, assumptions, insights, summarized_title, artifact, artifact_title, artifact_host_url, capability_promo, exports, } = answer;
379
409
  const { chat_session_id, message_id, timestamp, chain_of_thought_action_steps: chainOfThoughtActionSteps = [], } = metadata;
380
410
  return {
381
411
  messageId: message_id,
@@ -390,6 +420,7 @@ const toResponseBlockType = (answer, userId) => {
390
420
  table: table != null ? (0, exports.toAiCfoVisualization)(table) : undefined,
391
421
  followUpQuestions: follow_up_questions ?? [],
392
422
  suggestedReply: suggested_reply ?? undefined,
423
+ capabilityPromo: toCapabilityPromo(capability_promo),
393
424
  assumptions: assumptions ?? '',
394
425
  insights: insights ?? '',
395
426
  summarizedTitle: summarized_title ?? undefined,
@@ -154,6 +154,18 @@ export interface ResponseBlockBase {
154
154
  state: AiCfoAnswerStateType;
155
155
  userId: ID;
156
156
  }
157
+ /** Where a capability promo renders; 'banner' = dismissible hint bar above the composer. */
158
+ export type AiCfoCapabilityPromoSurface = 'banner' | 'inline';
159
+ export interface AiCfoCapabilityPromo {
160
+ copy: string;
161
+ id: string;
162
+ surface: AiCfoCapabilityPromoSurface;
163
+ cta?: AiCfoCapabilityPromoCta;
164
+ }
165
+ export interface AiCfoCapabilityPromoCta {
166
+ label: string;
167
+ prefill: string;
168
+ }
157
169
  /** A downloadable spreadsheet attached to one answer. See AiCfoExportPayload. */
158
170
  export interface AiCfoExport {
159
171
  exportId: ID;
@@ -169,6 +181,8 @@ export interface AnswerContentBlockBase {
169
181
  artifact?: string;
170
182
  artifactHostUrl?: string;
171
183
  artifactTitle?: string;
184
+ /** Feature-discovery promo (banner surface): dismissible hint bar above the composer. */
185
+ capabilityPromo?: AiCfoCapabilityPromo;
172
186
  exports?: AiCfoExport[];
173
187
  suggestedReply?: string;
174
188
  summarizedTitle?: string;
@@ -110,6 +110,7 @@ function chatHistoryToQA(history) {
110
110
  ? parsedAgentMessage.follow_up_questions
111
111
  : [],
112
112
  suggestedReply: parsedAgentMessage.suggested_reply ?? undefined,
113
+ capabilityPromo: toCapabilityPromo(parsedAgentMessage.capability_promo),
113
114
  assumptions: parsedAgentMessage.assumptions ?? '',
114
115
  insights: parsedAgentMessage.insights ?? '',
115
116
  summarizedTitle: parsedAgentMessage.summarized_title ?? undefined,
@@ -368,8 +369,37 @@ const toAiCfoVisualizationData = (data) => {
368
369
  columns,
369
370
  };
370
371
  };
372
+ const AI_CFO_CAPABILITY_PROMO_SURFACES = [
373
+ 'banner',
374
+ 'inline',
375
+ ];
376
+ const toAiCfoCapabilityPromoSurface = (value) => AI_CFO_CAPABILITY_PROMO_SURFACES.find((surface) => surface === value);
377
+ const toCapabilityPromo = (payload) => {
378
+ // Runtime payloads can miss fields regardless of the wire type — drop the
379
+ // promo on a missing/empty id or copy, and narrow surface to the union.
380
+ if (payload == null || !payload.id || !payload.copy) {
381
+ return undefined;
382
+ }
383
+ const surface = toAiCfoCapabilityPromoSurface(payload.surface);
384
+ if (surface == null) {
385
+ return undefined;
386
+ }
387
+ const cta = toCapabilityPromoCta(payload.cta);
388
+ return {
389
+ copy: payload.copy,
390
+ id: payload.id,
391
+ surface,
392
+ ...(cta != null && { cta }),
393
+ };
394
+ };
395
+ const toCapabilityPromoCta = (payload) => {
396
+ if (payload == null || !payload.label || !payload.prefill) {
397
+ return undefined;
398
+ }
399
+ return { label: payload.label, prefill: payload.prefill };
400
+ };
371
401
  const toResponseBlockType = (answer, userId) => {
372
- const { metadata, state, type, text, visualization, table, follow_up_questions, suggested_reply, assumptions, insights, summarized_title, artifact, artifact_title, artifact_host_url, exports, } = answer;
402
+ const { metadata, state, type, text, visualization, table, follow_up_questions, suggested_reply, assumptions, insights, summarized_title, artifact, artifact_title, artifact_host_url, capability_promo, exports, } = answer;
373
403
  const { chat_session_id, message_id, timestamp, chain_of_thought_action_steps: chainOfThoughtActionSteps = [], } = metadata;
374
404
  return {
375
405
  messageId: message_id,
@@ -384,6 +414,7 @@ const toResponseBlockType = (answer, userId) => {
384
414
  table: table != null ? toAiCfoVisualization(table) : undefined,
385
415
  followUpQuestions: follow_up_questions ?? [],
386
416
  suggestedReply: suggested_reply ?? undefined,
417
+ capabilityPromo: toCapabilityPromo(capability_promo),
387
418
  assumptions: assumptions ?? '',
388
419
  insights: insights ?? '',
389
420
  summarizedTitle: summarized_title ?? undefined,
@@ -3,7 +3,7 @@ import { catchError, exhaustMap, filter, mergeMap } from 'rxjs/operators';
3
3
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
5
  import { isConfirmStatementMappingConflictResponse, transformConfirmStatementMappingConflictToState, transformConfirmStatementMappingPayloadToState, } from '../../payload/reconciliationPayload';
6
- import { confirmStatementMapping, confirmStatementMappingFailure, confirmStatementMappingSuccess, fetchReconciliation, } from '../../reducers/reconciliationViewReducer';
6
+ import { confirmStatementMapping, confirmStatementMappingFailure, confirmStatementMappingSuccess, } from '../../reducers/reconciliationViewReducer';
7
7
  function createConfirmStatementMappingErrorSnackbar(apiMessage) {
8
8
  const trimmedApiMessage = apiMessage?.trim();
9
9
  if (trimmedApiMessage != null && trimmedApiMessage !== '') {
@@ -39,7 +39,7 @@ export const confirmStatementMappingEpic = (actions$, _state$, zeniAPI) => actio
39
39
  accountId,
40
40
  selectedPeriod,
41
41
  statementUploads: transformConfirmStatementMappingPayloadToState(response.data),
42
- }), fetchReconciliation(selectedPeriod, undefined, true, true));
42
+ }));
43
43
  }
44
44
  const mappingConflict = isConfirmStatementMappingConflictResponse(response)
45
45
  ? transformConfirmStatementMappingConflictToState(response)
@@ -5,7 +5,7 @@ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePay
5
5
  import { mapCombinedStatementUpdateLocalDataToRequestBody } from '../../helpers/mapStatementUpdateLocalDataToRequestBody';
6
6
  import { resolveCombinedStatementGroupId } from '../../helpers/reconciliationHelpers';
7
7
  import { isStatementDateConflictResponse, transformStatementDateConflictToState, transformUpdateStatementInfoPayloadToState, } from '../../payload/reconciliationPayload';
8
- import { submitCombinedStatementUpdate, submitStatementUpdateFailure, submitStatementUpdateSuccess, updateParsedStatementData, } from '../../reducers/reconciliationViewReducer';
8
+ import { fetchReconciliation, submitCombinedStatementUpdate, submitStatementUpdateFailure, submitStatementUpdateSuccess, updateParsedStatementData, } from '../../reducers/reconciliationViewReducer';
9
9
  import { getStatementUploadsFromParsedData } from '../../selectors/statementParseViewSelector';
10
10
  export const updateCombinedStatementInfoEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(submitCombinedStatementUpdate.match), switchMap((action) => {
11
11
  const { accountId, selectedPeriod } = action.payload;
@@ -45,7 +45,7 @@ export const updateCombinedStatementInfoEpic = (actions$, state$, zeniAPI) => ac
45
45
  }), submitStatementUpdateSuccess({
46
46
  accountId,
47
47
  selectedPeriod,
48
- }));
48
+ }), fetchReconciliation(selectedPeriod, undefined, true, true));
49
49
  }
50
50
  const dateConflict = isStatementDateConflictResponse(response)
51
51
  ? transformStatementDateConflictToState(response)
@@ -7,6 +7,7 @@ import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
7
7
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
8
8
  import { clearAll } from '../../../../rootActions';
9
9
  import { date } from '../../../../zeniDayJS';
10
+ import { SERVICE_MONTH_FORMAT, } from '../../payload/jeSchedulesPayload';
10
11
  import { fetchJeSchedules, fetchJeSchedulesFailure, fetchJeSchedulesSuccess, initializeJeScheduleLocalData, } from '../../reducers/jeSchedulesViewReducer';
11
12
  export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchJeSchedules.match), mergeMap((action) => {
12
13
  const state = state$.value;
@@ -20,15 +21,47 @@ export const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe
20
21
  .subtract(1, 'month')
21
22
  .endOf('month')
22
23
  .format(DEFAULT_DATE_FORMAT));
24
+ // Existing Schedules looks at months already closed, so it stops at the previous month end;
25
+ // Review Schedules is closing the selected month and runs to its end.
26
+ const endDate = isClosePeriodTab || existingEndDate == null
27
+ ? toString(period.end)
28
+ : toString(existingEndDate);
29
+ // Accrued rows are windowed on the schedule's own start_date rather than a transaction date,
30
+ // so they get their own bounds. Review wants the month being closed; Existing wants the year
31
+ // up to endDate, snapped to the 1st — the same window the server used to compute for itself.
32
+ const accruedStartDate = isClosePeriodTab
33
+ ? toString(period.start)
34
+ : date(endDate)
35
+ .subtract(1, 'year')
36
+ .startOf('month')
37
+ .format(DEFAULT_DATE_FORMAT);
23
38
  const queryParam = {
24
- start_date: toString(period.start),
25
- end_date: isClosePeriodTab || existingEndDate == null
26
- ? toString(period.end)
27
- : toString(existingEndDate),
39
+ base_transaction_end_date: endDate,
40
+ accrued_start_date: accruedStartDate,
41
+ accrued_end_date: endDate,
28
42
  include_accrued: true,
29
43
  ...(isClosePeriodTab
30
- ? { close_period_start_date: toString(period.start) }
31
- : {}),
44
+ ? {
45
+ // Both types share the close month, so one bound covers them. Existing sends none,
46
+ // which is what keeps the differing server defaults — a year back for prepaid, five
47
+ // for fixed assets.
48
+ base_transaction_start_date: toString(period.start),
49
+ close_period_start_date: toString(period.start),
50
+ one_time_accrual_service_month: date(toString(period.start)).format(SERVICE_MONTH_FORMAT),
51
+ // Empty means no status filter: the month being closed is reviewed whatever state
52
+ // each accrual is in.
53
+ one_time_accrual_statuses: [],
54
+ filter_failed_je_postings_by_date: true,
55
+ }
56
+ : {
57
+ one_time_accrual_service_month_start: date(accruedStartDate).format(SERVICE_MONTH_FORMAT),
58
+ one_time_accrual_service_month_end: date(endDate).format(SERVICE_MONTH_FORMAT),
59
+ // Existing lists what actually reached the books.
60
+ one_time_accrual_statuses: ['posted'],
61
+ // A failed posting from an earlier month still needs to surface here, so this list
62
+ // is deliberately not windowed.
63
+ filter_failed_je_postings_by_date: false,
64
+ }),
32
65
  };
33
66
  return zeniAPI
34
67
  .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/expenses_automation/je_schedules?query=${encodeURIComponent(JSON.stringify(queryParam))}`)
@@ -2,7 +2,7 @@ import { DEFAULT_DATE_FORMAT } from '../../../commonStateTypes/timePeriod';
2
2
  import { getClassList } from '../../classList/classListSelector';
3
3
  import { mapScheduleTransactionToBaseScheduleTransactionPayload, mapVendorToVendorPayload, } from '../../scheduleView/scheduleDetailView/scheduleDetailPayload';
4
4
  const BALANCE_SHEET_CLASS_LABEL = 'balance_sheet';
5
- const SERVICE_MONTH_FORMAT = 'YYYY-MM';
5
+ export const SERVICE_MONTH_FORMAT = 'YYYY-MM';
6
6
  /**
7
7
  * The credit line is the accrued liability, which always sits on the balance sheet — the
8
8
  * recurring accrued path resolves the same class the same way (see
package/lib/index.d.ts CHANGED
@@ -984,7 +984,7 @@ export { AiCfoViewSelector, getAiCfoView, getSuggestedQuestionsForPageContext, g
984
984
  export { MessagePayload, ChatSessionPayload, AiCfoAnswerPayload, } from './entity/aiCfo/aiCfoPayload';
985
985
  export { setNewSession, setSessions, updateAiCfoAnswerCardPolicyWizardPlan, upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, addQuestionPayload, clearSession, toAiCfoExports, toAiCfoVisualization, appendSyntheticAiCfoAnswer, updateSyntheticAiCfoAnswer, removeSyntheticAiCfoAnswer, } from './entity/aiCfo/aiCfoReducer';
986
986
  export { AiCfoSelectorView, getAllQuestionAnswersForChatSession, getQuestionAnswerByIdForChatSession, getAllQuestionsForChatSession, getAiCfoSelectorView, getSyntheticAiCfoAnswersForChatSession, getSyntheticAiCfoAnswerByQuestionAnswerId, ChatSessionWithOrderedQuestionAnswers, } from './entity/aiCfo/aiCfoSelector';
987
- export { AiCfoQuestionWithAnswer, AiCfoAnswerParagraph, AiCfoAnswerStateType, AiCfoChartType, AiCfoAnswerResponseType, TableVisualization, ChartVisualization, CardNameOption, CardsCardKind, CardsCreationInitialData, CardPolicyDraftPolicy, CardPolicyDraftPolicyEntity, CardPolicyInitialData, CardPolicySpendLimits, CardPolicyStep5Review, CardPolicyUploadSource, CardPolicyWizardPlan, InteractiveFormType, InteractiveFormVisualization, AiCfoExport, AiCfoVisualization, AiCfoVisualizationType, AiCfoState, ChatSession, ALL_AI_CFO_CHARTS_TYPES, ALL_AI_CFO_VISUALIZATION_TYPES, ALL_AI_CFO_ANSWER_STATE_TYPES, ALL_AI_CFO_ANSWER_RESPONSE_TYPES, ALL_INTERACTIVE_FORM_TYPES, toAiCfoVisualizationType, toAiCfoVisualizationTypeStrict, toAiCfoChartType, toAiCfoChartTypeStrict, toAiCfoAnswerStateType, toAiCfoAnswerStateTypeStrict, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toInteractiveFormType, toInteractiveFormTypeStrict, ChatSessionWithMessages, ResponseBlockBase, AnswerContentBlockBase, FileAttachmentMetadata, QuestionContentBlockBase, ResponseBlockType, SyntheticAiCfoAnswer, SyntheticAiCfoAnswerKind, ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS, toMessageSender, toMessageType, MessageSender, MessageType, } from './entity/aiCfo/aiCfoState';
987
+ export { AiCfoQuestionWithAnswer, AiCfoAnswerParagraph, AiCfoAnswerStateType, AiCfoChartType, AiCfoAnswerResponseType, TableVisualization, ChartVisualization, CardNameOption, CardsCardKind, CardsCreationInitialData, CardPolicyDraftPolicy, CardPolicyDraftPolicyEntity, CardPolicyInitialData, CardPolicySpendLimits, CardPolicyStep5Review, CardPolicyUploadSource, CardPolicyWizardPlan, InteractiveFormType, InteractiveFormVisualization, AiCfoCapabilityPromo, AiCfoCapabilityPromoCta, AiCfoCapabilityPromoSurface, AiCfoExport, AiCfoVisualization, AiCfoVisualizationType, AiCfoState, ChatSession, ALL_AI_CFO_CHARTS_TYPES, ALL_AI_CFO_VISUALIZATION_TYPES, ALL_AI_CFO_ANSWER_STATE_TYPES, ALL_AI_CFO_ANSWER_RESPONSE_TYPES, ALL_INTERACTIVE_FORM_TYPES, toAiCfoVisualizationType, toAiCfoVisualizationTypeStrict, toAiCfoChartType, toAiCfoChartTypeStrict, toAiCfoAnswerStateType, toAiCfoAnswerStateTypeStrict, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toInteractiveFormType, toInteractiveFormTypeStrict, ChatSessionWithMessages, ResponseBlockBase, AnswerContentBlockBase, FileAttachmentMetadata, QuestionContentBlockBase, ResponseBlockType, SyntheticAiCfoAnswer, SyntheticAiCfoAnswerKind, ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS, toMessageSender, toMessageType, MessageSender, MessageType, } from './entity/aiCfo/aiCfoState';
988
988
  export { clearPolicyDocumentExtraction, extractPolicyDocument, fetchCardPolicyMccCategories, fetchCardPolicyRecommendationFromUpload, fetchCardPolicyVendorOptions, removeCardPolicyTemplate, updateCardPolicyMccCategories, updateCardPolicyMccCategoriesFailure, updateCardPolicyStats, updateCardPolicyTemplates, updateCardPolicyVendorOptions, updateCardPolicyVendorOptionsFailure, updateCreatedCardPolicyTemplate, updatePolicyDocumentExtractionFailure, updatePolicyDocumentExtractionSuccess, updatePolicyRecommendationFromUploadFailure, updatePolicyRecommendationFromUploadSuccess, } from './entity/cardPolicy/cardPolicyReducer';
989
989
  export { getAllCardPolicyTemplates, getCardPolicyMccCategories, getCardPolicyMccCategoriesError, getCardPolicyMccCategoriesFetchState, getCardPolicyStats, getCardPolicySuggestedAllowCategories, getCardPolicySuggestedAllowMerchants, getCardPolicySuggestedBlockCategories, getCardPolicySuggestedBlockMerchants, getCardPolicyTemplateById, getCardPolicyTemplatesByIds, getCardPolicyVendorSearchFetchState, getCardPolicyVendorSearchOptions, getCardPolicyVendorSearchString, getExtractedCardPolicyRules, getPolicyDocumentExtractionError, getPolicyDocumentExtractionFetchState, getPolicyRecommendationFromUploadAnswerId, getPolicyRecommendationFromUploadChatSessionId, getPolicyRecommendationFromUploadError, getPolicyRecommendationFromUploadFetchState, getUploadedPolicyDocumentFileName, } from './entity/cardPolicy/cardPolicySelector';
990
990
  export { ALL_CARD_POLICY_TEMPLATE_MODES, ALL_CARD_POLICY_TEMPLATE_STATUSES, CardPolicyState, CardPolicyStats, CardPolicyTemplate, CardPolicyTemplateEntityList, CardPolicyTemplateMode, CardPolicyTemplateSpendLimits, CardPolicyTemplateStatus, CardPolicyVendorSearchEntry, CardPolicyVendorSearchState, ExtractedCardPolicyRules, MccCategory, PolicyDocumentExtractionState, PolicyRecommendationFromUploadState, toCardPolicyTemplateMode, toCardPolicyTemplateStatus, } from './entity/cardPolicy/cardPolicyState';
@@ -2,8 +2,8 @@ import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
3
3
  import { RootState } from '../../../../rootStateTypes';
4
4
  import { ZeniAPI } from '../../../../zeniAPI';
5
- import { confirmStatementMapping, confirmStatementMappingFailure, confirmStatementMappingSuccess, fetchReconciliation } from '../../reducers/reconciliationViewReducer';
6
- export type ActionType = ReturnType<typeof confirmStatementMapping> | ReturnType<typeof confirmStatementMappingSuccess> | ReturnType<typeof confirmStatementMappingFailure> | ReturnType<typeof fetchReconciliation> | ReturnType<typeof openSnackbar>;
5
+ import { confirmStatementMapping, confirmStatementMappingFailure, confirmStatementMappingSuccess } from '../../reducers/reconciliationViewReducer';
6
+ export type ActionType = ReturnType<typeof confirmStatementMapping> | ReturnType<typeof confirmStatementMappingSuccess> | ReturnType<typeof confirmStatementMappingFailure> | ReturnType<typeof openSnackbar>;
7
7
  export declare const confirmStatementMappingEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
8
8
  payload: {
9
9
  messageSection: import("../../../..").SnackbarMessageSections;
@@ -31,12 +31,4 @@ export declare const confirmStatementMappingEpic: (actions$: ActionsObservable<A
31
31
  mappingConflict?: import("../../types/reconciliationViewState").ConfirmStatementMappingConflict | null;
32
32
  };
33
33
  type: "expenseAutomationReconciliationView/confirmStatementMappingFailure";
34
- } | {
35
- payload: {
36
- selectedPeriod: import("../../../..").MonthYearPeriod;
37
- accountId: string | undefined;
38
- cacheOverride: any;
39
- refreshViewInBackground: any;
40
- };
41
- type: "expenseAutomationReconciliationView/fetchReconciliation";
42
34
  }>;
@@ -42,7 +42,7 @@ const confirmStatementMappingEpic = (actions$, _state$, zeniAPI) => actions$.pip
42
42
  accountId,
43
43
  selectedPeriod,
44
44
  statementUploads: (0, reconciliationPayload_1.transformConfirmStatementMappingPayloadToState)(response.data),
45
- }), (0, reconciliationViewReducer_1.fetchReconciliation)(selectedPeriod, undefined, true, true));
45
+ }));
46
46
  }
47
47
  const mappingConflict = (0, reconciliationPayload_1.isConfirmStatementMappingConflictResponse)(response)
48
48
  ? (0, reconciliationPayload_1.transformConfirmStatementMappingConflictToState)(response)
@@ -1,9 +1,17 @@
1
1
  import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { RootState } from '../../../../rootStateTypes';
3
3
  import { ZeniAPI } from '../../../../zeniAPI';
4
- import { submitCombinedStatementUpdate, submitStatementUpdateFailure, submitStatementUpdateSuccess, updateParsedStatementData } from '../../reducers/reconciliationViewReducer';
5
- export type ActionType = ReturnType<typeof submitCombinedStatementUpdate> | ReturnType<typeof submitStatementUpdateSuccess> | ReturnType<typeof submitStatementUpdateFailure> | ReturnType<typeof updateParsedStatementData>;
4
+ import { fetchReconciliation, submitCombinedStatementUpdate, submitStatementUpdateFailure, submitStatementUpdateSuccess, updateParsedStatementData } from '../../reducers/reconciliationViewReducer';
5
+ export type ActionType = ReturnType<typeof submitCombinedStatementUpdate> | ReturnType<typeof submitStatementUpdateSuccess> | ReturnType<typeof submitStatementUpdateFailure> | ReturnType<typeof updateParsedStatementData> | ReturnType<typeof fetchReconciliation>;
6
6
  export declare const updateCombinedStatementInfoEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
7
+ payload: {
8
+ selectedPeriod: import("../../../../commonStateTypes/timePeriod").MonthYearPeriod;
9
+ accountId: string | undefined;
10
+ cacheOverride: any;
11
+ refreshViewInBackground: any;
12
+ };
13
+ type: "expenseAutomationReconciliationView/fetchReconciliation";
14
+ } | {
7
15
  payload: {
8
16
  accountId: import("../../../..").ID;
9
17
  parsedStatementData: import("../../types/reconciliationViewState").ParsedStatementData;
@@ -48,7 +48,7 @@ const updateCombinedStatementInfoEpic = (actions$, state$, zeniAPI) => actions$.
48
48
  }), (0, reconciliationViewReducer_1.submitStatementUpdateSuccess)({
49
49
  accountId,
50
50
  selectedPeriod,
51
- }));
51
+ }), (0, reconciliationViewReducer_1.fetchReconciliation)(selectedPeriod, undefined, true, true));
52
52
  }
53
53
  const dateConflict = (0, reconciliationPayload_1.isStatementDateConflictResponse)(response)
54
54
  ? (0, reconciliationPayload_1.transformStatementDateConflictToState)(response)
@@ -1,8 +1,8 @@
1
1
  import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { Observable } from 'rxjs';
3
3
  import { updateAccruedJESchedules, updateAccruedJESchedulesDetails, updateJEOneTimeAccruals, updateJESchedules, updateJESchedulesDetails } from '../../../../entity/jeSchedules/jeSchedulesReducer';
4
- import { RootState } from '../../../../rootStateTypes';
5
4
  import { clearAll } from '../../../../rootActions';
5
+ import { RootState } from '../../../../rootStateTypes';
6
6
  import { ZeniAPI } from '../../../../zeniAPI';
7
7
  import { fetchJeSchedules, fetchJeSchedulesFailure, fetchJeSchedulesSuccess, initializeJeScheduleLocalData } from '../../reducers/jeSchedulesViewReducer';
8
8
  export type ActionType = ReturnType<typeof clearAll> | ReturnType<typeof fetchJeSchedules> | ReturnType<typeof fetchJeSchedulesFailure> | ReturnType<typeof fetchJeSchedulesSuccess> | ReturnType<typeof initializeJeScheduleLocalData> | ReturnType<typeof updateAccruedJESchedules> | ReturnType<typeof updateAccruedJESchedulesDetails> | ReturnType<typeof updateJEOneTimeAccruals> | ReturnType<typeof updateJESchedules> | ReturnType<typeof updateJESchedulesDetails>;
@@ -10,6 +10,7 @@ const tenantSelector_1 = require("../../../../entity/tenant/tenantSelector");
10
10
  const responsePayload_1 = require("../../../../responsePayload");
11
11
  const rootActions_1 = require("../../../../rootActions");
12
12
  const zeniDayJS_1 = require("../../../../zeniDayJS");
13
+ const jeSchedulesPayload_1 = require("../../payload/jeSchedulesPayload");
13
14
  const jeSchedulesViewReducer_1 = require("../../reducers/jeSchedulesViewReducer");
14
15
  const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(jeSchedulesViewReducer_1.fetchJeSchedules.match), (0, operators_1.mergeMap)((action) => {
15
16
  const state = state$.value;
@@ -23,15 +24,47 @@ const fetchJeSchedulesEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, op
23
24
  .subtract(1, 'month')
24
25
  .endOf('month')
25
26
  .format(timePeriod_1.DEFAULT_DATE_FORMAT));
27
+ // Existing Schedules looks at months already closed, so it stops at the previous month end;
28
+ // Review Schedules is closing the selected month and runs to its end.
29
+ const endDate = isClosePeriodTab || existingEndDate == null
30
+ ? (0, timePeriod_2.toString)(period.end)
31
+ : (0, timePeriod_2.toString)(existingEndDate);
32
+ // Accrued rows are windowed on the schedule's own start_date rather than a transaction date,
33
+ // so they get their own bounds. Review wants the month being closed; Existing wants the year
34
+ // up to endDate, snapped to the 1st — the same window the server used to compute for itself.
35
+ const accruedStartDate = isClosePeriodTab
36
+ ? (0, timePeriod_2.toString)(period.start)
37
+ : (0, zeniDayJS_1.date)(endDate)
38
+ .subtract(1, 'year')
39
+ .startOf('month')
40
+ .format(timePeriod_1.DEFAULT_DATE_FORMAT);
26
41
  const queryParam = {
27
- start_date: (0, timePeriod_2.toString)(period.start),
28
- end_date: isClosePeriodTab || existingEndDate == null
29
- ? (0, timePeriod_2.toString)(period.end)
30
- : (0, timePeriod_2.toString)(existingEndDate),
42
+ base_transaction_end_date: endDate,
43
+ accrued_start_date: accruedStartDate,
44
+ accrued_end_date: endDate,
31
45
  include_accrued: true,
32
46
  ...(isClosePeriodTab
33
- ? { close_period_start_date: (0, timePeriod_2.toString)(period.start) }
34
- : {}),
47
+ ? {
48
+ // Both types share the close month, so one bound covers them. Existing sends none,
49
+ // which is what keeps the differing server defaults — a year back for prepaid, five
50
+ // for fixed assets.
51
+ base_transaction_start_date: (0, timePeriod_2.toString)(period.start),
52
+ close_period_start_date: (0, timePeriod_2.toString)(period.start),
53
+ one_time_accrual_service_month: (0, zeniDayJS_1.date)((0, timePeriod_2.toString)(period.start)).format(jeSchedulesPayload_1.SERVICE_MONTH_FORMAT),
54
+ // Empty means no status filter: the month being closed is reviewed whatever state
55
+ // each accrual is in.
56
+ one_time_accrual_statuses: [],
57
+ filter_failed_je_postings_by_date: true,
58
+ }
59
+ : {
60
+ one_time_accrual_service_month_start: (0, zeniDayJS_1.date)(accruedStartDate).format(jeSchedulesPayload_1.SERVICE_MONTH_FORMAT),
61
+ one_time_accrual_service_month_end: (0, zeniDayJS_1.date)(endDate).format(jeSchedulesPayload_1.SERVICE_MONTH_FORMAT),
62
+ // Existing lists what actually reached the books.
63
+ one_time_accrual_statuses: ['posted'],
64
+ // A failed posting from an earlier month still needs to surface here, so this list
65
+ // is deliberately not windowed.
66
+ filter_failed_je_postings_by_date: false,
67
+ }),
35
68
  };
36
69
  return zeniAPI
37
70
  .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/expenses_automation/je_schedules?query=${encodeURIComponent(JSON.stringify(queryParam))}`)
@@ -7,11 +7,42 @@ import { RootState } from '../../../rootStateTypes';
7
7
  import { ZeniDate } from '../../../zeniDayJS';
8
8
  import { JESchedulePayload, SaveJESchedulePayload } from '../../scheduleView/scheduleDetailView/scheduleDetailPayload';
9
9
  import { JEScheduleLocalData, NewOneTimeAccrualLocalData } from '../types/jeSchedulesViewState';
10
+ /**
11
+ * The query this endpoint accepts. Every field names the thing it filters, because three
12
+ * different fields are involved and which one applies depends on the row type:
13
+ *
14
+ * - prepaid / fixed assets -> the base transaction's date
15
+ * - accrued schedules -> the schedule's own start_date, i.e. its first posting date
16
+ * - one-time accruals -> service_month, a 'YYYY-MM' string
17
+ *
18
+ * Omitting a bound means "use the server default", and the defaults differ per type -- which is
19
+ * why the Existing tab omits `base_transaction_start_date` rather than sending one value for both.
20
+ */
10
21
  export interface ExpenseAutomationJESchedulesQueryPayload {
11
- end_date: string;
22
+ accrued_end_date: string;
23
+ accrued_start_date: string;
24
+ base_transaction_end_date: string;
25
+ /**
26
+ * Sent while the backend rollout completes.
27
+ *
28
+ * The server ignores it now and always returns accrued rows. An older server does not: it reads
29
+ * this flag and omits `accrued_je_schedules` and `one_time_accruals` without it. Dropping it here
30
+ * would mean a new bundle against a not-yet-deployed (or rolled-back) backend silently loses
31
+ * every accrued row. Remove once the backend change is released everywhere.
32
+ */
12
33
  include_accrued: boolean;
13
- start_date: string;
34
+ base_transaction_start_date?: string;
35
+ /**
36
+ * Deprecated, sent for the same rollout reason as `include_accrued`. On an older server its
37
+ * presence is what selects the close-period behaviour; on the current one the explicit fields
38
+ * above take precedence and this is only a fallback.
39
+ */
14
40
  close_period_start_date?: string;
41
+ filter_failed_je_postings_by_date?: boolean;
42
+ one_time_accrual_service_month?: string;
43
+ one_time_accrual_service_month_end?: string;
44
+ one_time_accrual_service_month_start?: string;
45
+ one_time_accrual_statuses?: string[];
15
46
  }
16
47
  interface ExpenseAutomationJESchedulesPayload {
17
48
  failed_je_postings: {
@@ -24,8 +55,21 @@ interface ExpenseAutomationJESchedulesPayload {
24
55
  scheduled_journal_entries?: ScheduledJournalEntryPayload[];
25
56
  };
26
57
  one_time_accruals?: JEOneTimeAccrualPayload[];
58
+ query?: {
59
+ accrued_end_date: string;
60
+ accrued_start_date: string;
61
+ base_transaction_end_date: string;
62
+ filter_failed_je_postings_by_date: boolean;
63
+ fixed_assets_start_date: string;
64
+ prepaid_start_date: string;
65
+ one_time_accrual_service_month?: string;
66
+ one_time_accrual_service_month_end?: string;
67
+ one_time_accrual_service_month_start?: string;
68
+ one_time_accrual_statuses?: string[];
69
+ };
27
70
  }
28
71
  export type ExpenseAutomationJESchedulesResponse = ZeniAPIResponse<ExpenseAutomationJESchedulesPayload>;
72
+ export declare const SERVICE_MONTH_FORMAT = "YYYY-MM";
29
73
  export interface CreateOneTimeAccrualPayload {
30
74
  amount: number;
31
75
  je_credit_account_id: ID;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.preparePayloadForRetryPosting = exports.prepareIgnoreSchedulePayload = exports.getExpectedReversalDate = exports.prepareCreateOneTimeAccrualPayload = void 0;
3
+ exports.preparePayloadForRetryPosting = exports.prepareIgnoreSchedulePayload = exports.getExpectedReversalDate = exports.prepareCreateOneTimeAccrualPayload = exports.SERVICE_MONTH_FORMAT = void 0;
4
4
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
5
5
  const classListSelector_1 = require("../../classList/classListSelector");
6
6
  const scheduleDetailPayload_1 = require("../../scheduleView/scheduleDetailView/scheduleDetailPayload");
7
7
  const BALANCE_SHEET_CLASS_LABEL = 'balance_sheet';
8
- const SERVICE_MONTH_FORMAT = 'YYYY-MM';
8
+ exports.SERVICE_MONTH_FORMAT = 'YYYY-MM';
9
9
  /**
10
10
  * The credit line is the accrued liability, which always sits on the balance sheet — the
11
11
  * recurring accrued path resolves the same class the same way (see
@@ -27,7 +27,7 @@ const prepareCreateOneTimeAccrualPayload = (state, localData) => {
27
27
  return {
28
28
  vendor_id: localData.vendorId,
29
29
  vendor_name: localData.vendorName,
30
- service_month: localData.serviceMonth.format(SERVICE_MONTH_FORMAT),
30
+ service_month: localData.serviceMonth.format(exports.SERVICE_MONTH_FORMAT),
31
31
  amount: localData.amount,
32
32
  memo: localData.memo,
33
33
  je_debit_account_id: localData.debitAccountId,
@@ -25,6 +25,6 @@ export interface CommonHistoryState {
25
25
  }
26
26
  export declare const toHistoricEventUpdateType: (v: string) => "deleted" | "created" | "updated";
27
27
  type HistoricEventUpdateType = ReturnType<typeof toHistoricEventUpdateType>;
28
- export declare const toHistoricEventUpdateDisplayType: (v: string) => "list" | "sentence" | "inline";
28
+ export declare const toHistoricEventUpdateDisplayType: (v: string) => "inline" | "list" | "sentence";
29
29
  type HistoricEventUpdateDisplayType = ReturnType<typeof toHistoricEventUpdateDisplayType>;
30
30
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.2.19-betaAK0",
3
+ "version": "5.2.20-betaRD0",
4
4
  "description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",
@@ -33,44 +33,6 @@
33
33
  "require": "./lib/view/*.js"
34
34
  }
35
35
  },
36
- "scripts": {
37
- "clean": "rimraf lib",
38
- "test:typecheck": "echo 'Typechecking test files...' && NODE_OPTIONS=--max-old-space-size=4096 time tsc -p tsconfig.typecheck.json",
39
- "test:typecheck-modified-files": "chmod +x ./scripts/tsc-modified-files.sh && SINCE_DAYS=30 ./scripts/tsc-modified-files.sh master tsconfig.typecheck.json",
40
- "test:typecheck-mocks": "echo 'Typechecking mock files...' && NODE_OPTIONS=--max-old-space-size=4096 time tsc -p tsconfig.mocks.json",
41
- "test:typecheck-mocks-modified-files": "chmod +x ./scripts/tsc-modified-files.sh && SINCE_DAYS=30 ./scripts/tsc-modified-files.sh master tsconfig.mocks.json",
42
- "test": "pnpm lint-modified-files && pnpm test:typecheck-modified-files && pnpm test:typecheck-mocks-modified-files && vitest run --typecheck",
43
- "test:full": "pnpm test:typecheck-modified-files && pnpm test:typecheck-mocks-modified-files && vitest run --typecheck",
44
- "lint": "eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0 --fix",
45
- "lint-modified-files": "chmod +x ./scripts/lint-modified-files.sh && ./scripts/lint-modified-files.sh",
46
- "lint:fix-modified-files": "chmod +x ./scripts/lint-modified-files.sh && LINT_FIX=true ./scripts/lint-modified-files.sh",
47
- "tsc-modified-files": "chmod +x ./scripts/tsc-modified-files.sh && ./scripts/tsc-modified-files.sh",
48
- "typecheck": "tsc --noEmit",
49
- "circular-dependency": "madge --circular --extensions ts ./src",
50
- "circular-dependency-modified-files": "chmod +x ./scripts/circular-dependency-modified-files.sh && ./scripts/circular-dependency-modified-files.sh",
51
- "build": "chmod +x ./scripts/run_build.sh && ./scripts/run_build.sh && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
52
- "only-build": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc && tsc -p tsconfig.esm.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
53
- "only-build-dev": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc -p tsconfig.dev.json && tsc -p tsconfig.esm.dev.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
54
- "format": "prettier --write --ignore-unknown \"src/**/*\" && pnpm lint",
55
- "format-watch": "bash ./scripts/run-format-watch.sh",
56
- "check-version": "node ./scripts/check_version.js",
57
- "prepublishOnly": "chmod +x ./scripts/branch_validation.sh && ./scripts/branch_validation.sh && pnpm update-slack-group-topic && pnpm run check-version && pnpm clean && pnpm build",
58
- "version": "git add -A src",
59
- "postversion": "git push && git push --tags",
60
- "check-dependencies": "node ./scripts/check_dependencies.js",
61
- "clean-overrides": "node ./scripts/clean_overrides.js",
62
- "create-or-update-release-branch": "chmod +x ./scripts/create_or_update_release_branch.sh && ./scripts/create_or_update_release_branch.sh",
63
- "bump-versions-master": "chmod +x ./scripts/bump_versions_master.sh && ./scripts/bump_versions_master.sh",
64
- "bump-versions-beta": "chmod +x ./scripts/bump_versions_beta.sh && ./scripts/bump_versions_beta.sh",
65
- "bump-update-web-app-cockpit-beta": "chmod +x ./scripts/bump_and_update_web_app_ui_beta.sh && ./scripts/bump_and_update_web_app_ui_beta.sh",
66
- "send-release-notes": "chmod +x ./scripts/send_release_notes.sh && ./scripts/send_release_notes.sh",
67
- "update-slack-group-topic": "chmod +x ./scripts/update-slack-group-topic.sh && ./scripts/update-slack-group-topic.sh",
68
- "build-beta-and-copy": "chmod +x ./scripts/build_and_copy.sh && ./scripts/build_and_copy.sh",
69
- "pr-approvals-update": "chmod +x ./scripts/pr_approvals.sh && ./scripts/pr_approvals.sh",
70
- "raise-pr-automation": "chmod +x ./scripts/raise_pr_automation.sh && ./scripts/raise_pr_automation.sh",
71
- "test:file": "bash ./scripts/test-file.sh",
72
- "find-unused-code": "knip"
73
- },
74
36
  "files": [
75
37
  "lib/**/*"
76
38
  ],
@@ -138,36 +100,41 @@
138
100
  "dayjs": "^1.10.7",
139
101
  "url-parse": "^1.5.10"
140
102
  },
141
- "pnpm": {
142
- "overrides": {
143
- "@babel/core": ">=7.29.6",
144
- "@babel/helpers": ">=7.26.10",
145
- "@babel/runtime": ">=7.26.10",
146
- "@babel/traverse": ">=7.23.2",
147
- "@eslint/eslintrc>ajv": ">=6.14.0 <7",
148
- "@eslint/plugin-kit": ">=0.3.4",
149
- "@modelcontextprotocol/sdk": ">=1.25.2",
150
- "ajv": ">=8.18.0",
151
- "body-parser": ">=2.2.1",
152
- "brace-expansion": ">=5.0.9",
153
- "cross-spawn": ">=7.0.5",
154
- "esbuild": ">=0.28.1",
155
- "eslint>ajv": ">=6.14.0 <7",
156
- "flatted": ">=3.4.2",
157
- "glob": ">=11.1.0",
158
- "hono": ">=4.11.4",
159
- "immutable": ">=4.3.9 <5",
160
- "js-yaml": ">=4.3.1 <5",
161
- "minimatch": ">=10.2.3",
162
- "nanoid": ">=3.3.17 <4",
163
- "picomatch": ">=4.0.4",
164
- "postcss": ">=8.5.18",
165
- "qs": "^6.14.1",
166
- "rollup": ">=4.59.0",
167
- "shell-quote": ">=1.9.0",
168
- "tough-cookie": "=4.1.3",
169
- "vite": ">=7.3.5 <8",
170
- "yaml": ">=2.9.0"
171
- }
103
+ "scripts": {
104
+ "clean": "rimraf lib",
105
+ "test:typecheck": "echo 'Typechecking test files...' && NODE_OPTIONS=--max-old-space-size=4096 time tsc -p tsconfig.typecheck.json",
106
+ "test:typecheck-modified-files": "chmod +x ./scripts/tsc-modified-files.sh && SINCE_DAYS=30 ./scripts/tsc-modified-files.sh master tsconfig.typecheck.json",
107
+ "test:typecheck-mocks": "echo 'Typechecking mock files...' && NODE_OPTIONS=--max-old-space-size=4096 time tsc -p tsconfig.mocks.json",
108
+ "test:typecheck-mocks-modified-files": "chmod +x ./scripts/tsc-modified-files.sh && SINCE_DAYS=30 ./scripts/tsc-modified-files.sh master tsconfig.mocks.json",
109
+ "test": "pnpm lint-modified-files && pnpm test:typecheck-modified-files && pnpm test:typecheck-mocks-modified-files && vitest run --typecheck",
110
+ "test:full": "pnpm test:typecheck-modified-files && pnpm test:typecheck-mocks-modified-files && vitest run --typecheck",
111
+ "lint": "eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0 --fix",
112
+ "lint-modified-files": "chmod +x ./scripts/lint-modified-files.sh && ./scripts/lint-modified-files.sh",
113
+ "lint:fix-modified-files": "chmod +x ./scripts/lint-modified-files.sh && LINT_FIX=true ./scripts/lint-modified-files.sh",
114
+ "tsc-modified-files": "chmod +x ./scripts/tsc-modified-files.sh && ./scripts/tsc-modified-files.sh",
115
+ "typecheck": "tsc --noEmit",
116
+ "circular-dependency": "madge --circular --extensions ts ./src",
117
+ "circular-dependency-modified-files": "chmod +x ./scripts/circular-dependency-modified-files.sh && ./scripts/circular-dependency-modified-files.sh",
118
+ "build": "chmod +x ./scripts/run_build.sh && ./scripts/run_build.sh && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
119
+ "only-build": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc && tsc -p tsconfig.esm.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
120
+ "only-build-dev": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc -p tsconfig.dev.json && tsc -p tsconfig.esm.dev.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
121
+ "format": "prettier --write --ignore-unknown \"src/**/*\" && pnpm lint",
122
+ "format-watch": "bash ./scripts/run-format-watch.sh",
123
+ "check-version": "node ./scripts/check_version.js",
124
+ "version": "git add -A src",
125
+ "postversion": "git push && git push --tags",
126
+ "check-dependencies": "node ./scripts/check_dependencies.js",
127
+ "clean-overrides": "node ./scripts/clean_overrides.js",
128
+ "create-or-update-release-branch": "chmod +x ./scripts/create_or_update_release_branch.sh && ./scripts/create_or_update_release_branch.sh",
129
+ "bump-versions-master": "chmod +x ./scripts/bump_versions_master.sh && ./scripts/bump_versions_master.sh",
130
+ "bump-versions-beta": "chmod +x ./scripts/bump_versions_beta.sh && ./scripts/bump_versions_beta.sh",
131
+ "bump-update-web-app-cockpit-beta": "chmod +x ./scripts/bump_and_update_web_app_ui_beta.sh && ./scripts/bump_and_update_web_app_ui_beta.sh",
132
+ "send-release-notes": "chmod +x ./scripts/send_release_notes.sh && ./scripts/send_release_notes.sh",
133
+ "update-slack-group-topic": "chmod +x ./scripts/update-slack-group-topic.sh && ./scripts/update-slack-group-topic.sh",
134
+ "build-beta-and-copy": "chmod +x ./scripts/build_and_copy.sh && ./scripts/build_and_copy.sh",
135
+ "pr-approvals-update": "chmod +x ./scripts/pr_approvals.sh && ./scripts/pr_approvals.sh",
136
+ "raise-pr-automation": "chmod +x ./scripts/raise_pr_automation.sh && ./scripts/raise_pr_automation.sh",
137
+ "test:file": "bash ./scripts/test-file.sh",
138
+ "find-unused-code": "knip"
172
139
  }
173
- }
140
+ }