|
1 | 1 | import {note,collect,same,has,promise,pass,slip,something,observe,functor,describe,remember,expect,control,trace,array,compound,simple,apply,stream,record,revert,provide,tether,differ,whether,either,when,each,drop,swap,crop,infer,buffer,is,not,plural,numeric,binary,basic,match,wait,string,defined,compose,combine,exit,clock,route,major} from "./Blik_2023_inference.js";
|
2 | 2 | import {sum,merge,stringify,search,edit,prune,parse as records,relevant} from "./Blik_2023_search.js";
|
3 |
| - import {parse,sanitize,serialize,exports,reexport,test,mime,coordinates} from "./Blik_2023_meta.js"; |
| 3 | + import {parser,parse,sanitize,serialize,exports,reexport,test,mime,coordinates} from "./Blik_2023_meta.js"; |
4 | 4 |
|
5 | 5 | export const address=new URL(import.meta.url).pathname;
|
6 | 6 | export const location=address.replace(/\/[^/]*$/,"");//path.dirname(address);
|
|
16 | 16 | export function version(navigator)
|
17 | 17 | {let agent=["user-agent","userAgent"].reduce((agent,field)=>
|
18 | 18 | agent||navigator?.[field],undefined);
|
| 19 | + let device=/\((.*?)\)/.exec(agent)?.[1]; |
19 | 20 | let entries=agent?.match(/[\w\.]+\/(\.{0,1}\d+){1,2}/g)?.map(agent=>agent.split("/"))||
|
20 | 21 | [[agent]];
|
21 |
| - return entries.map(([name,version])=>({[name]:Number(version)})).reduce(merge); |
| 22 | + return entries.map(([name,version])=>({[name]:Number(version)})).reduce(merge |
| 23 | +,device?.split(";").reduce(function(platform) |
| 24 | +{return {[platform]:arguments[3].splice(1).join(";")}; |
| 25 | +})||{}); |
22 | 26 | };
|
23 | 27 |
|
24 | 28 | export var feature=agent=>agent&&prune.call
|
25 | 29 | ({attributes:{node:21,Chrome:123}
|
26 | 30 | ,assertions:{node:16.14,Chrome:91,Firefox:Infinity}
|
27 | 31 | ,json:{Chrome:125,Firefox:Infinity}
|
28 | 32 | },([feature,condition])=>
|
29 |
| - [true,Object.keys(condition).find(name=>agent[name])].filter(Boolean).reduce((value,name)=> |
| 33 | +[true,Object.keys(condition).find(name=>agent[name]) |
| 34 | +].filter(Boolean).reduce((value,name)=> |
30 | 35 | condition[name]<=agent[name])
|
31 | 36 | );
|
32 | 37 |
|
|
171 | 176 | let json=source.endsWith(".json")||undefined;
|
172 | 177 | let recover=compose(recovery,infer("call",scope,absolute,target),infer(resolve,context,next));
|
173 | 178 | let module=command
|
174 |
| -?import(source,json&&{[feature(agent).attributes?"with":"assert"]:{type:"json"}}) |
| 179 | +?import(source,json&&{[!agent.Linux&&feature(agent).attributes?"with":"assert"]:{type:"json"}}) |
175 | 180 | :either(precedent,compose
|
176 | 181 | (either(buffer(next,buffer(recover)),compose(swap(source),request))
|
177 | 182 | ,shortcircuit,{imports:new Set()},merge,[absolute],record,slip(scope),merge
|
|
335 | 340 | ,transform:(source,address)=>compose.call
|
336 | 341 | ("url","pathToFileURL",address,resolve,"href"
|
337 | 342 | ,{format:formats[route(address)[1]]}
|
338 |
| -,load,code=>({code,map:{mappings:''}}) |
| 343 | +,load,(code,map={mappings:''})=>({code,map}) |
339 | 344 | ),resolveId:(source,client)=>client
|
340 | 345 | ?/^\./.test(source)
|
341 | 346 | ?route(client).reduce((source,entry,index,route)=>
|
|
387 | 392 | Object.assign(context,{format:format="builtin"});
|
388 | 393 | if(!format&&/\.ts$/.test(source))
|
389 | 394 | Object.assign(context,{format:format="typescript"});
|
| 395 | + if(format==="module"&&/\.glsl\.js$/.test(source)) |
| 396 | + Object.assign(context,{format:syntax=format="shader"}); |
390 | 397 | if(format==="commonjs")
|
391 | 398 | // don't trust default assumption from nearest package.json as it often refers to inaccessible build outputs.
|
392 | 399 | await require(target).catch(fail=>
|
|
399 | 406 | [entry,relative.splice(2).join("/")]);
|
400 | 407 | let {comment,...definition}=
|
401 | 408 | [{syntax}
|
402 |
| -,typeof format==="object"?format||{}:await import(sources).then(sources=> |
| 409 | +,compound(format)?format||{}:await import(sources).then(sources=> |
403 | 410 | [Object.values(sources.default[format]||{})[index]||sources.default[format]||{}].reduce(function flat(entries,source)
|
404 | 411 | {return [entries,!compound(source)||array(source)?source:Object.values(source).reduce(flat,[])].flat();
|
405 | 412 | },[]).filter(compound).map(entry=>
|
|
409 | 416 | syntax=definition.syntax;
|
410 | 417 | let foreign=!["javascript"].includes(syntax)||Object.keys(definition).length>1;
|
411 | 418 | // parse foreign to serialize standard syntax. without native interpretter to call (next), all syntax are foreign.
|
412 |
| - // using acorn's Parser methods (parse) until interpretation reducer is complete. |
| 419 | + // using acorn's Parser methods (parse) until semiotic reducer is complete. |
413 | 420 | let edits=relevant(definition.edit||{},sparse);
|
414 | 421 | if(syntax==="json")
|
415 | 422 | syntax="module",edits["^((?:.*[\n$])*)"]="export default $1";
|
416 |
| - let patriate=foreign?[infer(parse,syntax,{source}),definition,sanitize,serialize,"javascript",{source},parse,serialize]:[]; |
| 423 | + let patriate=foreign?parser[format]||compose |
| 424 | +(infer(parse,syntax,{source}),definition,sanitize,serialize |
| 425 | +,"javascript",{source},parse,serialize):infer(); |
417 | 426 | let module=await buffer
|
418 |
| -(compose(access,edits,edit,...patriate) |
| 427 | +(compose(access,edits,edit,patriate) |
419 | 428 | ,fail=>note.call(1,"Failed to patriate "+syntax+" \""+source+"\" due to",fail)&&wait(1000)(fail).then(exit)
|
420 | 429 | )(source,true);
|
421 | 430 | if(next)
|
422 |
| - return compose.call({source:module,format:{json:"json"}[syntax]||"module"},shortcircuit); |
| 431 | + return compose.call(module,source=>( |
| 432 | + {source,format:{json:"json"}[syntax]||"module" |
| 433 | + }),shortcircuit); |
423 | 434 | return module;
|
424 | 435 | };
|
425 | 436 |
|
|
778 | 789 | async function freefetch(request,{method,body,headers}={})
|
779 | 790 | {let remote=/^http/.test(request);
|
780 | 791 | let url=string(request)?!remote
|
781 |
| -?[this.location.origin,request?.replace(/^[\.\/]+/,"")||""].join("/") |
| 792 | +?!this?exit(freefetch.name+" not bound to JSDOM for local origin request. No server context for "+request+"?") |
| 793 | +:[this.location.origin,request?.replace(/^[\.\/]+/,"")||""].join("/") |
782 | 794 | :request:request.url;
|
783 | 795 | let {protocol,host,hostname,path,port}=await resolve("url","parse",url);
|
784 | 796 | return revert((respond,reject,request,body)=>compose
|
|
789 | 801 | ,{data:record(body=>body).bind(body)
|
790 | 802 | ,error:compose(note,reject)
|
791 | 803 | ,end:compose
|
792 |
| -(swap(body),body=>Buffer.concat(body,sum(body.map(({length})=>length))),buffer(status===302 |
| 804 | +(swap(body),body=>Buffer.concat(body,sum(body.map(({length})=>length))),buffer([302,308].includes(status) |
793 | 805 | ?compose(swap({...request,url:headers.location}),fetch)
|
794 | 806 | :compose(body=>({body,status,headers,type:headers["content-type"]}),request,stage)
|
795 | 807 | ,reject),respond
|
|
824 | 836 | note.call(3,"navigated browser to "+url);
|
825 | 837 | expose(window=browser.window);
|
826 | 838 | })(url);
|
827 |
| -} |
| 839 | +}; |
828 | 840 |
|
829 | 841 | export async function stage(response,request)
|
830 | 842 | {let agent=version(request.headers);
|
831 |
| - let browser="Mozilla/Chrome/Safari/AppleWebKit".split("/").some(has.bind(agent||{})); |
832 | 843 | let features=feature(agent);
|
833 |
| - let importing=request.headers?.referer&&!request.headers.referer.endsWith(request.url)&&request?.headers?.["sec-fetch-dest"]==="script"; |
| 844 | + let browser="Mozilla/Chrome/Safari/AppleWebKit".split("/").some(has.bind(agent||{})); |
| 845 | + let direct=request.headers?.referer?.endsWith(request.url)===false; |
| 846 | + let importing=!direct&&request?.headers?.["sec-fetch-dest"]==="script"; |
834 | 847 | let fail=is(Error)(response);
|
835 |
| - let type=!fail&&response?.type||mime(response?.nodeName?.toLowerCase()||(either(simple,array)(response)?"json":request.url))||mime(response.nodeName?"html":"txt"); |
| 848 | + let type=!fail&&response?.type||response.headers?.get("Content-Type")||mime(response?.nodeName?.toLowerCase()||(either(simple,array)(response)?"json":path(request)))||mime(response.nodeName?"html":"txt"); |
836 | 849 | let [js,json]=[type===mime("js"),type===mime("json")];
|
837 | 850 | let status=response?fail?500:response.status||200:404;
|
838 | 851 | let success=status<400;
|
|
874 | 887 | {let gzip=this.headers["Content-Encoding"]==="gzip";
|
875 | 888 | // if(simple(this.body))
|
876 | 889 | // return compose(JSON.stringify(this.body),"encode","buffer")(new TextEncoder());
|
877 |
| - if(this.body.constructor?.name=="Buffer") |
| 890 | + if(this.body.constructor?.name==="Buffer") |
878 | 891 | return compose
|
879 |
| -(infer("reduce",(array,byte,index)=>Object.assign(array,{[index]:byte}) |
880 |
| -,new Uint8Array(new ArrayBuffer(this.body.length))) |
| 892 | +(new Uint8Array(new ArrayBuffer(this.body.length)) |
| 893 | +,(buffer,array)=>{for(let i=0;i<array.length;i++){array[i]=buffer[i]};return array} |
881 | 894 | ,"buffer"
|
882 | 895 | )(this.body);
|
883 | 896 | return Buffer.from(this.body,"utf-8");
|
|
0 commit comments