UNPKG

mw.js

Version:

Typed MediaWiki API client for node.js using TypeScript.

30 lines (24 loc) 12.7 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var O = require('fs'); var L = require('fs-extra'); var C = require('tough-cookie'); var undici = require('undici'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var O__default = /*#__PURE__*/_interopDefaultLegacy(O); var L__default = /*#__PURE__*/_interopDefaultLegacy(L); var C__default = /*#__PURE__*/_interopDefaultLegacy(C); var I=(a,e,t)=>{if(!e.has(a))throw TypeError("Cannot "+t)};var o=(a,e,t)=>(I(a,e,"read from private field"),t?t.call(a):e.get(a)),g=(a,e,t)=>{if(e.has(a))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(a):e.set(a,t);},m=(a,e,t,r)=>(I(a,e,"write to private field"),r?r.call(a,t):e.set(a,t),t);var w=class extends Error{constructor(e){super(`Invalid interwiki: ${e}`);}};var k=class extends Error{constructor(t){let r=typeof t=="object"&&t!==null?Object.entries(t).map(([i,s])=>` ${i} = ${s}`).join(` `):"";super(`Your request returned an error object. ${r}`);}};var R,q,p,v=class{constructor({password:e,username:t,wiki:r}){g(this,R,void 0);g(this,q,void 0);g(this,p,void 0);this.csrf=null;m(this,R,e.trim()),m(this,q,t.trim()),m(this,p,r);}get wiki(){return o(this,p)}set wiki(e){m(this,p,e);}async block(e){return this.wiki.post({...e,action:"block",token:await this.getCSRFToken()})}async delete(e){return o(this,p).post({...e,action:"delete",token:await this.getCSRFToken()})}async edit(e){return o(this,p).post({...e,action:"edit",assert:e.bot?"bot":"user",token:await this.getCSRFToken()})}async getCSRFToken(e=!1){if(e||!this.csrf){let t=await o(this,p).getToken("csrf");this.csrf=t.query.tokens.csrftoken;}return this.csrf}async isLoggedIn(){return (await this.whoAmI()).query.userinfo.id!==0}async login(e=!1){if(!e&&await this.isLoggedIn())return;o(this,p).request.clear(o(this,p).api);let r=(await o(this,p).getToken("login")).query.tokens.logintoken,i=await o(this,p).post({action:"login",lgname:o(this,q),lgpassword:o(this,R),lgtoken:r});if(i.login.result!=="Success")throw new k(i.login)}async logout(){await o(this,p).post({action:"logout",token:await this.getCSRFToken()}),o(this,p).request.clear(o(this,p).api);}async move(e){return o(this,p).post({...e,action:"move",token:await this.getCSRFToken()})}async protect(e){return this.wiki.post({...e,action:"protect",token:await this.getCSRFToken()})}purge(e){return this.wiki.purge(e)}async rollback(e){return this.wiki.post({...e,action:"rollback",token:(await this.wiki.getToken("rollback")).query.tokens.rollbacktoken})}touch(e){return this.wiki.purge(e)}async unblock(e){return this.wiki.post({...e,action:"unblock",token:await this.getCSRFToken()})}async undelete(e){return this.wiki.post({...e,action:"undelete",token:await this.getCSRFToken()})}async upload(e){return o(this,p).post({...e,action:"upload",token:await this.getCSRFToken()})}whoAmI(){return o(this,p).get({action:"query",meta:"userinfo",uiprop:"groups"})}};R=new WeakMap,q=new WeakMap,p=new WeakMap;var u,l,P,x=class{constructor({prettify:e=!1,store:t}={}){g(this,u,void 0);g(this,l,void 0);g(this,P,void 0);var i;if(m(this,P,e),m(this,u,{}),t&&m(this,l,t),!o(this,l)||!L__default["default"].existsSync(o(this,l).path))return;let r=L__default["default"].readJsonSync(o(this,l).path);for(let s in r){o(this,u)[s]=new Map;let n=r[s];if(!!n)for(let c of n){let b=C__default["default"].Cookie.fromJSON(c);!b||b.expiryTime()<Date.now()||(i=o(this,u)[s])==null||i.set(b.key,b);}}this.expire();}clear(e){var r;let t=x.getHost(e);!o(this,u)[t]||(r=o(this,u)[t])==null||r.clear();}clearAll(){m(this,u,{});}expire(e){let t=e??Object.keys(o(this,u));for(let r of t){let i=o(this,u)[r];if(!!i)for(let[s,n]of i){let c=!1;n.creation&&typeof n.maxAge=="number"&&n.creation.getTime()+n.maxAge*1e3<Date.now()&&(c=!1),typeof n.maxAge=="string"&&(c=!0),n.expires instanceof Date&&n.expires.getTime()<Date.now()&&(c=!1),c&&i.delete(s);}}}get(e){let t=x.getHost(e);this.expire(t);let r=o(this,u)[t];return r?[...r.values()].join(";"):""}set({cookie:e,url:t}){var s;let r=C__default["default"].parse(e);if(!r||!this.allowCookie(r))return;let i=x.getHost(t);o(this,u)[i]||(o(this,u)[i]=new Map),(s=o(this,u)[i])==null||s.set(r.key,r),this.save();}allowCookie(e){var i;return (i=o(this,l))!=null&&i.regex?(Array.isArray(o(this,l).regex)?o(this,l).regex:[o(this,l).regex]).find(s=>e.key.match(s))!==void 0:!0}static getHost(e){var s;let{host:t,pathname:r}=new URL(e),i=(s=r.match(/\/([a-z-]+)\//))==null?void 0:s[1];return i?`${t}/${i}`:t}save(){var t;if(!o(this,l))return;L__default["default"].ensureFileSync(o(this,l).path);let e={};for(let r in o(this,u)){e[r]=[];let i=o(this,u)[r];if(!!i)for(let s of i.values())(t=e[r])==null||t.push(s.toJSON());}L__default["default"].writeJSONSync(o(this,l).path,e,{spaces:o(this,P)?" ":void 0});}},A=x;u=new WeakMap,l=new WeakMap,P=new WeakMap;var h,f=class{constructor({agent:e,headers:t,jarOptions:r}={}){g(this,h,void 0);this.agent=e,m(this,h,new A(r)),this.headers=t??{};}get jar(){return o(this,h)}clear(e){o(this,h).clear(e);}async get({url:e,qs:t}){let r=new URLSearchParams(t),{body:i,headers:s}=await this.raw(`${e}?${r}`),n=s["set-cookie"]||[];return this.addCookies(e,n),i.json()}async post({url:e,form:t}){let r=new undici.FormData;for(let n in t)r.set(n,t[n]);let{body:i,headers:s}=await this.raw(e,{body:r,method:"POST"});return this.addCookies(e,s["set-cookie"]),i.json()}raw(e,t={method:"GET"}){return undici.request(e,{...t,dispatcher:this.agent,headers:{...this.headers,cookie:o(this,h).get(e)}})}addCookies(e,t){if(!t)return;let r=Array.isArray(t)?t:[t];for(let i of r)o(this,h).set({cookie:i,url:e});}};h=new WeakMap;var X=a=>new Promise(e=>setTimeout(e,a));var S=class{constructor({api:e,request:t}){this.api=e.trim(),this.request=t??new f;}querystring(e){let t={},r;for(r in e){let i=e[r];if(typeof i=="boolean")t[r]=i?"1":"0";else if(Array.isArray(i)){let s=i;t[r]=s.join("|");}else i instanceof O__default["default"].ReadStream?t[r]=i:t[r]=`${i}`;}return t}async raw(e,t){let r={...e,format:"json",formatversion:2},i=this.querystring(r),s=t==="GET"?await this.request.get({qs:i,url:this.api}):await this.request.post({form:i,url:this.api});if("error"in s)throw new k(s.error);return s}get(e){return this.raw(e,"GET")}post(e){return this.raw(e,"POST")}async exists(){let{statusCode:e}=await this.request.raw(this.api);return e===200}async getInterwikis(){let t=(await this.get({action:"query",meta:"siteinfo",siprop:["interwikimap"]})).query.interwikimap.filter(i=>"language"in i),r={};for(let i of t)try{r[i.prefix]=i.url;}catch{continue}return r}getSiteInfo(...e){return this.get({action:"query",meta:"siteinfo",siprop:e})}async getPages(e){let t=Array.isArray(e)?e:[e],r={};for(;t.length!==0;){let i=await this.get({action:"query",prop:"revisions",rvprop:["content"],rvslots:"main",titles:t.splice(0,50).join("|")});for(let s of i.query.pages)if(!s.missing){let{content:n}=s.revisions[0].slots.main;n&&(r[s.title]=n);}}return Array.isArray(e)?r:Object.values(r)[0]??{}}async getToken(e){return await this.get({action:"query",meta:"tokens",type:e})}getURL(e){e=e.replace(/ /g,"_");let t=new URL(this.api).origin;return new URL(this.articlepath??"/wiki/$1",t).href.replace("$1",encodeURI(e))}async load(){let e=await this.getSiteInfo("general");return this.mainpage=e.query.general.mainpage,this.base=e.query.general.base,this.sitename=e.query.general.sitename,this.lang=e.query.general.lang,this.readonly=e.query.general.readonly,this.writeapi=e.query.general.writeapi,this.articlepath=e.query.general.articlepath,this.scriptpath=e.query.general.scriptpath,this.script=e.query.general.script,this.server=e.query.general.server,this.servername=e.query.general.servername,this.wikiid=e.query.general.wikiid,this}async pagesExist(e){let t=Array.isArray(e)?e:[e],r={};for(;t.length!==0;){let i=await this.get({action:"query",prop:"revisions",rvprop:["content"],rvslots:"main",titles:t.splice(0,50).join("|")});for(let s of i.query.pages){if(typeof e=="string")return !s.missing;r[s.title]=!s.missing;}}return r}parse(e){return this.get({...e,action:"parse"})}async purge(e){let t={};for(;e.length!==0;){let r=await this.post({action:"purge",titles:e.splice(0,50).join("|")});for(let i of r.purge)"missing"in i?t[i.title]=!1:t[i.title]=!0;}return t}search(e){return this.get({...e,action:"opensearch"})}async queryList(e,t){let r=this.iterQueryList(e,t),i=[];for await(let s of r)i.push(s);return i}async*iterQueryList(e,t){let r=0;for(;;){let i=await this.get({action:"query",...e}),s=i.query[e.list];if(s){for(let c of s)if(yield c,r++,t&&r===t)return}if(!i.continue)break;let n=Object.keys(i.continue).find(c=>c!=="continue");if(!n)break;e[n]=i.continue[n];}}async queryProp(e,t){let r=this.iterQueryProp(e,t),i=[];for await(let s of r)i.push(s);return i.flat()}async rawQueryProp(e){return (await this.get({action:"query",...e})).query}async*iterQueryProp(e,t){let r=0;for(;;){let i=await this.get({action:"query",...e}),s=i.query.pages;for(let c of s)if(yield c,r++,t&&r===t)return;if(!i.continue)break;let n=Object.keys(i.continue).find(c=>c!=="continue");if(!n)break;e[n]=i.continue[n];}}async*iterPages(e){for(;e.length!==0;){let t=await this.get({action:"query",prop:"revisions",rvprop:["content"],rvslots:"main",titles:e.splice(0,50).join("|")});for(let r of t.query.pages)r.missing!==!0&&(yield r);}}};var d,N=class extends v{constructor({password:t,username:r,wiki:i}){super({password:t,username:r,wiki:i});g(this,d,new Set);o(this,d).add(i.interwiki);}async setWiki(t){this.wiki=t,o(this,d).has(t.interwiki)||(await this.login(),o(this,d).add(t.interwiki)),this.csrf=null;}};d=new WeakMap;var T=class extends S{constructor({interwiki:t,request:r}){super({api:y.interwiki2api(t),request:r});this.interwiki=t;}getURL(t){t=t.replace(/ /g,"_");let r=this.api.replace("/api.php","/wiki/");return new URL(t,r).href}async load(){var r;if(this.id)return this;let t=await this.getSiteInfo("general","variables");return this.mainpage=t.query.general.mainpage,this.base=t.query.general.base,this.sitename=t.query.general.sitename,this.lang=t.query.general.lang,this.readonly=t.query.general.readonly,this.writeapi=t.query.general.writeapi,this.articlepath=t.query.general.articlepath,this.scriptpath=t.query.general.scriptpath,this.script=t.query.general.script,this.server=t.query.general.server,this.servername=t.query.general.servername,this.wikiid=t.query.general.wikiid,this.id=(r=t.query.variables.find(i=>i.id==="wgCityId"))==null?void 0:r["*"],this}};var y=class{constructor({cookies:e,prettyCookies:t=!1,requestOptions:r={}}={}){let i={prettify:t};e&&(i.store={path:e,regex:[/^wiki(a|cities)_/]}),this.request=new f({...r,jarOptions:i});}static interwiki2path(e){let t=e.toLowerCase();if(t.match(/[a-z0-9-]+\.[a-z0-9-]+/)){let[r,i]=t.split(".");return `https://${i}.fandom.com/${r}`}else if(t.match(/^[a-z0-9-]+$/))return `https://${t}.fandom.com`;throw new w(t)}static getWiki(e){return this.request||(this.request=new f),new T({interwiki:e,request:this.request})}static interwiki2api(e){return `${y.interwiki2path(e)}/api.php`}static interwiki2url(e){return `${y.interwiki2path(e)}/wiki/`}static url2interwiki(e){var n;let t=/https?:\/\/([a-z0-9-]+)\.fandom\.com\/(wiki|api|index)/,r=(n=e.match(t))==null?void 0:n[1];if(r)return r;let i=/https?:\/\/([a-z0-9-]+)\.fandom\.com\/([a-z-]+)\/(wiki|api|index)/,s=e.match(i);if(s)return `${s[2]}.${s[1]}`;throw new w(e)}async getUserAvatar(e){let t=await this.getUserId(e);if(!t)return null;let{body:r}=await this.request.raw(`https://services.fandom.com/user-attribute/user/${t}/attr/avatar`);return (await r.json()).value??null}async getUserDiscordTag(e){let t=await this.getUserId(e);if(!t)return null;let{body:r}=await this.request.raw(`https://services.fandom.com/user-attribute/user/${t}/attr/discordHandle`);return (await r.json()).value??null}async getUserId(e){var i;return ((i=(await this.getWiki("community").queryList({list:"users",ususers:e}))[0])==null?void 0:i.userid)??null}async getUsersIds(e){return (await this.getWiki("community").queryList({list:"users",ususers:e})).reduce((i,s)=>(i[s.name]=s.userid,i),{})}getWiki(e){return new T({interwiki:e,request:this.request})}async login({password:e,username:t,wiki:r}){let i=new N({password:e,username:t,wiki:r??this.getWiki("community")});return await i.login(),i}}; exports.Bot = v; exports.CookieJar = A; exports.Fandom = y; exports.FandomBot = N; exports.FandomWiki = T; exports.InvalidInterwikiError = w; exports.MediaWikiError = k; exports.RequestManager = f; exports.Wiki = S; exports.sleep = X; //# sourceMappingURL=main.js.map