@salve-software/react-native-nitro-jsdom 1.0.0

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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/NitroJsdom.podspec +63 -0
  3. package/README.md +95 -0
  4. package/android/CMakeLists.txt +86 -0
  5. package/android/build.gradle +148 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +5 -0
  8. package/android/src/main/AndroidManifest.xml +2 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  10. package/android/src/main/java/com/nitrojsdom/NitroJsdomPackage.kt +20 -0
  11. package/cpp/HybridHtmlSandbox.cpp +171 -0
  12. package/cpp/HybridHtmlSandbox.hpp +47 -0
  13. package/cpp/lexbor/LexborDocument.cpp +365 -0
  14. package/cpp/lexbor/LexborDocument.hpp +71 -0
  15. package/cpp/quickjs/DOMBindings.cpp +57 -0
  16. package/cpp/quickjs/DOMBindings.hpp +21 -0
  17. package/cpp/quickjs/DOMBindingsInternal.cpp +157 -0
  18. package/cpp/quickjs/DOMBindingsInternal.hpp +83 -0
  19. package/cpp/quickjs/MutationObservers.cpp +546 -0
  20. package/cpp/quickjs/MutationObservers.hpp +127 -0
  21. package/cpp/quickjs/QuickJSRuntime.cpp +475 -0
  22. package/cpp/quickjs/QuickJSRuntime.hpp +110 -0
  23. package/cpp/quickjs/Storage.cpp +130 -0
  24. package/cpp/quickjs/Storage.hpp +40 -0
  25. package/cpp/quickjs/bindings/ClassListBindings.cpp +241 -0
  26. package/cpp/quickjs/bindings/ClassListBindings.hpp +29 -0
  27. package/cpp/quickjs/bindings/DatasetBindings.cpp +120 -0
  28. package/cpp/quickjs/bindings/DatasetBindings.hpp +20 -0
  29. package/cpp/quickjs/bindings/DocumentBindings.cpp +155 -0
  30. package/cpp/quickjs/bindings/DocumentBindings.hpp +19 -0
  31. package/cpp/quickjs/bindings/ElementBindings.cpp +1106 -0
  32. package/cpp/quickjs/bindings/ElementBindings.hpp +19 -0
  33. package/cpp/quickjs/bindings/EventBindings.cpp +352 -0
  34. package/cpp/quickjs/bindings/EventBindings.hpp +21 -0
  35. package/cpp/quickjs/bindings/FetchBindings.cpp +347 -0
  36. package/cpp/quickjs/bindings/FetchBindings.hpp +16 -0
  37. package/cpp/quickjs/bindings/StyleBindings.cpp +245 -0
  38. package/cpp/quickjs/bindings/StyleBindings.hpp +22 -0
  39. package/cpp/quickjs/bindings/TimerBindings.cpp +94 -0
  40. package/cpp/quickjs/bindings/TimerBindings.hpp +16 -0
  41. package/cpp/quickjs/bindings/WindowBindings.cpp +211 -0
  42. package/cpp/quickjs/bindings/WindowBindings.hpp +16 -0
  43. package/ios/Bridge.h +8 -0
  44. package/lib/commonjs/classes/JSDOM/JSDOM.class.js +138 -0
  45. package/lib/commonjs/classes/JSDOM/JSDOM.class.js.map +1 -0
  46. package/lib/commonjs/classes/JSDOM/index.js +17 -0
  47. package/lib/commonjs/classes/JSDOM/index.js.map +1 -0
  48. package/lib/commonjs/classes/JSDOM/types/IFetchOptions.js +2 -0
  49. package/lib/commonjs/classes/JSDOM/types/IFetchOptions.js.map +1 -0
  50. package/lib/commonjs/classes/JSDOM/types/IJSDOMOptions.js +6 -0
  51. package/lib/commonjs/classes/JSDOM/types/IJSDOMOptions.js.map +1 -0
  52. package/lib/commonjs/classes/JSDOM/types/index.js +2 -0
  53. package/lib/commonjs/classes/JSDOM/types/index.js.map +1 -0
  54. package/lib/commonjs/classes/index.js +17 -0
  55. package/lib/commonjs/classes/index.js.map +1 -0
  56. package/lib/commonjs/index.js +17 -0
  57. package/lib/commonjs/index.js.map +1 -0
  58. package/lib/commonjs/package.json +1 -0
  59. package/lib/commonjs/specs/HtmlSandbox.nitro.js +6 -0
  60. package/lib/commonjs/specs/HtmlSandbox.nitro.js.map +1 -0
  61. package/lib/module/classes/JSDOM/JSDOM.class.js +133 -0
  62. package/lib/module/classes/JSDOM/JSDOM.class.js.map +1 -0
  63. package/lib/module/classes/JSDOM/index.js +4 -0
  64. package/lib/module/classes/JSDOM/index.js.map +1 -0
  65. package/lib/module/classes/JSDOM/types/IFetchOptions.js +2 -0
  66. package/lib/module/classes/JSDOM/types/IFetchOptions.js.map +1 -0
  67. package/lib/module/classes/JSDOM/types/IJSDOMOptions.js +4 -0
  68. package/lib/module/classes/JSDOM/types/IJSDOMOptions.js.map +1 -0
  69. package/lib/module/classes/JSDOM/types/index.js +2 -0
  70. package/lib/module/classes/JSDOM/types/index.js.map +1 -0
  71. package/lib/module/classes/index.js +4 -0
  72. package/lib/module/classes/index.js.map +1 -0
  73. package/lib/module/index.js +4 -0
  74. package/lib/module/index.js.map +1 -0
  75. package/lib/module/specs/HtmlSandbox.nitro.js +4 -0
  76. package/lib/module/specs/HtmlSandbox.nitro.js.map +1 -0
  77. package/lib/typescript/src/classes/JSDOM/JSDOM.class.d.ts +74 -0
  78. package/lib/typescript/src/classes/JSDOM/JSDOM.class.d.ts.map +1 -0
  79. package/lib/typescript/src/classes/JSDOM/index.d.ts +3 -0
  80. package/lib/typescript/src/classes/JSDOM/index.d.ts.map +1 -0
  81. package/lib/typescript/src/classes/JSDOM/types/IFetchOptions.d.ts +14 -0
  82. package/lib/typescript/src/classes/JSDOM/types/IFetchOptions.d.ts.map +1 -0
  83. package/lib/typescript/src/classes/JSDOM/types/IJSDOMOptions.d.ts +57 -0
  84. package/lib/typescript/src/classes/JSDOM/types/IJSDOMOptions.d.ts.map +1 -0
  85. package/lib/typescript/src/classes/JSDOM/types/index.d.ts +3 -0
  86. package/lib/typescript/src/classes/JSDOM/types/index.d.ts.map +1 -0
  87. package/lib/typescript/src/classes/index.d.ts +2 -0
  88. package/lib/typescript/src/classes/index.d.ts.map +1 -0
  89. package/lib/typescript/src/index.d.ts +2 -0
  90. package/lib/typescript/src/index.d.ts.map +1 -0
  91. package/lib/typescript/src/specs/HtmlSandbox.nitro.d.ts +13 -0
  92. package/lib/typescript/src/specs/HtmlSandbox.nitro.d.ts.map +1 -0
  93. package/nitro.json +26 -0
  94. package/nitrogen/generated/.gitattributes +1 -0
  95. package/nitrogen/generated/android/NitroJsdom+autolinking.cmake +81 -0
  96. package/nitrogen/generated/android/NitroJsdom+autolinking.gradle +27 -0
  97. package/nitrogen/generated/android/NitroJsdomOnLoad.cpp +49 -0
  98. package/nitrogen/generated/android/NitroJsdomOnLoad.hpp +34 -0
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrojsdom/NitroJsdomOnLoad.kt +35 -0
  100. package/nitrogen/generated/ios/NitroJsdom+autolinking.rb +62 -0
  101. package/nitrogen/generated/ios/NitroJsdom-Swift-Cxx-Bridge.cpp +17 -0
  102. package/nitrogen/generated/ios/NitroJsdom-Swift-Cxx-Bridge.hpp +27 -0
  103. package/nitrogen/generated/ios/NitroJsdom-Swift-Cxx-Umbrella.hpp +38 -0
  104. package/nitrogen/generated/ios/NitroJsdomAutolinking.mm +35 -0
  105. package/nitrogen/generated/ios/NitroJsdomAutolinking.swift +16 -0
  106. package/nitrogen/generated/shared/c++/HybridHtmlSandboxSpec.cpp +26 -0
  107. package/nitrogen/generated/shared/c++/HybridHtmlSandboxSpec.hpp +73 -0
  108. package/package.json +131 -0
  109. package/src/classes/JSDOM/JSDOM.class.ts +145 -0
  110. package/src/classes/JSDOM/index.ts +2 -0
  111. package/src/classes/JSDOM/types/IFetchOptions.ts +14 -0
  112. package/src/classes/JSDOM/types/IJSDOMOptions.ts +57 -0
  113. package/src/classes/JSDOM/types/index.ts +2 -0
  114. package/src/classes/index.ts +1 -0
  115. package/src/index.ts +1 -0
  116. package/src/specs/HtmlSandbox.nitro.ts +33 -0
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from "react-native-nitro-modules";
4
+ function safeParseHeaders(headersJson) {
5
+ try {
6
+ const parsed = JSON.parse(headersJson);
7
+ return parsed && typeof parsed === 'object' ? parsed : {};
8
+ } catch {
9
+ return {};
10
+ }
11
+ }
12
+ export class JSDOM {
13
+ _disposed = false;
14
+ constructor(sandbox) {
15
+ this.sandbox = sandbox;
16
+ }
17
+
18
+ /**
19
+ * Creates a new sandboxed DOM environment.
20
+ *
21
+ * @param html - The initial HTML document string.
22
+ * @param options.runScripts - Execute `<script>` tags found in the HTML. Default: `true`.
23
+ * @param options.url - Value of `window.location.href` inside the sandbox. Default: `'about:blank'`.
24
+ * @param options.pretendToBeVisual - Sets `document.hidden = false`, allowing scripts that
25
+ * gate on page visibility (e.g. `requestAnimationFrame`) to run. Default: `false`.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const dom = JSDOM.create('<html><body><div id="result">0</div></body></html>')
30
+ * await dom.evaluate(`document.getElementById('result').textContent = String(2 + 2)`)
31
+ * const value = await dom.evaluate(`document.getElementById('result').textContent`)
32
+ * // value → "4"
33
+ * dom.dispose()
34
+ * ```
35
+ */
36
+ static create(html, options) {
37
+ const sandbox = NitroModules.createHybridObject('HtmlSandbox');
38
+ sandbox.initialize(html, options?.runScripts ?? true, options?.url ?? 'about:blank');
39
+ if (options?.onConsole) {
40
+ const cb = options.onConsole;
41
+ sandbox.setConsoleCallback((level, args) => cb(level, args));
42
+ } else {
43
+ sandbox.setConsoleCallback(null);
44
+ }
45
+ if (options?.onAlert || options?.onConfirm || options?.onPrompt) {
46
+ sandbox.setDialogCallbacks(options.onAlert ?? null, options.onConfirm ?? null, options.onPrompt ?? null);
47
+ }
48
+ if (options?.onFetch) {
49
+ const onFetch = options.onFetch;
50
+ sandbox.setFetchCallback(async (url, method, headersJson, body) => {
51
+ const headers = safeParseHeaders(headersJson);
52
+ return onFetch(url, {
53
+ method,
54
+ headers,
55
+ body
56
+ }).then(res => JSON.stringify({
57
+ ok: (res.status ?? 200) >= 200 && (res.status ?? 200) < 300,
58
+ status: res.status ?? 200,
59
+ statusText: res.statusText ?? '',
60
+ headersJson: JSON.stringify(res.headers ?? {}),
61
+ body: res.body ?? ''
62
+ })).catch(err => JSON.stringify({
63
+ error: err instanceof Error ? err.message : String(err)
64
+ }));
65
+ });
66
+ }
67
+ return new JSDOM(sandbox);
68
+ }
69
+
70
+ /**
71
+ * Runs arbitrary JavaScript inside the isolated QuickJS sandbox.
72
+ * The return value is coerced to a string (same behaviour as `String(expr)` in JS).
73
+ *
74
+ * This is the **only** door into the sandbox — all DOM queries and mutations must
75
+ * be expressed as JS strings passed to `evaluate()`.
76
+ *
77
+ * @param script - Any valid JS expression or block of statements.
78
+ * @returns The stringified result of the last evaluated expression.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * // Mutate the DOM
83
+ * await dom.evaluate(`document.getElementById('price').textContent = (qty * unitPrice).toFixed(2)`)
84
+ *
85
+ * // Read from the DOM
86
+ * const text = await dom.evaluate(`document.getElementById('price').textContent`)
87
+ * // text → "42.00"
88
+ * ```
89
+ */
90
+ evaluate(script) {
91
+ if (this._disposed) {
92
+ return Promise.reject(new Error("JSDOM instance has been disposed"));
93
+ }
94
+ return this.sandbox.evaluate(script);
95
+ }
96
+
97
+ /**
98
+ * Serializes the current state of the document back to an HTML string.
99
+ * Reflects any DOM mutations made via `evaluate()`.
100
+ *
101
+ * Returns an empty string if called after `dispose()`.
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * await dom.evaluate(`document.title = 'Hello'`)
106
+ * dom.serialize() // "<html><head><title>Hello</title></head>...</html>"
107
+ * ```
108
+ */
109
+ serialize() {
110
+ if (this._disposed) return "";
111
+ return this.sandbox.serialize();
112
+ }
113
+
114
+ /**
115
+ * Frees all native memory held by this sandbox (Lexbor document + QuickJS runtime).
116
+ * After calling `dispose()`, any further `evaluate()` calls will reject with an error.
117
+ * Calling `dispose()` multiple times is safe (idempotent).
118
+ * Always call this when you are done with the sandbox to avoid memory leaks.
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * const dom = JSDOM.create(html)
123
+ * const value = await dom.evaluate(`window.__result`)
124
+ * dom.dispose() // ← always pair with create()
125
+ * ```
126
+ */
127
+ dispose() {
128
+ if (this._disposed) return;
129
+ this._disposed = true;
130
+ this.sandbox = null;
131
+ }
132
+ }
133
+ //# sourceMappingURL=JSDOM.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","safeParseHeaders","headersJson","parsed","JSON","parse","JSDOM","_disposed","constructor","sandbox","create","html","options","createHybridObject","initialize","runScripts","url","onConsole","cb","setConsoleCallback","level","args","onAlert","onConfirm","onPrompt","setDialogCallbacks","onFetch","setFetchCallback","method","body","headers","then","res","stringify","ok","status","statusText","catch","err","error","Error","message","String","evaluate","script","Promise","reject","serialize","dispose"],"sourceRoot":"../../../../src","sources":["classes/JSDOM/JSDOM.class.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export * from './JSDOM.class';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["classes/JSDOM/index.ts"],"mappings":";;AACA,cAAc,eAAe","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=IFetchOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["classes/JSDOM/types/IFetchOptions.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=IJSDOMOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["classes/JSDOM/types/IJSDOMOptions.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["classes/JSDOM/types/index.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export * from './JSDOM';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["classes/index.ts"],"mappings":";;AAAA,cAAc,SAAS","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export * from './classes';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,WAAW","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=HtmlSandbox.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/HtmlSandbox.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,74 @@
1
+ import type { IJSDOMOptions } from "./types";
2
+ export declare class JSDOM {
3
+ private sandbox;
4
+ private _disposed;
5
+ private constructor();
6
+ /**
7
+ * Creates a new sandboxed DOM environment.
8
+ *
9
+ * @param html - The initial HTML document string.
10
+ * @param options.runScripts - Execute `<script>` tags found in the HTML. Default: `true`.
11
+ * @param options.url - Value of `window.location.href` inside the sandbox. Default: `'about:blank'`.
12
+ * @param options.pretendToBeVisual - Sets `document.hidden = false`, allowing scripts that
13
+ * gate on page visibility (e.g. `requestAnimationFrame`) to run. Default: `false`.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const dom = JSDOM.create('<html><body><div id="result">0</div></body></html>')
18
+ * await dom.evaluate(`document.getElementById('result').textContent = String(2 + 2)`)
19
+ * const value = await dom.evaluate(`document.getElementById('result').textContent`)
20
+ * // value → "4"
21
+ * dom.dispose()
22
+ * ```
23
+ */
24
+ static create(html: string, options?: IJSDOMOptions): JSDOM;
25
+ /**
26
+ * Runs arbitrary JavaScript inside the isolated QuickJS sandbox.
27
+ * The return value is coerced to a string (same behaviour as `String(expr)` in JS).
28
+ *
29
+ * This is the **only** door into the sandbox — all DOM queries and mutations must
30
+ * be expressed as JS strings passed to `evaluate()`.
31
+ *
32
+ * @param script - Any valid JS expression or block of statements.
33
+ * @returns The stringified result of the last evaluated expression.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Mutate the DOM
38
+ * await dom.evaluate(`document.getElementById('price').textContent = (qty * unitPrice).toFixed(2)`)
39
+ *
40
+ * // Read from the DOM
41
+ * const text = await dom.evaluate(`document.getElementById('price').textContent`)
42
+ * // text → "42.00"
43
+ * ```
44
+ */
45
+ evaluate(script: string): Promise<string>;
46
+ /**
47
+ * Serializes the current state of the document back to an HTML string.
48
+ * Reflects any DOM mutations made via `evaluate()`.
49
+ *
50
+ * Returns an empty string if called after `dispose()`.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * await dom.evaluate(`document.title = 'Hello'`)
55
+ * dom.serialize() // "<html><head><title>Hello</title></head>...</html>"
56
+ * ```
57
+ */
58
+ serialize(): string;
59
+ /**
60
+ * Frees all native memory held by this sandbox (Lexbor document + QuickJS runtime).
61
+ * After calling `dispose()`, any further `evaluate()` calls will reject with an error.
62
+ * Calling `dispose()` multiple times is safe (idempotent).
63
+ * Always call this when you are done with the sandbox to avoid memory leaks.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const dom = JSDOM.create(html)
68
+ * const value = await dom.evaluate(`window.__result`)
69
+ * dom.dispose() // ← always pair with create()
70
+ * ```
71
+ */
72
+ dispose(): void;
73
+ }
74
+ //# sourceMappingURL=JSDOM.class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSDOM.class.d.ts","sourceRoot":"","sources":["../../../../../src/classes/JSDOM/JSDOM.class.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAY7C,qBAAa,KAAK;IAChB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO;IAIP;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,KAAK;IA2C3D;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOzC;;;;;;;;;;;OAWG;IACH,SAAS,IAAI,MAAM;IAKnB;;;;;;;;;;;;OAYG;IACH,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,3 @@
1
+ export type * from './types';
2
+ export * from './JSDOM.class';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/classes/JSDOM/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAC7B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** The request passed to `onFetch` when `fetch(url, init)` is called inside the sandbox. */
2
+ export interface IFetchRequestInit {
3
+ method: string;
4
+ headers: Record<string, string>;
5
+ body?: string;
6
+ }
7
+ /** The response `onFetch` must resolve with. */
8
+ export interface IFetchResponseInit {
9
+ status: number;
10
+ statusText?: string;
11
+ headers?: Record<string, string>;
12
+ body?: string;
13
+ }
14
+ //# sourceMappingURL=IFetchOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IFetchOptions.d.ts","sourceRoot":"","sources":["../../../../../../src/classes/JSDOM/types/IFetchOptions.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,57 @@
1
+ import type { IFetchRequestInit, IFetchResponseInit } from './IFetchOptions';
2
+ export interface IJSDOMOptions {
3
+ /** Execute <script> tags found in the initial HTML. Default: true */
4
+ runScripts?: boolean;
5
+ /** Value of window.location.href inside the sandbox. Default: 'about:blank' */
6
+ url?: string;
7
+ /** Sets document.hidden = false. Default: false */
8
+ pretendToBeVisual?: boolean;
9
+ /**
10
+ * Callback invoked whenever console.log / warn / error / info / debug is called
11
+ * inside the sandbox. If not provided, console output is silently discarded.
12
+ */
13
+ onConsole?: (level: 'log' | 'warn' | 'error' | 'info' | 'debug', args: string[]) => void;
14
+ /**
15
+ * Callback invoked when `window.alert(message)` is called inside the sandbox.
16
+ * If not provided, alert() is a silent no-op (browser default when no UI is available).
17
+ *
18
+ * WARNING: The callback is synchronous. Do NOT call back into the same sandbox
19
+ * from inside the callback — QuickJS is not re-entrant.
20
+ */
21
+ onAlert?: (message: string) => void;
22
+ /**
23
+ * Callback invoked when `window.confirm(message)` is called inside the sandbox.
24
+ * Must return a boolean. If not provided, confirm() returns false (browser default).
25
+ *
26
+ * WARNING: The callback is synchronous. Do NOT call back into the same sandbox
27
+ * from inside the callback — QuickJS is not re-entrant.
28
+ */
29
+ onConfirm?: (message: string) => boolean;
30
+ /**
31
+ * Callback invoked when `window.prompt(message, defaultValue?)` is called inside
32
+ * the sandbox. Return a string for the user input, or null for a dismissed prompt.
33
+ * If not provided, prompt() returns null (browser default for dismissed prompts).
34
+ *
35
+ * WARNING: The callback is synchronous. Do NOT call back into the same sandbox
36
+ * from inside the callback — QuickJS is not re-entrant.
37
+ */
38
+ onPrompt?: (message: string, defaultValue?: string) => string | null;
39
+ /**
40
+ * Callback invoked when `fetch(url, init)` is called inside the sandbox.
41
+ * Receives the request and must resolve with the response. If not provided,
42
+ * `fetch()` inside the sandbox rejects with "fetch is not available".
43
+ *
44
+ * Typically wired to React Native's real `fetch()`:
45
+ * ```ts
46
+ * onFetch: async (url, init) => {
47
+ * const res = await fetch(url, init)
48
+ * return { status: res.status, statusText: res.statusText, headers: Object.fromEntries(res.headers), body: await res.text() }
49
+ * }
50
+ * ```
51
+ *
52
+ * WARNING: Do NOT call back into the same sandbox (`dom.evaluate()`) from inside
53
+ * this callback — QuickJS is not re-entrant.
54
+ */
55
+ onFetch?: (url: string, init: IFetchRequestInit) => Promise<IFetchResponseInit>;
56
+ }
57
+ //# sourceMappingURL=IJSDOMOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IJSDOMOptions.d.ts","sourceRoot":"","sources":["../../../../../../src/classes/JSDOM/types/IJSDOMOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACzF;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrE;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjF"}
@@ -0,0 +1,3 @@
1
+ export type * from './IJSDOMOptions';
2
+ export type * from './IFetchOptions';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/classes/JSDOM/types/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './JSDOM';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/classes/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './classes';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ export interface HtmlSandbox extends HybridObject<{
3
+ ios: 'c++';
4
+ android: 'c++';
5
+ }> {
6
+ initialize(html: string, runScripts: boolean, url: string): void;
7
+ evaluate(script: string): Promise<string>;
8
+ serialize(): string;
9
+ setConsoleCallback(callback: ((level: string, args: string[]) => void) | null): void;
10
+ setDialogCallbacks(onAlert: ((message: string) => void) | null, onConfirm: ((message: string) => boolean) | null, onPrompt: ((message: string, defaultValue?: string) => string | null) | null): void;
11
+ setFetchCallback(callback: ((url: string, method: string, headersJson: string, body?: string) => Promise<string>) | null): void;
12
+ }
13
+ //# sourceMappingURL=HtmlSandbox.nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlSandbox.nitro.d.ts","sourceRoot":"","sources":["../../../../src/specs/HtmlSandbox.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,WAAY,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;IAE/E,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG1C,SAAS,IAAI,MAAM,CAAC;IAGpB,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAIrF,kBAAkB,CAChB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,EAC3C,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,EAChD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,GAC3E,IAAI,CAAC;IAQR,gBAAgB,CACd,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GACtG,IAAI,CAAC;CACT"}
package/nitro.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://nitro.margelo.com/nitro.schema.json",
3
+ "cxxNamespace": [
4
+ "nitrojsdom"
5
+ ],
6
+ "ios": {
7
+ "iosModuleName": "NitroJsdom"
8
+ },
9
+ "android": {
10
+ "androidNamespace": [
11
+ "nitrojsdom"
12
+ ],
13
+ "androidCxxLibName": "NitroJsdom"
14
+ },
15
+ "autolinking": {
16
+ "HtmlSandbox": {
17
+ "all": {
18
+ "language": "c++",
19
+ "implementationClassName": "HybridHtmlSandbox"
20
+ }
21
+ }
22
+ },
23
+ "ignorePaths": [
24
+ "**/node_modules"
25
+ ]
26
+ }
@@ -0,0 +1 @@
1
+ ** linguist-generated=true
@@ -0,0 +1,81 @@
1
+ #
2
+ # NitroJsdom+autolinking.cmake
3
+ # This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ # https://github.com/mrousavy/nitro
5
+ # Copyright © Marc Rousavy @ Margelo
6
+ #
7
+
8
+ # This is a CMake file that adds all files generated by Nitrogen
9
+ # to the current CMake project.
10
+ #
11
+ # To use it, add this to your CMakeLists.txt:
12
+ # ```cmake
13
+ # include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroJsdom+autolinking.cmake)
14
+ # ```
15
+
16
+ # Define a flag to check if we are building properly
17
+ add_definitions(-DBUILDING_NITROJSDOM_WITH_GENERATED_CMAKE_PROJECT)
18
+
19
+ # Enable Raw Props parsing in react-native (for Nitro Views)
20
+ add_definitions(-DRN_SERIALIZABLE_STATE)
21
+
22
+ # Add all headers that were generated by Nitrogen
23
+ include_directories(
24
+ "../nitrogen/generated/shared/c++"
25
+ "../nitrogen/generated/android/c++"
26
+ "../nitrogen/generated/android/"
27
+ )
28
+
29
+ # Add all .cpp sources that were generated by Nitrogen
30
+ target_sources(
31
+ # CMake project name (Android C++ library name)
32
+ NitroJsdom PRIVATE
33
+ # Autolinking Setup
34
+ ../nitrogen/generated/android/NitroJsdomOnLoad.cpp
35
+ # Shared Nitrogen C++ sources
36
+ ../nitrogen/generated/shared/c++/HybridHtmlSandboxSpec.cpp
37
+ # Android-specific Nitrogen C++ sources
38
+
39
+ )
40
+
41
+ # From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
42
+ # Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
43
+ target_compile_definitions(
44
+ NitroJsdom PRIVATE
45
+ -DFOLLY_NO_CONFIG=1
46
+ -DFOLLY_HAVE_CLOCK_GETTIME=1
47
+ -DFOLLY_USE_LIBCPP=1
48
+ -DFOLLY_CFG_NO_COROUTINES=1
49
+ -DFOLLY_MOBILE=1
50
+ -DFOLLY_HAVE_RECVMMSG=1
51
+ -DFOLLY_HAVE_PTHREAD=1
52
+ # Once we target android-23 above, we can comment
53
+ # the following line. NDK uses GNU style stderror_r() after API 23.
54
+ -DFOLLY_HAVE_XSI_STRERROR_R=1
55
+ )
56
+
57
+ # Add all libraries required by the generated specs
58
+ find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
59
+ find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
60
+ find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
61
+
62
+ # Link all libraries together
63
+ target_link_libraries(
64
+ NitroJsdom
65
+ fbjni::fbjni # <-- Facebook C++ JNI helpers
66
+ ReactAndroid::jsi # <-- RN: JSI
67
+ react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
68
+ )
69
+
70
+ # Link react-native (different prefab between RN 0.75 and RN 0.76)
71
+ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
72
+ target_link_libraries(
73
+ NitroJsdom
74
+ ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
75
+ )
76
+ else()
77
+ target_link_libraries(
78
+ NitroJsdom
79
+ ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
80
+ )
81
+ endif()
@@ -0,0 +1,27 @@
1
+ ///
2
+ /// NitroJsdom+autolinking.gradle
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ /// This is a Gradle file that adds all files generated by Nitrogen
9
+ /// to the current Gradle project.
10
+ ///
11
+ /// To use it, add this to your build.gradle:
12
+ /// ```gradle
13
+ /// apply from: '../nitrogen/generated/android/NitroJsdom+autolinking.gradle'
14
+ /// ```
15
+
16
+ logger.warn("[NitroModules] 🔥 NitroJsdom is boosted by nitro!")
17
+
18
+ android {
19
+ sourceSets {
20
+ main {
21
+ java.srcDirs += [
22
+ // Nitrogen files
23
+ "${project.projectDir}/../nitrogen/generated/android/kotlin"
24
+ ]
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,49 @@
1
+ ///
2
+ /// NitroJsdomOnLoad.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #ifndef BUILDING_NITROJSDOM_WITH_GENERATED_CMAKE_PROJECT
9
+ #error NitroJsdomOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this?
10
+ #endif
11
+
12
+ #include "NitroJsdomOnLoad.hpp"
13
+
14
+ #include <jni.h>
15
+ #include <fbjni/fbjni.h>
16
+ #include <NitroModules/HybridObjectRegistry.hpp>
17
+
18
+ #include "HybridHtmlSandbox.hpp"
19
+
20
+ namespace margelo::nitro::nitrojsdom {
21
+
22
+ int initialize(JavaVM* vm) {
23
+ return facebook::jni::initialize(vm, []() {
24
+ ::margelo::nitro::nitrojsdom::registerAllNatives();
25
+ });
26
+ }
27
+
28
+
29
+
30
+ void registerAllNatives() {
31
+ using namespace margelo::nitro;
32
+ using namespace margelo::nitro::nitrojsdom;
33
+
34
+ // Register native JNI methods
35
+
36
+
37
+ // Register Nitro Hybrid Objects
38
+ HybridObjectRegistry::registerHybridObjectConstructor(
39
+ "HtmlSandbox",
40
+ []() -> std::shared_ptr<HybridObject> {
41
+ static_assert(std::is_default_constructible_v<HybridHtmlSandbox>,
42
+ "The HybridObject \"HybridHtmlSandbox\" is not default-constructible! "
43
+ "Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
44
+ return std::make_shared<HybridHtmlSandbox>();
45
+ }
46
+ );
47
+ }
48
+
49
+ } // namespace margelo::nitro::nitrojsdom
@@ -0,0 +1,34 @@
1
+ ///
2
+ /// NitroJsdomOnLoad.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include <jni.h>
9
+ #include <functional>
10
+ #include <NitroModules/NitroDefines.hpp>
11
+
12
+ namespace margelo::nitro::nitrojsdom {
13
+
14
+ [[deprecated("Use registerNatives() instead.")]]
15
+ int initialize(JavaVM* vm);
16
+
17
+ /**
18
+ * Register the native (C++) part of NitroJsdom, and autolinks all Hybrid Objects.
19
+ * Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
20
+ * inside a `facebook::jni::initialize(vm, ...)` call.
21
+ * Example:
22
+ * ```cpp (cpp-adapter.cpp)
23
+ * JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
24
+ * return facebook::jni::initialize(vm, []() {
25
+ * // register all NitroJsdom HybridObjects
26
+ * margelo::nitro::nitrojsdom::registerNatives();
27
+ * // any other custom registrations go here.
28
+ * });
29
+ * }
30
+ * ```
31
+ */
32
+ void registerAllNatives();
33
+
34
+ } // namespace margelo::nitro::nitrojsdom