projectz
Version:
Stop wasting time syncing and updating your project's README and Package Files!
256 lines (255 loc) • 9.13 kB
JavaScript
// external
import { lines, t, i, ma, mul, mh2, mh3, mh4, mcode, mcodeblock, } from '@bevry/render';
import { hydrateTextWithLinks } from './util.js';
function getNpmInstructionList(data, commands, local) {
const label = `Executable${commands.length === 1 ? '' : 's'}`;
let importStatement = '';
let requireStatement = '';
if (local && data.main) {
if (Array.isArray(data.keywords) &&
data.keywords.includes('export-default')) {
importStatement = `import pkg from ('${data.name}')`;
requireStatement = `const pkg = require('${data.name}').default`;
}
else {
importStatement = `import * as pkg from ('${data.name}')`;
requireStatement = `const pkg = require('${data.name}')`;
}
}
return mul([
t([
'Install:',
mcode(`npm install ${local ? '--save' : '--global'} ${data.name}`),
]),
i(commands.length, () => t([
`${label}:`,
commands
.map((command) => (local ? `npx ${command}` : command))
.map(mcode)
.join(', '),
])),
i(importStatement, () => t(['Import:', mcode(importStatement)])),
i(requireStatement, () => t(['Require:', mcode(requireStatement)])),
]);
}
function getNpmInstructions(data) {
const commands = typeof data.bin === 'string' ? [data.name] : Object.keys(data.bin || {});
return lines([
mh3(ma({
inner: 'npm',
url: 'https://npmjs.com',
title: 'npm is a package manager for javascript',
})),
i(commands.length, () => mh4('Install Globally')),
i(commands.length, () => getNpmInstructionList(data, commands, false)),
i(commands.length, () => mh4('Install Locally')),
getNpmInstructionList(data, commands, true),
]);
}
function getDenoInstructions(data) {
const url = `https://unpkg.com/${data.name}@^${data.version}` +
(data.deno ? `/${data.deno}` : '');
const importer = Array.isArray(data.keywords) && data.keywords.includes('export-default')
? `pkg`
: '* as pkg';
const imports = `import ${importer} from '${url}'`;
return lines([
mh3(ma({
inner: 'Deno',
url: 'https://deno.land',
title: 'Deno is a secure runtime for JavaScript and TypeScript, it is an alternative for Node.js',
})),
mcodeblock('typescript', `${imports}`),
]);
}
function getUnpkgInstructions(data) {
const url = `//unpkg.com/${data.name}@^${data.version}`;
const importer = Array.isArray(data.keywords) && data.keywords.includes('export-default')
? `pkg`
: '* as pkg';
const imports = `import ${importer} from '${url}'`;
return lines([
mh3(ma({
inner: 'unpkg',
url: 'https://unpkg.com',
title: 'unpkg is a fast, global content delivery network for everything on npm',
})),
mcodeblock('html', [
'<script type="module">',
` ${imports}`,
`</script>`,
]),
]);
}
function getSkypackInstructions(data) {
const url = `//cdn.skypack.dev/${data.name}@^${data.version}`;
const importer = Array.isArray(data.keywords) && data.keywords.includes('export-default')
? `pkg`
: '* as pkg';
const imports = `import ${importer} from '${url}'`;
return lines([
mh3(ma({
inner: 'Skypack',
url: 'https://www.skypack.dev',
title: 'Skypack is a JavaScript Delivery Network for modern web apps',
})),
mcodeblock('html', [
'<script type="module">',
` ${imports}`,
`</script>`,
]),
]);
}
function getJspmInstructions(data) {
const url = `//dev.jspm.io/${data.name}@${data.version}`;
const importer = Array.isArray(data.keywords) && data.keywords.includes('export-default')
? `pkg`
: '* as pkg';
const imports = `import ${importer} from '${url}'`;
return lines([
mh3(ma({
inner: 'jspm',
url: 'https://jspm.io',
title: 'Native ES Modules CDN',
})),
mcodeblock('html', [
'<script type="module">',
` ${imports}`,
`</script>`,
]),
]);
}
function getTypeScriptInstructions() {
return lines([
hydrateTextWithLinks(mh3('TypeScript')),
hydrateTextWithLinks('This project provides its type information via inline JSDoc Comments. To make use of this in TypeScript, set your <code>maxNodeModuleJsDepth</code> compiler option to `5` or thereabouts. You can accomplish this via your `tsconfig.json` file like so:'),
mcodeblock('json', JSON.stringify({
compilerOptions: {
maxNodeModuleJsDepth: 5,
},
}, null, ' ')),
]);
}
function getComponentInstructions(data) {
return lines([
mh3(ma({
inner: 'Component',
url: 'https://github.com/componentjs/component',
title: 'Frontend package manager and build tool for modular web applications',
})),
mul(['Install: ' + mcode(`component install ${data.name}`)]),
]);
}
function getBowerInstructions(data) {
return lines([
mh3(ma({
inner: 'Bower',
url: 'https://bower.io',
title: 'A package manager for the web',
})),
mul(['Install: ' + mcode(`bower install ${data.name}`)]),
]);
}
function getEditionsInstructions(data) {
if (!data.editions.length)
return '';
let hasDefaultEdition = false;
const editions = [];
for (const edition of data.editions) {
const entryParts = [];
if (edition.directory) {
entryParts.push(edition.directory);
}
if (edition.entry) {
// handle the editions standard 1.3 and below
// can't use substring, as we don't know if we have 1.3 and below or not
if (edition.directory) {
entryParts.push(edition.entry.replace(edition.directory.length + '/', ''));
}
else {
entryParts.push(edition.entry);
}
}
const entry = entryParts.join('/');
if (entry === data.main) {
hasDefaultEdition = true;
editions.push(t([mcode(data.name), 'aliases', mcode(`${data.name}/${data.main}`)]));
}
editions.push(t([mcode(`${data.name}/${entry}`), 'is', edition.description]));
}
// Autoloaders
if (!hasDefaultEdition) {
if ('editions' in data.dependencies) {
editions.unshift(t([
mcode(data.name),
'aliases',
mcode(`${data.name}/${data.main}`),
`which uses the Editions Autoloader to automatically select the correct edition for the consumer's environment`,
]));
}
else if ('esnextguardian' in data.dependencies) {
editions.unshift(t([
mcode(data.name),
'aliases',
mcode(`${data.name}/${data.main}`),
'which uses ESNextGuardian to automatically select the correct edition for the consumers environment',
]));
}
}
// Compile result
const result = lines([
mh3('Editions'),
'This package is published with the following editions:',
mul(editions),
]);
// Add links
return hydrateTextWithLinks(result);
}
// Define
export function getInstallInstructions(data) {
const parts = [mh2('Install')];
// DocPad
const prefix = 'docpad-plugin-';
if (data.name.startsWith(prefix)) {
const pluginName = data.name.substring(prefix.length);
parts.push(t([
'Install this DocPad plugin by entering',
mcode(`docpad install ${pluginName}`),
'into your terminal.',
]));
}
else {
// Node
if (data.filenamesForPackageFiles.package) {
parts.push(getNpmInstructions(data));
// Deno
if (data.deno) {
parts.push(getDenoInstructions(data));
}
// Browser
if (data.browsers) {
if (data.module) {
parts.push(getSkypackInstructions(data));
parts.push(getUnpkgInstructions(data));
}
parts.push(getJspmInstructions(data));
}
}
// Component
if (data.filenamesForPackageFiles.component) {
parts.push(getComponentInstructions(data));
}
// Bower
if (data.filenamesForPackageFiles.bower) {
parts.push(getBowerInstructions(data));
}
// Editions
if (data.editions) {
parts.push(getEditionsInstructions(data));
}
}
if (data.main && data.devDependencies && data.devDependencies.jsdoc) {
parts.push(getTypeScriptInstructions());
}
return lines(parts);
}