idk
This commit is contained in:
		
							parent
							
								
									469c0c4edd
								
							
						
					
					
						commit
						a0d6f89290
					
				
							
								
								
									
										13
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| { | ||||
|     // Use IntelliSense to learn about possible attributes. | ||||
|     // Hover to view descriptions of existing attributes. | ||||
|     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||||
|     "version": "0.2.0", | ||||
|     "configurations": [ | ||||
|         { | ||||
|             "request": "attach", | ||||
|             "name": "Attach", | ||||
|             "type": "node" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| { | ||||
|     "deno.enable": true, | ||||
| } | ||||
| @ -1 +1,5 @@ | ||||
| {} | ||||
| { | ||||
|     "tasks": { | ||||
|         "dbg": "deno run -A --inspect-wait junk/module_inspector.test.ts" | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								deno.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								deno.lock
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| { | ||||
|   "version": "3", | ||||
|   "remote": { | ||||
|     "https://esm.sh/preact@10.23.1": "5c90e3946c882878ada8f82671a1e2cfc3d307eb1253e83cee74f04194cecf41", | ||||
|     "https://esm.sh/preact@10.23.1/compat": "e6e124f2c59692ee4dda7d1b9271a6169c57eaa43077495497a44313195fc859", | ||||
|     "https://esm.sh/preact@10.23.1/debug": "8d66a656164fe5d5f40078740a444af0cbf38f4eefe415e7bbf76ceefdde4c32", | ||||
|     "https://esm.sh/stable/preact@10.23.1/denonext/compat.js": "49c7e42b0555fab75f189e8317d39a252bbb38b49224badf4a110c6a708954f7", | ||||
|     "https://esm.sh/stable/preact@10.23.1/denonext/debug.js": "baec17edc90c1c0ba53a2f64c66b3890779169e71289450634543a5a2aab839a", | ||||
|     "https://esm.sh/stable/preact@10.23.1/denonext/devtools.js": "bb198cea043a5878c0367867e1be710e9a11581f8ab10ca0a51091e3d2add74d", | ||||
|     "https://esm.sh/stable/preact@10.23.1/denonext/hooks.js": "6962ffaaded3eee1cff070f660b6304007754ef1993d63241d2f3807a10ee21e", | ||||
|     "https://esm.sh/stable/preact@10.23.1/denonext/preact.mjs": "c30c9bd2ab4b41104f97c0679413cdfe37ec2fa0131a7c5a1a2d3b6f6fae9670" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										39
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								index.html
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | ||||
| <script type="module" src="test_receiver.mjs"></script> | ||||
| 
 | ||||
| <!-- | ||||
| <script type="module"> | ||||
|     import r1 from "./test_rand.mjs?1"; | ||||
|     import r2 from "./test_rand.mjs?2"; | ||||
| @ -8,4 +9,42 @@ | ||||
| 
 | ||||
|     console.log(r1, r2, r3, r4); | ||||
| 
 | ||||
| </script>--> | ||||
| 
 | ||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/typescript/4.5.4/typescript.min.js"></script> | ||||
| <script type="module"> | ||||
| 
 | ||||
| // TypeScript source code | ||||
| const source = ` | ||||
| export const num: number = 42; | ||||
| export function greet() { | ||||
|     console.log('Hello, world!'); | ||||
| } | ||||
| `; | ||||
| 
 | ||||
| // Transpile the TypeScript code to JavaScript | ||||
| const result = ts.transpileModule(source, { | ||||
|     compilerOptions: {  | ||||
|         module: ts.ModuleKind.ESNext,  | ||||
|         target: ts.ScriptTarget.ESNext  | ||||
|     } | ||||
| }); | ||||
| 
 | ||||
| // Parse the AST of the TypeScript source code | ||||
| const sourceFile = ts.createSourceFile('module.ts', source, ts.ScriptTarget.ESNext, true); | ||||
| 
 | ||||
| // Function to inspect the AST and find export declarations | ||||
| function findExports(node) { | ||||
|     if (ts.isExportDeclaration(node) || ts.isExportAssignment(node)) { | ||||
|         console.log('Export found:', node); | ||||
|     } | ||||
|     ts.forEachChild(node, findExports); | ||||
| } | ||||
| 
 | ||||
| // Traverse the AST | ||||
| //findExports(sourceFile); | ||||
| 
 | ||||
| console.log(sourceFile); | ||||
| // Output: export const num = 42; export function greet() { console.log('Hello, world!'); } | ||||
| 
 | ||||
| </script> | ||||
							
								
								
									
										131
									
								
								junk/module_inspector.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								junk/module_inspector.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,131 @@ | ||||
| /** | ||||
|  * @typedef {function(string): boolean} GlyphCheck | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @type {GlyphCheck} | ||||
|  */ | ||||
| const isAlphaLike = (inGlyph) => { | ||||
|     const inCode = inGlyph.charCodeAt(0); | ||||
| 
 | ||||
|     if (inCode >= 97 && inCode <= 122) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     if (inCode >= 65 && inCode <= 90) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     return `$_.`.includes(inGlyph); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @type {GlyphCheck} | ||||
|  */ | ||||
| const isWhiteSpace = (inGlyph) => `\n\r\t `.includes(inGlyph); | ||||
| 
 | ||||
| /** | ||||
|  * @type {GlyphCheck} | ||||
|  */ | ||||
| const isQuote = (inGlyph) => `"'\``.includes(inGlyph); | ||||
| 
 | ||||
| /** | ||||
|  * @param {GlyphCheck} inCheck | ||||
|  * @returns {GlyphCheck} | ||||
|  */ | ||||
| const isNot = (inCheck) => (inGlyph) => !inCheck(inGlyph); | ||||
| 
 | ||||
| /** | ||||
|  * @param {string} inText | ||||
|  * @param {number} inStart | ||||
|  * @param {GlyphCheck} inTest | ||||
|  * @returns {number} | ||||
|  */ | ||||
| const contiguous = (inText, inStart, inTest) => { | ||||
|     let ok = true; | ||||
|     let index = inStart; | ||||
|     let count = 0; | ||||
|     while (ok && count < inText.length) { | ||||
|         count++; | ||||
|         ok = inTest(inText.charAt(index++)); | ||||
|     } | ||||
|     return index - 1; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @param {string} inFile | ||||
|  * @param {number} [inIndex=0] | ||||
|  * @param {Array<{internal: string, external: string}>} inLocal | ||||
|  * @param {Array<string>} inForeign | ||||
|  * @returns {number|boolean} | ||||
|  */ | ||||
| const findNextExport = (inFile, inIndex = 0, inLocal, inForeign) => { | ||||
|     const pos = inFile.indexOf("export", inIndex); | ||||
|     if (pos !== -1) { | ||||
|         if (!isAlphaLike(inFile.charAt(pos - 1)) || !isAlphaLike(inFile.charAt(pos + 6))) { | ||||
|             const nextCharInd = contiguous(inFile, pos + 6, isWhiteSpace); | ||||
|             const nextChar = inFile[nextCharInd]; | ||||
| 
 | ||||
|             if (nextChar === "*") { | ||||
|                 const firstQuoteInd = contiguous(inFile, nextCharInd + 1, isNot(isQuote)); | ||||
|                 const secondQuoteInd = contiguous(inFile, firstQuoteInd + 1, isNot(isQuote)); | ||||
|                 inForeign.push(inFile.substring(nextCharInd, secondQuoteInd + 1)); | ||||
|             } else if (nextChar == "{") { | ||||
|                 const endBracketInd = contiguous(inFile, nextCharInd, (inGlyph) => inGlyph !== "}"); | ||||
|                 const nextLetterInd = contiguous(inFile, endBracketInd + 1, isWhiteSpace); | ||||
|                 if (inFile.substring(nextLetterInd, nextLetterInd + 4) == "from") { | ||||
|                     const firstQuoteInd = contiguous(inFile, nextLetterInd + 4, isNot(isQuote)); | ||||
|                     const secondQuoteInd = contiguous(inFile, firstQuoteInd + 1, isNot(isQuote)); | ||||
|                     inForeign.push(inFile.substring(nextCharInd, secondQuoteInd + 1)); | ||||
|                 } else { | ||||
|                     const members = inFile.substring(nextCharInd + 1, endBracketInd).replaceAll(" as ", "|||").replace(/\s/g, ''); | ||||
|                     members.split(",").forEach(part => { | ||||
|                         const renamed = part.split("|||"); | ||||
|                         inLocal.push({ internal: renamed, external: renamed || renamed }); | ||||
|                     }); | ||||
|                 } | ||||
|             } else if (isAlphaLike(nextChar)) { | ||||
|                 const keywordEndInd = contiguous(inFile, nextCharInd, isAlphaLike); | ||||
|                 const keyword = inFile.substring(nextCharInd, keywordEndInd); | ||||
|                 if (keyword === "default") { | ||||
|                     inLocal.push({ internal: keyword, external: keyword }); | ||||
|                 } else if (["const", "let", "var", "function", "class"].includes(keyword)) { | ||||
|                     const varStartInd = contiguous(inFile, keywordEndInd + 1, isWhiteSpace); | ||||
|                     const varEndInd = contiguous(inFile, varStartInd + 1, isAlphaLike); | ||||
|                     const keyword = inFile.substring(varStartInd, varEndInd); | ||||
|                     inLocal.push({ internal: keyword, external: keyword }); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return pos + 7; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @param {string} inFile | ||||
|  * @returns {[local: string[], foreign: string[]]} | ||||
|  */ | ||||
| export const Exports = (inFile) => { | ||||
|     let match = /** @type {number|boolean} */ (0); | ||||
|     let count = 0; | ||||
|     const local = /** @type {string[]} */ ([]); | ||||
|     const foreign = /** @type {string[]} */ ([]); | ||||
|     while (match !== false && count < 200) { | ||||
|         count++; | ||||
|         match = findNextExport(inFile, match, local, foreign); | ||||
|     } | ||||
|     return [local, foreign]; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @param {string|URL} inURL | ||||
|  * @returns {Promise<[local: string[], foreign: string[]]>} | ||||
|  */ | ||||
| export const FileExports = async (inURL) => { | ||||
|     const resp = await fetch(inURL); | ||||
|     const text = await resp.text(); | ||||
|     return Exports(text); | ||||
| }; | ||||
| @ -1,12 +1,14 @@ | ||||
| import * as Inspector from "./module_inspector.ts"; | ||||
| 
 | ||||
| console.log(); | ||||
| 
 | ||||
| Deno.test("check string parsing", ()=>{ | ||||
| 
 | ||||
|     const [local, global] = Inspector.Exports(` | ||||
| // export in comment
 | ||||
| /** | ||||
|  *  | ||||
| * export const TESTtt | ||||
| * export const  | ||||
|  * / | ||||
| const fakeexport =()=>{}; | ||||
| const exportfake =()=>{}; | ||||
|  | ||||
| @ -32,7 +32,7 @@ const contiguous =(inText:string, inStart:number, inTest:GlyphCheck):number=> | ||||
|     return index-1; | ||||
| } | ||||
| 
 | ||||
| const findNextExport =(inFile:string, inIndex=0, inLocal:Array<string>, inForeign:Array<string>)=> | ||||
| const findNextExport =(inFile:string, inIndex=0, inLocal:Array<{internal:string, external:string }>, inForeign:Array<string>)=> | ||||
| { | ||||
|     const pos = inFile.indexOf("export", inIndex); | ||||
|     if(pos !== -1) | ||||
| @ -65,11 +65,12 @@ const findNextExport =(inFile:string, inIndex=0, inLocal:Array<string>, inForeig | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     const members = inFile.substring(nextCharInd+1, endBracketInd).replace(/\s/g, ''); | ||||
|                     const members = inFile.substring(nextCharInd+1, endBracketInd).replaceAll(" as ", "|||").replace(/\s/g, ''); | ||||
|                     members.split(",").forEach(part=> | ||||
|                     { | ||||
|                         const renamed = part.split(" as "); | ||||
|                         inLocal.push(renamed[1] || renamed[0]); | ||||
|                         const renamed = part.split("|||"); | ||||
|                         //inLocal.push(renamed[1] || renamed[0]);
 | ||||
|                         inLocal.push({internal:renamed[0], external:renamed[1]||renamed[0]}) | ||||
|                     }); | ||||
|                 } | ||||
|                  | ||||
| @ -80,7 +81,7 @@ const findNextExport =(inFile:string, inIndex=0, inLocal:Array<string>, inForeig | ||||
|                 const keyword = inFile.substring(nextCharInd, keywordEndInd); | ||||
|                 if(keyword === "default") | ||||
|                 { | ||||
|                     inLocal.push(keyword); | ||||
|                     inLocal.push({internal:keyword, external:keyword}); | ||||
|                     //console.log(`MEMBER: >>${keyword})}<<`);
 | ||||
|                 } | ||||
|                 else if(["const", "let", "var", "function", "class"].includes(keyword)) | ||||
| @ -88,7 +89,8 @@ const findNextExport =(inFile:string, inIndex=0, inLocal:Array<string>, inForeig | ||||
|                     const varStartInd = contiguous(inFile, keywordEndInd+1, isWhiteSpace); | ||||
|                     const varEndInd = contiguous(inFile, varStartInd+1, isAlphaLike); | ||||
|                     //console.log(`MEMBER: >>${inFile.substring(varStartInd, varEndInd)}<<`);
 | ||||
|                     inLocal.push(inFile.substring(varStartInd, varEndInd)) | ||||
|                     const keyword = inFile.substring(varStartInd, varEndInd); | ||||
|                     inLocal.push({internal:keyword, external:keyword}); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
							
								
								
									
										43
									
								
								preactthing.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								preactthing.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | ||||
| import { useState as preactUseState, useEffect as preactUseEffect } from 'preact/hooks'; | ||||
| import { useState as reactUseState, useEffect as reactUseEffect } from 'react'; | ||||
| import { options as preactOptions } from 'preact'; | ||||
| 
 | ||||
| const isPreact = typeof preactUseState === 'function'; | ||||
| 
 | ||||
| const useState = isPreact ? preactUseState : reactUseState; | ||||
| const useEffect = isPreact ? preactUseEffect : reactUseEffect; | ||||
| 
 | ||||
| function useLogger(componentName) { | ||||
|   useEffect(() => { | ||||
|     console.log(`${isPreact ? 'Preact' : 'React'}: Component ${componentName} mounted`); | ||||
|     return () => { | ||||
|       console.log(`${isPreact ? 'Preact' : 'React'}: Component ${componentName} unmounted`); | ||||
|     }; | ||||
|   }, [componentName]); | ||||
| 
 | ||||
|   useEffect(() => { | ||||
|     console.log(`${isPreact ? 'Preact' : 'React'}: Component ${componentName} rendered`); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| if (isPreact) { | ||||
|   preactOptions.__r = (vnode) => { | ||||
|     console.log('Preact: Rendering component:', vnode); | ||||
|   }; | ||||
| 
 | ||||
|   preactOptions.diffed = (vnode) => { | ||||
|     console.log('Preact: Component diffed:', vnode); | ||||
|   }; | ||||
| 
 | ||||
|   preactOptions.unmount = (vnode) => { | ||||
|     console.log('Preact: Unmounting component:', vnode); | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // Example component using the custom hook
 | ||||
| function MyComponent() { | ||||
|   useLogger('MyComponent'); | ||||
|   return <div>My Component</div>; | ||||
| } | ||||
| 
 | ||||
| export default MyComponent; | ||||
							
								
								
									
										7
									
								
								state-preserve/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								state-preserve/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| <html> | ||||
| <head></head> | ||||
| <body> | ||||
|     <div id="app"></div> | ||||
|     <script type="module" src="./preact.js"></script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										30
									
								
								state-preserve/preact.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								state-preserve/preact.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| import "https://esm.sh/preact@10.23.1/debug"; | ||||
| import * as Preact from "https://esm.sh/preact@10.23.1"; | ||||
| import * as React from "https://esm.sh/preact@10.23.1/compat"; | ||||
| const H = Preact.h; | ||||
| 
 | ||||
| console.log(React); | ||||
| 
 | ||||
| /** @typedef {(vnode:Preact.VNode)=>unknown} DeepHook*/ | ||||
| 
 | ||||
| /** @type {DeepHook|undefined} */ | ||||
| const renderOld =Preact.options.__r; | ||||
| 
 | ||||
| /** @type {DeepHook} */ | ||||
| const renderNew =(vnode)=> | ||||
| { | ||||
|     console.log("render!") | ||||
|     console.log(vnode); | ||||
|     // how to examine state context here?
 | ||||
| }; | ||||
| 
 | ||||
| Preact.options.__r = renderOld ? /**@type{DeepHook}*/((vnode)=>{renderOld(vnode); renderNew(vnode);}) : renderNew; | ||||
| 
 | ||||
| const Component =()=> | ||||
| { | ||||
|     const [countGet, countSet] = React.useState(3); | ||||
|     return H("h1", {onClick(){countSet(countGet+1)}}, `count: ${countGet}`); | ||||
| } | ||||
| 
 | ||||
| const root = document.querySelector("#app")||document.body; | ||||
| Preact.render(H(Component, {HEY:"HEY"}), root); | ||||
| @ -1,14 +1,20 @@ | ||||
| export let changing = 2; | ||||
| export let changing = 42; | ||||
| 
 | ||||
| ////////////////////////////////////////////
 | ||||
| let ReImported = {}; | ||||
| const thisURL = new URL(import.meta.url) | ||||
| const thisFile = thisURL.pathname; | ||||
| if(!thisURL.search) | ||||
| { | ||||
|     setInterval(()=>{ | ||||
|         import(thisFile+"?"+Math.random()).then(module=>{ | ||||
|              | ||||
|             changing = module.changing; | ||||
|             console.log(changing); | ||||
|             ReImported = module; | ||||
|             for(let key in module) | ||||
|             { | ||||
|                 const statement = `${key}=ReImported.${key}` | ||||
|                 eval(statement); | ||||
|                 console.log(statement); | ||||
|             } | ||||
|         }) | ||||
|     }, 3000); | ||||
| } | ||||
							
								
								
									
										27
									
								
								transpiler/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								transpiler/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| <html> | ||||
| <head></head> | ||||
| <body style="display: flex; gap: 30px;"> | ||||
| <textarea id="input"></textarea> | ||||
| <button style="align-self: center;" id="transpile">→</button> | ||||
| <textarea id="output"></textarea> | ||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/typescript/4.5.4/typescript.min.js"></script> | ||||
| <script type="module"> | ||||
| const domIn = document.getElementById("input"); | ||||
| const domOut = document.getElementById("output"); | ||||
| const domDo = document.getElementById("transpile"); | ||||
| 
 | ||||
| domDo.addEventListener("click", ()=>{ | ||||
|     const result = ts.transpileModule(domIn.value, { | ||||
|         compilerOptions: {  | ||||
|             module: ts.ModuleKind.ESNext,  | ||||
|             target: ts.ScriptTarget.ESNext  | ||||
|         } | ||||
|     });    | ||||
|     domOut.value = result.outputText | ||||
|     console.log(result);  | ||||
| }) | ||||
| 
 | ||||
| </script> | ||||
| 
 | ||||
| </body> | ||||
| </html> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user