|
| 1 | +const fs = require('fs'); |
| 2 | +const build = require('extra-build'); |
| 3 | + |
| 4 | +const owner = 'nodef'; |
| 5 | +const repo = build.readMetadata('.').name; |
| 6 | +const srcts = 'index.ts'; |
| 7 | +const LOCATIONS = [ |
| 8 | + 'src/index.ts', |
| 9 | +]; |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | +// Get keywords for main/sub package. |
| 15 | +function keywords(ds, less=false) { |
| 16 | + var rkind = /namespace|function/i; |
| 17 | + var ds = less? ds.filter(d => rkind.test(d.kind)) : ds; |
| 18 | + var m = build.readMetadata('.'); |
| 19 | + var s = new Set([...m.keywords, ...ds.map(d => d.name)]); |
| 20 | + return Array.from(s); |
| 21 | +} |
| 22 | + |
| 23 | + |
| 24 | +// Publish a root package to NPM, GitHub. |
| 25 | +function publishRootPackage(ds, ver, typ) { |
| 26 | + var _package = build.readDocument('package.json'); |
| 27 | + var _readme = build.readDocument('README.md'); |
| 28 | + var m = build.readMetadata('.'); |
| 29 | + var md = build.readFileText('README.md'); |
| 30 | + m.version = ver; |
| 31 | + m.keywords = keywords(ds); |
| 32 | + if (typ) { |
| 33 | + m.name = `${m.name}.${typ}`; |
| 34 | + m.description = m.description.replace(/\.$/, ` {${typ}}.`); |
| 35 | + md = md.replace(/(unpkg\.com\/)(\S+?)(\/\))/, `$1$2.${typ}$3`); |
| 36 | + } |
| 37 | + build.writeMetadata('.', m); |
| 38 | + build.writeFileText('README.md', md); |
| 39 | + build.publish('.'); |
| 40 | + try { build.publishGithub('.', owner); } |
| 41 | + catch {} |
| 42 | + build.writeDocument(_package); |
| 43 | + build.writeDocument(_readme); |
| 44 | +} |
| 45 | + |
| 46 | + |
| 47 | +// Transform JSDoc in .d.ts file. |
| 48 | +function transformJsdoc(x, dm) { |
| 49 | + if (!dm.has(x.name)) return null; |
| 50 | + var link = `[📘](https://github.com/${owner}/${repo}/wiki/${x.name})`; |
| 51 | + x.description = x.description.replace(/\[📘\]\(.+?\)/g, ''); |
| 52 | + x.description = x.description.trim() + '\n' + link; |
| 53 | + return x; |
| 54 | +} |
| 55 | + |
| 56 | + |
| 57 | +// Bundle script for test or publish. |
| 58 | +function bundleScript(ds) { |
| 59 | + var dm = new Map(ds.map(d => [d.name, d])); |
| 60 | + build.exec(`tsc`); |
| 61 | + build.bundleScript(`.build/${srcts}`); |
| 62 | + build.jsdocifyScript('index.d.ts', 'index.d.ts', x => transformJsdoc(x, dm)); |
| 63 | +} |
| 64 | + |
| 65 | + |
| 66 | +// Publish root packages to NPM, GitHub. |
| 67 | +function publishRootPackages(ds, ver) { |
| 68 | + var m = build.readMetadata('.'); |
| 69 | + var sym = build.symbolname(m.name); |
| 70 | + bundleScript(ds); |
| 71 | + publishRootPackage(ds, ver, ''); |
| 72 | + build.webifyScript('index.mjs', 'index.mjs', {format: 'esm'}); |
| 73 | + build.webifyScript('index.js', 'index.js', {format: 'cjs', symbol: sym}); |
| 74 | + publishRootPackage(ds, ver, 'web'); |
| 75 | +} |
| 76 | + |
| 77 | + |
| 78 | +// Publish docs. |
| 79 | +function publishDocs(ds) { |
| 80 | + build.updateGithubRepoDetails({owner, repo, topics: keywords(ds, true)}); |
| 81 | + build.generateDocs(`src/${srcts}`); |
| 82 | + build.publishDocs(); |
| 83 | +} |
| 84 | + |
| 85 | + |
| 86 | +// Pushish root, sub packages to NPM, GitHub. |
| 87 | +function publishPackages(ds) { |
| 88 | + var m = build.readMetadata('.'); |
| 89 | + var ver = build.nextUnpublishedVersion(m.name, m.version); |
| 90 | + publishRootPackages(ds, ver); |
| 91 | +} |
| 92 | + |
| 93 | + |
| 94 | +// Generate wiki for all exported symbols. |
| 95 | +function generateWiki(ds) { |
| 96 | + var rkind = /namespace|function/i, useWiki = true; |
| 97 | + var dm = new Map(ds.map(d => [d.name, d])); |
| 98 | + for (var d of ds) { |
| 99 | + var f = `wiki/${d.name}.md`; |
| 100 | + if (!rkind.test(d.kind)) continue; |
| 101 | + if (!fs.existsSync(f)) { |
| 102 | + var txt = build.wikiMarkdown(d, {owner, repo, useWiki}); |
| 103 | + build.writeFileText(f, txt); |
| 104 | + } |
| 105 | + else { |
| 106 | + var txt = build.readFileText(f); |
| 107 | + txt = build.wikiUpdateDescription(txt, d); |
| 108 | + txt = build.wikiUpdateCodeReference(txt, d, {owner, repo, useWiki}) |
| 109 | + txt = build.wikiUpdateLinkReferences(txt, dm, {owner, repo, useWiki}); |
| 110 | + build.writeFileText(f, txt); |
| 111 | + } |
| 112 | + } |
| 113 | +} |
| 114 | + |
| 115 | + |
| 116 | +// Get README index descriptions. |
| 117 | +function readmeDescription(d) { |
| 118 | + var rkind = /namespace|function/i; |
| 119 | + var sname = /a?sync$/i; |
| 120 | + if (!rkind.test(d.kind)) return ''; |
| 121 | + if (sname.test(d.name) && d.name!=='spawnAsync') return ''; |
| 122 | + var a = d.description.replace(/The.+method/, 'This method'); |
| 123 | + a = a.replace(', with command-line arguments in ', ' and '); |
| 124 | + a = a.replace(/(\S)`(.*?)`/, '$1 `$2`'); |
| 125 | + return a; |
| 126 | +} |
| 127 | + |
| 128 | + |
| 129 | +// Sort docs details by original order. |
| 130 | +function compareLocation(a, b) { |
| 131 | + if (a.kind!==b.kind) return 0; |
| 132 | + var alocn = a.location.replace(/.*?@types\/node.*?\:/, 'src/_file.ts:'); |
| 133 | + var blocn = b.location.replace(/.*?@types\/node.*?\:/, 'src/_file.ts:'); |
| 134 | + var [afile] = alocn.split(':'); |
| 135 | + var [bfile] = blocn.split(':'); |
| 136 | + return LOCATIONS.indexOf(afile) - LOCATIONS.indexOf(bfile) || alocn.localeCompare(blocn); |
| 137 | +} |
| 138 | + |
| 139 | + |
| 140 | +// Update README. |
| 141 | +function updateReadme(ds) { |
| 142 | + var m = build.readMetadata('.'); |
| 143 | + var repo = m.name; |
| 144 | + var ds = ds.slice().sort(compareLocation); |
| 145 | + var dm = new Map(ds.map(d => [d.name, d])); |
| 146 | + var txt = build.readFileText('README.md'); |
| 147 | + txt = build.wikiUpdateIndex(txt, dm, readmeDescription); |
| 148 | + txt = build.wikiUpdateLinkReferences(txt, dm, {owner, repo, useWiki: true}); |
| 149 | + build.writeFileText('README.md', txt); |
| 150 | +} |
| 151 | + |
| 152 | + |
| 153 | +// Finally. |
| 154 | +function main(a) { |
| 155 | + var p = build.loadDocs([`src/${srcts}`]); |
| 156 | + var ds = p.children.map(build.docsDetails); |
| 157 | + if (a[2]==='wiki') generateWiki(ds); |
| 158 | + else if (a[2]==='readme') updateReadme(ds); |
| 159 | + else if (a[2]==='publish-docs') publishDocs(ds); |
| 160 | + else if (a[2]==='publish-packages') publishPackages(ds); |
| 161 | + else bundleScript(ds); |
| 162 | +} |
| 163 | +main(process.argv); |
0 commit comments