[No QA] Clean up tsconfig projects to split by runtime rather than directory - #99354
Conversation
|
@codex review |
|
@MelvinBot review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d3baadbf68
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Reviewed the tsconfig consolidation end-to-end. The restructure is clean and the tricky parts are handled well — decoupling One concrete thing worth fixing before merge, plus two minor notes. 🟡
|
Keep Bun translation tooling off the React Native import graph while preserving shared runtime values and type contracts.
|
Thanks for the review. Re-added |
…-phase-1 # Conflicts: # src/CONST/index.ts
Keep the monolithic CONST as the source of truth while routing React Native-specific values through platform adapters for Bun tooling.
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index c5a95fd8..027b1547 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1542,7 +1542,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'basierend auf bisherigen Aktivitäten',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `basierend auf den <a href="${rulesLink}">Workspace-Regeln</a>` : 'basierend auf dem Workspace-Regelwerk'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `für ${comment}` : 'Ausgabe'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Rechnungsbericht Nr. ${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Rechnungsbericht Nr. ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} gesendet${comment ? `für ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `Ausgabe von persönlichem Bereich nach ${workspaceName ?? `Chat mit ${reportName}`} verschoben`,
movedToPersonalSpace: 'Ausgabe in persönlichen Bereich verschoben',
@@ -1866,7 +1866,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Wählen Sie die Details aus, die Sie behalten möchten:',
noDifferences: 'Keine Unterschiede zwischen den Transaktionen gefunden',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'an' : 'a';
+ const article = startsWithVowel(field) ? 'an' : 'eine';
return `Bitte wählen Sie ${article} ${field} aus`;
},
pleaseSelectAttendees: 'Bitte wählen Sie Teilnehmende aus',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index fa947524..d442d0f4 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -1265,7 +1265,6 @@ const translations: TranslationDeepObject<typeof en> = {
if (count === 0) {
return duplicates > 0 ? 'Δεν προστέθηκαν κανόνες εμπόρων, καθώς υπάρχουν ήδη όλοι.' : 'Δεν έχουν προστεθεί κανόνες εμπόρου.';
}
-
return {
one: 'Προστέθηκε 1 κανόνας εμπόρου.',
other: `Έχουν προστεθεί ${count} κανόνες εμπόρων.`,
@@ -1597,7 +1596,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'βάσει προηγούμενης δραστηριότητας',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `βάσει των <a href="${rulesLink}">κανόνων του χώρου εργασίας</a>` : 'βάσει κανόνα χώρου εργασίας'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `για ${comment}` : 'δαπάνη'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Αναφορά τιμολογίου #${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Αναφορά τιμολογίου #${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `στάλθηκαν ${formattedAmount}${comment ? `για ${comment}` : ''}`,
movedFromPersonalSpace: (reportName, workspaceName) => `μετακινήθηκε η δαπάνη από τον προσωπικό χώρο στο ${workspaceName ?? `συνομιλήστε με τον/την ${reportName}`}`,
movedToPersonalSpace: 'μετακινήθηκε η δαπάνη στον προσωπικό χώρο',
@@ -1916,7 +1915,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Επιλέξτε τις λεπτομέρειες που θέλετε να διατηρήσετε:',
noDifferences: 'Δεν βρέθηκαν διαφορές μεταξύ των συναλλαγών',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'ένα' : 'α';
+ const article = startsWithVowel(field) ? 'ένα' : 'α';
return `Παρακαλούμε επιλέξτε ${article} ${field}`;
},
pleaseSelectAttendees: 'Παρακαλώ επιλέξτε συμμετέχοντες',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index f90ba1f6..8d0c912b 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -1189,7 +1189,6 @@ const translations: TranslationDeepObject<typeof en> = {
if (count === 0) {
return duplicates > 0 ? 'No se han añadido reglas de comerciante, ya que todas ya existen.' : 'No se han añadido reglas de comerciante.';
}
-
return {
one: 'Se ha añadido 1 regla de comerciante.',
other: `Se han añadido ${count} reglas de comerciante.`,
@@ -1540,7 +1539,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'basado en actividad pasada',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `basado en <a href="${rulesLink}">reglas del espacio de trabajo</a>` : 'basado en regla del espacio de trabajo'),
threadExpenseReportName: (formattedAmount, comment) => `${comment ? `${formattedAmount} para ${comment}` : `Gasto de ${formattedAmount}`}`,
- invoiceReportName: ({linkedReportID}) => `Informe de facturación #${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Informe de factura n.º ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount, comment) => `${formattedAmount} enviado${comment ? ` para ${comment}` : ''}`,
movedFromPersonalSpace: (reportName, workspaceName) => `movió el gasto desde su espacio personal a ${workspaceName ?? `un chat con ${reportName}`}`,
movedToPersonalSpace: 'movió el gasto a su espacio personal',
@@ -1852,7 +1851,10 @@ const translations: TranslationDeepObject<typeof en> = {
header: 'Selecciona los detalles',
pageTitle: 'Selecciona los detalles que deseas conservar:',
noDifferences: 'No se encontraron diferencias entre las transacciones',
- pleaseSelectError: ({field}) => `Por favor, selecciona un(a) ${field}`,
+ pleaseSelectError: ({field}: {field: string}) => {
+ const article = startsWithVowel(field) ? 'un' : 'a';
+ return `Por favor, selecciona ${article} ${field}`;
+ },
pleaseSelectAttendees: 'Por favor, selecciona asistentes',
selectAllDetailsError: 'Selecciona todos los detalles antes de continuar.',
},
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 38c034a3..8a7e43cb 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1546,7 +1546,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnMCC: ({rulesLink}: {rulesLink: string}) =>
rulesLink ? `en fonction des <a href="${rulesLink}">règles de l’espace de travail</a>` : 'en fonction de la règle de l’espace de travail',
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `pour ${comment}` : 'dépense'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Note de frais de facture n° ${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Note de frais de facture n° ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} envoyé${comment ? `pour ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `a déplacé la dépense de l’espace personnel vers ${workspaceName ?? `discuter avec ${reportName}`}`,
movedToPersonalSpace: 'a déplacé la dépense vers l’espace personnel',
@@ -1872,7 +1872,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Sélectionnez les détails que vous souhaitez conserver :',
noDifferences: 'Aucune différence trouvée entre les transactions',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'un' : 'un';
+ const article = startsWithVowel(field) ? 'un' : 'a';
return `Veuillez sélectionner ${article} ${field}`;
},
pleaseSelectAttendees: 'Veuillez sélectionner les participants',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 87a38c60..e5f94c38 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1540,7 +1540,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'in base all’attività precedente',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `in base alle <a href="${rulesLink}">regole dello spazio di lavoro</a>` : 'in base alle regole della workspace'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `per ${comment}` : 'spesa'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Report fattura n. ${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Report fattura n. ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} inviato${comment ? `per ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `ha spostato la spesa dallo spazio personale a ${workspaceName ?? `chatta con ${reportName}`}`,
movedToPersonalSpace: 'ha spostato la spesa nello spazio personale',
@@ -1863,7 +1863,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Seleziona i dettagli che vuoi mantenere:',
noDifferences: 'Nessuna differenza trovata tra le transazioni',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'un' : 'a';
+ const article = startsWithVowel(field) ? 'un' : 'a';
return `Seleziona ${article} ${field}`;
},
pleaseSelectAttendees: 'Seleziona i partecipanti',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index fdb22137..a076a4ef 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1521,7 +1521,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: '過去のアクティビティに基づく',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `<a href="${rulesLink}">ワークスペースルール</a>に基づく` : 'ワークスペースのルールに基づく'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `${comment} 用` : '経費'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `請求書レポート #${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `請求書レポート #${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} を送信済み${comment ? `${comment}用` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `経費を個人スペースから${workspaceName ?? `${reportName}とチャット`}に移動しました`,
movedToPersonalSpace: '経費を個人スペースに移動しました',
@@ -1841,8 +1841,8 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: '保持したい詳細を選択してください:',
noDifferences: '取引間に差異は見つかりませんでした',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'ある' : 'a';
- return `${article} の${field}を選択してください`;
+ const article = startsWithVowel(field) ? '1つの' : 'a';
+ return `${article} ${field} を選択してください`;
},
pleaseSelectAttendees: '出席者を選択してください',
selectAllDetailsError: '続行する前にすべての詳細を選択してください。',
@@ -9024,9 +9024,6 @@ ${reportName}`,
reject: '却下',
duplicateExpense: () => ({
one: '経費を複製',
- // Japanese has no grammatical plural, so `Intl.PluralRules` selects `other` for every count,
- // including 1. The single/bulk distinction here is semantic rather than grammatical, so `other`
- // branches on the count itself to keep 一括 (bulk) on the multi-expense action only.
other: (count: number) => (count === 1 ? '経費を複製' : '経費を一括複製'),
}),
noOptionsAvailable: '選択した経費グループには利用できるオプションがありません。',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index b20d5623..92853b40 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1538,7 +1538,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'op basis van eerdere activiteit',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `op basis van <a href="${rulesLink}">werkruimteregels</a>` : 'op basis van werkruimteregel'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `voor ${comment}` : 'uitgave'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Factuurrapport nr. ${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Factuurrapport nr. ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} verzonden${comment ? `voor ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `heeft uitgave verplaatst van persoonlijke ruimte naar ${workspaceName ?? `chat met ${reportName}`}`,
movedToPersonalSpace: 'heeft uitgave verplaatst naar persoonlijke ruimte',
@@ -1858,8 +1858,8 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Selecteer de details die je wilt behouden:',
noDifferences: 'Geen verschillen gevonden tussen de transacties',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'een' : 'een';
- return `Selecteer ${article} ${field}`;
+ const article = startsWithVowel(field) ? 'een' : 'een';
+ return `Selecteer alsjeblieft ${article} ${field}`;
},
pleaseSelectAttendees: 'Selecteer aanwezigen',
selectAllDetailsError: 'Selecteer alle details voordat je verdergaat.',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 7055403c..a4acf289 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1567,7 +1567,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'na podstawie dotychczasowej aktywności',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `na podstawie <a href="${rulesLink}">zasad przestrzeni roboczej</a>` : 'na podstawie reguły przestrzeni roboczej'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `dla ${comment}` : 'wydatek'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Raport faktury nr ${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Raport faktury nr ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `Wysłano ${formattedAmount}${comment ? `za ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `przeniesiono wydatek z przestrzeni osobistej do ${workspaceName ?? `czat z ${reportName}`}`,
movedToPersonalSpace: 'przeniesiono wydatek do przestrzeni prywatnej',
@@ -1890,7 +1890,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Wybierz szczegóły, które chcesz zachować:',
noDifferences: 'Nie znaleziono różnic między transakcjami',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'włączony' : 'a';
+ const article = startsWithVowel(field) ? 'jeden' : 'a';
return `Wybierz ${article} ${field}`;
},
pleaseSelectAttendees: 'Wybierz uczestników',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index b72a7b75..c4591cdd 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1537,7 +1537,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: 'com base na atividade anterior',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `com base nas <a href="${rulesLink}">regras do workspace</a>` : 'com base na regra do workspace'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `para ${comment}` : 'despesa'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `Relatório de fatura nº ${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `Relatório de fatura nº ${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} enviado${comment ? `para ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `moveu a despesa do espaço pessoal para ${workspaceName ?? `conversar com ${reportName}`}`,
movedToPersonalSpace: 'moveu a despesa para o espaço pessoal',
@@ -1853,7 +1853,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: 'Selecione os detalhes que você quer manter:',
noDifferences: 'Nenhuma diferença encontrada entre as transações',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? 'um' : 'a';
+ const article = startsWithVowel(field) ? 'um' : 'um';
return `Selecione ${article} ${field}`;
},
pleaseSelectAttendees: 'Selecione participantes',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 4ebbb342..49e6e3c7 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1479,7 +1479,7 @@ const translations: TranslationDeepObject<typeof en> = {
basedOnAI: '基于过去的活动',
basedOnMCC: ({rulesLink}: {rulesLink: string}) => (rulesLink ? `基于<a href="${rulesLink}">工作区规则</a>` : '基于工作区规则'),
threadExpenseReportName: (formattedAmount: string, comment?: string) => `${formattedAmount} ${comment ? `用于 ${comment}` : '报销'}`,
- invoiceReportName: ({linkedReportID}: OriginalMessage<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>) => `发票报告 #${linkedReportID}`,
+ invoiceReportName: ({linkedReportID}: OriginalMessageReportPreview) => `发票报表 #${linkedReportID}`,
threadPaySomeoneReportName: (formattedAmount: string, comment?: string) => `已发送 ${formattedAmount}${comment ? `用于 ${comment}` : ''}`,
movedFromPersonalSpace: (reportName?: string, workspaceName?: string) => `已将报销从个人空间移动到 ${workspaceName ?? `与 ${reportName} 聊天`}`,
movedToPersonalSpace: '已将报销移动到个人空间',
@@ -1782,7 +1782,7 @@ const translations: TranslationDeepObject<typeof en> = {
pageTitle: '选择要保留的详细信息:',
noDifferences: '在这些交易之间未发现差异',
pleaseSelectError: ({field}: {field: string}) => {
- const article = StringUtils.startsWithVowel(field) ? '一个' : 'a';
+ const article = startsWithVowel(field) ? '一个' : '一个';
return `请选择${article}${field}`;
},
pleaseSelectAttendees: '请选择参会者',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Document the CONST runtime split, reuse existing translation parameter types, and apply generated locale updates.
|
@codex review |
|
@MelvinBot review |
|
Codex Review: Didn't find any major issues. Keep them coming! Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
Re-reviewed the changes since my last pass — the CONST runtime isolation and translation-type isolation that landed after it. LGTM, no blockers. The prior finding is fixed and the new work is clean. ✅ Prior finding resolved
What I verified on the new surface
🟡 Minor (optional)The only residual is the one I flagged before: the duplicated types in Local web smoke test (inconclusive — environmental)I ran a boot smoke test against the local dev server for the PR's "no console errors" step. The page stayed blank (0 DOM nodes) after a 120s wait, but I'm treating this as a dev-server/session bring-up issue in the test harness, not a regression — on this exact commit, CI's app-rendering checks are all green: the web
|
|
@ChavdaSachin Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
No product, design, or C+ review should be needed here imo:
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0d221220a3
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
blimpich
left a comment
There was a problem hiding this comment.
Wasn't able to find anything to critique on my pass. Claude found a very minor translation issue but otherwise looks good 👍
|
🚧 roryabraham has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |

Explanation of Change
This organizes TypeScript projects by runtime rather than directory, and removes some hacks that were in-place to hardcode certain files in tsconfigs.
web/proxy.ts, and config into the Node project.generateTranslationsimporting the real English translations while isolating CONST's React Native-specific runtime values behind platform adapters.Fixed Issues
$ #99290
Tests
CI only.
Offline tests
n/a
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionScreenshots/Videos
Not applicable: tooling-only change.