@expensify/react-native-live-markdown 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/commonjs/MarkdownTextInput.js +5 -55
  2. package/lib/commonjs/MarkdownTextInput.js.map +1 -1
  3. package/lib/commonjs/MarkdownTextInput.web.js +399 -9
  4. package/lib/commonjs/MarkdownTextInput.web.js.map +1 -1
  5. package/lib/commonjs/react-native-web.d.js +2 -0
  6. package/lib/commonjs/react-native-web.d.js.map +1 -0
  7. package/lib/commonjs/styleUtils.js +61 -0
  8. package/lib/commonjs/styleUtils.js.map +1 -0
  9. package/lib/commonjs/web/InputHistory.js +92 -0
  10. package/lib/commonjs/web/InputHistory.js.map +1 -0
  11. package/lib/commonjs/web/MarkdownTextInput.css +24 -0
  12. package/lib/commonjs/web/cursorUtils.js +90 -0
  13. package/lib/commonjs/web/cursorUtils.js.map +1 -0
  14. package/lib/commonjs/web/parserUtils.js +170 -0
  15. package/lib/commonjs/web/parserUtils.js.map +1 -0
  16. package/lib/module/MarkdownTextInput.js +3 -55
  17. package/lib/module/MarkdownTextInput.js.map +1 -1
  18. package/lib/module/MarkdownTextInput.web.js +399 -12
  19. package/lib/module/MarkdownTextInput.web.js.map +1 -1
  20. package/lib/module/react-native-web.d.js +2 -0
  21. package/lib/module/react-native-web.d.js.map +1 -0
  22. package/lib/module/styleUtils.js +56 -0
  23. package/lib/module/styleUtils.js.map +1 -0
  24. package/lib/module/web/InputHistory.js +85 -0
  25. package/lib/module/web/InputHistory.js.map +1 -0
  26. package/lib/module/web/MarkdownTextInput.css +24 -0
  27. package/lib/module/web/cursorUtils.js +83 -0
  28. package/lib/module/web/cursorUtils.js.map +1 -0
  29. package/lib/module/web/parserUtils.js +162 -0
  30. package/lib/module/web/parserUtils.js.map +1 -0
  31. package/lib/parser/react-native-live-markdown-parser.js +34 -0
  32. package/lib/typescript/src/MarkdownTextInput.d.ts +3 -6
  33. package/lib/typescript/src/MarkdownTextInput.d.ts.map +1 -1
  34. package/lib/typescript/src/MarkdownTextInput.web.d.ts +9 -2
  35. package/lib/typescript/src/MarkdownTextInput.web.d.ts.map +1 -1
  36. package/lib/typescript/src/styleUtils.d.ts +9 -0
  37. package/lib/typescript/src/styleUtils.d.ts.map +1 -0
  38. package/lib/typescript/src/web/InputHistory.d.ts +24 -0
  39. package/lib/typescript/src/web/InputHistory.d.ts.map +1 -0
  40. package/lib/typescript/src/web/cursorUtils.d.ts +8 -0
  41. package/lib/typescript/src/web/cursorUtils.d.ts.map +1 -0
  42. package/lib/typescript/src/web/parserUtils.d.ts +16 -0
  43. package/lib/typescript/src/web/parserUtils.d.ts.map +1 -0
  44. package/package.json +6 -3
  45. package/parser/react-native-live-markdown-parser.js +7 -7
  46. package/src/MarkdownTextInput.tsx +9 -69
  47. package/src/MarkdownTextInput.web.tsx +516 -16
  48. package/src/react-native-web.d.ts +1 -0
  49. package/src/styleUtils.ts +70 -0
  50. package/src/web/InputHistory.ts +114 -0
  51. package/src/web/MarkdownTextInput.css +24 -0
  52. package/src/web/cursorUtils.ts +87 -0
  53. package/src/web/parserUtils.ts +194 -0
@@ -1,11 +1,8 @@
1
- import React from 'react';
2
1
  import { TextInput } from 'react-native';
2
+ import React from 'react';
3
3
  import type { TextInputProps } from 'react-native';
4
- import type * as MarkdownTextInputDecoractorView from './MarkdownTextInputDecoratorViewNativeComponent';
5
- type MarkdownStyle = MarkdownTextInputDecoractorView.MarkdownStyle;
6
- type PartialMarkdownStyle = Partial<{
7
- [K in keyof MarkdownStyle]: Partial<MarkdownStyle[K]>;
8
- }>;
4
+ import type * as StyleUtilsTypes from './styleUtils';
5
+ type PartialMarkdownStyle = StyleUtilsTypes.PartialMarkdownStyle;
9
6
  interface MarkdownTextInputProps extends TextInputProps {
10
7
  markdownStyle?: PartialMarkdownStyle;
11
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownTextInput.d.ts","sourceRoot":"","sources":["../../../src/MarkdownTextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAuB,SAAS,EAAe,MAAM,cAAc,CAAC;AAC3E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,KAAK,+BAA+B,MAAM,iDAAiD,CAAC;AAGxG,KAAK,aAAa,GAAG,+BAA+B,CAAC,aAAa,CAAC;AA6CnE,KAAK,oBAAoB,GAAG,OAAO,CAAC;KACjC,CAAC,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CACtD,CAAC,CAAC;AAsCH,UAAU,sBAAuB,SAAQ,cAAc;IACrD,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,QAAA,MAAM,iBAAiB,0FAiBrB,CAAC;AAaH,YAAY,EAAC,oBAAoB,IAAI,aAAa,EAAE,sBAAsB,EAAC,CAAC;AAE5E,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"MarkdownTextInput.d.ts","sourceRoot":"","sources":["../../../src/MarkdownTextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAe,MAAM,cAAc,CAAC;AACjE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAIjD,OAAO,KAAK,KAAK,eAAe,MAAM,cAAc,CAAC;AAErD,KAAK,oBAAoB,GAAG,eAAe,CAAC,oBAAoB,CAAC;AAGjE,UAAU,sBAAuB,SAAQ,cAAc;IACrD,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAuBD,QAAA,MAAM,iBAAiB,0FAiBrB,CAAC;AAaH,YAAY,EAAC,oBAAoB,IAAI,aAAa,EAAE,sBAAsB,EAAC,CAAC;AAE5E,eAAe,iBAAiB,CAAC"}
@@ -1,7 +1,14 @@
1
- import { TextInput } from 'react-native';
1
+ import type { TextInput, TextInputProps } from 'react-native';
2
2
  import React from 'react';
3
- import type { TextInputProps } from 'react-native';
3
+ import type { MouseEvent } from 'react';
4
+ import type * as MarkdownTextInputDecoratorViewNativeComponent from './MarkdownTextInputDecoratorViewNativeComponent';
5
+ import './web/MarkdownTextInput.css';
6
+ type MarkdownStyle = MarkdownTextInputDecoratorViewNativeComponent.MarkdownStyle;
4
7
  interface MarkdownTextInputProps extends TextInputProps {
8
+ markdownStyle?: MarkdownStyle;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ dir?: string;
11
+ disabled?: boolean;
5
12
  }
6
13
  declare const MarkdownTextInput: React.ForwardRefExoticComponent<MarkdownTextInputProps & React.RefAttributes<TextInput>>;
7
14
  export default MarkdownTextInput;
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownTextInput.web.d.ts","sourceRoot":"","sources":["../../../src/MarkdownTextInput.web.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAGjD,UAAU,sBAAuB,SAAQ,cAAc;CAEtD;AAGD,QAAA,MAAM,iBAAiB,0FAQrB,CAAC;AAEH,eAAe,iBAAiB,CAAC;AAEjC,YAAY,EAAC,sBAAsB,EAAC,CAAC"}
1
+ {"version":3,"file":"MarkdownTextInput.web.d.ts","sourceRoot":"","sources":["../../../src/MarkdownTextInput.web.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EAKT,cAAc,EAGf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAgD,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,EAAwE,UAAU,EAAgC,MAAM,OAAO,CAAC;AAK5I,OAAO,KAAK,KAAK,6CAA6C,MAAM,iDAAiD,CAAC;AACtH,OAAO,6BAA6B,CAAC;AAgCrC,KAAK,aAAa,GAAG,6CAA6C,CAAC,aAAa,CAAC;AAEjF,UAAU,sBAAuB,SAAQ,cAAc;IACrD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkED,QAAA,MAAM,iBAAiB,0FA0XtB,CAAC;AAoBF,eAAe,iBAAiB,CAAC;AAEjC,YAAY,EAAC,sBAAsB,EAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type * as MarkdownTextInputDecoractorView from './MarkdownTextInputDecoratorViewNativeComponent';
2
+ type MarkdownStyle = MarkdownTextInputDecoractorView.MarkdownStyle;
3
+ type PartialMarkdownStyle = Partial<{
4
+ [K in keyof MarkdownStyle]: Partial<MarkdownStyle[K]>;
5
+ }>;
6
+ declare function mergeMarkdownStyleWithDefault(input: PartialMarkdownStyle | undefined): MarkdownStyle;
7
+ export type { PartialMarkdownStyle };
8
+ export { mergeMarkdownStyleWithDefault };
9
+ //# sourceMappingURL=styleUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleUtils.d.ts","sourceRoot":"","sources":["../../../src/styleUtils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,+BAA+B,MAAM,iDAAiD,CAAC;AAExG,KAAK,aAAa,GAAG,+BAA+B,CAAC,aAAa,CAAC;AAEnE,KAAK,oBAAoB,GAAG,OAAO,CAAC;KACjC,CAAC,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CACtD,CAAC,CAAC;AA6CH,iBAAS,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,GAAG,aAAa,CAa7F;AAED,YAAY,EAAC,oBAAoB,EAAC,CAAC;AAEnC,OAAO,EAAC,6BAA6B,EAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ type HistoryItem = {
3
+ text: string;
4
+ cursorPosition: number | null;
5
+ };
6
+ export default class InputHistory {
7
+ depth: number;
8
+ history: HistoryItem[];
9
+ historyIndex: number;
10
+ currentText: string | null;
11
+ timeout: NodeJS.Timeout | null;
12
+ debounceTime: number;
13
+ constructor(depth: number, debounceTime?: number);
14
+ getCurrentItem(): HistoryItem | null;
15
+ setHistory(newHistory: HistoryItem[]): void;
16
+ setHistoryIndex(index: number): void;
17
+ clear(): void;
18
+ debouncedAdd(text: string, cursorPosition: number): void;
19
+ add(text: string, cursorPosition: number): void;
20
+ undo(): HistoryItem | null;
21
+ redo(): HistoryItem | null;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=InputHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputHistory.d.ts","sourceRoot":"","sources":["../../../../src/web/InputHistory.ts"],"names":[],"mappings":";AAAA,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,KAAK,EAAE,MAAM,CAAC;IAEd,OAAO,EAAE,WAAW,EAAE,CAAC;IAEvB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAElC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;IAEtC,YAAY,EAAE,MAAM,CAAC;gBAET,KAAK,EAAE,MAAM,EAAE,YAAY,SAAM;IAO7C,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI;IAK3C,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC,KAAK,IAAI,IAAI;IAKb,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAgBxD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAoB/C,IAAI,IAAI,WAAW,GAAG,IAAI;IAgB1B,IAAI,IAAI,WAAW,GAAG,IAAI;CAkB3B"}
@@ -0,0 +1,8 @@
1
+ declare function setCursorPosition(target: HTMLElement, targetPosition: number, ignoreNewLines?: boolean): void;
2
+ declare function moveCursorToEnd(target: HTMLElement): void;
3
+ declare function getCurrentCursorPosition(target: HTMLElement): {
4
+ start: number;
5
+ end: number;
6
+ };
7
+ export { getCurrentCursorPosition, moveCursorToEnd, setCursorPosition };
8
+ //# sourceMappingURL=cursorUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../src/web/cursorUtils.ts"],"names":[],"mappings":"AAsCA,iBAAS,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,UAAQ,QAQ7F;AAED,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,QAS3C;AAiBD,iBAAS,wBAAwB,CAAC,MAAM,EAAE,WAAW;;;EAUpD;AAED,OAAO,EAAC,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type * as StyleUtilsTypes from '../styleUtils';
2
+ type PartialMarkdownStyle = StyleUtilsTypes.PartialMarkdownStyle;
3
+ type MarkdownType = 'bold' | 'italic' | 'strikethrough' | 'link' | 'code' | 'pre' | 'blockquote' | 'h1' | 'syntax' | 'mention-here' | 'mention-user';
4
+ type MarkdownRange = {
5
+ type: MarkdownType;
6
+ startIndex: number;
7
+ length: number;
8
+ };
9
+ declare function parseRangesToHTMLNodes(text: string, ranges: MarkdownRange[], markdownStyle?: PartialMarkdownStyle, disableInlineStyles?: boolean): HTMLElement;
10
+ declare function parseText(target: HTMLElement, text: string, curosrPositionIndex: number | null, markdownStyle?: PartialMarkdownStyle, disableNewLinesInCursorPositioning?: boolean, alwaysMoveCursorToTheEnd?: boolean): {
11
+ text: string;
12
+ cursorPosition: number;
13
+ };
14
+ export { parseText, parseRangesToHTMLNodes };
15
+ export type { MarkdownRange, MarkdownType };
16
+ //# sourceMappingURL=parserUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parserUtils.d.ts","sourceRoot":"","sources":["../../../../src/web/parserUtils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,eAAe,MAAM,eAAe,CAAC;AAEtD,KAAK,oBAAoB,GAAG,eAAe,CAAC,oBAAoB,CAAC;AAEjE,KAAK,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,IAAI,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAErJ,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAoEF,iBAAS,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,aAAa,GAAE,oBAAyB,EAAE,mBAAmB,UAAQ,GAAG,WAAW,CAkEzJ;AAED,iBAAS,SAAS,CAChB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,aAAa,GAAE,oBAAyB,EACxC,kCAAkC,UAAQ,EAC1C,wBAAwB,UAAQ;;;EAoCjC;AAED,OAAO,EAAC,SAAS,EAAE,sBAAsB,EAAC,CAAC;AAE3C,YAAY,EAAC,aAAa,EAAE,YAAY,EAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expensify/react-native-live-markdown",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Drop-in replacement for React Native's TextInput component with Markdown formatting.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -36,7 +36,7 @@
36
36
  "lint:parser": "eslint parser --ext .js,.ts,.tsx",
37
37
  "lint:web": "eslint WebExample --ext .js,.ts,.tsx",
38
38
  "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
39
- "prepare": "bob build",
39
+ "prepare": "bob build && mkdir -p lib/parser && cp parser/react-native-live-markdown-parser.js lib/parser/react-native-live-markdown-parser.js",
40
40
  "release": "release-it"
41
41
  },
42
42
  "keywords": [
@@ -85,11 +85,13 @@
85
85
  "eslint-plugin-promise": "^6.1.1",
86
86
  "eslint-plugin-tsdoc": "^0.2.17",
87
87
  "jest": "^28.1.1",
88
+ "jest-environment-jsdom": "^29.7.0",
88
89
  "pod-install": "^0.1.0",
89
90
  "prettier": "^2.0.5",
90
91
  "react": "18.2.0",
91
92
  "react-native": "0.72.9",
92
93
  "react-native-builder-bob": "^0.20.0",
94
+ "react-native-web": "^0.19.10",
93
95
  "release-it": "^15.0.0",
94
96
  "turbo": "^1.10.7",
95
97
  "typescript": "^5.3.3"
@@ -113,7 +115,8 @@
113
115
  "modulePathIgnorePatterns": [
114
116
  "<rootDir>/example/node_modules",
115
117
  "<rootDir>/lib/"
116
- ]
118
+ ],
119
+ "testEnvironment": "jsdom"
117
120
  },
118
121
  "commitlint": {
119
122
  "extends": [