hackmud-script-manager 0.13.0-d5b12bf → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ const e=function createErrorClass(e){const r={[e]:class extends Error{}}[e];return Object.defineProperty(r.prototype,"name",{value:e}),r}("AssertError");function assert(r,s="assertion failed"){if(!r)throw new e(s)}function ensure(e,r="ensure failed"){return assert(e,r),e}export{assert as a,ensure as e};
package/bin/hsm.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e from"chalk";import o from"fs";import{homedir as s}from"os";import{resolve as t,basename as n,extname as c,dirname as a,relative as r}from"path";import{supportedExtensions as i,test as l,watch as g,push as d}from"../index.js";import{DynamicMap as f,hackmudLength as h,writeFilePersist as u}from"../lib.js";import{syncMacros as m}from"../syncMacros.js";import{pull as b}from"../pull.js";import{processScript as p}from"../processScript.js";import{generateTypings as k}from"../generateTypings.js";import"chokidar";import"@babel/core";import"@babel/generator";import"acorn";import"terser";const{readFile:w,rmdir:y,writeFile:$,mkdir:v}=o.promises,j=t(s(),".config"),S=t(j,"hsm.json"),P=new Map,x=[];let z;const N=e.rgb(255,244,4),_=e.rgb(243,249,152),E=e.rgb(179,255,155),I=e.rgb(255,150,224),O=e.rgb(30,255,0),T=e.rgb(202,202,202),F=new f((e=>{let o=0;for(const s of e)o+=(o>>1)+o+"xi1_8ratvsw9hlbgm02y5zpdcn7uekof463qj".indexOf(s)+1;return[N,_,E,I,O,T][o%6](e)}));for(const e of process.argv.slice(2))if("-"==e[0]){const[o,s]=e.split("=");let t=s;if(t)if("true"==t)t=!0;else if("false"==t)t=!1;else{const e=Number(t);isFinite(e)&&(t=e)}else t=!0;if("-"==e[1])P.set(o.slice(2),t);else for(const e of o.slice(1))P.set(e,t)}else x.push(e);function L(){switch(x[0]){case"config":switch(x[1]){case"get":console.log("hsm config get <key>");break;case"set":console.log("hsm config set <key> <value>");break;case"delete":console.log("hsm config delete <key>");break;default:console.log("hsm config <get, delete, set>")}break;case"push":console.log("hsm push [dir]");break;case"watch":console.log("hsm watch [dir]");break;case"pull":console.log("hsm pull <user.script>");break;case"minify":case"golf":console.log(`${n(process.argv[1])} ${x[0]} <target> [output]`);break;default:console.log("hsm <push, watch, pull, config, golf>")}}async function M(){console.log("0.12.0")}async function q(){return z||(z=await w(S,{encoding:"utf-8"}).then((e=>{let o;try{o=JSON.parse(e)}catch{return console.log("config file was corrupted, resetting"),{}}return o&&"object"==typeof o?o:(console.log("config file was corrupted, resetting"),{})}),(()=>(console.log(`creating config file at ${S}`),{}))))}function D(e,o,s=!1){for(const t of o)e=s?"object"==typeof e[t]?e[t]:e[t]={}:null==e?void 0:e[t];return e}function J(){if(z){const e=JSON.stringify(z);$(S,e).catch((async o=>{switch(o.code){case"EISDIR":await y(S);break;case"ENOENT":await v(j);break;default:throw o}$(S,e)}))}}function R({file:o,users:s,srcLength:a,minLength:r,error:i}){s.length&&(i?console.log(`error "${e.bold(i.message)}" in ${e.bold(o)}`):console.log(`pushed ${e.bold(o)} to ${s.map((o=>e.bold(F.get(o)))).join(", ")} | ${e.bold(String(r))} chars from ${e.bold(String(a))} | saved ${e.bold(String(a-r))} (${e.bold(`${Math.round(100*(1-r/a))}%`)}) | ${e.bold(`${t(z.hackmudPath,s[0],"scripts",n(o,c(o)))}.js`)}`))}(async()=>{var o,s,f,y,$,v;if(P.get("version")||P.get("v"))M();else if(P.get("help")||P.get("h"))L();else{switch(x[0]){case"push":{const t=await q();if(!t.hackmudPath){console.log("you need to set hackmudPath in config before you can use this command");break}const n=x[1]||".",c=t.hackmudPath;let a,r;if(x[2]){const o=x[2].match(/^([a-z_][a-z_0-9]{0,24})\.([a-z_][a-z_0-9]{0,24})$/);if(!o){console.log(`"${e.bold(x[2])}" is not a valid script name`);break}a=[o[1]],r=[o[2]]}else a=(null===(o=P.get("users"))||void 0===o?void 0:o.toString().split(","))||[],r=(null===(s=P.get("scripts"))||void 0===s?void 0:s.toString().split(","))||[];await d(n,c,a,r,R),J()}break;case"dev":case"watch":{const e=await q();if(!e.hackmudPath){console.log("you need to set hackmudPath in config before you can use this command");break}const o=x[1]||".",s=e.hackmudPath,t=(null===(f=P.get("users"))||void 0===f?void 0:f.toString().split(","))||[],n=(null===(y=P.get("scripts"))||void 0===y?void 0:y.toString().split(","))||[],c=null===($=P.get("gen-types"))||void 0===$?void 0:$.toString();g(o,s,t,n,R,{genTypes:c})}break;case"pull":{const e=await q();if(!e.hackmudPath){console.log("you need to set hackmudPath in config before you can use this command");break}const o=x[1];if(!o){L();break}const s=x[2]||".",t=e.hackmudPath;try{await b(s,t,o)}catch(e){console.log("something went wrong, did you forget to #down the script?")}}break;case"sync-macros":{const{hackmudPath:e}=await q();if(!e){console.log("you need to set hackmudPath in config before you can use this command");break}const{macrosSynced:o,usersSynced:s}=await m(e);console.log(`synced ${o} macros to ${s} users`)}break;case"test":{const o=t(x[1]||".");let s=0;console.log(`testing scripts in ${e.bold(o)}\n`);for(const{file:t,line:n,message:c}of await l(o))console.log(`error "${e.bold(c)}" in ${e.bold(t)} on line ${e.bold(String(n))}`),s++;if(!s){console.log("no errors found");break}if(s){process.exitCode=1,console.log(`\nencountered ${e.bold(String(s))} errors`);break}console.log("no errors found")}break;case"gen-types":{const e=t(x[1]||".");let o;o=x[2]?t(x[2]):t(e,"../player.d.ts"),k(e,o,(await q()).hackmudPath)}break;case"config":switch(x[1]){case"get":console.log(D(await q(),x[2].split(".")));break;case"delete":{const e=x[2].split(".");if(!e.length){L();break}const o=await q();null===(v=D(o,e))||void 0===v||delete v[x[3]],console.log(o)}break;case"set":{const e=x[2].split(".");if(!e.length){L();break}const o=await q();let s=o;for(let o of e.slice(0,-1))s="object"==typeof s[o]?s[o]:s[o]={};s[e.slice(-1)[0]]=x[3],o.hackmudPath&&(o.hackmudPath=t(o.hackmudPath)),console.log(o)}break;default:x[1]&&console.log("unknown command"),L()}break;case"help":case"h":L();break;case"version":case"v":M();break;case"golf":case"minify":{if(!x[1]){console.log(`Target required\nUsage: ${n(process.argv[1])} ${x[0]} <target> [output]`);break}const o=c(x[1]);if(!i.includes(o)){console.log(`Unsupported file extension "${e.bold(o)}"\nSupported extensions are "${i.map((o=>e.bold(o))).join('", "')}"`);break}await w(x[1],{encoding:"utf-8"}).then((async s=>{const{script:c,srcLength:i,warnings:l}=await p(s);for(const{message:o,line:s}of l)console.log(`warning "${e.bold(o)}" on line ${e.bold(String(s))}`);let g;if(x[2])g=x[2];else{const e=n(x[1],o);g=t(a(x[1]),e.endsWith(".src")?`${e.slice(0,-4)}.js`:".js"==o?`${e}.min.js`:`${e}.js`)}const d=h(c);await u(g,c).catch((async e=>{if(!x[2]||"EISDIR"!=e.code)throw e;g=t(g,`${n(x[1],o)}.js`),await u(g,c)})).then((()=>console.log(`wrote ${e.bold(d)} chars to ${e.bold(r(".",g))} | saved ${e.bold(i-d)} chars`)),(e=>console.log(e.message)))}),(e=>console.log(e.message)))}break;default:x[0]&&console.log("unknown command"),L()}J()}})();
2
+ import o from"chalk";import e from"fs";import{homedir as s}from"os";import{resolve as t,basename as i,extname as n,dirname as r,relative as a}from"path";import{s as l,processScript as c}from"../processScript/index.js";import{D as p,w as g,push as m}from"../push.js";import{c as u}from"../processScript/minify.js";import{generateTypings as f}from"../generateTypings.js";import{syncMacros as b}from"../syncMacros.js";import{pull as h}from"../pull.js";import{watch as d}from"../watch.js";import"@babel/generator";import"@babel/parser";import"@babel/plugin-proposal-class-properties";import"@babel/plugin-proposal-class-static-block";import"@babel/plugin-proposal-decorators";import"@babel/plugin-proposal-do-expressions";import"@babel/plugin-proposal-function-bind";import"@babel/plugin-proposal-function-sent";import"@babel/plugin-proposal-json-strings";import"@babel/plugin-proposal-logical-assignment-operators";import"@babel/plugin-proposal-nullish-coalescing-operator";import"@babel/plugin-proposal-numeric-separator";import"@babel/plugin-proposal-object-rest-spread";import"@babel/plugin-proposal-optional-catch-binding";import"@babel/plugin-proposal-optional-chaining";import"@babel/plugin-proposal-partial-application";import"@babel/plugin-proposal-pipeline-operator";import"@babel/plugin-proposal-private-property-in-object";import"@babel/plugin-proposal-record-and-tuple";import"@babel/plugin-proposal-throw-expressions";import"@babel/plugin-transform-exponentiation-operator";import"@babel/plugin-transform-typescript";import"@babel/traverse";import"@babel/types";import"@rollup/plugin-babel";import"@rollup/plugin-commonjs";import"@rollup/plugin-json";import"@rollup/plugin-node-resolve";import"perf_hooks";import"prettier";import"rollup";import"../processScript/postprocess.js";import"../assert-1556d989.js";import"../spliceString-2c6f214f.js";import"../processScript/preprocess.js";import"../processScript/transform.js";import"../processScript/shared.js";import"acorn";import"terser";import"chokidar";const{readFile:k,rmdir:w,writeFile:y,mkdir:j}=e.promises,v=t(s(),".config"),$=t(v,"hsm.json"),S=new Map,P=[];let C;const x=o.rgb(255,244,4),N=o.rgb(243,249,152),O=o.rgb(179,255,155),L=o.rgb(255,150,224),U=o.rgb(30,255,0),T=o.rgb(202,202,202),E=new p((o=>{let e=0;for(const s of o)e+=(e>>1)+e+"xi1_8ratvsw9hlbgm02y5zpdcn7uekof463qj".indexOf(s)+1;return[x,N,O,L,U,T][e%6](o)}));for(const o of process.argv.slice(2))if("-"==o[0]){const[e,s]=o.split("=");let t=s;if(t)if("true"==t)t=!0;else if("false"==t)t=!1;else{const o=Number(t);isFinite(o)&&(t=o)}else t=!0;if("-"==o[1])S.set(e.slice(2),t);else for(const o of e.slice(1))S.set(o,t)}else P.push(o);function help(){switch(P[0]){case"config":switch(P[1]){case"get":console.log("hsm config get <key>");break;case"set":console.log("hsm config set <key> <value>");break;case"delete":console.log("hsm config delete <key>");break;default:console.log("hsm config <get, delete, set>")}break;case"push":console.log('hsm push [<dir> [..."<script user>.<script name>"]]');break;case"watch":console.log("hsm watch [dir]");break;case"pull":console.log("hsm pull <script user>.<script name>");break;case"minify":case"golf":console.log(`${i(process.argv[1])} ${P[0]} <target> [output]`);break;default:console.log("hsm <push, watch, pull, config, golf>")}}function version(){console.log("0.13.1")}async function getConfig(){return C||(C=await k($,{encoding:"utf-8"}).then((o=>{let e;try{e=JSON.parse(o)}catch{return console.log("config file was corrupted, resetting"),{}}return e&&"object"==typeof e?e:(console.log("config file was corrupted, resetting"),{})}),(()=>(console.log(`creating config file at ${$}`),{}))))}function exploreObject(o,e,s=!1){for(const i of e){var t;o=s?"object"==typeof o[i]?o[i]:o[i]={}:null===(t=o)||void 0===t?void 0:t[i]}return o}function updateConfig(){if(C){const o=JSON.stringify(C,void 0,"\t");y($,o).catch((async e=>{switch(e.code){case"EISDIR":await w($);break;case"ENOENT":await j(v);break;default:throw e}y($,o)}))}}function onPushLogger({file:e,users:s,srcLength:r,minLength:a,error:l}){s.length&&(l?console.log(`error "${o.bold(l.message)}" in ${o.bold(e)}`):console.log(`pushed ${o.bold(e)} to ${s.map((e=>o.bold(E.get(e)))).join(", ")} | ${o.bold(String(a))} chars from ${o.bold(String(r))} | saved ${o.bold(String(r-a))} (${o.bold(`${Math.round(100*(1-a/r))}%`)}) | ${o.bold(`${t(C.hackmudPath,s[0],"scripts",i(e,n(e)))}.js`)}`))}(async()=>{if(S.get("version")||S.get("v"))version();else if(S.get("help")||S.get("h"))help();else{switch(P[0]){case"push":{const o=await getConfig();if(!o.hackmudPath){console.log("you need to set hackmudPath in config before you can use this command");break}const e=P[1]||".",s=o.hackmudPath,t=P.slice(2);t.length||t.push("*.*");(await m(e,s,{scripts:t,onPush:onPushLogger,minify:!S.get("skip-minify")})).length||console.warn("couldn't find any scripts to push"),updateConfig()}break;case"dev":case"watch":{var e,s,p;const o=await getConfig();if(!o.hackmudPath){console.log("you need to set hackmudPath in config before you can use this command");break}const t=P[1]||".",i=o.hackmudPath,n=(null===(e=S.get("users"))||void 0===e?void 0:e.toString().split(","))||[],r=(null===(s=S.get("scripts"))||void 0===s?void 0:s.toString().split(","))||[],a=null===(p=S.get("gen-types"))||void 0===p?void 0:p.toString();d(t,i,n,r,onPushLogger,{genTypes:a})}break;case"pull":{const o=await getConfig();if(!o.hackmudPath){console.log("you need to set hackmudPath in config before you can use this command");break}const e=P[1];if(!e){help();break}const s=P[2]||".",t=o.hackmudPath;try{await h(s,t,e)}catch{console.log("something went wrong, did you forget to #down the script?")}}break;case"sync-macros":{const{hackmudPath:o}=await getConfig();if(!o){console.log("you need to set hackmudPath in config before you can use this command");break}const{macrosSynced:e,usersSynced:s}=await b(o);console.log(`synced ${e} macros to ${s} users`)}break;case"gen-types":{const o=t(P[1]||".");f(o,P[2]?t(P[2]):t(o,"../player.d.ts"),(await getConfig()).hackmudPath)}break;case"config":switch(P[1]){case"get":P[2]?console.log(exploreObject(await getConfig(),P[2].split("."))):console.log(await getConfig());break;case"delete":if(P[2]){var w;const o=P[2].split("."),e=o.pop();if(!o.length){help();break}const s=await getConfig();null===(w=exploreObject(s,o))||void 0===w||delete w[e],console.log(s)}else console.log("Usage:\nhsm config delete <key>");break;case"set":if(P[2]&&P[3]){const o=P[2].split(".");if(!o.length){help();break}const e=o.pop(),s=await getConfig();if(o.length||"hackmudPath"!=e){let t=s;for(const e of o)"object"==typeof t[e]||(t[e]={}),t=t[e];t[e]=P[3]}else s.hackmudPath=t(P[3]);console.log(s)}else console.log("Usage:\nhsm config set <key> <value>");break;default:P[1]&&console.log("unknown command"),help()}break;case"help":case"h":help();break;case"version":case"v":version();break;case"golf":case"minify":{const e=P[1];if(!e){console.log(`Target required\nUsage: ${i(process.argv[1])} ${P[0]} <target> [output]`);break}const s=n(e);if(!l.includes(s)){console.log(`Unsupported file extension "${o.bold(s)}"\nSupported extensions are "${l.map((e=>o.bold(e))).join('", "')}"`);break}await k(e,{encoding:"utf-8"}).then((async n=>{const l=i(e,s),p=l.endsWith(".src"),m=p?l.slice(0,-4):l;let f="UNKNOWN";"scripts"==i(t(e,".."))&&"hackmud"==i(t(e,"../../.."))&&(f=i(t(e,"../..")));const b=!S.get("skip-minify"),h=Boolean(S.get("mangle-names"));!b&&h&&console.warn("warning: `--mangle-names` has no effect while `--skip-minify` is active");const{script:d,srcLength:k,warnings:w,timeTook:y}=await c(n,{minify:b,scriptUser:f,scriptName:m,filePath:e,mangleNames:h});for(const{message:e,line:s}of w)console.log(`warning "${o.bold(e)}" on line ${o.bold(String(s))}`);let j;j=P[2]?P[2]:t(r(e),p?`${m}.js`:".js"==s?`${l}.min.js`:`${l}.js`);const v=u(d);await g(j,d).catch((async o=>{if(!P[2]||"EISDIR"!=o.code)throw o;j=t(j,`${i(e,s)}.js`),await g(j,d)})).then((()=>console.log(`wrote ${o.bold(v)} chars to ${o.bold(a(".",j))} | saved ${o.bold(k-v)} chars | took ${Math.round(100*y)/100}ms`)),(o=>console.log(o.message)))}),(o=>console.log(o.message)))}break;default:P[0]&&console.log("unknown command"),help()}updateConfig()}})();
@@ -1,2 +1,2 @@
1
- export declare function generateTypings(srcDir: string, target: string, hackmudPath?: string): Promise<void>;
1
+ export declare function generateTypings(sourceDirectory: string, target: string, hackmudPath?: string): Promise<void>;
2
2
  export default generateTypings;
@@ -1 +1 @@
1
- import t from"fs";import{extname as e,basename as n,resolve as s}from"path";const{readdir:r,writeFile:o}=t.promises;async function a(t,a,i){const f=new Set;if(i)for(const t of await r(i,{withFileTypes:!0}))t.isFile()&&".key"==e(t.name)&&f.add(n(t.name,".key"));const c=[],l=[],m={},p={};for(const o of await r(t,{withFileTypes:!0}))if(o.isFile())".ts"==e(o.name)?c.push(n(o.name,".ts")):".js"==e(o.name)&&l.push(n(o.name,".js"));else if(o.isDirectory()){const a=m[o.name]=[],i=p[o.name]=[];f.add(o.name);for(const f of await r(s(t,o.name),{withFileTypes:!0}))f.isFile()&&(".ts"==e(f.name)?a.push(n(f.name,".ts")):".js"==e(f.name)&&i.push(n(f.name,".js")))}let $="";for(const t of c)$+=`import { script as $${t}$ } from "./src/${t}"\n`;$+="\n";for(const t in m){const e=m[t];for(const n of e)$+=`import { script as $${t}$${n}$ } from "./src/${t}/${n}"\n`}$+="\ntype ArrayRemoveFirst<A> = A extends [ infer FirstItem, ...infer Rest ] ? Rest : never\n\ntype Subscript<T extends (...args: any) => any> =\n\t(...args: ArrayRemoveFirst<Parameters<T>>) => ReturnType<T> | ScriptFailure\n\ntype WildFullsec = Record<string, () => ScriptFailure> & {\n";for(const t of c)$+=`\t${t}: Subscript<typeof $${t}$>\n`;for(const t of l)$+=`\t${t}: (...args: any) => any\n`;$+="}\n\ndeclare global {\n\tinterface PlayerFullsec {";let y=!0;for(const t of f){const e=m[t],n=p[t];if(e&&e.length||n&&n.length){y=!0,$+=`\n\t\t${t}: WildFullsec & {\n`;for(const n of e)$+=`\t\t\t${n}: Subscript<typeof $${t}$${n}$>\n`;for(const t of n)$+=`\t\t\t${t}: (...args: any) => any\n`;$+="\t\t}"}else y&&($+="\n",y=!1),$+=`\t\t${t}: WildFullsec`;$+="\n"}$+="\t}\n}\n",await o(a,$)}export{a as default,a as generateTypings};
1
+ import e from"fs";import{extname as n,basename as t,resolve as s,relative as r}from"path";const{readdir:i,writeFile:a}=e.promises;async function generateTypings(e,o,f){const c=new Set;if(f)for(const e of await i(f,{withFileTypes:!0}))e.isFile()&&".key"==n(e.name)&&c.add(t(e.name,".key"));const l=[],m=[],p={},$={};await Promise.all((await i(e,{withFileTypes:!0})).map((async r=>{if(r.isFile())".ts"==n(r.name)?l.push(t(r.name,".ts")):".js"==n(r.name)&&m.push(t(r.name,".js"));else if(r.isDirectory()){const a=[],o=[];p[r.name]=a,$[r.name]=o,c.add(r.name);for(const f of await i(s(e,r.name),{withFileTypes:!0}))f.isFile()&&(".ts"==n(f.name)?a.push(t(f.name,".ts")):".js"==n(f.name)&&o.push(t(f.name,".js")))}}))),e=r(".",e);let y="";for(const n of l)y+=`import $${n}$ from "./${e}/${n}"\n`;y+="\n";for(const n in p){const t=p[n];for(const s of t)y+=`import $${n}$${s}$ from "./${e}/${n}/${s}"\n`}y+="\ntype ArrayRemoveFirst<A> = A extends [ infer FirstItem, ...infer Rest ] ? Rest : never\n\ntype Subscript<T extends (...args: any) => any> =\n\t(...args: ArrayRemoveFirst<Parameters<T>>) => ReturnType<T> | ScriptFailure\n\ntype WildFullsec = Record<string, () => ScriptFailure> & {\n";for(const e of l)y+=`\t${e}: Subscript<typeof $${e}$>\n`;for(const e of m)y+=`\t${e}: (...args: any) => any\n`;y+="}\n\ninterface PlayerFullsec {";let u=!0;for(const e of c){const n=p[e],t=$[e];if(n&&n.length||t&&t.length){if(u=!0,y+=`\n\t${e}: WildFullsec & {\n`,n)for(const t of n)y+=`\t\t${t}: Subscript<typeof $${e}$${t}$>\n`;if(t)for(const e of t)y+=`\t\t${e}: (...args: any) => any\n`;y+="\t}"}else u&&(y+="\n",u=!1),y+=`\t${e}: WildFullsec`;y+="\n"}y+="}\n",await a(o,y)}export{generateTypings as default,generateTypings};
package/index.d.ts CHANGED
@@ -1,15 +1,14 @@
1
- export interface Info {
1
+ export { supportedExtensions } from "./constants.json";
2
+ export { generateTypings } from "./generateTypings";
3
+ export { processScript } from "./processScript";
4
+ export { pull } from "./pull";
5
+ export { push } from "./push";
6
+ export { syncMacros } from "./syncMacros";
7
+ export { watch } from "./watch";
8
+ export declare type Info = {
2
9
  file: string;
3
10
  users: string[];
4
11
  srcLength: number;
5
12
  minLength: number;
6
- error: Error | null;
7
- }
8
- export declare const supportedExtensions: string[];
9
- export * from "./push";
10
- export * from "./watch";
11
- export * from "./pull";
12
- export * from "./syncMacros";
13
- export * from "./test";
14
- export * from "./generateTypings";
15
- export * from "./processScript";
13
+ error: Error | undefined;
14
+ };
package/index.js CHANGED
@@ -1 +1 @@
1
- import e from"fs";import{resolve as s,extname as n,basename as t}from"path";import{watch as i}from"chokidar";import{hackmudLength as r,writeFilePersist as o}from"./lib.js";import{generateTypings as c}from"./generateTypings.js";export{generateTypings}from"./generateTypings.js";import{processScript as a}from"./processScript.js";export{processScript}from"./processScript.js";export{pull}from"./pull.js";export{syncMacros}from"./syncMacros.js";import"@babel/core";import"@babel/generator";import"acorn";import"terser";const{readFile:l,readdir:p}=e.promises;function m(e,i,c,m,h){return new Promise((async f=>{const u=[],g=await p(e,{withFileTypes:!0}),w=new Map,d=[];for(const f of g){const g=f.name;!f.isDirectory()||c.length&&!c.includes(g)||d.push(p(s(e,g),{withFileTypes:!0}).then((c=>{for(const p of c){const c=n(p.name),f=t(p.name,c);if(y.includes(c)&&p.isFile()&&(!m.length||m.includes(f))){let n=w.get(f);n?n.push(g):w.set(f,[g]),l(s(e,g,p.name),{encoding:"utf-8"}).then((async e=>{let n=null;const{srcLength:t,script:c}=await a(e).catch((e=>(n=e,{srcLength:0,script:""}))),l={file:`${g}/${p.name}`,users:[g],minLength:0,error:n,srcLength:t};u.push(l),n||(c?(l.minLength=r(c),await o(s(i,g,"scripts",`${f}.js`),c)):l.error=new Error("processed script was empty")),null==h||h(l)}))}}})))}c.length||(c=(await p(i,{withFileTypes:!0})).filter((e=>e.isFile()&&".key"==n(e.name))).map((e=>t(e.name,".key")))),Promise.all(d).then((()=>{const p=[];for(const f of g)if(f.isFile()){const g=n(f.name);if(y.includes(g)){const n=t(f.name,g);m.length&&!m.includes(n)||p.push(l(s(e,f.name),{encoding:"utf-8"}).then((async e=>{let t=null;const{script:l,srcLength:m}=await a(e).catch((e=>(t=e,{script:"",srcLength:0}))),g={file:f.name,users:[],minLength:0,error:t,srcLength:m};if(u.push(g),!t)if(l){g.minLength=r(l);const e=w.get(n)||[],t=[];for(const r of c)e.includes(r)||(g.users.push(r),t.push(o(s(i,r,"scripts",`${n}.js`),l)))}else g.error=new Error("processed script was empty");h&&Promise.all(p).then((()=>h(g)))})))}}Promise.all(p).then((()=>f(u)))}))}))}const{readFile:h,readdir:f}=e.promises;function u(e,l,p,m,u,{genTypes:g}={}){const w=i("",{depth:1,cwd:e,awaitWriteFinish:{stabilityThreshold:100}}).on("change",(async i=>{const c=n(i);if(y.includes(c)){const g=t(i,c);if(i==t(i)){if(!m.length||m.includes(g)){const c=await h(s(e,i),{encoding:"utf-8"}),m=new Map,w=[];for(const i of await f(e,{withFileTypes:!0}))i.isDirectory()&&w.push(f(s(e,i.name),{withFileTypes:!0}).then((e=>{for(const s of e){if(!s.isFile())continue;const e=n(s.name);if(!y.includes(e))continue;const r=t(s.name,e),o=m.get(r);o?o.push(i.name):m.set(r,[i.name])}})));await Promise.all(w);let d=null;const{script:L,srcLength:F}=await a(c).catch((e=>(d=e,{script:"",srcLength:0}))),T={file:i,users:[],minLength:0,error:d,srcLength:F},j=[];if(!d)if(L){const e=m.get(g)||[];T.minLength=r(L),p.length||(p=(await f(l,{withFileTypes:!0})).filter((e=>e.isFile()&&".key"==n(e.name))).map((e=>t(e.name,".key"))));for(const n of p)e.includes(n)||(T.users.push(n),j.push(o(s(l,n,"scripts",`${g}.js`),L)))}else T.error=new Error("processed script was empty");u&&(await Promise.all(j),u(T))}}else{const n=t(s(i,".."));if((!p.length||p.includes(n))&&(!m.length||m.includes(g))){const t=await h(s(e,i),{encoding:"utf-8"});let c=null;const{script:p,srcLength:m}=await a(t).catch((e=>(c=e,{script:"",srcLength:0}))),f={file:i,users:[n],minLength:0,error:c,srcLength:m};c||(p?(f.minLength=r(p),await o(s(l,n,"scripts",`${g}.js`),p)):f.error=new Error("processed script was empty")),null==u||u(f)}}}}));g&&(c(e,s(e,g),l),w.on("add",(()=>c(e,s(e,g),l))),w.on("unlink",(()=>c(e,s(e,g),l))))}const{readFile:g,readdir:w}=e.promises;async function d(e){const t=[],i=[];for(const r of await w(e,{withFileTypes:!0}))r.isDirectory()?t.push(w(s(e,r.name),{withFileTypes:!0}).then((t=>{const o=[];for(const c of t)c.isFile()&&y.includes(n(c.name))&&o.push(g(s(e,r.name,c.name),{encoding:"utf-8"}).then(a).then((({warnings:e})=>i.push(...e.map((({message:e,line:s})=>({file:`${r.name}/${c.name}`,message:e,line:s})))))));return Promise.all(o)}))):r.isFile()&&y.includes(n(r.name))&&t.push(g(s(e,r.name),{encoding:"utf-8"}).then(a).then((({warnings:e})=>i.push(...e.map((({message:e,line:s})=>({file:r.name,message:e,line:s})))))));return await Promise.all(t),i}const y=[".js",".ts"];export{m as push,y as supportedExtensions,d as test,u as watch};
1
+ export{processScript,s as supportedExtensions}from"./processScript/index.js";export{generateTypings}from"./generateTypings.js";export{pull}from"./pull.js";export{push}from"./push.js";export{syncMacros}from"./syncMacros.js";export{watch}from"./watch.js";import"@babel/generator";import"@babel/parser";import"@babel/plugin-proposal-class-properties";import"@babel/plugin-proposal-class-static-block";import"@babel/plugin-proposal-decorators";import"@babel/plugin-proposal-do-expressions";import"@babel/plugin-proposal-function-bind";import"@babel/plugin-proposal-function-sent";import"@babel/plugin-proposal-json-strings";import"@babel/plugin-proposal-logical-assignment-operators";import"@babel/plugin-proposal-nullish-coalescing-operator";import"@babel/plugin-proposal-numeric-separator";import"@babel/plugin-proposal-object-rest-spread";import"@babel/plugin-proposal-optional-catch-binding";import"@babel/plugin-proposal-optional-chaining";import"@babel/plugin-proposal-partial-application";import"@babel/plugin-proposal-pipeline-operator";import"@babel/plugin-proposal-private-property-in-object";import"@babel/plugin-proposal-record-and-tuple";import"@babel/plugin-proposal-throw-expressions";import"@babel/plugin-transform-exponentiation-operator";import"@babel/plugin-transform-typescript";import"@babel/traverse";import"@babel/types";import"@rollup/plugin-babel";import"@rollup/plugin-commonjs";import"@rollup/plugin-json";import"@rollup/plugin-node-resolve";import"path";import"perf_hooks";import"prettier";import"rollup";import"./processScript/minify.js";import"acorn";import"terser";import"./processScript/shared.js";import"./assert-1556d989.js";import"./spliceString-2c6f214f.js";import"./processScript/postprocess.js";import"./processScript/preprocess.js";import"./processScript/transform.js";import"fs";import"chokidar";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackmud-script-manager",
3
- "version": "0.13.0-d5b12bf",
3
+ "version": "0.13.1",
4
4
  "description": "Script manager for game hackmud, with minification, TypeScript support, and player script type definition generation.",
5
5
  "keywords": [
6
6
  "api",
@@ -21,30 +21,18 @@
21
21
  "bugs": "https://github.com/samualtnorman/hackmud-script-manager/issues",
22
22
  "license": "GPL-3.0-or-later",
23
23
  "author": "Samual Norman",
24
- "files": [
25
- "*.d.ts",
26
- "*.js",
27
- "bin"
28
- ],
29
24
  "main": "index.js",
30
- "bin": {
31
- "hsm": "bin/hsm.js"
32
- },
33
25
  "repository": {
34
26
  "type": "git",
35
27
  "url": "https://github.com/samualtnorman/hackmud-script-manager.git"
36
28
  },
37
- "scripts": {
38
- "build": "rollup -c",
39
- "dev": "rollup -cw",
40
- "gen-types": ""
41
- },
42
29
  "dependencies": {
43
30
  "@babel/core": "^7.16.0",
44
31
  "@babel/generator": "^7.16.0",
32
+ "@babel/parser": "^7.16.4",
45
33
  "@babel/plugin-proposal-class-properties": "^7.16.0",
46
34
  "@babel/plugin-proposal-class-static-block": "^7.16.0",
47
- "@babel/plugin-proposal-decorators": "^7.16.0",
35
+ "@babel/plugin-proposal-decorators": "^7.16.4",
48
36
  "@babel/plugin-proposal-do-expressions": "^7.16.0",
49
37
  "@babel/plugin-proposal-function-bind": "^7.16.0",
50
38
  "@babel/plugin-proposal-function-sent": "^7.16.0",
@@ -62,27 +50,74 @@
62
50
  "@babel/plugin-proposal-throw-expressions": "^7.16.0",
63
51
  "@babel/plugin-transform-exponentiation-operator": "^7.16.0",
64
52
  "@babel/plugin-transform-typescript": "^7.16.1",
65
- "acorn": "8.x",
66
- "chalk": "4.x",
67
- "chokidar": "3.x",
68
- "terser": "5.x"
53
+ "@babel/traverse": "^7.16.3",
54
+ "@babel/types": "^7.16.0",
55
+ "@bloomberg/record-tuple-polyfill": "^0.0.4",
56
+ "@rollup/plugin-babel": "^5.3.0",
57
+ "@rollup/plugin-commonjs": "^21.0.1",
58
+ "@rollup/plugin-json": "^4.1.0",
59
+ "@rollup/plugin-node-resolve": "^13.0.6",
60
+ "acorn": "^8.5.0",
61
+ "chalk": "^5.0.0",
62
+ "chokidar": "^3.5.2",
63
+ "prettier": "^2.4.1",
64
+ "proxy-polyfill": "^0.3.2",
65
+ "rollup": "^2.60.0",
66
+ "terser": "^5.10.0"
69
67
  },
70
68
  "devDependencies": {
71
- "@rollup/plugin-json": "^4.1.0",
72
- "@rollup/plugin-typescript": "^8.2.5",
69
+ "@babel/preset-env": "^7.16.4",
70
+ "@babel/preset-typescript": "^7.16.0",
71
+ "@samual/lib": "^0.2.2",
73
72
  "@types/babel__core": "^7.1.16",
74
- "@types/node": "12.x",
75
- "@types/semver": "7.x",
76
- "rollup": "^2.56.3",
73
+ "@types/node": "^12.20.37",
74
+ "@types/prettier": "^2.4.2",
75
+ "@types/semver": "^7.3.9",
76
+ "@typescript-eslint/eslint-plugin": "^5.8.0",
77
+ "@typescript-eslint/parser": "^5.8.1",
78
+ "eslint": "^8.5.0",
79
+ "eslint-plugin-array-func": "^3.1.7",
80
+ "eslint-plugin-eslint-comments": "^3.2.0",
81
+ "eslint-plugin-optimize-regex": "^1.2.1",
82
+ "eslint-plugin-regexp": "^1.5.1",
83
+ "eslint-plugin-unicorn": "^40.1.0",
84
+ "eslint-plugin-write-good-comments": "^0.1.3",
85
+ "latest-version": "^6.0.0",
77
86
  "rollup-plugin-preserve-shebang": "^1.0.1",
78
87
  "rollup-plugin-terser": "^7.0.2",
79
- "semver": "7.x",
80
- "tslib": "^2.3.1",
81
- "typescript": "^4.4.4"
88
+ "semver": "^7.3.5",
89
+ "typescript": "^4.5.2"
90
+ },
91
+ "optionalDependencies": {
92
+ "deasync": "^0.1.24"
82
93
  },
83
94
  "engines": {
84
- "node": "^12.17 || ^13.1 || >=14"
95
+ "node": "^12.20 || >=14"
85
96
  },
86
97
  "types": "index.d.ts",
87
- "type": "module"
88
- }
98
+ "type": "module",
99
+ "exports": {
100
+ ".": {
101
+ "import": "./index.js",
102
+ "require": "./index.cjs"
103
+ },
104
+ "./*": "./*",
105
+ "./generateTypings": "./generateTypings.js",
106
+ "./index": "./index.js",
107
+ "./pull": "./pull.js",
108
+ "./push": "./push.js",
109
+ "./syncMacros": "./syncMacros.js",
110
+ "./watch": "./watch.js",
111
+ "./bin/hsm": "./bin/hsm.js",
112
+ "./processScript/index": "./processScript/index.js",
113
+ "./processScript": "./processScript/index.js",
114
+ "./processScript/minify": "./processScript/minify.js",
115
+ "./processScript/postprocess": "./processScript/postprocess.js",
116
+ "./processScript/preprocess": "./processScript/preprocess.js",
117
+ "./processScript/shared": "./processScript/shared.js",
118
+ "./processScript/transform": "./processScript/transform.js"
119
+ },
120
+ "bin": {
121
+ "hsm": "./bin/hsm.js"
122
+ }
123
+ }
@@ -0,0 +1,33 @@
1
+ export { minify } from "./minify";
2
+ export { postprocess } from "./postprocess";
3
+ export { preprocess } from "./preprocess";
4
+ export { transform as compile } from "./transform";
5
+ export declare type ProcessOptions = {
6
+ /** whether to minify the given code */
7
+ minify: boolean;
8
+ /** 11 a-z 0-9 characters */
9
+ uniqueID: string;
10
+ /** the user going to be hosting this script (or set to `true` if not yet known) */
11
+ scriptUser: string | true;
12
+ /** the name of this script (or set to `true` if not yet known) */
13
+ scriptName: string | true;
14
+ filePath: string;
15
+ /** whether to mangle function and class names (defaults to `false`) */
16
+ mangleNames: boolean;
17
+ };
18
+ /**
19
+ * Minifies a given script
20
+ *
21
+ * @param code JavaScript or TypeScript code
22
+ * @param options {@link ProcessOptions details}
23
+ */
24
+ export declare function processScript(code: string, { minify: shouldMinify, uniqueID, scriptUser, scriptName, filePath, mangleNames }?: Partial<ProcessOptions>): Promise<{
25
+ srcLength: number;
26
+ script: string;
27
+ warnings: {
28
+ message: string;
29
+ line: number;
30
+ }[];
31
+ timeTook: number;
32
+ }>;
33
+ export default processScript;
@@ -0,0 +1 @@
1
+ import e from"@babel/generator";import{parse as o}from"@babel/parser";import r from"@babel/plugin-proposal-class-properties";import t from"@babel/plugin-proposal-class-static-block";import s from"@babel/plugin-proposal-decorators";import p from"@babel/plugin-proposal-do-expressions";import a from"@babel/plugin-proposal-function-bind";import l from"@babel/plugin-proposal-function-sent";import i from"@babel/plugin-proposal-json-strings";import n from"@babel/plugin-proposal-logical-assignment-operators";import m from"@babel/plugin-proposal-nullish-coalescing-operator";import c from"@babel/plugin-proposal-numeric-separator";import f from"@babel/plugin-proposal-object-rest-spread";import u from"@babel/plugin-proposal-optional-catch-binding";import b from"@babel/plugin-proposal-optional-chaining";import d from"@babel/plugin-proposal-partial-application";import g from"@babel/plugin-proposal-pipeline-operator";import h from"@babel/plugin-proposal-private-property-in-object";import w from"@babel/plugin-proposal-record-and-tuple";import y from"@babel/plugin-proposal-throw-expressions";import x from"@babel/plugin-transform-exponentiation-operator";import j from"@babel/plugin-transform-typescript";import S from"@babel/traverse";import k from"@babel/types";import v from"@rollup/plugin-babel";import E from"@rollup/plugin-commonjs";import N from"@rollup/plugin-json";import C from"@rollup/plugin-node-resolve";import{resolve as L}from"path";import{performance as _}from"perf_hooks";import I from"prettier";import{rollup as D}from"rollup";import{c as U,minify as $}from"./minify.js";export{minify}from"./minify.js";import{postprocess as M}from"./postprocess.js";export{postprocess}from"./postprocess.js";import{preprocess as W}from"./preprocess.js";export{preprocess}from"./preprocess.js";import{transform as q}from"./transform.js";export{transform as compile}from"./transform.js";import{a as F}from"../assert-1556d989.js";import"acorn";import"terser";import"./shared.js";import"../spliceString-2c6f214f.js";const T=[".js",".ts"],{default:H}=v,{format:O}=I,{default:P}=e,{default:K}=S;async function processScript(e,{minify:S=!0,uniqueID:v=Math.floor(Math.random()*2**52).toString(36).padStart(11,"0"),scriptUser:I="UNKNOWN",scriptName:z="UNKNOWN",filePath:B,mangleNames:G=!1}={}){F(/^\w{11}$/.exec(v)),B=B?L(B):"script";const A=_.now(),J=e;let Q,R;const V=/^function\s*\(.+\/\/(?<autocomplete>.+)/.exec(e);if(V)e=`export default ${e}`,({autocomplete:Q}=V.groups);else for(const o of e.split("\n")){const e=/^\s*\/\/(?<commentContent>.+)/.exec(o);if(!e)break;const r=e.groups.commentContent.trim();if(r.startsWith("@autocomplete "))Q=r.slice(14).trimStart();else if(r.startsWith("@seclevel ")){const e=r.slice(10).trimStart().toLowerCase();switch(e){case"fullsec":case"full":case"fs":case"4s":case"f":case"4":R=4;break;case"highsec":case"high":case"hs":case"3s":case"h":case"3":R=3;break;case"midsec":case"mid":case"ms":case"2s":case"m":case"2":R=2;break;case"lowsec":case"low":case"ls":case"1s":case"l":case"1":R=1;break;case"nullsec":case"null":case"ns":case"0s":case"n":case"0":R=0;break;default:throw new Error(`unrecognised seclevel "${e}"`)}}}F(/^\w{11}$/.exec(v));const X=B?L(B):"script";let Y=4;const Z=await D({plugins:[{name:"emit script",buildStart(){this.emitFile({type:"chunk",id:X})},load(o){if(o==X)return e},transform(e){const{code:o,seclevel:r}=W(e,{uniqueID:v});return Y=Math.min(Y,r),o}},H({babelHelpers:"bundled",plugins:[[j.default,{allowDeclareFields:!0,optimizeConstEnums:!0}],[s.default,{decoratorsBeforeExport:!0}],[p.default],[a.default],[l.default],[d.default],[g.default,{proposal:"hack",topicToken:"%"}],[y.default],[w.default,{syntaxType:"hash",importPolyfill:!0}],[r.default],[t.default],[h.default],[n.default],[c.default],[m.default],[b.default],[u.default],[i.default],[f.default],[x.default]],configFile:!1,extensions:T}),E(),C({extensions:T}),N()],treeshake:{moduleSideEffects:!1}}),ee=["NULLSEC","LOWSEC","MIDSEC","HIGHSEC","FULLSEC"];let oe;if(e=(await Z.generate({})).output[0].code,({file:oe,seclevel:Y}=await q(o(e,{sourceType:"module"}),J,{uniqueID:v,scriptUser:I,scriptName:z,seclevel:Y})),null!=R&&Y<R)throw new Error(`detected seclevel ${ee[Y]} is lower than stated seclevel ${ee[R]}`);e=P(oe).code;const re=U(e.replace(/^function\s*\w+\(/,"function("));return S?e=await $(oe,Q,{uniqueID:v,mangleNames:G}):(K(oe,{MemberExpression({node:e}){e.computed||(F("Identifier"==e.property.type),"prototype"==e.property.name?(e.computed=!0,e.property=k.stringLiteral("prototype")):"__proto__"==e.property.name&&(e.computed=!0,e.property=k.stringLiteral("__proto__")))}}),e=O(P(oe).code,{parser:"babel",arrowParens:"avoid",semi:!1,trailingComma:"none"})),{srcLength:re,script:e=M(e,Y,v),warnings:[],timeTook:_.now()-A}}export{processScript as default,processScript,T as s};
@@ -0,0 +1,14 @@
1
+ import { File } from "@babel/types";
2
+ declare type MinifyOptions = {
3
+ /** 11 a-z 0-9 characters */
4
+ uniqueID: string;
5
+ /** whether to mangle function and class names (defaults to `false`) */
6
+ mangleNames: boolean;
7
+ };
8
+ /**
9
+ * @param code compiled code and/or hackmud compatible code
10
+ * @param autocomplete the comment inserted after the function signature
11
+ * @param options {@link MinifyOptions details}
12
+ */
13
+ export declare function minify(file: File, autocomplete?: string, { uniqueID, mangleNames }?: Partial<MinifyOptions>): Promise<string>;
14
+ export default minify;
@@ -0,0 +1 @@
1
+ import e from"@babel/generator";import t from"@babel/traverse";import r from"@babel/types";import{tokenizer as i,tokTypes as n}from"acorn";import*as a from"terser";import{getReferencePathsToGlobal as s}from"./shared.js";import{a as o}from"../assert-1556d989.js";import{s as p}from"../spliceString-2c6f214f.js";function countHackmudCharacters(e){return e.replace(/\/\/.*/g,"").replace(/[ \t\n\r\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000]/g,"").length}const{default:l}=e,{default:u}=t;async function minify(e,t,{uniqueID:i="00000000000",mangleNames:n=!1}={}){let c;o(/^\w{11}$/.exec(i)),u(e,{Program(e){c=e,e.skip()}});const f=c.get("body.0");for(const e of[...f.node.params].reverse()){if("Identifier"==e.type){if(!f.scope.getBinding(e.name).referenced){f.node.params.pop();continue}}break}for(const e in c.scope.globals){if("arguments"==e||e.startsWith(`$${i}`))continue;const t=s(e,c);if(!(5+e.length+t.length>=e.length*t.length)){for(const n of t)n.replaceWith(r.identifier(`_GLOBAL_${e}_${i}_`));f.node.body.body.unshift(r.variableDeclaration("let",[r.variableDeclarator(r.identifier(`_GLOBAL_${e}_${i}_`),r.identifier(e))]))}}const d=s(`$${i}$GLOBAL`,c);if(d.length>3){for(const e of d)e.replaceWith(r.identifier(`_G_${i}_`));f.node.body.body.unshift(r.variableDeclaration("let",[r.variableDeclarator(r.identifier(`_G_${i}_`),r.identifier(`$${i}$GLOBAL`))]))}const m=[];let y=!1;const _=r.cloneNode(e);u(_,{MemberExpression({node:e}){e.computed||(o("Identifier"==e.property.type),"prototype"==e.property.name?(e.computed=!0,e.property=r.identifier(`_PROTOTYPE_PROPERTY_${i}_`)):"__proto__"==e.property.name&&(e.computed=!0,e.property=r.identifier(`_PROTO_PROPERTY_${i}_`)))}});const $=(await a.minify(l(_).code,{ecma:2015,compress:{passes:1/0,unsafe:!0,unsafe_arrows:!0,unsafe_comps:!0,unsafe_symbols:!0,unsafe_methods:!0,unsafe_proto:!0,unsafe_regexp:!0,unsafe_undefined:!0,sequences:!1},format:{semicolons:!1},keep_classnames:!n,keep_fnames:!n})).code.replace(new RegExp(`_PROTOTYPE_PROPERTY_${i}_`,"g"),'"prototype"').replace(new RegExp(`_PROTO_PROPERTY_${i}_`,"g"),'"__proto__"');let E,b,g=!1;{const t=[];u(e,{FunctionDeclaration(e){e.traverse({Function(e){"CallExpression"!=e.parent.type&&"callee"!=e.parentKey&&e.skip()},Loop(e){e.skip()},ObjectExpression(e){const t={};parseObjectExpression(e.node,t)&&e.replaceWith(r.identifier(`_JSON_VALUE_${m.push(t)-1}_${i}_`))},ArrayExpression(e){const t=[];parseArrayExpression(e.node,t)&&e.replaceWith(r.identifier(`_JSON_VALUE_${m.push(t)-1}_${i}_`))}}),e.traverse({TemplateLiteral(e){const t=e.node;let i=r.stringLiteral(t.quasis[0].value.cooked);for(let e=0;e<t.expressions.length;e++){const n=t.expressions[e],a=t.quasis[e+1];i=r.binaryExpression("+",i,n),a.value.cooked&&(i=r.binaryExpression("+",i,r.stringLiteral(a.value.cooked)))}e.replaceWith(i)},MemberExpression({node:e}){e.computed||(o("Identifier"==e.property.type),e.property.name.length<3||(e.computed=!0,e.property=r.stringLiteral(e.property.name)))},UnaryExpression(e){if("void"==e.node.operator)"NumericLiteral"!=e.node.argument.type||e.node.argument.value||(e.replaceWith(r.identifier(`_UNDEFINED_${i}_`)),y=!0);else if("-"==e.node.operator&&"NumericLiteral"==e.node.argument.type){const n=-e.node.argument.value;t.push((async()=>{if((await minifyNumber(n)).length<=3)return;"key"==e.parentKey&&"ObjectProperty"==e.parent.type&&(e.parent.computed=!0);let t=m.indexOf(n);-1==t&&(t+=m.push(n)),e.replaceWith(r.identifier(`_JSON_VALUE_${t}_${i}_`))})()),e.skip()}},NullLiteral(e){let t=m.indexOf(null);-1==t&&(t+=m.push(null)),e.replaceWith(r.identifier(`_JSON_VALUE_${t}_${i}_`))},BooleanLiteral(e){let t=m.indexOf(e.node.value);-1==t&&(t+=m.push(e.node.value)),e.replaceWith(r.identifier(`_JSON_VALUE_${t}_${i}_`))},NumericLiteral(e){t.push((async()=>{if((await minifyNumber(e.node.value)).length<=3)return;"key"==e.parentKey&&"ObjectProperty"==e.parent.type&&(e.parent.computed=!0);let t=m.indexOf(e.node.value);-1==t&&(t+=m.push(e.node.value)),e.replaceWith(r.identifier(`_JSON_VALUE_${t}_${i}_`))})())},StringLiteral(e){if(e.node.value.includes("\0")||e.toString().length<4)return;"key"==e.parentKey&&"ObjectProperty"==e.parent.type&&(e.parent.computed=!0);let t=m.indexOf(e.node.value);-1==t&&(t+=m.push(e.node.value)),e.replaceWith(r.identifier(`_JSON_VALUE_${t}_${i}_`))},ObjectProperty({node:e}){if(e.computed||"Identifier"!=e.key.type||e.key.name.length<4)return;let t=m.indexOf(e.key.name);-1==t&&(t+=m.push(e.key.name)),e.computed=!0,e.key=r.identifier(`_JSON_VALUE_${t}_${i}_`)}}),e.skip()}}),await Promise.all(t);const n=e.program.body[0];if(o("FunctionDeclaration"==n.type),m.length)if(g=!0,1==m.length)if("string"!=typeof m[0]||m[0].includes("\n")||m[0].includes("\t")){const e=r.variableDeclaration("let",[r.variableDeclarator(r.identifier(`_JSON_VALUE_0_${i}_`),r.callExpression(r.memberExpression(r.identifier("JSON"),r.identifier("parse")),[r.memberExpression(r.taggedTemplateExpression(r.memberExpression(r.callExpression(r.identifier(`$${i}$SUBSCRIPT$scripts$quine`),[]),r.identifier("split")),r.templateLiteral([r.templateElement({raw:"\t",cooked:"\t"},!0)],[])),r.identifier(`$${i}$SPLIT_INDEX`),!0)]))]);y&&e.declarations.push(r.variableDeclarator(r.identifier(`_UNDEFINED_${i}_`))),n.body.body.unshift(e),E=JSON.stringify(m[0])}else{const e=r.variableDeclaration("let",[r.variableDeclarator(r.identifier(`_JSON_VALUE_0_${i}_`),r.memberExpression(r.taggedTemplateExpression(r.memberExpression(r.callExpression(r.identifier(`$${i}$SUBSCRIPT$scripts$quine`),[]),r.identifier("split")),r.templateLiteral([r.templateElement({raw:"\t",cooked:"\t"},!0)],[])),r.identifier(`$${i}$SPLIT_INDEX`),!0))]);y&&e.declarations.push(r.variableDeclarator(r.identifier(`_UNDEFINED_${i}_`))),n.body.body.unshift(e),E=m[0]}else{const e=r.variableDeclaration("let",[r.variableDeclarator(r.arrayPattern(m.map(((e,t)=>r.identifier(`_JSON_VALUE_${t}_${i}_`)))),r.callExpression(r.memberExpression(r.identifier("JSON"),r.identifier("parse")),[r.memberExpression(r.taggedTemplateExpression(r.memberExpression(r.callExpression(r.identifier(`$${i}$SUBSCRIPT$scripts$quine`),[]),r.identifier("split")),r.templateLiteral([r.templateElement({raw:"\t",cooked:"\t"},!0)],[])),r.identifier(`$${i}$SPLIT_INDEX`),!0)]))]);y&&e.declarations.push(r.variableDeclarator(r.identifier(`_UNDEFINED_${i}_`))),n.body.body.unshift(e),E=JSON.stringify(m)}else y&&n.body.body.unshift(r.variableDeclaration("let",[r.variableDeclarator(r.identifier(`_UNDEFINED_${i}_`))]));b=l(e).code}return b=(await a.minify(b,{ecma:2015,compress:{passes:1/0,unsafe:!0,unsafe_arrows:!0,unsafe_comps:!0,unsafe_symbols:!0,unsafe_methods:!0,unsafe_proto:!0,unsafe_regexp:!0,unsafe_undefined:!0,sequences:!1},format:{semicolons:!1},keep_classnames:!n,keep_fnames:!n})).code||"",null!=E&&(b=p(b,`${t?`//${t}\n`:""}\n//\t${E}\t\n`,getFunctionBodyStart(b)+1),b=b.replace(`$${i}$SPLIT_INDEX`,await minifyNumber(b.split("\t").findIndex((e=>e==E))))),countHackmudCharacters($)<=countHackmudCharacters(b)+Number(g)&&(b=$,t&&(b=p(b,`//${t}\n`,getFunctionBodyStart(b)+1))),b}function parseObjectExpression(e,t){if(!e.properties.length)return!1;for(const r of e.properties){if("ObjectProperty"!=r.type||r.computed)return!1;if(o("Identifier"==r.key.type||"NumericLiteral"==r.key.type||"StringLiteral"==r.key.type),"ArrayExpression"==r.value.type){const e=[];if(!parseArrayExpression(r.value,e))return!1;t["Identifier"==r.key.type?r.key.name:r.key.value]=e}else if("ObjectExpression"==r.value.type){const e={};if(!parseObjectExpression(r.value,e))return!1;t["Identifier"==r.key.type?r.key.name:r.key.value]=e}else if("NullLiteral"==r.value.type)t["Identifier"==r.key.type?r.key.name:r.key.value]=null;else if("BooleanLiteral"==r.value.type||"NumericLiteral"==r.value.type||"StringLiteral"==r.value.type)t["Identifier"==r.key.type?r.key.name:r.key.value]=r.value.value;else{if("TemplateLiteral"!=r.value.type||r.value.expressions.length)return!1;t["Identifier"==r.key.type?r.key.name:r.key.value]=r.value.quasis[0].value.cooked}}return!0}function parseArrayExpression(e,t){if(!e.elements.length)return!1;for(const r of e.elements){if(!r)return!1;if("ArrayExpression"==r.type){const e=[];if(!parseArrayExpression(r,e))return!1;e.push(e)}else if("ObjectExpression"==r.type){const e={};if(!parseObjectExpression(r,e))return!1;t.push(e)}else if("NullLiteral"==r.type)t.push(null);else if("BooleanLiteral"==r.type||"NumericLiteral"==r.type||"StringLiteral"==r.type)t.push(r.value);else{if("TemplateLiteral"!=r.type||r.expressions.length)return!1;t.push(r.quasis[0].value.cooked)}}return!0}async function minifyNumber(e){return/\$\((?<number>.+)\)/.exec((await a.minify(`$(${e})`,{ecma:2015})).code).groups.number}function getFunctionBodyStart(e){const t=i(e,{ecmaVersion:2015});t.getToken(),t.getToken(),t.getToken();let r=1;for(;r;){const e=t.getToken();e.type==n.parenL?r++:e.type==n.parenR&&r--}return t.getToken().start}export{countHackmudCharacters as c,minify as default,minify};
@@ -0,0 +1,2 @@
1
+ export declare function postprocess(code: string, seclevel: number, uniqueID: string): string;
2
+ export default postprocess;
@@ -0,0 +1 @@
1
+ import{a as e}from"../assert-1556d989.js";import{s}from"../spliceString-2c6f214f.js";function*findMatches(s,t){let n;for(e(s.global,"regex must have global flag");n=s.exec(t);)yield{index:n.index,match:n[1]||n[0]}}function postprocess(e,t,n){e=e.replace(/^function\s*\w+\(/,"function(");for(const{index:r,match:a}of[...findMatches(new RegExp(`\\$${n}\\$[\\w$]+`,"g"),e)].reverse()){const[n,...o]=a.slice(13).split("$");switch(n){case"SUBSCRIPT":e=s(e,`#${"nlmhf"[t]}s.${o[0]}.${o[1]}`,r,a.length);break;case"DEBUG":e=s(e,"#D",r,a.length);break;case"FMCL":e=s(e,"#FMCL",r,a.length);break;case"GLOBAL":e=s(e,"#G",r,a.length);break;case"DB":e=s(e,`#db.${o[0]}`,r,a.length);break;default:throw new Error(`unknown type "${n}"`)}}return e}export{postprocess as default,postprocess};
@@ -0,0 +1,13 @@
1
+ export declare type PreprocessOptions = {
2
+ /** 11 a-z 0-9 characters */
3
+ uniqueID: string;
4
+ };
5
+ /**
6
+ * @param code source code for preprocessing
7
+ * @param options {@link PreprocessOptions details}
8
+ */
9
+ export declare function preprocess(code: string, { uniqueID }?: Partial<PreprocessOptions>): {
10
+ code: string;
11
+ seclevel: number;
12
+ };
13
+ export default preprocess;
@@ -0,0 +1 @@
1
+ import e from"@babel/generator";import{parse as r}from"@babel/parser";import o from"@babel/traverse";import i from"@babel/types";import{a as t}from"../assert-1556d989.js";import{s}from"../spliceString-2c6f214f.js";const{default:p}=o,{default:l}=e;function preprocess(e,{uniqueID:o="00000000000"}={}){if(t(/^\w{11}$/.test(o)),/(?:SC|DB)\$/.test(e))throw new Error("SC$ and DB$ are protected and cannot appear in a script");const n=e;let a;do{a=e.length,e=e.replace(/^\s+/,"").replace(/^\/\/.*/,"").replace(/^\/\*[\s\S]*?\*\//,"")}while(e.length!=a);e=e.replace(/^function\s*\(/,"export default function (");const c={f:4,h:3,m:2,l:1,n:0,4:4,3:3,2:2,1:1,0:0};let d,f,u=4;for(;;){let i;try{d=r(e,{plugins:["typescript",["decorators",{decoratorsBeforeExport:!0}],"doExpressions","functionBind","functionSent","partialApplication",["pipelineOperator",{proposal:"hack",topicToken:"%"}],"throwExpressions",["recordAndTuple",{syntaxType:"hash"}],"classProperties","classPrivateProperties","classPrivateMethods","logicalAssignment","numericSeparator","nullishCoalescingOperator","optionalChaining","optionalCatchBinding","objectRestSpread"],sourceType:"module"});break}catch(e){t(e instanceof SyntaxError),i=e}var m;if("BABEL_PARSER_SYNTAX_ERROR"!=i.code||"PrivateInExpectedIn"!=i.reasonCode)throw console.log(null===(m=/.+/.exec(e.slice(i.pos)))||void 0===m?void 0:m[0]),i;const p=e.slice(i.pos);let l;if(l=/^#[0-4fhmln]s\.scripts\.quine\(\)/.exec(p))e=s(e,JSON.stringify(n),i.pos,l[0].length);else if(l=/^#(?<seclevel>[0-4fhmln])?s\.(?<userName>[_a-z][\d_a-z]{0,24})\.(?<scriptName>[_a-z][\d_a-z]{0,24})\(/.exec(p))l[1]&&(u=Math.min(u,c[l[1]])),e=s(e,`$${o}$SUBSCRIPT$${l[2]}$${l[3]}(`,i.pos,l[0].length);else if(l=/^#D\(/.exec(p))e=s(e,`$${o}$DEBUG(`,i.pos,l[0].length);else if(l=/^#FMCL/.exec(p))e=s(e,`$${o}$FMCL`,i.pos,l[0].length);else if(l=/^#G/.exec(p))e=s(e,`$${o}$GLOBAL`,i.pos,l[0].length);else{if(!(l=/^#db\.(?<methodName>[irfu]|u1|us|ObjectId)\(/.exec(p)))throw i;e=s(e,`$${o}$DB$${l[1]}(`,i.pos,l[0].length)}}p(d,{Program(e){f=e,e.skip()}});const h=f.scope.hasGlobal("Record"),$=f.scope.hasGlobal("Tuple");return(h||$)&&d.program.body.unshift(i.importDeclaration(h?$?[i.importSpecifier(i.identifier("Record"),i.identifier("Record")),i.importSpecifier(i.identifier("Tuple"),i.identifier("Tuple"))]:[i.importSpecifier(i.identifier("Record"),i.identifier("Record"))]:[i.importSpecifier(i.identifier("Tuple"),i.identifier("Tuple"))],i.stringLiteral("@bloomberg/record-tuple-polyfill"))),f.scope.hasGlobal("Proxy")&&d.program.body.unshift(i.importDeclaration([i.importDefaultSpecifier(i.identifier("Proxy"))],i.stringLiteral("proxy-polyfill/src/proxy.js"))),1==f.node.body.length&&"FunctionDeclaration"==f.node.body[0].type?{code:`export default ${l(d).code}`,seclevel:u}:{code:l(d).code,seclevel:u}}export{preprocess as default,preprocess};
@@ -0,0 +1,3 @@
1
+ import { NodePath } from "@babel/traverse";
2
+ import t, { Program } from "@babel/types";
3
+ export declare function getReferencePathsToGlobal(name: string, program: NodePath<Program>): NodePath<t.Identifier>[];
@@ -0,0 +1 @@
1
+ import e from"@babel/types";import{e as r}from"../assert-1556d989.js";function getReferencePathsToGlobal(t,o){const[a]=o.unshiftContainer("body",e.variableDeclaration("let",[e.variableDeclarator(e.identifier(t))]));o.scope.crawl();const n=r(o.scope.getBinding(t));return a.remove(),n.referencePaths}export{getReferencePathsToGlobal};
@@ -0,0 +1,22 @@
1
+ import t, { File } from "@babel/types";
2
+ export declare type TransformOptions = {
3
+ /** 11 a-z 0-9 characters */
4
+ uniqueID: string;
5
+ /** the user going to be hosting this script (or set to `true` if not yet known) */
6
+ scriptUser: string | true;
7
+ /** the name of this script (or set to `true` if not yet known) */
8
+ scriptName: string | true;
9
+ seclevel: number;
10
+ };
11
+ /**
12
+ * transform a given babel `File` to be hackmud compatible
13
+ *
14
+ * (returned File will need `postprocess()`ing)
15
+ *
16
+ * @param options {@link TransformOptions details}
17
+ */
18
+ export declare function transform(file: File, sourceCode: string, { uniqueID, scriptUser, scriptName, seclevel }?: Partial<TransformOptions>): {
19
+ file: t.File;
20
+ seclevel: number;
21
+ };
22
+ export default transform;
@@ -0,0 +1 @@
1
+ import e from"@babel/traverse";import t from"@babel/types";import{getReferencePathsToGlobal as i}from"./shared.js";import{a as r}from"../assert-1556d989.js";function clearObject(e,t){for(const t of Object.getOwnPropertyNames(e))delete e[t];for(const t of Object.getOwnPropertySymbols(e))delete e[t];void 0!==t&&Object.setPrototypeOf(e,t)}const{default:n}=e,o=["Map","Set","Date","JSON","Math","Array","Error","isNaN","Number","Object","RegExp","String","Symbol","BigInt"];function transform(e,a,{uniqueID:s="00000000000",scriptUser:p="UNKNOWN",scriptName:l="UNKNOWN",seclevel:c=4}={}){const d=`_SCRIPT_${s}_`,f=new Map,b=new Map;let y;if(n(e,{Program(e){y=e,e.skip()}}),y.scope.hasGlobal("_START"))for(const e of i("_START",y))e.replaceWith(t.identifier("_ST"));if(y.scope.hasGlobal("_TIMEOUT"))for(const e of i("_START",y))e.replaceWith(t.identifier("_TO"));if(y.scope.hasGlobal("_SOURCE"))for(const e of i("_SOURCE",y))e.replaceWith(t.stringLiteral(a));if(y.scope.hasGlobal("_BUILD_DATE"))for(const e of i("_BUILD_DATE",y))e.replaceWith(t.numericLiteral(Date.now()));if(y.scope.hasGlobal("_SCRIPT_USER"))for(const e of i("_SCRIPT_USER",y))1==p?e.replaceWith(t.stringLiteral(`$${s}$SCRIPT_USER`)):e.replaceWith(t.stringLiteral(p));if(y.scope.hasGlobal("_SCRIPT_NAME"))for(const e of i("_SCRIPT_NAME",y))1==l?e.replaceWith(t.stringLiteral(`$${s}$SCRIPT_NAME`)):e.replaceWith(t.stringLiteral(l));if(y.scope.hasGlobal("_FULL_SCRIPT_NAME"))for(const e of i("_FULL_SCRIPT_NAME",y))1==p||1==l?e.replaceWith(t.stringLiteral(`$${s}$FULL_SCRIPT_NAME`)):e.replaceWith(t.stringLiteral(`${p}.${l}`));let h=!1;if(y.scope.hasGlobal("Function")){const e=i("Function",y);if(1==e.length){const t=e[0];r("MemberExpression"==t.parent.type,"`Function` isn't available in hackmud, only `Function.prototype` is accessible"),r("Identifier"==t.parent.property.type,"`Function` isn't available in hackmud, only `Function.prototype` is accessible"),r("prototype"==t.parent.property.name,"`Function` isn't available in hackmud, only `Function.prototype` is accessible"),t.parentPath.replaceWith(createGetFunctionPrototypeNode())}else{for(const i of e)r("MemberExpression"==i.parent.type,"`Function` isn't available in hackmud, only `Function.prototype` is accessible"),r("Identifier"==i.parent.property.type,"`Function` isn't available in hackmud, only `Function.prototype` is accessible"),r("prototype"==i.parent.property.name,"`Function` isn't available in hackmud, only `Function.prototype` is accessible"),h=!0,i.parentPath.replaceWith(t.identifier(`$${s}$FUNCTION_DOT_PROTOTYPE`));h=!0}}let m=4;for(const e of["$fs","$4s","$s"])if(y.scope.hasGlobal(e))for(const n of i(e,y)){var $;r("MemberExpression"==n.parent.type),r("Identifier"==n.parent.property.type),r("MemberExpression"==(null===($=n.parentPath.parentPath)||void 0===$?void 0:$.node.type)),r("Identifier"==n.parentPath.parentPath.node.property.type),n.parentPath.parentPath.replaceWith(t.identifier(`$${s}$SUBSCRIPT$${n.parent.property.name}$${n.parentPath.parentPath.node.property.name}`))}for(const e of["$hs","$3s"])if(y.scope.hasGlobal(e)){m=3;for(const n of i(e,y)){var E;r("MemberExpression"==n.parent.type),r("Identifier"==n.parent.property.type),r("MemberExpression"==(null===(E=n.parentPath.parentPath)||void 0===E?void 0:E.node.type)),r("Identifier"==n.parentPath.parentPath.node.property.type),n.parentPath.parentPath.replaceWith(t.identifier(`$${s}$SUBSCRIPT$${n.parent.property.name}$${n.parentPath.parentPath.node.property.name}`))}}for(const e of["$ms","$2s"])if(y.scope.hasGlobal(e)){m=2;for(const n of i(e,y)){var P;r("MemberExpression"==n.parent.type),r("Identifier"==n.parent.property.type),r("MemberExpression"==(null===(P=n.parentPath.parentPath)||void 0===P?void 0:P.node.type)),r("Identifier"==n.parentPath.parentPath.node.property.type),n.parentPath.parentPath.replaceWith(t.identifier(`$${s}$SUBSCRIPT$${n.parent.property.name}$${n.parentPath.parentPath.node.property.name}`))}}for(const e of["$ls","$1s"])if(y.scope.hasGlobal(e)){m=1;for(const n of i(e,y)){var u;r("MemberExpression"==n.parent.type),r("Identifier"==n.parent.property.type),r("MemberExpression"==(null===(u=n.parentPath.parentPath)||void 0===u?void 0:u.node.type)),r("Identifier"==n.parentPath.parentPath.node.property.type),n.parentPath.parentPath.replaceWith(t.identifier(`$${s}$SUBSCRIPT$${n.parent.property.name}$${n.parentPath.parentPath.node.property.name}`))}}for(const e of["$ns","$0s"])if(y.scope.hasGlobal(e)){m=0;for(const n of i(e,y)){var _;r("MemberExpression"==n.parent.type),r("Identifier"==n.parent.property.type),r("MemberExpression"==(null===(_=n.parentPath.parentPath)||void 0===_?void 0:_.node.type)),r("Identifier"==n.parentPath.parentPath.node.property.type),n.parentPath.parentPath.replaceWith(t.identifier(`$${s}$SUBSCRIPT$${n.parent.property.name}$${n.parentPath.parentPath.node.property.name}`))}}if(c=Math.min(c,m),y.scope.hasGlobal("$db"))for(const e of i("$db",y))r("MemberExpression"==e.parentPath.node.type),r("Identifier"==e.parentPath.node.property.type),e.parentPath.replaceWith(t.identifier(`$${s}$DB$${e.parentPath.node.property.name}`));if(y.scope.hasGlobal("$D"))for(const e of i("$D",y))e.replaceWith(t.identifier(`$${s}$DEBUG`));if(y.scope.hasGlobal("$FMCL"))for(const e of i("$FMCL",y))e.replaceWith(t.identifier(`$${s}$FMCL`));if(y.scope.hasGlobal("$G"))for(const e of i("$G",y))e.replaceWith(t.identifier(`$${s}$GLOBAL`));if(y.scope.hasGlobal("_SECLEVEL"))for(const e of i("_SECLEVEL",y))e.replaceWith(t.numericLiteral(c));let T=!1,O=!1;if(y.scope.hasGlobal("Object"))for(const e of i("Object",y))"MemberExpression"!=e.parent.type||e.parent.computed||(r("Identifier"==e.parent.property.type),"getPrototypeOf"==e.parent.property.name?(e.parentPath.replaceWith(t.identifier(`$${s}$GET_PROTOTYPE_OF`)),T=!0):"setPrototypeOf"==e.parent.property.name&&(e.parentPath.replaceWith(t.identifier(`$${s}$SET_PROTOTYPE_OF`)),O=!0));const x=y.node.body[y.node.body.length-1];let S;if(r(x,"program is empty"),"ExportNamedDeclaration"==x.type){y.node.body.pop();for(const e of x.specifiers){r("ExportSpecifier"==e.type,`${e.type} is currently unsupported`);const t="Identifier"==e.exported.type?e.exported.name:e.exported.value;"default"==t?S=e.local.name:f.set(e.local.name,t)}}const v=t.blockStatement([]);let D;for(const e of y.node.body)if("VariableDeclaration"==e.type)for(const i of e.declarations)if("Identifier"!=i.id.type||i.id.name!=S||!i.init||"FunctionExpression"!=i.init.type&&"ArrowFunctionExpression"!=i.init.type||i.init.async||i.init.generator){for(const r in t.getBindingIdentifiers(i.id))r==S&&(D=t.functionDeclaration(t.identifier(d),[t.identifier("context"),t.identifier("args")],t.blockStatement([t.returnStatement(t.callExpression(t.identifier(S),[]))]))),"const"!=e.kind&&f.has(r)&&(b.set(r,f.get(r)),f.delete(r)),v.body.push(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(r))]));i.init&&v.body.push(t.expressionStatement(t.assignmentExpression("=",i.id,i.init)))}else D=t.functionDeclaration(t.identifier(d),i.init.params,"BlockStatement"==i.init.body.type?i.init.body:t.blockStatement([t.returnStatement(i.init.body)]));else"FunctionDeclaration"==e.type?e.id.name==S?D=e:v.body.push(t.variableDeclaration("let",[t.variableDeclarator(e.id,t.functionExpression(void 0,e.params,e.body,e.generator,e.async))])):v.body.push(e);if(D||(D=t.functionDeclaration(t.identifier(d),[t.identifier("context"),t.identifier("args")],t.blockStatement([]))),y.node.body=[D],v.body.length){(f.size||b.size)&&D.body.body.push(t.returnStatement(t.objectExpression([...[...f].map((([e,i])=>t.objectProperty(t.identifier(i),t.identifier(e)))),...[...b].map((([e,i])=>t.objectMethod("get",t.identifier(i),[],t.blockStatement([t.returnStatement(t.identifier(e))]))))]))),y.scope.crawl();const e=new Set;let n=0;for(const[i,o]of[...v.body.entries()].reverse())if("VariableDeclaration"==o.type){r(1==o.declarations.length);const a=o.declarations[0];if(r("Identifier"==a.id.type,`declarator.id.type was "${a.id.type}"`),y.scope.crawl(),y.scope.hasGlobal(a.id.name)){v.body.splice(i,1);const[p]=y.unshiftContainer("body",v),[l]=y.unshiftContainer("body",o);if(y.scope.crawl(),!a.init||"FunctionExpression"!=a.init.type&&"ArrowFunctionExpression"!=a.init.type||Object.keys(y.scope.globals).some((t=>e.has(t)))){const e=y.scope.getBinding(a.id.name);r(e);for(const i of e.referencePaths)r("Identifier"==i.node.type),i.replaceWith(t.memberExpression(t.identifier(`$${s}$GLOBAL`),t.identifier(i.node.name)));for(const i of e.constantViolations)if("AssignmentExpression"==i.node.type)for(const[e,r]of Object.entries(t.getBindingIdentifiers(i.node)))e==a.id.name&&(clearObject(r),Object.assign(r,t.memberExpression(t.identifier(`$${s}$GLOBAL`),t.identifier(e))));p.remove(),l.remove(),a.init&&v.body.splice(i,0,t.expressionStatement(t.assignmentExpression("=",t.memberExpression(t.identifier(`$${s}$GLOBAL`),t.identifier(a.id.name)),a.init)))}else p.remove(),l.remove(),D.body.body.unshift(o),n++}else e.add(a.id.name)}else if("ClassDeclaration"==o.type&&(y.scope.crawl(),y.scope.hasGlobal(o.id.name))){v.body.splice(i,1);const[e]=y.unshiftContainer("body",v),[n]=y.unshiftContainer("body",o);y.scope.crawl();const a=y.scope.getBinding(o.id.name);r(a);for(const e of a.referencePaths)r("Identifier"==e.node.type),e.replaceWith(t.memberExpression(t.identifier(`$${s}$GLOBAL`),t.identifier(e.node.name)));e.remove(),n.remove(),v.body.splice(i,0,t.expressionStatement(t.assignmentExpression("=",t.memberExpression(t.identifier(`$${s}$GLOBAL`),t.identifier(o.id.name)),t.classExpression(void 0,o.superClass,o.body,o.decorators))))}if(y.scope.hasGlobal("_EXPORTS"))for(const e of i("_EXPORTS",y))e.replaceWith(t.arrayExpression([...f.keys(),...b.keys()].map((e=>t.stringLiteral(e)))));v.body.length&&D.body.body.splice(n,0,t.ifStatement(t.unaryExpression("!",t.identifier(`$${s}$FMCL`)),v))}return h&&D.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`$${s}$FUNCTION_DOT_PROTOTYPE`),createGetFunctionPrototypeNode())])),O&&D.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`$${s}$SET_PROTOTYPE_OF`),t.callExpression(t.memberExpression(t.memberExpression(t.identifier("Object"),t.identifier("call")),t.identifier("bind")),[t.identifier(`$${s}$DUNDER_PROTO_SETTER`)]))])),T&&D.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`$${s}$GET_PROTOTYPE_OF`),t.callExpression(t.memberExpression(t.memberExpression(t.identifier("Object"),t.identifier("call")),t.identifier("bind")),[t.identifier(`$${s}$DUNDER_PROTO_GETTER`)]))])),(T||O)&&D.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.objectPattern(T?O?[t.objectProperty(t.identifier("get"),t.identifier(`$${s}$DUNDER_PROTO_GETTER`)),t.objectProperty(t.identifier("set"),t.identifier(`$${s}$DUNDER_PROTO_SETTER`))]:[t.objectProperty(t.identifier("get"),t.identifier(`$${s}$DUNDER_PROTO_GETTER`))]:[t.objectProperty(t.identifier("set"),t.identifier(`$${s}$DUNDER_PROTO_SETTER`))]),t.callExpression(t.memberExpression(t.identifier("Object"),t.identifier("getOwnPropertyDescriptor")),[t.memberExpression(t.identifier("Object"),t.identifier("prototype")),t.stringLiteral("__proto__")]))])),n(e,{BlockStatement({node:e}){for(const[i,r]of e.body.entries())"FunctionDeclaration"!=r.type||r.generator||(e.body.splice(i,1),e.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(r.id,t.arrowFunctionExpression(r.params,r.body,r.async))])))},ClassBody({node:e,scope:i,parent:o}){r(t.isClass(o));let a=!1;for(const r of e.body){if("ClassMethod"!=r.type)continue;let e=!1;if(n(r.body,{ThisExpression(i){e=!0,a=!0,i.replaceWith(t.identifier(`_THIS_${s}_`))},Function(e){e.skip()}},i),e)if("constructor"!=r.kind)r.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`_THIS_${s}_`),t.callExpression(t.memberExpression(t.super(),t.identifier("valueOf")),[]))]));else{const e=[];if(n(r.body,{CallExpression(t){"Super"==t.node.callee.type&&e.push(t)}},i),e.length)if(1==e.length&&"ExpressionStatement"==e[0].parent.type&&e[0].parentPath.parentPath.parent==r)e[0].parentPath.replaceWith(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`_THIS_${s}_`),e[0].node)]));else{for(const i of e)i.replaceWith(t.assignmentExpression("=",t.identifier(`_THIS_${s}_`),i.node));r.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`_THIS_${s}_`))]))}else r.body.body.unshift(t.variableDeclaration("let",[t.variableDeclarator(t.identifier(`_THIS_${s}_`),t.callExpression(t.super(),[]))]))}}!o.superClass&&a&&(o.superClass=t.identifier("Object"))},VariableDeclaration({node:e}){"const"==e.kind&&(e.kind="let")},ThisExpression(e){e.replaceWith(t.identifier("undefined"))},BigIntLiteral(e){const i=Number(e.node.value);BigInt(i)==BigInt(e.node.value)?e.replaceWith(t.callExpression(t.identifier("BigInt"),[t.numericLiteral(i)])):e.replaceWith(t.callExpression(t.identifier("BigInt"),[t.stringLiteral(e.node.value)]))}}),{file:e,seclevel:c};function createGetFunctionPrototypeNode(){for(const e of o)if(!y.scope.hasOwnBinding(e))return t.memberExpression(t.memberExpression(t.identifier(e),t.identifier("constructor")),t.identifier("prototype"));return t.memberExpression(t.memberExpression(t.arrowFunctionExpression([t.identifier("_")],t.identifier("_")),t.identifier("constructor")),t.identifier("prototype"))}}export{transform as default,transform};
package/pull.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @param sourceFolderPath path to folder containing source files
5
5
  * @param hackmudPath path to hackmud directory
6
- * @param script script to pull in `user.name` format
6
+ * @param script to pull in `user.name` format
7
7
  */
8
8
  export declare function pull(sourceFolderPath: string, hackmudPath: string, script: string): Promise<void>;
9
9
  export default pull;
package/pull.js CHANGED
@@ -1 +1 @@
1
- import{resolve as t}from"path";import{copyFilePersist as s}from"./lib.js";import"fs";async function i(i,o,p){const[r,a]=p.split(".");await s(t(o,r,"scripts",`${a}.js`),t(i,r,`${a}.js`))}export{i as default,i as pull};
1
+ import{dirname as t,resolve as r}from"path";import i from"fs";const{mkdir:s,copyFile:o}=i.promises;async function pull(i,e,a){const[c,n]=a.split(".");if(!c||!n)throw new Error('`script` argument must be in "user.name" format');await function copyFilePersistent(r,i,e){return o(r,i,e).catch((async a=>{if("ENOENT"!=a.code)throw a;await s(t(i),{recursive:!0}),await o(r,i,e)}))}(r(e,c,"scripts",`${n}.js`),r(i,c,`${n}.js`))}export{pull as default,pull};
package/push.d.ts CHANGED
@@ -1,15 +1,28 @@
1
1
  import { Info } from ".";
2
+ declare type PushOptions = {
3
+ /** whether to do the minify step (defaults to `true`) */
4
+ minify: boolean;
5
+ /** whether to mangle function and class names (defaults to `false`) */
6
+ mangleNames: boolean;
7
+ /**
8
+ * array of scripts in the format `foo.bar`
9
+ *
10
+ * also accepts wild card (`*`) e.g. `*.bar` or `foo.*`
11
+ *
12
+ * pushes everything by default (`*.*`)
13
+ */
14
+ scripts: string | string[];
15
+ /** callback called on script push */
16
+ onPush: (info: Info) => void;
17
+ };
2
18
  /**
3
- * Push a specific or all scripts to a specific or all users.
4
- * In source directory, scripts in folders will override scripts with same name for user with folder name.
19
+ * Push scripts from a source directory to the hackmud directory.
5
20
  *
6
- * e.g. foo/bar.js overrides other bar.js script just for user foo.
7
- *
8
- * @param srcDir path to folder containing source files
9
- * @param hackmudDir path to hackmud directory
10
- * @param users users to push to (pushes to all if empty)
11
- * @param scripts scripts to push from (pushes from all if empty)
12
- * @param onPush function that's called when a script has been pushed
21
+ * Pushes files directly in the source folder to all users
22
+ * @param sourceDirectory directory containing source code
23
+ * @param hackmudDirectory directory created by hackmud containing user data including scripts
24
+ * @param options {@link PushOptions details}
25
+ * @returns array of info on pushed scripts
13
26
  */
14
- export declare function push(srcDir: string, hackmudDir: string, users: string[], scripts: string[], onPush?: (info: Info) => void): Promise<Info[]>;
27
+ export declare function push(sourceDirectory: string, hackmudDirectory: string, { scripts, onPush, minify, mangleNames }?: Partial<PushOptions>): Promise<Info[]>;
15
28
  export default push;
package/push.js CHANGED
@@ -1 +1 @@
1
- import"fs";import"path";export{push as default,push}from"./index.js";import"./lib.js";import"./processScript.js";import"chokidar";import"./generateTypings.js";import"./pull.js";import"./syncMacros.js";import"@babel/core";import"@babel/generator";import"acorn";import"terser";
1
+ import e from"fs";import{dirname as i,resolve as r,extname as t,basename as s}from"path";import{s as a,processScript as o}from"./processScript/index.js";import{c as p}from"./processScript/minify.js";import"@babel/generator";import"@babel/parser";import"@babel/plugin-proposal-class-properties";import"@babel/plugin-proposal-class-static-block";import"@babel/plugin-proposal-decorators";import"@babel/plugin-proposal-do-expressions";import"@babel/plugin-proposal-function-bind";import"@babel/plugin-proposal-function-sent";import"@babel/plugin-proposal-json-strings";import"@babel/plugin-proposal-logical-assignment-operators";import"@babel/plugin-proposal-nullish-coalescing-operator";import"@babel/plugin-proposal-numeric-separator";import"@babel/plugin-proposal-object-rest-spread";import"@babel/plugin-proposal-optional-catch-binding";import"@babel/plugin-proposal-optional-chaining";import"@babel/plugin-proposal-partial-application";import"@babel/plugin-proposal-pipeline-operator";import"@babel/plugin-proposal-private-property-in-object";import"@babel/plugin-proposal-record-and-tuple";import"@babel/plugin-proposal-throw-expressions";import"@babel/plugin-transform-exponentiation-operator";import"@babel/plugin-transform-typescript";import"@babel/traverse";import"@babel/types";import"@rollup/plugin-babel";import"@rollup/plugin-commonjs";import"@rollup/plugin-json";import"@rollup/plugin-node-resolve";import"perf_hooks";import"prettier";import"rollup";import"./processScript/postprocess.js";import"./assert-1556d989.js";import"./spliceString-2c6f214f.js";import"./processScript/preprocess.js";import"./processScript/transform.js";import"./processScript/shared.js";import"acorn";import"terser";class DynamicMap extends Map{constructor(e){super(),this.fallbackHandler=e}get(e){if(super.has(e))return super.get(e);const i=this.fallbackHandler(e);return super.set(e,i),i}}const{writeFile:n,mkdir:l}=e.promises;function writeFilePersistent(e,r,t){return n(e,r,t).catch((async s=>{if("ENOENT"!=s.code)throw s;await l(i(e),{recursive:!0}),await n(e,r,t)}))}const{readFile:c,readdir:m}=e.promises;async function push(e,i,{scripts:n="*.*",onPush:l=(()=>{}),minify:g=!0,mangleNames:u=!1}={}){"string"==typeof n&&(n=[n]);const f=new DynamicMap((e=>new Set)),b=new Set,h=new Set;let w=!1;for(const e of n){const[i,r]=e.split(".");i&&"*"!=i?r&&"*"!=r?f.get(i).add(r):b.add(i):r&&"*"!=r?h.add(r):w=!0}const d=new DynamicMap((e=>new Set)),y=[],$=new DynamicMap((e=>new Set));let P;if(h.size||w){const s=await m(r(i),{withFileTypes:!0}),a=new Set([...(P=await m(r(e),{withFileTypes:!0})).filter((e=>e.isDirectory())).map((e=>e.name)),...s.filter((e=>e.isDirectory())).map((e=>e.name)),...s.filter((e=>e.isFile()&&".key"==t(e.name))).map((e=>e.name.slice(0,-4))),...f.keys(),...b]);if(w)for(const e of a)b.add(e);else for(const e of a){const i=f.get(e);for(const e of h)i.add(e)}}return await Promise.all([...b].map((async n=>{await m(r(e,n),{withFileTypes:!0}).then((async m=>{await Promise.all(m.map((async m=>{const f=t(m.name);if(m.isFile()&&a.includes(f)){const t=s(m.name,f),a=r(e,n,m.name),{srcLength:b,script:h}=await o(await c(a,{encoding:"utf-8"}),{minify:g,scriptUser:n,scriptName:t,filePath:a,mangleNames:u}),w={file:`${n}/${m.name}`,users:[n],minLength:p(h),error:void 0,srcLength:b};$.get(n).add(t),y.push(w),await writeFilePersistent(r(i,n,`scripts/${t}.js`),h),l(w)}})))}),(e=>{if("ENOENT"!=e.code)throw e}))}))),await Promise.all([...f].map((async([t,s])=>{b.has(t)||await Promise.all([...s].map((async s=>{let n,m,f;for(const i of a)try{m=`${s}${i}`,n=await c(f=r(e,t,m),{encoding:"utf-8"});break}catch{}if(n){const{srcLength:e,script:a}=await o(n,{minify:g,scriptUser:t,scriptName:s,filePath:f,mangleNames:u}),c={file:`${t}/${m}`,users:[t],minLength:p(a),error:void 0,srcLength:e};y.push(c),await writeFilePersistent(r(i,t,"scripts",`${s}.js`),a),l(c)}else d.get(s).add(t)})))}))),await(b.size?Promise.all((P||await m(r(e),{withFileTypes:!0})).map((async n=>{const m=t(n.name);if(!n.isFile()||!a.includes(m))return;const f=s(n.name,m),h=[...b,...d.get(f)].filter((e=>!$.get(e).has(f)));if(!h.length)return;const w=Math.floor(Math.random()*2**52).toString(36).padStart(11,"0"),P=r(e,n.name),{srcLength:S,script:j}=await o(await c(P,{encoding:"utf-8"}),{minify:g,scriptUser:!0,scriptName:f,uniqueID:w,filePath:P,mangleNames:u}),F={file:n.name,users:h,minLength:p(j),error:void 0,srcLength:S};await Promise.all(h.map((e=>writeFilePersistent(r(i,e,`scripts/${f}.js`),j.replace(new RegExp(`$${w}$SCRIPT_USER`,"g"),e).replace(new RegExp(`$${w}$FULL_SCRIPT_NAME`,"g"),`${e}.${f}`))))),y.push(F),l(F)}))):Promise.all([...d].map((async([t,s])=>{let n,m,f;for(const i of a)try{m=`${t}${i}`,n=await c(f=r(e,m),{encoding:"utf-8"});break}catch{}if(n){const e=Math.floor(Math.random()*2**52).toString(36).padStart(11,"0"),{srcLength:a,script:c}=await o(n,{minify:g,scriptUser:!0,scriptName:t,uniqueID:e,filePath:f,mangleNames:u}),b={file:m,users:[...s],minLength:p(c),error:void 0,srcLength:a};await Promise.all([...s].map((s=>writeFilePersistent(r(i,s,`scripts/${t}.js`),c.replace(new RegExp(`$${e}$SCRIPT_USER`,"g"),s).replace(new RegExp(`$${e}$FULL_SCRIPT_NAME`,"g"),`${s}.${t}`))))),y.push(b),l(b)}})))),y}export{DynamicMap as D,push as default,push,writeFilePersistent as w};
@@ -0,0 +1 @@
1
+ function spliceString(i,e,s,c=0){return i.slice(0,s)+e+i.slice(s+c)}export{spliceString as s};
package/syncMacros.js CHANGED
@@ -1 +1 @@
1
- import e from"fs";import{extname as t,basename as o,resolve as a}from"path";const{readFile:s,readdir:n,stat:r,writeFile:c}=e.promises;async function i(e){const i=await n(e,{withFileTypes:!0}),m=new Map,f=[];for(const n of i)if(n.isFile())switch(t(n.name)){case".macros":{const t=(await s(a(e,n.name),{encoding:"utf-8"})).split("\n"),o=(await r(a(e,n.name))).mtime;for(let e=0;e<t.length/2-1;e++){const a=t[2*e],s=m.get(a);(!s||o>s.date)&&m.set(a,{date:o,macro:t[2*e+1]})}}break;case".key":f.push(o(n.name,".key"))}let l="",d=0;for(const[e,{macro:t}]of[...m].sort((([e],[t])=>(e>t)-(e<t))))t[0]==t[0].toLowerCase()&&(l+=`${e}\n${t}\n`,d++);for(const t of f)c(a(e,t+".macros"),l);return{macrosSynced:d,usersSynced:f.length}}export{i as default,i as syncMacros};
1
+ import e from"fs";import{extname as a,basename as s,resolve as t}from"path";const{readFile:o,readdir:n,stat:r,writeFile:c}=e.promises;async function syncMacros(e){const i=await n(e,{withFileTypes:!0}),m=new Map,l=[];await Promise.all(i.map((async n=>{if(n.isFile())switch(a(n.name)){case".macros":{const[a,s]=await Promise.all([o(t(e,n.name),{encoding:"utf-8"}).then((e=>e.split("\n"))),r(t(e,n.name)).then((({mtime:e})=>e))]);for(let e=0;e<a.length/2-1;e++){const t=a[2*e],o=m.get(t);(!o||s>o.date)&&m.set(t,{date:s,macro:a[2*e+1]})}}break;case".key":l.push(s(n.name,".key"))}})));let f="",p=0;for(const[e,{macro:a}]of[...m].sort((([e],[a])=>(e>a)-(e<a))))a[0]==a[0].toLowerCase()&&(f+=`${e}\n${a}\n`,p++);for(const a of l)c(t(e,`${a}.macros`),f);return{macrosSynced:p,usersSynced:l.length}}export{syncMacros as default,syncMacros};
package/watch.d.ts CHANGED
@@ -2,13 +2,13 @@ import { Info } from ".";
2
2
  /**
3
3
  * Watches target file or folder for updates and builds and pushes updated file.
4
4
  *
5
- * @param srcDir path to folder containing source files
6
- * @param hackmudDir path to hackmud directory
7
- * @param users users to push to (pushes to all if empty)
8
- * @param scripts scripts to push from (pushes from all if empty)
9
- * @param onPush function that's called after each script has been built and written
5
+ * @param sourceDirectory path to folder containing source files
6
+ * @param hackmudDirectory path to hackmud directory
7
+ * @param users to push to (pushes to all if empty)
8
+ * @param scripts to push from (pushes from all if empty)
9
+ * @param onPush function that's called on each script push
10
10
  */
11
- export declare function watch(srcDir: string, hackmudDir: string, users: string[], scripts: string[], onPush?: (info: Info) => void, { genTypes }?: {
11
+ export declare function watch(sourceDirectory: string, hackmudDirectory: string, users: string[], scripts: string[], onPush?: (info: Info) => void, { genTypes }?: {
12
12
  genTypes?: string | undefined;
13
13
  }): void;
14
14
  export default watch;
package/watch.js CHANGED
@@ -1 +1 @@
1
- import"chokidar";import"fs";import"path";export{watch as default,watch}from"./index.js";import"./lib.js";import"./generateTypings.js";import"./processScript.js";import"./pull.js";import"./syncMacros.js";import"@babel/core";import"@babel/generator";import"acorn";import"terser";
1
+ import{watch as o}from"chokidar";import p from"fs";import{extname as r,basename as i,resolve as t}from"path";import{s as e,processScript as s}from"./processScript/index.js";import{generateTypings as n}from"./generateTypings.js";import"@babel/generator";import"@babel/parser";import"@babel/plugin-proposal-class-properties";import"@babel/plugin-proposal-class-static-block";import"@babel/plugin-proposal-decorators";import"@babel/plugin-proposal-do-expressions";import"@babel/plugin-proposal-function-bind";import"@babel/plugin-proposal-function-sent";import"@babel/plugin-proposal-json-strings";import"@babel/plugin-proposal-logical-assignment-operators";import"@babel/plugin-proposal-nullish-coalescing-operator";import"@babel/plugin-proposal-numeric-separator";import"@babel/plugin-proposal-object-rest-spread";import"@babel/plugin-proposal-optional-catch-binding";import"@babel/plugin-proposal-optional-chaining";import"@babel/plugin-proposal-partial-application";import"@babel/plugin-proposal-pipeline-operator";import"@babel/plugin-proposal-private-property-in-object";import"@babel/plugin-proposal-record-and-tuple";import"@babel/plugin-proposal-throw-expressions";import"@babel/plugin-transform-exponentiation-operator";import"@babel/plugin-transform-typescript";import"@babel/traverse";import"@babel/types";import"@rollup/plugin-babel";import"@rollup/plugin-commonjs";import"@rollup/plugin-json";import"@rollup/plugin-node-resolve";import"perf_hooks";import"prettier";import"rollup";import"./processScript/minify.js";import"acorn";import"terser";import"./processScript/shared.js";import"./assert-1556d989.js";import"./spliceString-2c6f214f.js";import"./processScript/postprocess.js";import"./processScript/preprocess.js";import"./processScript/transform.js";const{readFile:a,readdir:l}=p.promises;function watch(p,c,m,b,g,{genTypes:u}={}){const h=o("",{depth:1,cwd:p,awaitWriteFinish:{stabilityThreshold:100}}).on("change",(async o=>{const n=r(o);if(e.includes(n)){const c=i(o,n);if(o==i(o)){if(!b.length||b.includes(c)){const n=await a(t(p,o),{encoding:"utf-8"}),c=new Map;let m;await Promise.all((await l(p,{withFileTypes:!0})).map((async o=>{o.isDirectory()&&await l(t(p,o.name),{withFileTypes:!0}).then((p=>{for(const t of p){if(!t.isFile())continue;const p=r(t.name);if(!e.includes(p))continue;const s=i(t.name,p),n=c.get(s);n?n.push(o.name):c.set(s,[o.name])}}))})));const{srcLength:b}=await s(n).catch((o=>(m=o,{script:"",srcLength:0}))),u={file:o,users:[],minLength:0,error:m,srcLength:b};g&&g(u)}}else{const r=i(t(o,".."));if((!m.length||m.includes(r))&&(!b.length||b.includes(c))){const i=await a(t(p,o),{encoding:"utf-8"});let e;const{srcLength:n}=await s(i).catch((o=>(e=o,{script:"",srcLength:0}))),l={file:o,users:[r],minLength:0,error:e,srcLength:n};null==g||g(l)}}}}));u&&(n(p,t(p,u),c),h.on("add",(()=>n(p,t(p,u),c))),h.on("unlink",(()=>n(p,t(p,u),c))))}export{watch as default,watch};
package/lib.d.ts DELETED
@@ -1,21 +0,0 @@
1
- /// <reference types="node" />
2
- import { PathLike } from "fs";
3
- export declare function writeFilePersist(path: string, data: any, options?: {
4
- encoding?: string | null | undefined;
5
- mode?: string | number | undefined;
6
- flag?: string | number | undefined;
7
- } | string | null): Promise<void>;
8
- export declare function copyFilePersist(src: PathLike, dest: string, flags?: number): Promise<void>;
9
- export declare function hackmudLength(script: string): number;
10
- export declare function stringSplice(original: string, replacement: string, start: number, end?: number): string;
11
- export declare class DynamicMap<K, V> extends Map<K, V> {
12
- private fallbackHandler;
13
- constructor(fallbackHandler: (key: K) => V);
14
- get(key: K): V;
15
- }
16
- export declare class CustomError extends Error {
17
- name: string;
18
- }
19
- export declare class AssertError extends CustomError {
20
- }
21
- export declare function assert(value: any, message?: string): asserts value;
package/lib.js DELETED
@@ -1 +0,0 @@
1
- import r from"fs";import{dirname as t}from"path";const{writeFile:e,mkdir:u,copyFile:s}=r.promises;function n(r,s,n){return e(r,s,n).catch((async c=>{if("ENOENT"!=c.code)throw c;await u(t(r),{recursive:!0}),await e(r,s,n)}))}function c(r,e,n){return s(r,e,n).catch((async c=>{if("ENOENT"!=c.code)throw c;await u(t(e),{recursive:!0}),await s(r,e,n)}))}function a(r){return r.replace(/\/\/.*/g,"").replace(/[ \t\n\r\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000]/g,"").length}function i(r,t,e,u=e){return r.slice(0,e)+t+r.slice(u)}class o extends Map{constructor(r){super(),this.fallbackHandler=r}get(r){if(super.has(r))return super.get(r);const t=this.fallbackHandler(r);return super.set(r,t),t}}class f extends Error{constructor(){super(...arguments),this.name=this.constructor.name}}class l extends f{}function p(r,t="assertion failed"){if(!r)throw new l(t)}export{l as AssertError,f as CustomError,o as DynamicMap,p as assert,c as copyFilePersist,a as hackmudLength,i as stringSplice,n as writeFilePersist};
@@ -1,14 +0,0 @@
1
- /**
2
- * Minifies a given script
3
- *
4
- * @param script JavaScript or TypeScript code
5
- */
6
- export declare function processScript(script: string): Promise<{
7
- srcLength: number;
8
- script: string;
9
- warnings: {
10
- message: string;
11
- line: number;
12
- }[];
13
- }>;
14
- export default processScript;
package/processScript.js DELETED
@@ -1 +0,0 @@
1
- import e from"@babel/core";import t from"@babel/generator";import{tokenizer as i,tokTypes as r}from"acorn";import{minify as n}from"terser";import{assert as s,hackmudLength as a,stringSplice as p}from"./lib.js";import"fs";import"path";const o=t.default;async function l(t){var i,r,l,f,_,m,b,g;let h,$,E;if([,h,t,$]=t.match(/((?:^\s*\/\/.*\n)*)\s*((?:.+?\/\/\s*(.+?)\s*$)?[^]*)/m),t.match(/(?:SC|DB)\$/))throw new Error("SC$ and DB$ are protected and cannot appear in a script");for(const e of h.split("\n")){let[,t,i]=e.match(/^\s*\/\/\s*(?:@autocomplete\s*([^\s].*?)|@seclevel\s*([^\s].*?))\s*$/)||[];t?$=t:i&&(i.match(/^(?:fullsec|f|4|fs|full)$/i)?E=4:i.match(/^(?:highsec|h|3|hs|high)$/i)?E=3:i.match(/^(?:midsec|m|2|ms|mid)$/i)?E=2:i.match(/^(?:lowsec|l|1|ls|low)$/i)?E=1:i.match(/^(?:nullsec|n|0|ns|null)$/i)&&(E=0))}let v=4;t.match(/[#$][n0]s\.[a-z_][a-z_0-9]{0,24}\.[a-z_][a-z_0-9]{0,24}\(/)?v=0:t.match(/[#$][l1]s\.[a-z_][a-z_0-9]{0,24}\.[a-z_][a-z_0-9]{0,24}\(/)?v=1:t.match(/[#$][m2]s\.[a-z_][a-z_0-9]{0,24}\.[a-z_][a-z_0-9]{0,24}\(/)?v=2:t.match(/[#$][h3]s\.[a-z_][a-z_0-9]{0,24}\.[a-z_][a-z_0-9]{0,24}\(/)&&(v=3);const x=["NULLSEC","LOWSEC","MIDSEC","HIGHSEC","FULLSEC"];if(null==E)E=v;else if(v<E)throw new Error(`detected seclevel ${x[v]} is lower than stated seclevel ${x[E]}`);const L=null!==(r=null===(i=t.match(/;/g))||void 0===i?void 0:i.length)&&void 0!==r?r:0;t=t.replace(/#[fhmln43210]s\.scripts\.quine\(\)/g,JSON.stringify(t)).replace(/[#$][fhmln43210]?s\.([a-z_][a-z_0-9]{0,24})\.([a-z_][a-z_0-9]{0,24})\(/g,"SC$$$1$$$2(").replace(/^function\s*\(/,"function script(").replace(/#D\(/g,"$D(").replace(/#FMCL/g,"$FMCL").replace(/#G/g,"$G").replace(/[#$]db\./g,"DB$");const D=(await e.transformAsync(t,{plugins:["@babel/plugin-transform-typescript",["@babel/plugin-proposal-decorators",{decoratorsBeforeExport:!0}],"@babel/plugin-proposal-do-expressions","@babel/plugin-proposal-function-bind","@babel/plugin-proposal-function-sent","@babel/plugin-proposal-partial-application",["@babel/plugin-proposal-pipeline-operator",{proposal:"hack",topicToken:"%"}],"@babel/plugin-proposal-throw-expressions",["@babel/plugin-proposal-record-and-tuple",{syntaxType:"hash"}],"@babel/plugin-proposal-class-properties","@babel/plugin-proposal-class-static-block","@babel/plugin-proposal-private-property-in-object","@babel/plugin-proposal-logical-assignment-operators","@babel/plugin-proposal-numeric-separator","@babel/plugin-proposal-nullish-coalescing-operator","@babel/plugin-proposal-optional-chaining","@babel/plugin-proposal-optional-catch-binding","@babel/plugin-proposal-json-strings","@babel/plugin-proposal-object-rest-spread","@babel/plugin-transform-exponentiation-operator"],code:!1,ast:!0})).ast;if(!D.program.body.length)return{srcLength:12,script:"function(){}",warnings:[{message:"script is empty",line:0}]};let S;const k=[],N=[];for(const t of D.program.body){if(!S){if("FunctionDeclaration"==t.type){S=t;continue}if("ExportNamedDeclaration"==t.type&&t.declaration&&"FunctionDeclaration"==t.declaration.type){S=t.declaration;continue}}if("VariableDeclaration"==t.type)for(const i of t.declarations)s("Identifier"==i.id.type,"global variables using destructure syntax is currently unsupported"),N.push(i.id.name),i.init&&k.push(e.types.expressionStatement(e.types.assignmentExpression("=",e.types.memberExpression(e.types.identifier("$G"),e.types.identifier(i.id.name)),i.init)));else k.push(t)}S||(S=e.types.functionDeclaration(e.types.identifier("main"),[e.types.identifier("context"),e.types.identifier("args")],e.types.blockStatement([]))),k.length&&S.body.body.unshift(e.types.ifStatement(e.types.unaryExpression("!",e.types.identifier("$FMCL")),e.types.blockStatement(k))),D.program.body=[S];const O=(Math.random()*2**53).toString(36),I=[];let T=!1;e.traverse(D,{enter(t){{const e=t.scope.getBinding("_START");if(e)for(const t of e.referencePaths)s("Identifier"==t.node.type),t.node.name="_ST"}{const e=t.scope.getBinding("_TIMEOUT");if(e)for(const t of e.referencePaths)s("Identifier"==t.node.type),t.node.name="_TO"}for(const i of N){const r=t.scope.getBinding(i);s(r);for(const t of r.referencePaths)s("Identifier"==t.node.type),t.replaceWith(e.types.memberExpression(e.types.identifier("$G"),e.types.identifier(t.node.name)))}t.skip()}}),e.traverse(D,{BlockStatement({node:t}){for(const[i,r]of t.body.entries())"FunctionDeclaration"!=r.type||r.generator||(t.body.splice(i,1),t.body.unshift(e.types.variableDeclaration("let",[e.types.variableDeclarator(r.id,e.types.arrowFunctionExpression(r.params,r.body,r.async))])))},ClassBody({node:t,scope:i}){for(const r of t.body)"ClassMethod"==r.type&&(e.traverse(r.body,{ThisExpression(t){t.replaceWith(e.types.identifier(`_THIS_${O}_`))}},i),"constructor"!=r.kind?r.body.body.unshift(e.types.variableDeclaration("let",[e.types.variableDeclarator(e.types.identifier(`_THIS_${O}_`),e.types.callExpression(e.types.memberExpression(e.types.super(),e.types.identifier("valueOf")),[]))])):(e.traverse(r.body,{CallExpression(t){"Super"==t.node.callee.type&&(t.replaceWith(e.types.assignmentExpression("=",e.types.identifier(`_THIS_${O}_`),t.node)),t.skip())}},i),r.body.body.unshift(e.types.variableDeclaration("let",[e.types.variableDeclarator(e.types.identifier(`_THIS_${O}_`))]))))},VariableDeclaration({node:e}){"const"==e.kind&&(e.kind="let")},ThisExpression(t){t.replaceWith(e.types.identifier(`_UNDEFINED_${O}_`))},BigIntLiteral(t){const i=Number(t.node.value);BigInt(i)==BigInt(t.node.value)?t.replaceWith(e.types.callExpression(e.types.identifier("BigInt"),[e.types.numericLiteral(i)])):t.replaceWith(e.types.callExpression(e.types.identifier("BigInt"),[e.types.stringLiteral(t.node.value)]))}}),t=o(D).code;let w,z=a(t.replace(/^function\s*\w+\(/,"function("))-(null!==(f=null===(l=t.match(/;/g))||void 0===l?void 0:l.length)&&void 0!==f?f:0)+L+(null!==(m=null===(_=t.match(/SC\$[a-zA-Z_][a-zA-Z0-9_]*\$[a-zA-Z_][a-zA-Z0-9_]*\(/g))||void 0===_?void 0:_.length)&&void 0!==m?m:0)+(null!==(g=null===(b=t.match(/DB\$/g))||void 0===b?void 0:b.length)&&void 0!==g?g:0);t=(await n(t,{ecma:2015,parse:{bare_returns:!0},compress:{passes:1/0,unsafe:!0,booleans:!1}})).code||"";{const i=await e.parseAsync(t);e.traverse(i,{MemberExpression({node:t}){t.computed||(s("Identifier"==t.property.type),"prototype"==t.property.name?(t.computed=!0,t.property=e.types.identifier(`_PROTOTYPE_PROPERTY_${O}_`)):"__proto__"==t.property.name&&(t.computed=!0,t.property=e.types.identifier(`_PROTO_PROPERTY_${O}_`)))}}),w=(await n(o(i).code,{ecma:2015,compress:{passes:1/0,unsafe:!0,unsafe_arrows:!0,unsafe_comps:!0,unsafe_symbols:!0,unsafe_methods:!0,unsafe_proto:!0,unsafe_regexp:!0,unsafe_undefined:!0},format:{semicolons:!1}})).code.replace(new RegExp(`_PROTOTYPE_PROPERTY_${O}_`,"g"),'"prototype"').replace(new RegExp(`_PROTO_PROPERTY_${O}_`,"g"),'"__proto__"')}let P=null,A=!1;{const i=await e.parseAsync(t),r=[];e.traverse(i,{FunctionDeclaration(t){t.traverse({Function(e){"CallExpression"!=e.parent.type&&"callee"!=e.parentKey&&e.skip()},Loop(e){e.skip()},ObjectExpression(t){const i={};d(t.node,i)&&t.replaceWith(e.types.identifier(`_JSON_VALUE_${I.push(i)-1}_${O}_`))},ArrayExpression(t){const i=[];u(t.node,i)&&t.replaceWith(e.types.identifier(`_JSON_VALUE_${I.push(i)-1}_${O}_`))}}),t.traverse({TemplateLiteral(t){const i=t.node;let r=e.types.stringLiteral(i.quasis[0].value.cooked);for(let t=0;t<i.expressions.length;t++){const n=i.expressions[t],s=i.quasis[t+1];r=e.types.binaryExpression("+",r,n),s.value.cooked&&(r=e.types.binaryExpression("+",r,e.types.stringLiteral(s.value.cooked)))}t.replaceWith(r)},MemberExpression({node:t}){t.computed||(s("Identifier"==t.property.type),t.property.name.length<3||(t.computed=!0,t.property=e.types.stringLiteral(t.property.name)))},UnaryExpression(t){"void"!=t.node.operator||"NumericLiteral"!=t.node.argument.type||t.node.argument.value||(t.replaceWith(e.types.identifier(`_UNDEFINED_${O}_`)),T=!0)},NullLiteral(t){let i=I.indexOf(null);-1==i&&(i+=I.push(null)),t.replaceWith(e.types.identifier(`_JSON_VALUE_${i}_${O}_`))},BooleanLiteral(t){let i=I.indexOf(t.node.value);-1==i&&(i+=I.push(t.node.value)),t.replaceWith(e.types.identifier(`_JSON_VALUE_${i}_${O}_`))},NumericLiteral(t){r.push((async()=>{if((await c(t.node.value)).length<=3)return;"key"==t.parentKey&&"ObjectProperty"==t.parent.type&&(t.parent.computed=!0);let i=I.indexOf(t.node.value);-1==i&&(i+=I.push(t.node.value)),t.replaceWith(e.types.identifier(`_JSON_VALUE_${i}_${O}_`))})())},StringLiteral(t){if(t.node.value.includes("\0")||t.node.value.length<2)return;"key"==t.parentKey&&"ObjectProperty"==t.parent.type&&(t.parent.computed=!0);let i=I.indexOf(t.node.value);-1==i&&(i+=I.push(t.node.value)),t.replaceWith(e.types.identifier(`_JSON_VALUE_${i}_${O}_`))},ObjectProperty({node:t}){if(t.computed||"Identifier"!=t.key.type||t.key.name.length<4)return;let i=I.indexOf(t.key.name);-1==i&&(i+=I.push(t.key.name)),t.computed=!0,t.key=e.types.identifier(`_JSON_VALUE_${i}_${O}_`)}}),t.skip()}}),await Promise.all(r);const[n]=i.program.body;if(s("FunctionDeclaration"==n.type),I.length)if(A=!0,1==I.length)if("string"!=typeof I[0]||I[0].includes("\n")||I[0].includes("\t")){const t=e.types.variableDeclaration("let",[e.types.variableDeclarator(e.types.identifier(`_JSON_VALUE_0_${O}_`),e.types.callExpression(e.types.memberExpression(e.types.identifier("JSON"),e.types.identifier("parse")),[e.types.memberExpression(e.types.taggedTemplateExpression(e.types.memberExpression(e.types.callExpression(e.types.identifier("SC$scripts$quine"),[]),e.types.identifier("split")),e.types.templateLiteral([e.types.templateElement({raw:"\t",cooked:"\t"},!0)],[])),e.types.identifier(`_SPLIT_INDEX_${O}_`),!0)]))]);T&&t.declarations.push(e.types.variableDeclarator(e.types.identifier(`_UNDEFINED_${O}_`))),n.body.body.unshift(t),P=JSON.stringify(I[0])}else{const t=e.types.variableDeclaration("let",[e.types.variableDeclarator(e.types.identifier(`_JSON_VALUE_0_${O}_`),e.types.memberExpression(e.types.taggedTemplateExpression(e.types.memberExpression(e.types.callExpression(e.types.identifier("SC$scripts$quine"),[]),e.types.identifier("split")),e.types.templateLiteral([e.types.templateElement({raw:"\t",cooked:"\t"},!0)],[])),e.types.identifier(`_SPLIT_INDEX_${O}_`),!0))]);T&&t.declarations.push(e.types.variableDeclarator(e.types.identifier(`_UNDEFINED_${O}_`))),n.body.body.unshift(t),P=I[0]}else{const t=e.types.variableDeclaration("let",[e.types.variableDeclarator(e.types.arrayPattern(I.map(((t,i)=>e.types.identifier(`_JSON_VALUE_${i}_${O}_`)))),e.types.callExpression(e.types.memberExpression(e.types.identifier("JSON"),e.types.identifier("parse")),[e.types.memberExpression(e.types.taggedTemplateExpression(e.types.memberExpression(e.types.callExpression(e.types.identifier("SC$scripts$quine"),[]),e.types.identifier("split")),e.types.templateLiteral([e.types.templateElement({raw:"\t",cooked:"\t"},!0)],[])),e.types.identifier(`_SPLIT_INDEX_${O}_`),!0)]))]);T&&t.declarations.push(e.types.variableDeclarator(e.types.identifier(`_UNDEFINED_${O}_`))),n.body.body.unshift(t),P=JSON.stringify(I)}else T&&n.body.body.unshift(e.types.variableDeclaration("let",[e.types.variableDeclarator(e.types.identifier(`_UNDEFINED_${O}_`))]));t=o(i).code}if(t=(await n(t,{ecma:2015,compress:{passes:1/0,unsafe:!0,unsafe_arrows:!0,unsafe_comps:!0,unsafe_symbols:!0,unsafe_methods:!0,unsafe_proto:!0,unsafe_regexp:!0,unsafe_undefined:!0},format:{semicolons:!1}})).code||"",null!=P){t=p(t,`${$?`//${$}\n`:""}\n//\t${P}\t\n`,y(t)+1);for(const[e,i]of t.split("\t").entries())if(i==P){t=t.replace(`_SPLIT_INDEX_${O}_`,await c(e));break}}return a(w)<=a(t)+Number(A)&&(t=w,$&&(t=p(t,`//${$}\n`,y(t)+1))),{srcLength:z,script:t=t.replace(/^function\s*\w+\(/,"function(").replace(/SC\$([a-zA-Z_][a-zA-Z0-9_]*)\$([a-zA-Z_][a-zA-Z0-9_]*)\(/g,`#${"nlmhf"[E]}s.$1.$2(`).replace(/\$D\(/g,"#D(").replace(/\$FMCL/g,"#FMCL").replace(/\$G/g,"#G").replace(/DB\$/g,"#db."),warnings:[]}}async function c(e){return(await n(`$(${e})`,{ecma:2015})).code.match(/\$\((.+)\)/)[1]}function y(e){const t=i(e,{ecmaVersion:2015});t.getToken(),t.getToken(),t.getToken();let n=1;for(;n;){const e=t.getToken();e.type==r.parenL?n++:e.type==r.parenR&&n--}return t.getToken().start}function d(e,t){if(!e.properties.length)return!1;for(const i of e.properties){if("ObjectProperty"!=i.type||i.computed)return!1;if(s("Identifier"==i.key.type||"NumericLiteral"==i.key.type||"StringLiteral"==i.key.type),"ArrayExpression"==i.value.type){const e=[];u(i.value,e)&&(t["Identifier"==i.key.type?i.key.name:i.key.value]=e)}else if("ObjectExpression"==i.value.type){const e={};d(i.value,e)&&(t["Identifier"==i.key.type?i.key.name:i.key.value]=e)}else if("NullLiteral"==i.value.type)t["Identifier"==i.key.type?i.key.name:i.key.value]=null;else{if("BooleanLiteral"!=i.value.type&&"NumericLiteral"!=i.value.type&&"StringLiteral"!=i.value.type)return!1;t["Identifier"==i.key.type?i.key.name:i.key.value]=i.value.value}}return!0}function u(e,t){if(!e.elements.length)return!1;for(const i of e.elements){if(!i)return!1;if("ArrayExpression"==i.type){const e=[];if(!u(i,e))return!1;e.push(e)}else if("ObjectExpression"==i.type){const e={};if(!d(i,e))return!1;t.push(e)}else if("NullLiteral"==i.type)t.push(null);else{if("BooleanLiteral"!=i.type&&"NumericLiteral"!=i.type&&"StringLiteral"!=i.type)return!1;t.push(i.value)}}return!0}export{l as default,l as processScript};
package/rollup.config.js DELETED
@@ -1,84 +0,0 @@
1
- import json from "@rollup/plugin-json"
2
- import typescript from "@rollup/plugin-typescript"
3
- import { promises as fsPromises } from "fs"
4
- import preserveShebang from "rollup-plugin-preserve-shebang"
5
- import { terser } from "rollup-plugin-terser"
6
- import { dependencies } from "./package.json"
7
-
8
- const { readdir: readDirectory } = fsPromises
9
-
10
- /** @typedef {import("rollup").RollupOptions} RollupOptions */
11
-
12
- const sourceDirectory = "src"
13
-
14
- /** @type {(command: Record<string, unknown>) => Promise<RollupOptions>} */
15
- export default async () => ({
16
- input: Object.fromEntries((await findFiles(sourceDirectory))
17
- .filter(path => path.endsWith(".ts"))
18
- .map(path => [ path.slice(sourceDirectory.length + 1, -3), path ])
19
- ),
20
- output: {
21
- dir: "."
22
- },
23
- plugins: [
24
- json({ preferConst: true }),
25
- typescript({ tsconfig: `${sourceDirectory}/tsconfig.json` }),
26
- preserveShebang(),
27
- terser()
28
- ],
29
- external: [
30
- ...Object.keys(dependencies),
31
- "fs",
32
- "path",
33
- "os"
34
- ]
35
- })
36
-
37
- /**
38
- * @param path the directory to start recursively finding files in
39
- * @param filter either a blacklist or a filter function that returns false to ignore file name
40
- * @returns promise that resolves to array of found files
41
- * @type {(path: string, filter?: string[] | ((name: string) => boolean)) => Promise<string[]>}
42
- */
43
- async function findFiles(path, filter = []) {
44
- const paths = []
45
- let /** @type {(name: string) => boolean} */ filterFunction
46
-
47
- if (Array.isArray(filter))
48
- filterFunction = name => !filter.includes(name)
49
- else
50
- filterFunction = filter
51
-
52
- for (const dirent of await readDirectory(path, { withFileTypes: true })) {
53
- if (!filterFunction(dirent.name))
54
- continue
55
-
56
- const direntPath = `${path}/${dirent.name}`
57
-
58
- if (dirent.isDirectory())
59
- await findFilesSub(direntPath, filterFunction, paths)
60
- else if (dirent.isFile())
61
- paths.push(direntPath)
62
- }
63
-
64
- return paths
65
- }
66
-
67
- async function findFilesSub(path, filterFunction, paths) {
68
- const promises = []
69
-
70
- for (const dirent of await readDirectory(path, { withFileTypes: true })) {
71
- if (!filterFunction(dirent.name))
72
- continue
73
-
74
- const direntPath = `${path}/${dirent.name}`
75
-
76
- if (dirent.isDirectory())
77
- promises.push(findFilesSub(direntPath, filterFunction, paths))
78
- else if (dirent.isFile())
79
- paths.push(direntPath)
80
- }
81
-
82
- await Promise.all(promises)
83
- return paths
84
- }
package/test.d.ts DELETED
@@ -1,6 +0,0 @@
1
- export declare function test(srcPath: string): Promise<{
2
- file: string;
3
- message: string;
4
- line: number;
5
- }[]>;
6
- export default test;
package/test.js DELETED
@@ -1 +0,0 @@
1
- import"fs";import"path";export{test as default,test}from"./index.js";import"./processScript.js";import"chokidar";import"./lib.js";import"./generateTypings.js";import"./pull.js";import"./syncMacros.js";import"@babel/core";import"@babel/generator";import"acorn";import"terser";