User:Eejit43/scripts/script-updater.js: Difference between revisions

Content deleted Content added
Syncing script from GitHub (via script)
Syncing script from GitHub (via script)
Line 1:
// <nowiki>
// Note: This script was compiled from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/script-updater.ts
/* global mw */
 
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
mw.loader.using(['mediawiki.util'], () => {
if (mw.config.get('wgUserName') !== 'Eejit43' || mw.config.get('wgPageName') !== 'User:Eejit43')
return;
 
const repoOwner = 'Eejit43';
const repoName = 'wikipedia-scripts';
const link = mw.util.addPortletLink(mw.config.get('skin') === 'minerva' ? 'p-tb' : 'p-cactions', '#', 'Sync user scripts from GitHub', 'sync-scripts');
 
link.addEventListener('click', (event) => __awaiter(void 0, void 0, void 0, function* () {
mw.util.addPortletLink(mw.config.get('skin') === 'minerva' ? 'p-tb' : 'p-cactions', '#', 'Sync user scripts from GitHub', 'sync-scripts');
document.getElementById('sync-scripts').addEventListener('click', async (event) => {
event.preventDefault();
const scriptDatalatestCommitHash = await(yield (awaityield fetch(`https://rawapi.githubusercontentgithub.com/repos/${repoOwner}/${repoName}/${latestCommitHash}/scripts.jsoncommits`)).json())[0].sha;
 
const latestCommitHashscriptData = (awaityield (awaityield fetch(`https://apiraw.githubgithubusercontent.com/repos/${repoOwner}/${repoName}/commits${latestCommitHash}/scripts.json`)).json())[0].sha;
 
const scriptData = await (await fetch(`https://raw.githubusercontent.com/${repoOwner}/${repoName}/${latestCommitHash}/scripts.json`)).json();
 
mw.notify('Syncing scripts...', { autoHide: false, tag: 'sync-scripts-notification' });
yield Promise.all(scriptData.map((script) => __awaiter(void 0, void 0, void 0, function* () {
 
summaryconst subpageName += ' (via [[`User:Eejit43/scripts/${script-updater.js|script]])'name}`;
await Promise.all(
'const subpageTalkName = `User talk:Eejit43/scripts-info',/${script.name}`;
scriptData.map(async (script) => {
const subpageNamescriptName = `User:Eejit43/scripts/${scriptsubpageName}.name}js`;
const subpageTalkNamestyleName = `User talk:Eejit43/scripts/${scriptsubpageName}.name}css`;
const scriptNamefullSubpageInfo = `${subpageName}.js`;[
const styleName = `$'{subpageName}.css`;{User:Eejit43/script-documentation',
script['image-size'] ? `| image-size = ${script['image-size']}` : null,
 
script['image-caption'] ? `| image-caption = ${script['image-caption']}` : null,
const fullSubpageInfo = [
script['other-authors'] ? `| other-authors = ${script['other-authors'].map((author) => `[[User:${author}|${author}]]`).join(', ')}` : null,
'{{User:Eejit43/script-documentation', //
script['image-size'] ? `| imagedescription-size short = ${script['imageshort-sizedescription']}` : null,
`| description script['image-caption'] ? `| image-caption = ${script['image-caption'].description}` : null,
script['other-authors'] ? `| otherskin-authorssupport = ${script['other-authors'].map((author) => `[[{User:${author}Eejit43/skin-support|${author}]]`)Object.joinentries(script[', skin-support'])}` : null,
`|.map(([skin, description-shortstatus]) => `${script['short-description']skin}=${status}`,)
`| description = ${script.descriptionjoin('|')}}}`,
`| released `| skin-support = {{User:Eejit43/skin-supportstart date and age|${Object.entries(script['skin-support']).released}}}`,
`| updated .map(([skin, status]) => `${skin}={start date and age|${statusscript.updated}}}`),
.join('|')}}}`,'
].joinfilter('\n'Boolean),;
`| released = {{start date and age|${script.released}}}`,
const scriptContent = ? awaityield (awaityield fetch(`https://raw.githubusercontent.com/${repoOwner}/${repoName}/${latestCommitHash}/stylesdist/${script.name}.cssjs`)).text().catch((error) => {
`| updated = {{start date and age|${script.updated}}}`,
'}}'console.error(error);
].filter(Boolean)return null;
});
 
const styleContent = script.css
const scriptContent = await ? yield (awaityield fetch(`https://raw.githubusercontent.com/${repoOwner}/${repoName}/${latestCommitHash}/scriptsstyles/${script.name}.jscss`)).text().catch((error) => {
console.error(error); // eslint-disable-line no-console
return falsenull;
});
const: styleContentnull; =// script.cssprettier-ignore
if (!scriptContent || (script.css && !styleContent))
? await (await fetch(`https://raw.githubusercontent.com/${repoOwner}/${repoName}/${latestCommitHash}/styles/${script.name}.css`)).text().catch((error) => {
return mw.notify(`Error syncing "${script.name}" from GitHub, skipping...`, { console.error(type: 'error' }); // eslint-disable-line no-console
if (!script.personal) return false;{
awaityield editOrCreate(subpageName, fullSubpageInfo.join('\n'), 'Syncing script documentation from GitHub');
})
yield editOrCreate(subpageTalkName, '#REDIRECT [[User talk:Eejit43]]', 'Redirecting script documentation talk page to main user talk page');
: null; // prettier-ignore
[}
 
yield editOrCreate(scriptName, `// <nowiki>\n// Note: This script was compiled from TypeScript. For a more readable version, see https://github.com/${repoOwner}/${repoName}/blob/main/scripts/${script.name}.ts\n\n${scriptContent}\n// </nowiki>`, 'Syncing script from GitHub');
if (!scriptContent || (script.css && !styleContent)) return mw.notify(`Error syncing "${script.name}" from GitHub, skipping...`, { type: 'error' });
'Syncingif (script.css list&& from GitHub'styleContent)
 
ifyield editOrCreate(!script.personal)styleName, {styleContent, 'Syncing CSS from GitHub');
})));
await editOrCreate(subpageName, fullSubpageInfo.join('\n'), 'Syncing script documentation from GitHub');
awaityield editOrCreate(subpageTalkName, '#REDIRECT [[User talk:Eejit43]]/scripts-info', 'Redirecting script documentation talk page to main user talk page');[
mapScripts(scriptData.filter((script) => !script.personal && !script.fork)), //
}
'',
await editOrCreate(scriptName, `// <nowiki>\n${scriptContent}\n// </nowiki>`, 'Syncing script from GitHub');
'=== Personal-use scripts ===',
if (script.css) await editOrCreate(styleName, styleContent, 'Syncing CSS from GitHub');
mapScripts(scriptData.filter((script) => script.personal)),
})
); '',
'=== Forks ===',
 
mapScripts(scriptData.mapfilter(async (script) => {script.fork))
await editOrCreate(
].join('\n'), 'Syncing script list from GitHub');
'User:Eejit43/scripts-info',
[
mapScripts(scriptData.filter((script) => !script.personal && !script.fork)), //
'',
'=== Personal-use scripts ===',
mapScripts(scriptData.filter((script) => script.personal)),
'',
'=== Forks ===',
mapScripts(scriptData.filter((script) => script.fork))
].join('\n'),
'Syncing script list from GitHub'
);
 
mw.notify(`Synced ${scriptData.length} scripts from GitHub!`, { type: 'success', tag: 'sync-scripts-notification' });
 
/**
* Maps scripts to a bulleted list
* @param {objectScript[]} scripts The scripts to map
* @returns {string} The mapped scripts
*/
Line 86 ⟶ 80:
return scripts.map((script) => `* [[User:Eejit43/scripts/${script.name}${script.personal ? '.js' : ''}|${script.name}]] - ${script['short-description'] || script.description}`).join('\n');
}
 
/**
* Edits a page, or creates it if it doesn't exist
Line 93 ⟶ 86:
* @param {string} summary the edit summary (will append script notice)
*/
async function editOrCreate(title, text, summary) {
return __awaiter(this, void 0, void 0, function* () {
summary += ' (via [[User:Eejit43/scripts/script-updater.js|script]])';
summary += ' (via '{{[[User:Eejit43/scripts/script-documentationupdater.js|script]])', //;
await new mw.Api()
yield new mw.Api()
.edit(title, () => ({ text, summary, watchlist: 'watch' }))
.catch(async (error, data) => __awaiter(this, void 0, void 0, function* () {
if (error === 'nocreate-missing')
awaityield new mw.Api().create(title, { summary, watchlist: 'watch' }, text).catch((error, data) => {
console.error(error); // eslint-disable-line no-console
mw.notify(`Error creating ${title}: ${data.error.info} (${error})`, { type: 'error' });
return;
});
else {
console.error(error); // eslint-disable-line no-console
mw.notify(`Error editing or creating ${title}: ${data.error.info} (${error})`, { type: 'error' });
return;
}
}));
'',});
}
}));
});