You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							39 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
	
	
							39 lines
						
					
					
						
							1.3 KiB
						
					
					
				| 'use strict'; | |
| 
 | |
| var Node = require('./Node.js'); | |
| 
 | |
| /** | |
|  * Recursively convert any node or its contents to native JavaScript | |
|  * | |
|  * @param value - The input value | |
|  * @param arg - If `value` defines a `toJSON()` method, use this | |
|  *   as its first argument | |
|  * @param ctx - Conversion context, originally set in Document#toJS(). If | |
|  *   `{ keep: true }` is not set, output should be suitable for JSON | |
|  *   stringification. | |
|  */ | |
| function toJS(value, arg, ctx) { | |
|     // eslint-disable-next-line @typescript-eslint/no-unsafe-return | |
|     if (Array.isArray(value)) | |
|         return value.map((v, i) => toJS(v, String(i), ctx)); | |
|     if (value && typeof value.toJSON === 'function') { | |
|         // eslint-disable-next-line @typescript-eslint/no-unsafe-call | |
|         if (!ctx || !Node.hasAnchor(value)) | |
|             return value.toJSON(arg, ctx); | |
|         const data = { aliasCount: 0, count: 1, res: undefined }; | |
|         ctx.anchors.set(value, data); | |
|         ctx.onCreate = res => { | |
|             data.res = res; | |
|             delete ctx.onCreate; | |
|         }; | |
|         const res = value.toJSON(arg, ctx); | |
|         if (ctx.onCreate) | |
|             ctx.onCreate(res); | |
|         return res; | |
|     } | |
|     if (typeof value === 'bigint' && !ctx?.keep) | |
|         return Number(value); | |
|     return value; | |
| } | |
| 
 | |
| exports.toJS = toJS;
 | |
| 
 |