@userscripters/generate-stackapps
Version:
StackApps post generator for userscripts
79 lines (63 loc) • 3.56 kB
JavaScript
import { parseAuthor } from "./utils/author.js";
import { scase, uniqify } from "./utils/common.js";
import { makeTemplateComment, mdLink } from "./utils/index.js";
import { parsePackageName, prettifyPackageName } from "./utils/name.js";
/**
* @summary generates StackApps post content
* @param pkg package.json JSON
* @param options parsed {@link GeneratorOptions}
*/
export const generateStackApps = (pkg, options) => {
const { author, contributors = [], description = "", license = "", name, version = "1.0.0" } = pkg;
const { about = description, excerpt = description, installURL, languages = [], minifiedURL, orgName, orgURL, postTitle, roomURL, screenshotAlt = "screenshot of the script", screenshotURL = "", tags = [], testedIn = {}, thumbnailURL = "", worksWith = [] } = options;
const browserNames = Object.keys(testedIn);
const testingData = Object.values(testedIn);
const managerNames = uniqify(worksWith.map(scase));
const { name: authorName, url: authorUrl = "" } = parseAuthor(author);
const parsedContribs = contributors.map(parseAuthor);
const contribs = parsedContribs.length ? `\n\nContributors:${parsedContribs.map(({ name, url }) => `\n<br>${url ? mdLink(url, name) : name}`)}` : "";
const { packageName, normalizedScopedName } = parsePackageName(name);
const title = postTitle || `${prettifyPackageName(packageName)} - ${description}`;
const minified = minifiedURL ? ` | ${mdLink(minifiedURL, "Minified")}` : "";
const org = orgName ? `<br>Organization: ${orgURL ? mdLink(orgURL, orgName) : orgName}` : "";
const room = roomURL ? `\nYou can also ${mdLink(roomURL, "drop by to chat")}, we are a friendly bunch.` : "";
const screenshot = screenshotURL ? `## Screenshot\n\n!${mdLink(screenshotURL, screenshotAlt)}\n` : "";
const testing = testingData.some(Boolean) ?
`Version number means "last tested on":
| ${browserNames.map(scase).join(" | ")} |
| ${new Array(browserNames.length).fill("-").join(" | ")} |
| ${testingData.map((data) => data && !data.startsWith("no") ? `✔ ${data}` : "-").join(" | ")} |\n` :
"";
const managers = managerNames.length ?
`${testing ? "\n" : ""}Supported userscript managers:\n\n${managerNames.map((n) => `- ${scase(n)}`).join("\n")}\n` :
"";
const platform = managers || testing ? `\n\n### Platform\n\n${testing}${managers}` : "";
const body = `
${makeTemplateComment("thumbnail", thumbnailURL)}
${makeTemplateComment("version", version)}
${makeTemplateComment("tag", tags[0])}
${makeTemplateComment("excerpt", excerpt)}
${screenshot}
## About
${about}
### License
The script is licensed under the ${mdLink(`https://spdx.org/licenses/${license}`, license)} license.
### Download
Latest version: ${version}
${mdLink(installURL, "Install")}${minified}
${platform}
## Change log
| Version | Description |
| ---------- | ----------- |
| ${version} | |
## Contact
Author: ${authorUrl ? mdLink(authorUrl, authorName) : authorName}
${org}${contribs}
Please, submit bug reports ${mdLink(`https://github.com/${normalizedScopedName}/issues`, "on the source repository")}.
<br>Before adding a new one, please check if it hasn't been raised before.
${room}
## Code
${mdLink(`https://github.com/${normalizedScopedName}/blob/master/src/index.ts`, "Source code")} is written in ${languages.join(", ")}.
Contributions are welcome, you can always ${mdLink(`https://github.com/${normalizedScopedName}/pulls`, "submit a PR here")}.`;
return { title, body, tags: tags.join(" ") };
};