Skip to content

Commit 4985249

Browse files
save file
1 parent 339dfdd commit 4985249

1 file changed

Lines changed: 375 additions & 0 deletions

File tree

Lines changed: 375 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,375 @@
1+
2+
<link rel=stylesheet href='https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.css'>
3+
4+
<style>
5+
6+
body
7+
{margin:20px;display:flex;flex-direction:column;gap:10px;font-family:arial}
8+
9+
10+
#hdr
11+
{display:flex;gap:10px;align-items:center}
12+
13+
#terminal
14+
{height:500px}
15+
16+
input
17+
{font-size:16px;padding:5px 10px;box-sizing:border-box}
18+
input[type=button}
19+
{cursor:pointer}
20+
21+
22+
</style>
23+
24+
<h3>estree-walker-browser</h3>
25+
26+
<div id=hdr>
27+
<div>
28+
auth
29+
</div>
30+
<input id=auth>
31+
<input value=ready type=button onclick='start()'>
32+
</div>
33+
34+
<div id=terminal></div>
35+
36+
37+
<script>
38+
39+
console.clear();
40+
console.log('estree-walker');
41+
console.log();
42+
43+
var term;
44+
var webcontainer;
45+
46+
var packages = ['estree-walker'];
47+
48+
49+
var files = {};
50+
51+
52+
var filename = {
53+
esm : 'estree-walker.m.js',
54+
cjs : 'estree-walker.js',
55+
}
56+
57+
58+
files['entry.esm.js'] = `
59+
60+
import * as walker from 'estree-walker';
61+
export {walker};
62+
63+
`;
64+
65+
66+
files['rollup.config.esm.js'] = `
67+
68+
import resolve from '@rollup/plugin-node-resolve';
69+
import commonjs from '@rollup/plugin-commonjs';
70+
import json from '@rollup/plugin-json';
71+
import nodePolyfills from 'rollup-plugin-polyfill-node';
72+
73+
export default {
74+
input : 'entry.esm.js',
75+
output : {
76+
file : '${filename.esm}',
77+
format : 'es'
78+
},
79+
plugins : [
80+
commonjs(),
81+
json(),
82+
nodePolyfills(),
83+
resolve({preferBuiltins:false})
84+
]
85+
};
86+
87+
`;
88+
89+
90+
files['entry.cjs.js'] = `
91+
92+
import * as walker from 'estree-walker';
93+
94+
export default walker; // iife / umd
95+
96+
`;
97+
98+
99+
files['rollup.config.cjs.js'] = `
100+
101+
import resolve from '@rollup/plugin-node-resolve';
102+
import commonjs from '@rollup/plugin-commonjs';
103+
import json from '@rollup/plugin-json';
104+
import nodePolyfills from 'rollup-plugin-polyfill-node';
105+
106+
export default {
107+
input : 'entry.cjs.js',
108+
output : {
109+
file : '${filename.cjs}',
110+
111+
format : 'iife', // or 'umd'
112+
name : 'walker', // This becomes window.espree
113+
exports : 'default',
114+
115+
},
116+
plugins : [
117+
commonjs(),
118+
json(),
119+
nodePolyfills(),
120+
resolve({preferBuiltins:false})
121+
]
122+
};
123+
124+
`;
125+
126+
127+
var rollup = {};
128+
129+
130+
131+
132+
133+
async function start(){
134+
135+
var {Terminal} = await import('https://cdn.jsdelivr.net/npm/@xterm/xterm/+esm');
136+
var {FitAddon} = await import('https://cdn.jsdelivr.net/npm/@xterm/addon-fit/+esm');
137+
138+
term = new Terminal();
139+
var fitAddon = new FitAddon();
140+
term.loadAddon(fitAddon);
141+
term.open(terminal);
142+
fitAddon.fit();
143+
144+
var {'file-server':fs} = await import('https://libs.ext-code.com/js/io/file-server/file-server.m.js');
145+
fs.url = 'https://localhost:3000';
146+
fs.auth = auth.value;
147+
148+
for(var key in files){
149+
150+
files[key] = {file:{contents:files[key]}};
151+
152+
}//for
153+
154+
155+
var {WebContainer} = await import('https://cdn.jsdelivr.net/npm/@webcontainer/api/+esm');
156+
157+
console.log('booting ...');
158+
webcontainer = await WebContainer.boot();
159+
160+
console.log('mounting file system ...');
161+
await webcontainer.mount(files);
162+
163+
164+
await install();
165+
//await package_json();
166+
await install_rollup();
167+
168+
await Promise.all(['esm','cjs'].map(async type=>{
169+
170+
await rollup[type]();
171+
172+
var uint8 = await webcontainer.fs.readFile(filename[type]);
173+
var blob = new Blob([uint8],{type:'text/javascript'});
174+
var url = window.URL.createObjectURL(blob);
175+
176+
177+
var path = '/npm/estree-walker-browser/';
178+
fs.dir.create(path);
179+
180+
await fs.file.save(path+filename[type],blob);
181+
182+
}));
183+
184+
console.log('done.');
185+
186+
}//start
187+
188+
189+
190+
async function install(){
191+
var str = packages.join(' ');
192+
console.log('npm install',str,'...');
193+
packages.unshift('install');
194+
var process = await webcontainer.spawn('npm',packages);
195+
var stream = new WritableStream({write(data){term.write(data)}});
196+
process.output.pipeTo(stream)
197+
var code = await process.exit;
198+
if(code!=0){
199+
console.log('an error occurred');
200+
}
201+
return code;
202+
203+
}//install
204+
205+
206+
async function package_json(){
207+
console.log('npm install ( package.json ) ...');
208+
var process = await webcontainer.spawn('npm',['install']);
209+
var stream = new WritableStream({write(data){term.write(data)}});
210+
process.output.pipeTo(stream)
211+
var code = await process.exit;
212+
if(code!=0){
213+
console.log('an error occurred');
214+
}
215+
return code;
216+
217+
}//package_json
218+
219+
220+
async function install_rollup(){
221+
222+
var packages = [
223+
'rollup',
224+
'@rollup/plugin-commonjs',
225+
'@rollup/plugin-node-resolve',
226+
'@rollup/plugin-json',
227+
'rollup-plugin-polyfill-node'
228+
];
229+
console.log('npm install',packages.join(' '),'...');
230+
packages.unshift('install');
231+
232+
var process = await webcontainer.spawn('npm',packages);
233+
var stream = new WritableStream({write(data){term.write(data)}});
234+
process.output.pipeTo(stream)
235+
var code = await process.exit;
236+
if(code!=0){
237+
console.log('an error occurred');
238+
}
239+
return code;
240+
241+
}//install_rollup
242+
243+
244+
rollup.esm = async function(){
245+
console.log('perform rollup ...');
246+
var process = await webcontainer.spawn('npx',['-y','rollup','--config','rollup.config.esm.js']);
247+
248+
var stream = new WritableStream({write(data){term.write(data)}});
249+
process.output.pipeTo(stream);
250+
251+
var code = await process.exit;
252+
if(code!=0){
253+
console.log('an error occurred');
254+
}
255+
return code;
256+
257+
}//rollup
258+
259+
rollup.cjs = async function(){
260+
console.log('perform rollup ...');
261+
var process = await webcontainer.spawn('npx',['-y','rollup','--config','rollup.config.cjs.js']);
262+
263+
var stream = new WritableStream({write(data){term.write(data)}});
264+
process.output.pipeTo(stream);
265+
266+
var code = await process.exit;
267+
if(code!=0){
268+
console.log('an error occurred');
269+
}
270+
return code;
271+
272+
}//rollup
273+
274+
275+
async function download(path1,path2){
276+
277+
var blob = await readfile(path);
278+
await fs.writeFile(path2,blob);
279+
280+
}//download
281+
282+
283+
async function readfile(path){
284+
285+
var uint8 = await webcontainer.fs.readFile(path);
286+
var blob = new Blob([uint8],{type:'text/javascript'});
287+
return blob;
288+
289+
}//readfile
290+
291+
292+
293+
//:
294+
295+
296+
async function test({espree,estraverse,scope}){
297+
298+
var code = `
299+
300+
function fn(){
301+
302+
console.log('123');
303+
304+
}//fn
305+
306+
`;
307+
308+
const options = {
309+
ecmaVersion: 2022,
310+
sourceType: "module",
311+
};
312+
313+
const ast = espree.parse(code, { range: true, ...options });
314+
const scopeManager = scope.analyze(ast, options);
315+
316+
var currentScope = scopeManager.acquire(ast); // global scope
317+
318+
estraverse.traverse(ast, {
319+
enter(node, parent) {
320+
// do stuff
321+
322+
if (/Function/.test(node.type)) {
323+
currentScope = scopeManager.acquire(node); // get current function scope
324+
}
325+
},
326+
leave(node, parent) {
327+
if (/Function/.test(node.type)) {
328+
currentScope = currentScope.upper; // set to parent scope
329+
}
330+
331+
// do stuff
332+
},
333+
});
334+
335+
}//test
336+
337+
338+
test.esm = async function(url){
339+
340+
var {espree} = await import('https://libs.ext-code.com/external/js/espree/espree.m.js');
341+
var {estraverse} = await import('https://libs.ext-code.com/external/js/estraverse/estraverse.m.js');
342+
var {scope} = await import(url);
343+
344+
test({espree,estraverse,scope});
345+
346+
}//test
347+
348+
349+
test.cjs = async function(url){
350+
}//cjs
351+
352+
353+
//:
354+
355+
356+
files['package.json'] = `
357+
358+
{
359+
"name": "node-test",
360+
"version": "1.0.0",
361+
"scripts": {}
362+
}
363+
364+
`;
365+
366+
367+
368+
369+
370+
371+
372+
</script>
373+
374+
375+

0 commit comments

Comments
 (0)