Skip to content

Commit d1a96b9

Browse files
author
blik
committed
preserve import target url in interface/resolve call scopes
split test context from its inferences (route) tune meta/sourcemap for co-located fragment action modules
1 parent 25e7967 commit d1a96b9

File tree

8 files changed

+360
-297
lines changed

8 files changed

+360
-297
lines changed

Blik_2023_fragment.js

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
// var [jss,...plugins]=await resolve(["","nested","extend","global"].map(plugin=>
88
// ["./Isonen_2014_jss",plugin].filter(Boolean).join("_")+".js")).then(modules=>
99
// modules.map(module=>module.default||module));
10-
if(!window)//&&!virtual)
11-
// tests require a browser ready.
10+
if(!window&&!virtual)
11+
// tests require a browser ready. warning: virtual modules may be used.
1212
await jsdom("http://localhost:80/");
1313
var address=new URL(import.meta.url).pathname;
1414
export const file=address.replace(/.*\//,"");
@@ -92,10 +92,10 @@
9292
(when(either(is("Element"),is("Attribute")),string)
9393
,whether(compose(drop(2),string),infer(),crop(2))
9494
,stash(compose(combine(swap("create"),crop(1),compose(drop(2),whether(string,swap("NS"),drop()))),"concat"))
95-
,drop(1),flip,slip(window.document),tether(infer)
95+
,drop(1),flip,slip(window?.document),tether(infer)
9696
);
9797

98-
export var append=compose(when(is(window.EventTarget))
98+
export var append=compose(when(is(window?.EventTarget))
9999
,collect,infer("reduce",compose(pass(whether
100100
(compose(drop(1),"nodeType",is(2)),whether
101101
(compose(drop(1),infer("specified"))
@@ -108,7 +108,7 @@
108108
),compose(each([crop(1),"name"]),"removeAttribute")
109109
),whether(not("contains"),"appendChild",crop(1))
110110
)),crop(1))),whether
111-
(is([is(window.DocumentFragment),compose("children","length",minor(2))])
111+
(is([is(window?.DocumentFragment),compose("children","length",minor(2))])
112112
,search(["firstChild"])
113113
,crop(1)
114114
));
@@ -581,7 +581,7 @@
581581
};
582582

583583
export function print(file)
584-
{return resolve(
584+
{return resolve.bind(import.meta.url)(
585585
["/mozilla_2010_pdf_viewer_brightspace.js"
586586
,"/mozilla_2010_pdf_link_service_brightspace.js"
587587
,"/mozilla_2010_pdf_brightspace.js"
@@ -949,13 +949,13 @@
949949
compose(wait(1000*index),Object.assign)(this.querySelector("span[title="+empty+"]").style,{animation}));
950950
let source=this.closest(".comments").parentNode.querySelector(".article").getAttribute("source");
951951
let comments=target.closest(".comments").querySelector(".history");
952-
let message={put:note(Date.now()),...fields};
953-
let body=JSON.stringify({[source]:[message]});
952+
let text={put:note(Date.now()),...fields};
953+
let body=JSON.stringify({[source]:[text]});
954954
let {status}=await fetch("/Blik_2024_comments.json",{method:"put",body});
955955
if(status!==200)
956956
return ["warn 1s","unset"].forEach((animation,index)=>
957957
compose(wait(1000*index),Object.assign)(target.closest(".comment").style,{animation}));
958-
await comment(message,comments.childNodes.length,comments);
958+
await message(text,comments.childNodes.length,comments);
959959
fill.call(this,{comment:""});
960960
if(cookie("author")===fields.name)
961961
return;
@@ -1260,8 +1260,8 @@
12601260

12611261
export async function featurefacebook()
12621262
{let module=await import("//connect.facebook.net/en_US/sdk.js");
1263-
let {default:svg}=await resolve("/Blik_2020_svg.json");
1264-
let {default:awesome}=await resolve("/blessochampion_2019_awesomesvgs.json");
1263+
let {default:svg}=await resolve.bind(import.meta.url)("/Blik_2020_svg.json");
1264+
let {default:awesome}=await resolve.bind(import.meta.url)("/blessochampion_2019_awesomesvgs.json");
12651265
return new Promise(resolve=>
12661266
window.fbAsyncInit=function()
12671267
{FB.init({appId:"281250585888156",autoLogAppEvents:true,status:false,xfbml:true,version:"v4.0"});
@@ -1289,7 +1289,7 @@
12891289
if(click.srcElement)(facebook.connected?FB.logout:FB.login)(settle,{scope:'user_posts'})
12901290
else settle(click);
12911291
}(response);
1292-
resolve(facebook)
1292+
resolve.bind(import.meta.url)(facebook)
12931293
})
12941294
}).then(facebook=>facebook)
12951295
};
@@ -1607,7 +1607,7 @@
16071607
close<open);
16081608
if(open)
16091609
return false;
1610-
let [module,feature]=await locate(last.layout);
1610+
let [module,feature]=await locate.call(import.meta.url,last.layout);
16111611
let jsons=[...last.action.matchAll(new RegExp(/[{\[]{1}(?:[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/,"mg"))].map(([json])=>json);
16121612
let context=jsons.reduce((context,json)=>
16131613
[context,context.pop().split(json).reduce((before,after)=>
@@ -1622,7 +1622,7 @@
16221622
,context
16231623
].flat()
16241624
,[""]).reverse():[term]);
1625-
let fragment=await buffer(infer(resolve),fail=>document({span:{"#text":fail?.stack}}))(module,feature,...context);
1625+
let fragment=await buffer(infer(resolve.bind(import.meta.url)),fail=>document({span:{"#text":fail?.stack}}))(module,feature,...context);
16261626
this.annotate(fragment,last.title);
16271627
return [fragment,syntax];
16281628
},"{":function style(last,...syntax)
@@ -1677,7 +1677,7 @@
16771677
let context=JSON.parse(compound);
16781678
if(context[0]==="this")
16791679
context.splice(0,1,syntax[0]);
1680-
let fragment=await buffer(compose(resolve,collect),compose(crop(1),"stack",["span","#text"],record,document,collect))(context);
1680+
let fragment=await buffer(compose(resolve.bind(import.meta.url),collect),compose(crop(1),"stack",["span","#text"],record,document,collect))(context);
16811681
fragment.forEach(compose(crop(1),last.title,this.annotate));
16821682
return [...fragment,syntax];
16831683
}//,"<":function(last,...syntax){if(last.style||last.action)return;return this.text("&lt;",...arguments);}
@@ -1700,12 +1700,12 @@
17001700
[{context:[{span:[{},{}]}],condition:compose("childNodes",Array.from,provide,when(are(compose("nodeName","toLowerCase",("span")))))}
17011701
,{context:[{span:{},div:{}}],condition:compose("childNodes",Array.from,provide,when(...["span","div"].map(node=>compose("nodeName","toLowerCase",is(node)))))}
17021702
],attribute:
1703-
{scope:document({span:{}})
1703+
{scope:{span:{}},route:document
17041704
,context:[{id:"node"}]
17051705
,condition:compose("id",when(is("node")))
17061706
}
17071707
,children:
1708-
{scope:document({div:{}})
1708+
{scope:{div:{}},route:document
17091709
,context:[{id:"node",span:{}}]
17101710
,condition:compose("outerHTML",when(is("<div id=\"node\"><span></span></div>")))
17111711
}
@@ -1733,7 +1733,8 @@
17331733
,condition:compose(infer("getAttributeNode","viewBox"),"name",when(is("viewBox")))
17341734
}
17351735
,redundant:
1736-
{scope:document({span:{id:"node",span:[{class:"first"},{class:"second"}]}})
1736+
{scope:{span:{id:"node",span:[{class:"first"},{class:"second"}]}}
1737+
,route:document
17371738
,context:[{id:"node",span:[{"#text":"first"},{"#text":"second"}]}]
17381739
,condition:compose("childNodes",iterate,each(combine("className","textContent")),collect,combine(0.5,-0.5),collect,"flat",when(infer("every",(values,index)=>values.every(is(["first","second"][index])))))
17391740
}

Blik_2023_host.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {note,debug,colors,when,stash,flip,functor,string,not,pattern,revert,each,describe,clock,observe,is,has,same,minor,slip,something,compound,infer,tether,whether,collect,provide,buffer,differ,compose,combine,either,drop,crop,swap,wait,exit,pass,binary,simple,array,expect} from "./Blik_2023_inference.js";
2-
import {thread,resolve,access,locate,prompt,list,window,jsdom,fetch,digest,persist,version,compress,stage,cookies,cookie,feature} from "./Blik_2023_interface.js";
2+
import {loader,resolve,access,locate,prompt,list,window,jsdom,fetch,digest,persist,version,compress,stage,cookies,cookie,feature} from "./Blik_2023_interface.js";
33
import {search,merge,sum,prune,extract,encrypt,record,remember,route} from "./Blik_2023_search.js";
44
import {mime,bytes} from "./Blik_2023_meta.js";
55
import {document} from "./Blik_2023_fragment.js";
@@ -11,9 +11,9 @@
1111
let [module,...fields]=string(protocol)?await locate(protocol.split("/")):[protocol];
1212
let [{default:routes,relay,syndication,encryption,classify,classified,published,permit},{default:credentials}]=
1313
await [source,module].reduce(record(module=>
14-
string(module)?resolve(module):{default:module}),[]);
14+
string(module)?resolve.bind(import.meta.url)(module):{default:module}),[]);
1515
let {network,port,certification={},distinguishedname,cache}=note(search.call(credentials,fields));
16-
let agent=await resolve(network);
16+
let agent=await resolve.bind(import.meta.url)(network);
1717
let [[domain,[signature,certificate]=[]]=[]]=Object.entries(certification);
1818
let [encrypted,syndicated]=await [encryption,syndication].reduce(record(required=>
1919
required?prompt(extract.call(credentials,Object.keys(required))):{}),[]);
@@ -23,15 +23,15 @@
2323
merge(certification,required&&{[domain]:[signature,certificate]});
2424
merge(encryption,prune.call(encrypted,([field,value])=>encrypt(value)));
2525
merge(globalThis,{cache,published,classified,classify});
26-
let certificates=Object.values(certification).flat().map(compose(crop(1),slip("path","resolve"),resolve));
26+
let certificates=Object.values(certification).flat().map(compose(crop(1),slip("path","resolve"),resolve.bind(import.meta.url)));
2727
await classify?.(module,...certificates);
2828
// send jsdom composition to loader thread too so it can fetch modules from this interface during eg. server-side rendering.
2929
let origin=agent.globalAgent.protocol+"//localhost"+":"+port;
30-
delegate.call(thread,[[origin],"interface/jsdom"]);
30+
delegate.call(loader,[[origin],"interface/jsdom"]);
3131
jsdom(origin);
3232
let certifications=prune.call(certification,([domain,certificates])=>
3333
certify(certificates,distinguishedname,[domain]),0,0);
34-
// if(await resolve("cluster","isMaster"))return fork();
34+
// if(await resolve.bind(import.meta.url)("cluster","isMaster"))return fork();
3535
var router=compose(combine(whether
3636
(compose("url",/^http/,"match"),fetch
3737
,compose(combine(path,infer()),buffer(route.bind(routes),either(tether(routes.error),crop(1))))
@@ -56,7 +56,7 @@
5656
// for self-signed certificates, assign them to the NODE_EXTRA_CA_CERTS option.
5757
pass(compose(domain,certification,"addContext")))
5858
,pass(host=>note.call(2,[host._connectionKey||port," open"].join("")))
59-
,pass(compose(relay,broadcast,resolve))
59+
,pass(compose(relay,broadcast,resolve.bind(import.meta.url)))
6060
,revert((close,error,channel)=>observe.call(channel,{close,error})&&suspend||close(channel))
6161
)(agent,Object.values(certifications)[0],buffer(respond,compose(note,exit)));
6262
};
@@ -112,13 +112,13 @@
112112
async function fork()
113113
{// https://github.com/nodejs/node/issues/35158
114114
//if(!process.argv[1])process.argv[1]=import.meta.url;
115-
await resolve("cluster","on","exit",(worker,code,signal)=>note.call(code,worker.process.id+" exited with status "+code));
115+
await resolve.bind(import.meta.url)("cluster","on","exit",(worker,code,signal)=>note.call(code,worker.process.id+" exited with status "+code));
116116
let os=await import("os");
117117
let cpus=note(os.cpus());
118118
if(!cpus.length)
119119
cpus=[{model:os.platform()}];
120120
return cpus.reduce(record((cpu,index,cpus)=>
121-
compose.call("cluster","fork",resolve,pass(compose
121+
compose.call("cluster","fork",resolve.bind(import.meta.url),pass(compose
122122
("id",cpus.length+" "+cpu.model+(!cpus[index+1]?"":"\nnext fork in a second..."),collect,"/","join",note.bind(1)
123123
)),wait(index*1000)))
124124
,[]);
@@ -137,7 +137,7 @@
137137
async function certify(certification,distinguishedname,altnames,duration=1)
138138
{if(!certification)
139139
return [];
140-
let [path,url]=await resolve(["path","url"]);
140+
let [path,url]=await resolve.bind(import.meta.url)(["path","url"]);
141141
let location=path.dirname(url.fileURLToPath(import.meta.url));
142142
let [key,cert]=await Promise.all(certification.map(certificate=>
143143
buffer(access,swap(null))(path.resolve(location,certificate),true)));
@@ -160,7 +160,7 @@
160160
{[key.match(/^[A-Z]{2}$/)?"shortName":"name"]:key,value}));
161161
let altnames={name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]};//,{type:6,value:"https://"+distinguishedname.commonName}]};
162162
let certificate=this.pki.createCertificate();
163-
let asn1=await resolve("crypto","randomBytes",19).then(infer("toString","hex"));
163+
let asn1=await resolve.bind(import.meta.url)("crypto","randomBytes",19).then(infer("toString","hex"));
164164
Object.assign(certificate,{publicKey,serialNumber:"01"+asn1});
165165
Object.assign(certificate.validity,{notBefore:new Date(),notAfter:new Date()});
166166
certificate.validity.notAfter.setFullYear(certificate.validity.notBefore.getFullYear()+duration);
@@ -181,7 +181,7 @@
181181

182182
async function authorize({privateKey,publicKey},distinguishedname)
183183
{let encryption=this.rsa.generateKeyPair(2048);
184-
let hash=compose(stash(compose(drop(),"crypto","createHash","sha256",resolve)),flip,"update","digest");
184+
let hash=compose(stash(compose(drop(),"crypto","createHash","sha256",resolve.bind(import.meta.url))),flip,"update","digest");
185185
let {asn1:{Class:{UNIVERSAL},Type:{SEQUENCE,OID,NULL,OCTETSTRING}}}=this;
186186
let SHA256identifier=this.asn1.create(UNIVERSAL,SEQUENCE,true,
187187
[this.asn1.oidToDer(this.oids.sha256).getBytes(),''
@@ -285,7 +285,7 @@
285285
({name,icon:"/svg/animal/"+name+"/document"}));
286286

287287
export async function traverse(source)
288-
{let {default:{interface:html,...routes}}=await resolve(source);
288+
{let {default:{interface:html,...routes}}=await resolve.bind(import.meta.url)(source);
289289
if(!functor(html))
290290
return;
291291
return prune.call(routes,([field,value],path)=>

Blik_2023_inference.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,21 @@
4848
export var flip=compose(collect,"reverse",provide);
4949
export function undefine(){};
5050

51+
export var expressions=
52+
{signature:/ *(async *){0,1}function\*{0,1} *[a-zA-Z]* */
53+
,arguments:/\([\s\S]*?\)[\s\S]*?/
54+
};
5155
export function type(term){return typeof term;};
5256
export function defined(term){return term!==undefined;};
5357
export function something(term){return defined(term??undefined);};
5458
export function none(term){return term===null;};
55-
export function modular(term){return term[Symbol.toStringTag]==="Module";};
59+
export function modular(term){return term?.[Symbol.toStringTag]==="Module";};
5660
export function functor(term){return typeof term==="function";};
5761
export function lambda(term){if(functor(term))term=String(term);let index=term.indexOf("=>")+1;return index&&parameters(term.slice(0,index-1));};
58-
export function imperative(term){if(functor(term))term=String(term);return /^ *(async *){0,1}function\*{0,1} *[a-zA-Z]+ *\([\s\S]*?\)[\s\S]*?\{/.test(term);};
62+
export function imperative(term)
63+
{if(functor(term))term=String(term);
64+
return new RegExp("^"+expressions.signature.source+expressions.arguments.source+"\\{").test(term);
65+
};
5966
export function asynchronous(term){return ["AsyncGeneratorFunction","AsyncFunction"].includes(term?.constructor?.name);};
6067
export function composed(term){return functor(term)&&term.name.includes("(");};
6168
export function binary(term){return typeof term==="boolean";};
@@ -323,7 +330,7 @@
323330
export function compose(...terms)
324331
{// recursive inference agnostic of dynamic context.
325332
if(!defined(this))
326-
return confer(compose,...arguments);
333+
return confer(compose,...terms);
327334
return terms.reduce(function inference(context,term)
328335
{return infer(term)(context);
329336
},this);

0 commit comments

Comments
 (0)