projectz
Version:
Stop wasting time syncing and updating your project's README and Package Files!
181 lines (172 loc) • 4.63 kB
text/typescript
// local
import { ma, Link, trim } from '@bevry/render'
import type { Github } from './types.js'
export function fileUrl(data: { github: Github }, filename: string): string {
if (data.github.slug) {
return `https://github.com/${data.github.slug}/blob/HEAD/${filename}#files`
} else {
throw new Error(
'File links are currently only supported for GitHub repositories',
)
}
}
// @todo replace this with bevry/ropo
export function replaceSection(
names: string | string[],
source: string,
inject: string | Function,
remove: boolean = false,
): string {
let regexName: string, sectionName: string
if (Array.isArray(names)) {
regexName = '(' + names.join('|') + ')'
sectionName = names[0]
} else {
regexName = sectionName = names
}
sectionName = sectionName.toUpperCase()
/* eslint indent:0 */
const regex = new RegExp(
[
'^(',
`<!--\\s*${regexName}\\s*-->`,
'|',
`<!--\\s*${regexName}/\\s*-->`,
'[\\s\\S]*?',
`<!--\\s*/${regexName}\\s*-->`,
')\\s+',
].join(''),
'gim',
)
function replace() {
const result = typeof inject === 'function' ? inject() : inject
return `<!-- ${sectionName}/ -->\n\n${trim(
result,
)}\n\n<!-- /${sectionName} -->\n\n\n`
}
const result = remove
? source.replace(regex, '')
: source.replace(regex, replace)
return result
}
export function hydrateTextWithLinks(text: string) {
const linksArray: Link[] = [
{
inner: 'Deno',
url: 'https://deno.land',
title:
'Deno is a secure runtime for JavaScript and TypeScript, it is an alternative to Node.js',
},
{
inner: 'Editions Autoloader',
url: 'https://github.com/bevry/editions',
title:
'You can use the Editions Autoloader to autoload the appropriate edition for your consumers environment',
},
{
inner: 'Editions',
url: 'https://editions.bevry.me',
title:
'Editions are the best way to produce and consume packages you care about.',
},
{
inner: 'ESNextGuardian',
url: 'https://github.com/bevry/esnextguardian',
title:
"Loads ES6+ files if the user's environment supports it, otherwise gracefully fallback to ES5 files.",
},
{
inner: "Babel's Polyfill",
url: 'https://babeljs.io/docs/usage/polyfill/',
title: 'A polyfill that emulates missing ECMAScript environment features',
},
{
inner: 'Babel',
url: 'https://babeljs.io',
title: 'The compiler for writing next generation JavaScript',
},
{
inner: 'CoffeeScript',
url: 'https://coffeescript.org',
title: 'CoffeeScript is a little language that compiles into JavaScript',
},
{
inner: 'Require',
url: 'https://nodejs.org/dist/latest-v5.x/docs/api/modules.html',
title: 'Node/CJS Modules',
},
{
inner: 'Import',
url: 'https://babeljs.io/docs/learn-es2015/#modules',
title: 'ECMAScript Modules',
},
{
inner: 'ESNext',
url: 'https://en.wikipedia.org/wiki/ECMAScript#ES.Next',
title: 'ECMAScript Next',
},
{
inner: 'ES2015',
url: 'https://babeljs.io/docs/en/learn#ecmascript-2015-features',
title: 'ECMAScript 2015',
},
...(function () {
const results: Array<Link> = []
const year = new Date().getFullYear()
for (let i = 2016; i <= year; i++) {
results.push({
inner: `ES${i}`,
url: `https://en.wikipedia.org/wiki/ES${i}`,
title: `ECMAScript ${i}`,
})
}
return results
})(),
{
inner: 'JSDoc Comments',
url: 'http://usejsdoc.org',
title:
'JSDoc is an API documentation generator for JavaScript, similar to Javadoc or phpDocumentor',
},
{
inner: 'Flow Type Comments',
url: 'http://flowtype.org/blog/2015/02/20/Flow-Comments.html',
title: 'Flow is a static type checker for JavaScript',
},
{
inner: 'Flow Type',
url: 'http://flowtype.org',
title: 'Flow is a static type checker for JavaScript',
},
{
inner: 'JSX',
url: 'https://facebook.github.io/jsx/',
title: 'XML/HTML inside your JavaScript',
},
{
inner: 'Node.js',
url: 'https://nodejs.org',
title:
"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine",
},
{
inner: 'TypeScript',
url: 'https://www.typescriptlang.org/',
title:
'TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.',
},
]
// build a map
const linksMap: Record<string, string> = {}
for (const link of linksArray) {
linksMap[link.inner.toLowerCase()] = ma(link)
}
// do the replacement
const linksMatch = new RegExp(
linksArray.map((link) => link.inner).join('|'),
'g',
)
return text.replace(linksMatch, function (match) {
return linksMap[match.toLowerCase()]
})
}