Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(publish): watch mode #24

Open
wants to merge 24 commits into
base: develop
Choose a base branch
from

Conversation

roryabraham
Copy link

@roryabraham roryabraham commented Jun 8, 2024

Fixes #22

This PR adds a --watch flag to the publish command. If the source file is deleted and re-created (as is the case for some build systems, such as https://github.com/callstack/react-native-builder-bob), then the --watch flag will re-establish the hard link with the new file in the source file path.

@privatenumber
Copy link
Owner

Will pick up the work in this PR

@roryabraham
Copy link
Author

Awesome! Hopefully what I had here helps 🙂

@privatenumber privatenumber marked this pull request as ready for review August 4, 2024 08:46
@privatenumber privatenumber changed the title Add watch flag for publish command feat(publish): watch mode Aug 4, 2024
@privatenumber
Copy link
Owner

privatenumber commented Aug 4, 2024

@roryabraham Would you mind reviewing this PR whenever?
I plan to release this soon but no rush—feel free to review even afterwards.

You can test it with

npx 'privatenumber/link#npm/publish-watch'

(FYI GitHub Actions is stuck right now)

}

await hardlinkPackage(
const throttledHardlinkPackage = throttle(hardlinkPackage, 500);
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not immediately clear to me why you chose to throttle this function. Maybe a code comment would be a good idea here.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also was curious so I investigated a bit the difference between throttleit and p-throttle. I think throttleit is appropriate here 👍🏼, since I assume we want to discard any but the last invocation of hardlinkPackage in an interval

@@ -38,12 +39,14 @@
"execa": "^8.0.1",
"fs-fixture": "^2.4.0",
"get-node": "^15.0.1",
"glob-to-regexp": "^0.4.1",
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed that this dependency is marked as archived/read-only, while a more popular alternative https://github.com/isaacs/minimatch is still actively maintained (and apparently used by npm internals).

Was there some reason you chose glob-to-regex instead?

continue;
}

const shouldIgnore = ignoreFiles.some(ignoreFile => ignoreFile.test(filename));
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably doesn't matter too much, but one thing you could consider if you're sticking with globToRegexp is joining the regexes together then calling test just once rather than in a loop:

diff --git a/src/commands/publish/link-publish-mode.ts b/src/commands/publish/link-publish-mode.ts
index e0b535c..69caad3 100644
--- a/src/commands/publish/link-publish-mode.ts
+++ b/src/commands/publish/link-publish-mode.ts
@@ -79,7 +79,7 @@ export const linkPublishMode = async (
 		 * npm-packlist ignore list:
 		 * https://github.com/npm/npm-packlist/blob/v8.0.2/lib/index.js#L15-L38
 		 */
-		const ignoreFiles = [
+		const ignoreFiles = new RegExp([
 			// Files
 			'**/{npm-debug.log,*.orig,package-lock.json,yarn.lock,pnpm-lock.yaml}',
 
@@ -91,7 +91,8 @@ export const linkPublishMode = async (
 
 			// Hidden folders
 			'**/.{_*,git,svn,hg,CVS}/**',
-		].map(glob => globToRegexp(glob, globOptions));
+		].map(glob => globToRegexp(glob, globOptions).source)
+		 .join('|'));
 
 		const watcher = fs.watch(
 			absoluteLinkPackagePath,
@@ -103,7 +104,7 @@ export const linkPublishMode = async (
 				continue;
 			}
 
-			const shouldIgnore = ignoreFiles.some(ignoreFile => ignoreFile.test(filename));
+			const shouldIgnore = ignoreFiles.test(filename);
 			if (shouldIgnore) {
 				continue;
 			}

@roryabraham
Copy link
Author

So I've tested this with my full e2e testing flow and it seems closer than what I had before. If I run:

npx 'privatenumber/link#npm/publish-watch' publish --watch ~/react-native-live-markdown

then the files in ~/react-native-live-markdown are correctly linked to node_modules/@expensify/react-native-live-markdown.

When I change files in ~/react-native-live-markdown, I've got a nodemon process that will re-run the build of that dependency. npx link will correctly observe that the file changed, but it seems like there's some race condition, and I end up with an error:

Error: ENOENT: no such file or directory, lstat '/Users/roryabraham/react-native-live-markdown/lib/module/MarkdownTextInput.js'

manually inspecting my filesystem a moment later, I see that file does exist.

More logs
10:46:56 AM Detected change in ../../react-native-live-markdown/src/MarkdownTextInput.web.tsx

Linking @expensify/react-native-live-markdown in publish mode:
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/LICENSE → ../../react-native-live-markdown/LICENSE
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/cpp/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/MarkdownTextInput.css → ../../react-native-live-markdown/src/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/android/build.gradle → ../../react-native-live-markdown/android/build.gradle
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/module/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.h → ../../react-native-live-markdown/ios/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/commonjs/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.h → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.h → ../../react-native-live-markdown/ios/RCTMarkdownStyle.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.h → ../../react-native-live-markdown/ios/MarkdownLayoutManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.h → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.h → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.h → ../../react-native-live-markdown/ios/RCTMarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/browserUtils.js → ../../react-native-live-markdown/lib/module/web/browserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java → ../../react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/index.js → ../../react-native-live-markdown/lib/commonjs/index.js
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeProxy.java → ../../react-native-live-markdown/android/src/oldarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/NativeProxy.java → ../../react-native-live-markdown/android/src/newarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/cursorUtils.js → ../../react-native-live-markdown/lib/commonjs/web/cursorUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/index.js → ../../react-native-live-markdown/lib/module/index.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/browserUtils.js → ../../react-native-live-markdown/lib/commonjs/web/browserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js → ../../react-native-live-markdown/lib/module/web/InputHistory.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/InputHistory.js → ../../react-native-live-markdown/lib/commonjs/web/InputHistory.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.js → ../../react-native-live-markdown/lib/module/MarkdownTextInput.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.web.js → ../../react-native-live-markdown/lib/module/MarkdownTextInput.web.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js → ../../react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js → ../../react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js → ../../react-native-live-markdown/lib/module/web/cursorUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js → ../../react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/parserUtils.js → ../../react-native-live-markdown/lib/commonjs/web/parserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/react-native-web.d.js → ../../react-native-live-markdown/lib/commonjs/react-native-web.d.js
  ✔ node_modules/@expensify/react-native-live-markdown/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/styleUtils.js → ../../react-native-live-markdown/lib/module/styleUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/package.json → ../../react-native-live-markdown/package.json
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/react-native-web.d.js → ../../react-native-live-markdown/lib/module/react-native-web.d.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js → ../../react-native-live-markdown/lib/module/web/parserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/styleUtils.js → ../../react-native-live-markdown/lib/commonjs/styleUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/react-native.config.js → ../../react-native-live-markdown/react-native.config.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/browserUtils.js.map → ../../react-native-live-markdown/lib/module/web/browserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js.map → ../../react-native-live-markdown/lib/module/web/cursorUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/browserUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/browserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/index.js.map → ../../react-native-live-markdown/lib/commonjs/index.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/cursorUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/cursorUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/index.js.map → ../../react-native-live-markdown/lib/module/index.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js.map → ../../react-native-live-markdown/lib/module/web/InputHistory.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/index.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.web.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInput.web.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInput.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js.map → ../../react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/parserUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/parserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/InputHistory.js.map → ../../react-native-live-markdown/lib/commonjs/web/InputHistory.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/styleUtils.js.map → ../../react-native-live-markdown/lib/commonjs/styleUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js.map → ../../react-native-live-markdown/lib/module/web/parserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/styleUtils.js.map → ../../react-native-live-markdown/lib/module/styleUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js.map → ../../react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/react-native-web.d.js.map → ../../react-native-live-markdown/lib/commonjs/react-native-web.d.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/react-native-web.d.js.map → ../../react-native-live-markdown/lib/module/react-native-web.d.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.mm → ../../react-native-live-markdown/ios/MarkdownLayoutManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/README.md → ../../react-native-live-markdown/README.md
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.mm → ../../react-native-live-markdown/ios/RCTMarkdownStyle.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/RNLiveMarkdown.podspec → ../../react-native-live-markdown/RNLiveMarkdown.podspec
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.mm → ../../react-native-live-markdown/ios/RCTMarkdownUtils.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.mm → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.mm → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/android/gradle.properties → ../../react-native-live-markdown/android/gradle.properties
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/android/proguard-rules.pro → ../../react-native-live-markdown/android/proguard-rules.pro
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.mm → ../../react-native-live-markdown/ios/MarkdownCommitHook.mm
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/cursorUtils.ts → ../../react-native-live-markdown/src/web/cursorUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/InputHistory.ts → ../../react-native-live-markdown/src/web/InputHistory.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts → ../../react-native-live-markdown/lib/typescript/src/index.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/browserUtils.ts → ../../react-native-live-markdown/src/web/browserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts → ../../react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/NativeLiveMarkdownModule.ts → ../../react-native-live-markdown/src/NativeLiveMarkdownModule.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/index.tsx → ../../react-native-live-markdown/src/index.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/cpp/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/src/styleUtils.ts → ../../react-native-live-markdown/src/styleUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/parserUtils.ts → ../../react-native-live-markdown/src/web/parserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifest.xml → ../../react-native-live-markdown/android/src/main/AndroidManifest.xml
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/src/react-native-web.d.ts → ../../react-native-live-markdown/src/react-native-web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.web.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.web.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifestNew.xml → ../../react-native-live-markdown/android/src/main/AndroidManifestNew.xml

10:46:58 AM Detected rename in ../../react-native-live-markdown/lib/commonjs/index.js.map

Linking @expensify/react-native-live-markdown in publish mode:
Error: ENOENT: no such file or directory, lstat '/Users/roryabraham/react-native-live-markdown/lib/module/MarkdownTextInput.js'

I'm thinking what's happening is something like:

  1. Source file changes in dependency
  2. npx link notices the change and begins re-linking the file
  3. Watched build in dependency clears out the build folder (~/react-native-live-markdown/lib in my case) and starts writing new compiled files into it
  4. Sometime during the previous step, npx link tries to hardlink to a file in ~/react-native-live-markdown/lib that isn't present yet. Then it crashes.

@roryabraham
Copy link
Author

Maybe a solution would be to wrap the call to throttledHardlinkPackage on line 121 in link-publish-mode.ts in a try/catch that will essentially poll for the expected source file and wait for it to show up. And if it doesn't, maybe just log a warning but don't crash the watch process (that way, if someone intentionally deletes a source file in a linked dependency, it won't crash npx link)

@privatenumber
Copy link
Owner

Thanks @roryabraham

Can you try it again?

I pushed the following changes:

  • try-catch on the stat
  • no minification to help debugging
npx 'privatenumber/link#npm/publish-watch' publish --watch <pkg>

@roryabraham
Copy link
Author

Having a similar issue as before:

12:46:54 PM Detected rename in ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map

Error: ENOENT: no such file or directory, lstat '/Users/roryabraham/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts'

To make sure I got the up-to-date code, I'll try checking out this branch and running link locally rather than over npx

@roryabraham
Copy link
Author

Running it locally (so I for sure was using the up-to-date code from this branch). This time I got a different set of errors:

logs
node ~/link/dist/cli.js publish --watch ~/react-native-live-markdown                   
Linking @expensify/react-native-live-markdown in publish mode:
  ✔ node_modules/@expensify/react-native-live-markdown/LICENSE → ../../react-native-live-markdown/LICENSE
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/cpp/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/MarkdownTextInput.css → ../../react-native-live-markdown/src/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.h → ../../react-native-live-markdown/ios/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/build.gradle → ../../react-native-live-markdown/android/build.gradle
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.h → ../../react-native-live-markdown/ios/MarkdownLayoutManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.h → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.h → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.h → ../../react-native-live-markdown/ios/RCTMarkdownStyle.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.h → ../../react-native-live-markdown/ios/RCTMarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.h → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java → ../../react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/commonjs/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeProxy.java → ../../react-native-live-markdown/android/src/oldarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/NativeProxy.java → ../../react-native-live-markdown/android/src/newarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/browserUtils.js → ../../react-native-live-markdown/lib/commonjs/web/browserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/index.js → ../../react-native-live-markdown/lib/commonjs/index.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/cursorUtils.js → ../../react-native-live-markdown/lib/commonjs/web/cursorUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/InputHistory.js → ../../react-native-live-markdown/lib/commonjs/web/InputHistory.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js → ../../react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.js
  ✔ node_modules/@expensify/react-native-live-markdown/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/react-native-web.d.js → ../../react-native-live-markdown/lib/commonjs/react-native-web.d.js
  ✔ node_modules/@expensify/react-native-live-markdown/react-native.config.js → ../../react-native-live-markdown/react-native.config.js
  ✔ node_modules/@expensify/react-native-live-markdown/package.json → ../../react-native-live-markdown/package.json
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/index.js.map → ../../react-native-live-markdown/lib/commonjs/index.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/browserUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/browserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/parserUtils.js → ../../react-native-live-markdown/lib/commonjs/web/parserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/styleUtils.js → ../../react-native-live-markdown/lib/commonjs/styleUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/cursorUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/cursorUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/InputHistory.js.map → ../../react-native-live-markdown/lib/commonjs/web/InputHistory.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js.map → ../../react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/react-native-web.d.js.map → ../../react-native-live-markdown/lib/commonjs/react-native-web.d.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.mm → ../../react-native-live-markdown/ios/MarkdownCommitHook.mm
  ✔ node_modules/@expensify/react-native-live-markdown/README.md → ../../react-native-live-markdown/README.md
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.mm → ../../react-native-live-markdown/ios/MarkdownLayoutManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.mm → ../../react-native-live-markdown/ios/RCTMarkdownStyle.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.mm → ../../react-native-live-markdown/ios/RCTMarkdownUtils.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.mm → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/RNLiveMarkdown.podspec → ../../react-native-live-markdown/RNLiveMarkdown.podspec
  ✔ node_modules/@expensify/react-native-live-markdown/android/gradle.properties → ../../react-native-live-markdown/android/gradle.properties
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.mm → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.mm
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/browserUtils.ts → ../../react-native-live-markdown/src/web/browserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/proguard-rules.pro → ../../react-native-live-markdown/android/proguard-rules.pro
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/cursorUtils.ts → ../../react-native-live-markdown/src/web/cursorUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/InputHistory.ts → ../../react-native-live-markdown/src/web/InputHistory.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts → ../../react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/NativeLiveMarkdownModule.ts → ../../react-native-live-markdown/src/NativeLiveMarkdownModule.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/parserUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/parserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/parserUtils.ts → ../../react-native-live-markdown/src/web/parserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/react-native-web.d.ts → ../../react-native-live-markdown/src/react-native-web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/index.tsx → ../../react-native-live-markdown/src/index.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/src/styleUtils.ts → ../../react-native-live-markdown/src/styleUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/cpp/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.web.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.web.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifest.xml → ../../react-native-live-markdown/android/src/main/AndroidManifest.xml
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/styleUtils.js.map → ../../react-native-live-markdown/lib/commonjs/styleUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifestNew.xml → ../../react-native-live-markdown/android/src/main/AndroidManifestNew.xml
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/module/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/browserUtils.js → ../../react-native-live-markdown/lib/module/web/browserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/index.js → ../../react-native-live-markdown/lib/module/index.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js → ../../react-native-live-markdown/lib/module/web/cursorUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js → ../../react-native-live-markdown/lib/module/web/InputHistory.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.js → ../../react-native-live-markdown/lib/module/MarkdownTextInput.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.web.js → ../../react-native-live-markdown/lib/module/MarkdownTextInput.web.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js → ../../react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js → ../../react-native-live-markdown/lib/module/web/parserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js → ../../react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/react-native-web.d.js → ../../react-native-live-markdown/lib/module/react-native-web.d.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/styleUtils.js → ../../react-native-live-markdown/lib/module/styleUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/index.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/browserUtils.js.map → ../../react-native-live-markdown/lib/module/web/browserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js.map → ../../react-native-live-markdown/lib/module/web/cursorUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/index.js.map → ../../react-native-live-markdown/lib/module/index.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js.map → ../../react-native-live-markdown/lib/module/web/InputHistory.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInput.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.web.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInput.web.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js.map → ../../react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js.map → ../../react-native-live-markdown/lib/module/web/parserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/react-native-web.d.js.map → ../../react-native-live-markdown/lib/module/react-native-web.d.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/styleUtils.js.map → ../../react-native-live-markdown/lib/module/styleUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts → ../../react-native-live-markdown/lib/typescript/src/index.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts

12:51:32 PM Detected change in ../../react-native-live-markdown/src/MarkdownTextInput.web.tsx

Linking @expensify/react-native-live-markdown in publish mode:
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/LICENSE → ../../react-native-live-markdown/LICENSE
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/commonjs/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/module/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/android/build.gradle → ../../react-native-live-markdown/android/build.gradle
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/cpp/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.h → ../../react-native-live-markdown/ios/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/MarkdownTextInput.css → ../../react-native-live-markdown/src/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.h → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.h → ../../react-native-live-markdown/ios/MarkdownLayoutManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.h → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.h → ../../react-native-live-markdown/ios/RCTMarkdownStyle.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.h → ../../react-native-live-markdown/ios/RCTMarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.h → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java → ../../react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/NativeProxy.java → ../../react-native-live-markdown/android/src/newarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeProxy.java → ../../react-native-live-markdown/android/src/oldarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/browserUtils.js → ../../react-native-live-markdown/lib/module/web/browserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/browserUtils.js → ../../react-native-live-markdown/lib/commonjs/web/browserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js → ../../react-native-live-markdown/lib/module/web/cursorUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/index.js → ../../react-native-live-markdown/lib/module/index.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/cursorUtils.js → ../../react-native-live-markdown/lib/commonjs/web/cursorUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js → ../../react-native-live-markdown/lib/module/web/InputHistory.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/index.js → ../../react-native-live-markdown/lib/commonjs/index.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/InputHistory.js → ../../react-native-live-markdown/lib/commonjs/web/InputHistory.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.js → ../../react-native-live-markdown/lib/module/MarkdownTextInput.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.web.js → ../../react-native-live-markdown/lib/module/MarkdownTextInput.web.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/parserUtils.js → ../../react-native-live-markdown/lib/commonjs/web/parserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js → ../../react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js → ../../react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js → ../../react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js → ../../react-native-live-markdown/lib/module/web/parserUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/styleUtils.js → ../../react-native-live-markdown/lib/module/styleUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/styleUtils.js → ../../react-native-live-markdown/lib/commonjs/styleUtils.js
  ✔ node_modules/@expensify/react-native-live-markdown/react-native.config.js → ../../react-native-live-markdown/react-native.config.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/react-native-web.d.js → ../../react-native-live-markdown/lib/commonjs/react-native-web.d.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/browserUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/browserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/browserUtils.js.map → ../../react-native-live-markdown/lib/module/web/browserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/package.json → ../../react-native-live-markdown/package.json
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/react-native-web.d.js → ../../react-native-live-markdown/lib/module/react-native-web.d.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/cursorUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/cursorUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js.map → ../../react-native-live-markdown/lib/module/web/cursorUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/index.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/index.js.map → ../../react-native-live-markdown/lib/module/index.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/InputHistory.js.map → ../../react-native-live-markdown/lib/commonjs/web/InputHistory.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/index.js.map → ../../react-native-live-markdown/lib/commonjs/index.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js.map → ../../react-native-live-markdown/lib/module/web/InputHistory.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.web.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInput.web.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInput.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInput.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js.map → ../../react-native-live-markdown/lib/commonjs/NativeLiveMarkdownModule.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map → ../../react-native-live-markdown/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map → ../../react-native-live-markdown/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js.map → ../../react-native-live-markdown/lib/module/NativeLiveMarkdownModule.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/parserUtils.js.map → ../../react-native-live-markdown/lib/commonjs/web/parserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js.map → ../../react-native-live-markdown/lib/module/web/parserUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/react-native-web.d.js.map → ../../react-native-live-markdown/lib/commonjs/react-native-web.d.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/react-native-web.d.js.map → ../../react-native-live-markdown/lib/module/react-native-web.d.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/commonjs/styleUtils.js.map → ../../react-native-live-markdown/lib/commonjs/styleUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/README.md → ../../react-native-live-markdown/README.md
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.mm → ../../react-native-live-markdown/ios/MarkdownLayoutManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/lib/module/styleUtils.js.map → ../../react-native-live-markdown/lib/module/styleUtils.js.map
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.mm → ../../react-native-live-markdown/ios/MarkdownCommitHook.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.mm → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.mm → ../../react-native-live-markdown/ios/RCTMarkdownStyle.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.mm → ../../react-native-live-markdown/ios/RCTMarkdownUtils.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/RNLiveMarkdown.podspec → ../../react-native-live-markdown/RNLiveMarkdown.podspec
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.mm → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/android/proguard-rules.pro → ../../react-native-live-markdown/android/proguard-rules.pro
  ✔ node_modules/@expensify/react-native-live-markdown/android/gradle.properties → ../../react-native-live-markdown/android/gradle.properties
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/browserUtils.ts → ../../react-native-live-markdown/src/web/browserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/cursorUtils.ts → ../../react-native-live-markdown/src/web/cursorUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts → ../../react-native-live-markdown/lib/typescript/src/index.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/InputHistory.ts → ../../react-native-live-markdown/src/web/InputHistory.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts → ../../react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/NativeLiveMarkdownModule.ts → ../../react-native-live-markdown/src/NativeLiveMarkdownModule.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/react-native-web.d.ts → ../../react-native-live-markdown/src/react-native-web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/index.tsx → ../../react-native-live-markdown/src/index.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/src/styleUtils.ts → ../../react-native-live-markdown/src/styleUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/parserUtils.ts → ../../react-native-live-markdown/src/web/parserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.web.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.web.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/cpp/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifest.xml → ../../react-native-live-markdown/android/src/main/AndroidManifest.xml
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifestNew.xml → ../../react-native-live-markdown/android/src/main/AndroidManifestNew.xml

12:51:34 PM Detected rename in ../../react-native-live-markdown/lib/commonjs/MarkdownTextInput.web.js.map

Linking @expensify/react-native-live-markdown in publish mode:
  ✔ node_modules/@expensify/react-native-live-markdown/LICENSE → ../../react-native-live-markdown/LICENSE
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/cpp/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp → ../../react-native-live-markdown/android/src/main/new_arch/OnLoad.cpp
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/MarkdownTextInput.css → ../../react-native-live-markdown/src/web/MarkdownTextInput.css
  ✔ node_modules/@expensify/react-native-live-markdown/android/build.gradle → ../../react-native-live-markdown/android/build.gradle
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.h → ../../react-native-live-markdown/ios/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h → ../../react-native-live-markdown/android/src/main/new_arch/MarkdownCommitHook.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorShadowNode.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorState.h
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownShadowFamilyRegistry.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.h → ../../react-native-live-markdown/ios/MarkdownLayoutManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/NativeProxy.h → ../../react-native-live-markdown/android/src/main/new_arch/NativeProxy.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h → ../../react-native-live-markdown/android/src/main/cpp/MarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.h → ../../react-native-live-markdown/ios/RCTMarkdownStyle.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.h → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.h → ../../react-native-live-markdown/ios/RCTMarkdownUtils.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.h → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java
  ✔ node_modules/@expensify/react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h → ../../react-native-live-markdown/cpp/react/renderer/components/RNLiveMarkdownSpec/MarkdownTextInputDecoratorViewComponentDescriptor.h
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownEmojiSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java → ../../react-native-live-markdown/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h → ../../react-native-live-markdown/android/src/main/new_arch/RNLiveMarkdownSpec.h
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java → ../../react-native-live-markdown/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeProxy.java → ../../react-native-live-markdown/android/src/oldarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java → ../../react-native-live-markdown/android/src/oldarch/NativeLiveMarkdownModuleSpec.java
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/newarch/NativeProxy.java → ../../react-native-live-markdown/android/src/newarch/NativeProxy.java
  ✔ node_modules/@expensify/react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/lib/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/parser/react-native-live-markdown-parser.js → ../../react-native-live-markdown/parser/react-native-live-markdown-parser.js
  ✔ node_modules/@expensify/react-native-live-markdown/react-native.config.js → ../../react-native-live-markdown/react-native.config.js
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/index.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/package.json → ../../react-native-live-markdown/package.json
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/README.md → ../../react-native-live-markdown/README.md
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorComponentView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownLayoutManager.mm → ../../react-native-live-markdown/ios/MarkdownLayoutManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorView.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownCommitHook.mm → ../../react-native-live-markdown/ios/MarkdownCommitHook.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm → ../../react-native-live-markdown/ios/MarkdownTextInputDecoratorViewManager.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm → ../../react-native-live-markdown/ios/RCTBackedTextFieldDelegateAdapter+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm → ../../react-native-live-markdown/ios/RCTBaseTextInputView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTLiveMarkdownModule.mm → ../../react-native-live-markdown/ios/RCTLiveMarkdownModule.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownStyle.mm → ../../react-native-live-markdown/ios/RCTMarkdownStyle.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTMarkdownUtils.mm → ../../react-native-live-markdown/ios/RCTMarkdownUtils.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTUITextView+Markdown.mm → ../../react-native-live-markdown/ios/RCTUITextView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm → ../../react-native-live-markdown/ios/RCTTextInputComponentView+Markdown.mm
  ✔ node_modules/@expensify/react-native-live-markdown/android/proguard-rules.pro → ../../react-native-live-markdown/android/proguard-rules.pro
  ✔ node_modules/@expensify/react-native-live-markdown/RNLiveMarkdown.podspec → ../../react-native-live-markdown/RNLiveMarkdown.podspec
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/cursorUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/browserUtils.ts → ../../react-native-live-markdown/src/web/browserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/gradle.properties → ../../react-native-live-markdown/android/gradle.properties
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/browserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/cursorUtils.ts → ../../react-native-live-markdown/src/web/cursorUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/InputHistory.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInput.web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts → ../../react-native-live-markdown/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/index.d.ts → ../../react-native-live-markdown/lib/typescript/src/index.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts.map
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/InputHistory.ts → ../../react-native-live-markdown/src/web/InputHistory.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts → ../../react-native-live-markdown/lib/typescript/src/NativeLiveMarkdownModule.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/NativeLiveMarkdownModule.ts → ../../react-native-live-markdown/src/NativeLiveMarkdownModule.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/styleUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/styleUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts → ../../react-native-live-markdown/lib/typescript/src/web/parserUtils.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/web/parserUtils.ts → ../../react-native-live-markdown/src/web/parserUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/src/react-native-web.d.ts → ../../react-native-live-markdown/src/react-native-web.d.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/new_arch/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/src/index.tsx → ../../react-native-live-markdown/src/index.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/cpp/CMakeLists.txt → ../../react-native-live-markdown/android/src/main/cpp/CMakeLists.txt
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInput.web.tsx → ../../react-native-live-markdown/src/MarkdownTextInput.web.tsx
  ✔ node_modules/@expensify/react-native-live-markdown/src/styleUtils.ts → ../../react-native-live-markdown/src/styleUtils.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifest.xml → ../../react-native-live-markdown/android/src/main/AndroidManifest.xml
  ✔ node_modules/@expensify/react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts → ../../react-native-live-markdown/src/MarkdownTextInputDecoratorViewNativeComponent.ts
  ✔ node_modules/@expensify/react-native-live-markdown/android/src/main/AndroidManifestNew.xml → ../../react-native-live-markdown/android/src/main/AndroidManifestNew.xml
  ✖ Failed to link node_modules/@expensify/react-native-live-markdown/lib/module/web/MarkdownTextInput.css → ../../react-native-live-markdown/lib/module/web/MarkdownTextInput.css ENOENT: no such file or directory, link '/Users/roryabraham/react-native-live-markdown/lib/module/web/MarkdownTextInput.css' -> '/Users/roryabraham/Expensidev/App/node_modules/@expensify/react-native-live-markdown/lib/module/web/MarkdownTextInput.css'
  ✖ Failed to link node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js → ../../react-native-live-markdown/lib/module/web/parserUtils.js ENOENT: no such file or directory, link '/Users/roryabraham/react-native-live-markdown/lib/module/web/parserUtils.js' -> '/Users/roryabraham/Expensidev/App/node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js'
  ✖ Failed to link node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js → ../../react-native-live-markdown/lib/module/web/InputHistory.js EEXIST: file already exists, link '/Users/roryabraham/react-native-live-markdown/lib/module/web/InputHistory.js' -> '/Users/roryabraham/Expensidev/App/node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js'
  ✖ Failed to link node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js.map → ../../react-native-live-markdown/lib/module/web/parserUtils.js.map ENOENT: no such file or directory, link '/Users/roryabraham/react-native-live-markdown/lib/module/web/parserUtils.js.map' -> '/Users/roryabraham/Expensidev/App/node_modules/@expensify/react-native-live-markdown/lib/module/web/parserUtils.js.map'
  ✖ Failed to link node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js.map → ../../react-native-live-markdown/lib/module/web/InputHistory.js.map EEXIST: file already exists, link '/Users/roryabraham/react-native-live-markdown/lib/module/web/InputHistory.js.map' -> '/Users/roryabraham/Expensidev/App/node_modules/@expensify/react-native-live-markdown/lib/module/web/InputHistory.js.map'
Error: ENOENT: no such file or directory, lstat '/Users/roryabraham/react-native-live-markdown/lib/typescript/src/MarkdownTextInput.d.ts'

@privatenumber
Copy link
Owner

Yeah looks like your first request is cached.

Are all those watches being triggered from 1 build? If so, maybe debounce is preferable than throttle.

Since you're running the code directly, are you able to trace back which lines those errors are being thrown from? Feel free to commit a try-catch if you're able to find it.

BTW you should use package.json#files or .npmignore to filter out the non JS files in @expensify/react-native-live-markdown. This will minimize the published package size and reduce the logs on your screen.

@roryabraham
Copy link
Author

roryabraham commented Aug 7, 2024

If so, maybe debounce is preferable than throttle

This makes sense to me - wait for the all the changes to watched files to "settle" before re-linking 👍🏼

Still, relying on that sounds like a flaky solution so I think it would be good to try to get this working with throttle first, then switch to debounce

@privatenumber
Copy link
Owner

You'll have to do it since I can't reproduce the errors you're getting. Feel free to push to this PR.

@roryabraham
Copy link
Author

working on it

@roryabraham
Copy link
Author

roryabraham commented Aug 7, 2024

So while the debounce alone was enough to fix the issues in my case, I managed to fix the error without debounce by adding a simple polling mechanism to wait for source files to show up where they're expected. I set the max timeout to 15s. I also kept the debounce in place because it's more efficient and less noisy.

Maybe it would be beneficial to offer some configurations and documentation for these values. Something like this...

  • --watch - create a watched hard-link for a package. This can be useful for certain build systems that may delete build files before overwriting them. This may break hard-links, so this flag will create a file watcher to re-establish broken hard links.
  • maxBuildTime. If using the --watch flag to link a package in publish mode, what's the maximum time you expect to wait between files being deleted by your build system and having them replaced?
  • pollingInterval. If you are using the --watch flag and this package detects a broken hard link, how frequently should it poll to see if the source file for the hard link is re-established?

what do you think?

@roryabraham
Copy link
Author

At this point this PR is working for my needs. thanks for the help pushing it forward @privatenumber. let me know if you have any feedback or if you think it's worth adding those additional configs I mentioned in the last comment

@roryabraham
Copy link
Author

update: actually, there are more race conditions at play here. Namely, we're executing getNpmPacklist right after the debounced watcher is triggered. This will take an inventory of files by traversing the source package. But if some of those files have been deleted and not re-written yet, then we get an incomplete list. this is further challenged by the fact that we can't simply wait for the files to appear, because there may be some cases where a file in a linked package is intentionally removed by a developer.

@roryabraham
Copy link
Author

ok, I've found a more robust solution. But it requires some work on the side of the linked package. The idea is that in the linked package, you can update your build process to:

  1. Delete a .build_complete file at the start of each build
  2. Write an empty .build_complete file at the end of each build
  3. That way, link can reliably wait for the .build_complete file to appear before running getNpmPacklist and re-establishing hard links

@roryabraham
Copy link
Author

Updated this PR with an implementation that is hopefully both flexible and approachable. Again, I'm open to feedback. Thanks

@privatenumber
Copy link
Owner

Really appreciate your work on this @roryabraham, but I'm not sure if I want to add integrations to that extent. Specifically, I'd like to only support the --watch flag, and would prefer not to add things like a custom file for the build to signal to link with.

I'm curious what kind of build you're running that causes so many race conditions? How long does 1 build iteration take that the debounce fires before the build is done?

In any case, I think it's fine to just do debounce and check if the file exists right before hardlinking and ignore if it no longer exists. If the build is still running, a second debounce pass should run to fix it. Does that sound right?

To make it a little easier for the user to manually intervene on missed changes, we can also listen to the Enter key on stdin to retrigger the link.

@roryabraham
Copy link
Author

Well, really there's only one race condition, it just took a while for me to understand the root cause. It exists between getNpmPacklist and the completion of the build.

I'm curious what kind of build you're running that causes so many race conditions? How long does 1 build iteration take that the debounce fires before the build is done?

I think my build typically takes 2-5 seconds, so a 500ms delay doesn't serve our use case very well. My experience with JS packages (using babel and such for minified builds) is that they rarely compile in <500ms. YMMV, as it may depend on hardware too. I'm working on an M2 MacBook Pro, so it feels unlikely that my hardware is a limiting factor.

People will have lots of different experiences with build times though, so I'm not sure debating what an "average build time" is will be productive.

If the build is still running, a second debounce pass should run to fix it. Does that sound right?

Unfortunately, I don't think this is correct. The reason is that if getNpmPacklist runs when the build is incomplete, then our watcher will stop watching files that are missing from the package manifest. So once the missing files appear, the watcher will ignore them.

This kind of cuts to a core challenge - without a specific file to use as a litmus test for a complete build, we have no way to tell the difference between files being missing and legitimately deleted.

If you're looking for a way to simplify the implementation, here's an alternate idea... we could just ignore that distinction and say that we don't support deleting files in the dependency package (i.e: delete this block). In practice, if we're linking a file that you've deleted, it won't be a problem because in order to legitimately delete a file you also need to delete code references to it.

What that means is that npx link publish --watch would support new files being added and returned by getNpmPacklist, but not deleted. That would improve things in many cases, because we could wait for all expected files to appear before re-linking. However, that still would not be immune to race conditions. For example:

  1. Developer adds a new file, A, in dependency package
  2. Build folder is cleared
  3. debounced relink occurs, but getNpmPacklist doesn't return the compiled version of the new file A' in the manifest, because it hasn't been written to the output folder yet
  4. We wait for all expected files to appear before re-creating hard links. But because A' is missing from the manifest we don't wait for it to appear or link it 💥

All this is to say, I really do think that relying on something like a .build_complete file to appear in the dependency package would be the most robust and reliable solution. I also tried to set up some sensible defaults such that it should work for most people without having to do that, but also included documentation for my recommended approach.

Ultimately, it's your call what you want to do with the package. Happy to discuss further, or if you're confident in what you want to do, I can update the PR accordingly.

@privatenumber
Copy link
Owner

People will have lots of different experiences with build times though, so I'm not sure debating what an "average build time" is will be productive.

I'm not sure where this came from but I was just curious to learn. Keep in mind that I don't experience the issue you're encountering and I haven't been able to reproduce it. That said, it's difficult for me to validate or ideate solutions without fully understanding the problem.

Would it be hard to create a test case to reproduce this race condition?

@roryabraham
Copy link
Author

Yeah, absolutely I can try to work on a minimal reproduction to more clearly illustrate the problem(s) I'm describing. 🙂

My sincere apologies if I sounded confrontational with that comment - that wasn't my intention at all. I merely meant to say that choosing the "appropriate debounce" will likely vary based on the situation.

@privatenumber
Copy link
Owner

Any progress?

No rush btw. If you're unable to find time for this, LMK and I can release a basic version of this and you can open an improvement PR at your leisure.

@roryabraham
Copy link
Author

Hey, sorry I haven't come back to this. Very busy with other work right now, so it's unlikely I'll be able to get back to this in the next few weeks

@privatenumber
Copy link
Owner

No worries at all, I've been busy too. Thanks for letting me know!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add --watch flag for "publish mode"
2 participants