@beforesemicolon/builder 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. package/README.md +3 -0
  2. package/dist/build-browser.d.ts +1 -0
  3. package/dist/build-browser.js +32 -0
  4. package/dist/build-browser.js.map +1 -0
  5. package/dist/build-modules.d.ts +1 -0
  6. package/{src/build-modules.ts → dist/build-modules.js} +19 -26
  7. package/dist/build-modules.js.map +1 -0
  8. package/dist/docs/renderer/code.d.ts +2 -0
  9. package/{src/docs/renderer/code.ts → dist/docs/renderer/code.js} +3 -4
  10. package/dist/docs/renderer/code.js.map +1 -0
  11. package/dist/docs/renderer/heading.d.ts +2 -0
  12. package/dist/docs/renderer/heading.js +10 -0
  13. package/dist/docs/renderer/heading.js.map +1 -0
  14. package/dist/docs/renderer/index.d.ts +3 -0
  15. package/dist/docs/renderer/index.js +9 -0
  16. package/dist/docs/renderer/index.js.map +1 -0
  17. package/dist/docs/renderer/link.d.ts +2 -0
  18. package/dist/docs/renderer/link.js +6 -0
  19. package/dist/docs/renderer/link.js.map +1 -0
  20. package/dist/docs/run.d.ts +1 -0
  21. package/dist/docs/run.js +158 -0
  22. package/dist/docs/run.js.map +1 -0
  23. package/dist/docs/templates/default.d.ts +3 -0
  24. package/{src/docs/templates/default.ts → dist/docs/templates/default.js} +3 -4
  25. package/dist/docs/templates/default.js.map +1 -0
  26. package/dist/docs/types.d.ts +17 -0
  27. package/dist/docs/types.js +2 -0
  28. package/dist/docs/types.js.map +1 -0
  29. package/package.json +15 -15
  30. package/.eslintignore +0 -1
  31. package/.eslintrc.cjs +0 -13
  32. package/.prettierignore +0 -2
  33. package/.prettierrc +0 -6
  34. package/src/build-browser.ts +0 -35
  35. package/src/docs/renderer/heading.ts +0 -13
  36. package/src/docs/renderer/index.ts +0 -10
  37. package/src/docs/renderer/link.ts +0 -7
  38. package/src/docs/run.ts +0 -212
  39. package/src/docs/types.ts +0 -16
  40. package/tsconfig.json +0 -24
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @beforesemicolon/builder
2
+
3
+ Before Semicolon utility to build npm packages and documentation website
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ import esbuild from 'esbuild';
2
+ const emptyParserDoc = {
3
+ name: 'empty-parser-Doc-plugin',
4
+ setup(build) {
5
+ build.onResolve({ filter: /Doc$/ }, (args) => {
6
+ if (args.importer.includes('@beforesemicolon/html-parser')) {
7
+ return {
8
+ path: args.path,
9
+ namespace: 'empty-Doc',
10
+ };
11
+ }
12
+ });
13
+ build.onLoad({ filter: /.*/, namespace: 'empty-Doc' }, () => {
14
+ return {
15
+ contents: '',
16
+ };
17
+ });
18
+ },
19
+ };
20
+ esbuild
21
+ .build({
22
+ entryPoints: ['src/client.ts'],
23
+ outfile: 'dist/client.js',
24
+ bundle: true,
25
+ keepNames: true,
26
+ sourcemap: true,
27
+ target: 'esnext',
28
+ minify: true,
29
+ plugins: [emptyParserDoc],
30
+ })
31
+ .catch(console.error);
32
+ //# sourceMappingURL=build-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-browser.js","sourceRoot":"","sources":["../src/build-browser.ts"],"names":[],"mappings":"AAAA,OAAO,OAAmB,MAAM,SAAS,CAAA;AAIzC,MAAM,cAAc,GAAG;IACnB,IAAI,EAAE,yBAAyB;IAC/B,KAAK,CAAC,KAAK;QACP,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;gBACzD,OAAO;oBACH,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,WAAW;iBACzB,CAAA;YACL,CAAC;QACL,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE;YACxD,OAAO;gBACH,QAAQ,EAAE,EAAE;aACf,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC;CACM,CAAA;AAEX,OAAO;KACF,KAAK,CAAC;IACH,WAAW,EAAE,CAAC,eAAe,CAAC;IAC9B,OAAO,EAAE,gBAAgB;IACzB,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,CAAC,cAAc,CAAC;CAC5B,CAAC;KACD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,34 +1,26 @@
1
- import esbuild from 'esbuild'
2
- import path from 'path'
3
- import fs from 'fs'
4
- import { transformExtPlugin } from '@gjsify/esbuild-plugin-transform-ext'
5
-
6
- function readFilesRecursively(directoryPath: string) {
7
- const files: string[] = []
8
-
9
- function readDirectory(currentPath: string) {
10
- const entries = fs.readdirSync(currentPath, { withFileTypes: true })
11
-
1
+ import esbuild from 'esbuild';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { transformExtPlugin } from '@gjsify/esbuild-plugin-transform-ext';
5
+ function readFilesRecursively(directoryPath) {
6
+ const files = [];
7
+ function readDirectory(currentPath) {
8
+ const entries = fs.readdirSync(currentPath, { withFileTypes: true });
12
9
  for (const entry of entries) {
13
- const fullPath = path.join(currentPath, entry.name)
14
-
10
+ const fullPath = path.join(currentPath, entry.name);
15
11
  if (entry.isDirectory()) {
16
- readDirectory(fullPath)
17
- } else {
18
- files.push(fullPath)
12
+ readDirectory(fullPath);
13
+ }
14
+ else {
15
+ files.push(fullPath);
19
16
  }
20
17
  }
21
18
  }
22
-
23
- readDirectory(directoryPath)
24
- return files
19
+ readDirectory(directoryPath);
20
+ return files;
25
21
  }
26
-
27
- const directoryPath = path.join(process.cwd(), 'src')
28
- const allFiles = readFilesRecursively(directoryPath).filter(
29
- (file) => !file.endsWith('.spec.ts') && !file.endsWith('/client.ts')
30
- )
31
-
22
+ const directoryPath = path.join(process.cwd(), 'src');
23
+ const allFiles = readFilesRecursively(directoryPath).filter((file) => !file.endsWith('.spec.ts') && !file.endsWith('/client.ts'));
32
24
  Promise.all([
33
25
  esbuild.build({
34
26
  entryPoints: allFiles,
@@ -50,4 +42,5 @@ Promise.all([
50
42
  keepNames: true,
51
43
  plugins: [transformExtPlugin({ outExtension: { '.ts': '.js' } })],
52
44
  }),
53
- ]).catch(console.error)
45
+ ]).catch(console.error);
46
+ //# sourceMappingURL=build-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-modules.js","sourceRoot":"","sources":["../src/build-modules.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAEzE,SAAS,oBAAoB,CAAC,aAAqB;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,SAAS,aAAa,CAAC,WAAmB;QACtC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAEpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAEnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACxB,CAAC;QACL,CAAC;IACL,CAAC;IAED,aAAa,CAAC,aAAa,CAAC,CAAA;IAC5B,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;AACrD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC,MAAM,CACvD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CACvE,CAAA;AAED,OAAO,CAAC,GAAG,CAAC;IACR,OAAO,CAAC,KAAK,CAAC;QACV,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;KACpE,CAAC;IACF,OAAO,CAAC,KAAK,CAAC;QACV,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;KACpE,CAAC;CACL,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Tokens } from 'marked';
2
+ export default function code({ lang, text }: Tokens.Code): string;
@@ -1,6 +1,4 @@
1
- import { Tokens } from 'marked'
2
-
3
- export default function code({ lang, text }: Tokens.Code) {
1
+ export default function code({ lang, text }) {
4
2
  return `<div class="code-snippet">
5
3
  ${lang ? `<div class="label ${lang.toLowerCase()}">${lang}</div>` : ''}
6
4
  <div class="content">
@@ -11,5 +9,6 @@ export default function code({ lang, text }: Tokens.Code) {
11
9
  <button type="button" class="code-copy-btn" style="visibility: hidden">
12
10
  copy
13
11
  </button>
14
- </div>`
12
+ </div>`;
15
13
  }
14
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../../src/docs/renderer/code.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAe;IACpD,OAAO;UACD,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;;;yDAGrB,IAAI;;;;;;WAMlD,CAAA;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Tokens } from 'marked';
2
+ export default function heading({ tokens, depth }: Tokens.Heading): string;
@@ -0,0 +1,10 @@
1
+ export default function heading({ tokens, depth }) {
2
+ const text = this.parser.parseInline(tokens);
3
+ const escapedText = text
4
+ .toLowerCase()
5
+ .replace(/[^\w]+/g, ' ')
6
+ .trim()
7
+ .replace(/\s/g, '-');
8
+ return `<h${depth} id="${escapedText}"><a href="#${escapedText}">${text}</a></h${depth}>`;
9
+ }
10
+ //# sourceMappingURL=heading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading.js","sourceRoot":"","sources":["../../../src/docs/renderer/heading.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAkB;IAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,WAAW,GAAG,IAAI;SACnB,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE;SACN,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAExB,OAAO,KAAK,KAAK,QAAQ,WAAW,eAAe,WAAW,KAAK,IAAI,UAAU,KAAK,GAAG,CAAA;AAC7F,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { RendererObject } from 'marked';
2
+ declare const _default: RendererObject;
3
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import heading from './heading.js';
2
+ import code from './code.js';
3
+ import link from './link.js';
4
+ export default {
5
+ heading,
6
+ code,
7
+ link,
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/docs/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,eAAe;IACX,OAAO;IACP,IAAI;IACJ,IAAI;CACsB,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Tokens } from 'marked';
2
+ export default function link({ href, text }: Tokens.Link): string;
@@ -0,0 +1,6 @@
1
+ export default function link({ href, text }) {
2
+ return `<a href="${href
3
+ .replace(/\.md/, '.html')
4
+ .replace(/index\.html/, '')}">${text}</a>`;
5
+ }
6
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/docs/renderer/link.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAe;IACpD,OAAO,YAAY,IAAI;SAClB,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;SACxB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,CAAA;AAClD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,158 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __rest = (this && this.__rest) || function (s, e) {
11
+ var t = {};
12
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
+ t[p] = s[p];
14
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
+ t[p[i]] = s[p[i]];
18
+ }
19
+ return t;
20
+ };
21
+ import { Marked } from 'marked';
22
+ import { cp, mkdir, readdir, readFile, writeFile } from 'fs/promises';
23
+ import path from 'path';
24
+ import fm from 'front-matter';
25
+ import DOMPurify from 'isomorphic-dompurify';
26
+ import { markedHighlight } from 'marked-highlight';
27
+ import hljs from 'highlight.js';
28
+ import defaultTemp from './templates/default.js';
29
+ import renderer from './renderer/index.js';
30
+ const layouts = new Map();
31
+ layouts.set('default', defaultTemp);
32
+ let currentFileMeta;
33
+ const marked = new Marked(markedHighlight({
34
+ langPrefix: 'hljs language-',
35
+ highlight(code, lang) {
36
+ const language = hljs.getLanguage(lang) ? lang : 'plaintext';
37
+ return hljs.highlight(code, { language }).value;
38
+ },
39
+ }));
40
+ marked.use({ renderer });
41
+ const docsDir = path.resolve(process.cwd(), 'docs');
42
+ const docsSiteDir = path.resolve(process.cwd(), 'website');
43
+ const docsLayoutsDir = path.resolve(process.cwd(), 'docs/_layouts');
44
+ const docsAssetsDir = path.resolve(process.cwd(), 'docs/assets');
45
+ const docsStylesheetsDir = path.resolve(process.cwd(), 'docs/stylesheets');
46
+ const docsScriptsDir = path.resolve(process.cwd(), 'docs/scripts');
47
+ const traverseDirectory = (dir) => __awaiter(void 0, void 0, void 0, function* () {
48
+ const items = yield readdir(dir);
49
+ const files = [];
50
+ for (const item of items) {
51
+ const ext = path.extname(item);
52
+ if (/^[._]/.test(item))
53
+ continue;
54
+ if (ext) {
55
+ files.push(path.join(dir, item));
56
+ }
57
+ else if (!/(stylesheets|assets|scripts)/.test(item)) {
58
+ files.push(...(yield traverseDirectory(path.join(dir, item))));
59
+ }
60
+ }
61
+ return files;
62
+ });
63
+ marked.use({
64
+ hooks: {
65
+ postprocess(html) {
66
+ var _a;
67
+ const _b = currentFileMeta.attributes, { layout = 'default' } = _b, options = __rest(_b, ["layout"]);
68
+ html = DOMPurify.sanitize(html);
69
+ const tableOfContent = [
70
+ ...html.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([^<]+)<\/a>/gm),
71
+ ].map((m) => ({ path: m[2], label: m[3], level: m[1] }));
72
+ return (((_a = layouts.get(layout)) === null || _a === void 0 ? void 0 : _a(Object.assign(Object.assign({}, options), { content: html, siteMap: currentFileMeta.siteMap, tableOfContent }))) || html);
73
+ },
74
+ },
75
+ });
76
+ (() => __awaiter(void 0, void 0, void 0, function* () {
77
+ yield mkdir(docsSiteDir, { recursive: true });
78
+ try {
79
+ yield cp(docsAssetsDir, docsAssetsDir.replace(docsDir, docsSiteDir), {
80
+ recursive: true,
81
+ });
82
+ }
83
+ catch (e) {
84
+ }
85
+ try {
86
+ yield cp(docsStylesheetsDir, docsStylesheetsDir.replace(docsDir, docsSiteDir), { recursive: true });
87
+ }
88
+ catch (e) {
89
+ }
90
+ try {
91
+ yield cp(docsScriptsDir, docsScriptsDir.replace(docsDir, docsSiteDir), {
92
+ recursive: true,
93
+ });
94
+ }
95
+ catch (e) {
96
+ }
97
+ try {
98
+ const layoutPaths = yield traverseDirectory(docsLayoutsDir);
99
+ for (const layoutPath of layoutPaths) {
100
+ if (/\.(j|t)s$/.test(layoutPath)) {
101
+ const fileName = path
102
+ .basename(layoutPath)
103
+ .replace(path.extname(layoutPath), '');
104
+ const handler = yield import(layoutPath);
105
+ layouts.set(fileName, handler.default);
106
+ }
107
+ }
108
+ }
109
+ catch (e) {
110
+ }
111
+ const filePaths = yield traverseDirectory(docsDir);
112
+ const siteMap = new Map();
113
+ (yield Promise.all(filePaths
114
+ .filter((filePath) => filePath.endsWith('.md'))
115
+ .map((filePath) => __awaiter(void 0, void 0, void 0, function* () {
116
+ const content = yield readFile(filePath, 'utf-8');
117
+ return Object.assign({ filePath }, fm(content));
118
+ }))))
119
+ .sort((a, b) => a.attributes.order - b.attributes.order)
120
+ .map(({ attributes, body, filePath }) => {
121
+ const pathname = filePath
122
+ .replace(docsDir, '')
123
+ .replace(/\.md/, '.html');
124
+ const fileWebsitePath = filePath
125
+ .replace(docsDir, docsSiteDir)
126
+ .replace('.md', '.html');
127
+ const fileDirWebsitePath = fileWebsitePath.replace(path.basename(fileWebsitePath), '');
128
+ const fileName = path.basename(pathname) || '/';
129
+ const dir = pathname.replace(fileName, '').replace(/\/$/, '');
130
+ let currentDir = siteMap;
131
+ dir.split('/')
132
+ .filter(Boolean)
133
+ .forEach((d) => {
134
+ if (!currentDir.has(d)) {
135
+ currentDir.set(d, new Map());
136
+ }
137
+ currentDir = currentDir.get(d);
138
+ });
139
+ const attrs = Object.assign(Object.assign({}, attributes), { path: pathname });
140
+ if (!currentDir.has(fileName)) {
141
+ currentDir.set(fileName, attrs);
142
+ }
143
+ return {
144
+ attributes: attrs,
145
+ fileWebsitePath,
146
+ fileDirWebsitePath,
147
+ body,
148
+ siteMap,
149
+ };
150
+ })
151
+ .forEach((_a) => __awaiter(void 0, [_a], void 0, function* ({ attributes, body, fileDirWebsitePath, fileWebsitePath, siteMap, }) {
152
+ currentFileMeta = { attributes, siteMap };
153
+ const contentMd = yield marked.parse(body);
154
+ yield mkdir(fileDirWebsitePath, { recursive: true });
155
+ yield writeFile(fileWebsitePath, contentMd);
156
+ }));
157
+ }))();
158
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/docs/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { PageProps } from '../types.js';
2
+ declare const _default: ({ title, description, content }: PageProps) => string;
3
+ export default _default;
@@ -1,6 +1,4 @@
1
- import { PageProps } from '../types.js'
2
-
3
- export default ({ title, description, content }: PageProps) => `
1
+ export default ({ title, description, content }) => `
4
2
  <!doctype html>
5
3
  <html lang="en">
6
4
  <head>
@@ -16,4 +14,5 @@ export default ({ title, description, content }: PageProps) => `
16
14
  ${content}
17
15
  </body>
18
16
  </html>
19
- `
17
+ `;
18
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/docs/templates/default.ts"],"names":[],"mappings":"AAEA,eAAe,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAa,EAAE,EAAE,CAAC;;;;;;;;;4CASnB,WAAW;iBACtC,KAAK;;;UAGZ,OAAO;;;CAGhB,CAAA"}
@@ -0,0 +1,17 @@
1
+ export interface PageProps {
2
+ name: string;
3
+ path: string;
4
+ order: number;
5
+ title: string;
6
+ description: string;
7
+ content: string;
8
+ siteMap: SiteMap;
9
+ tableOfContent: {
10
+ path: string;
11
+ label: string;
12
+ }[];
13
+ }
14
+ export interface CustomOptions extends Omit<PageProps, 'content'> {
15
+ layout: string;
16
+ }
17
+ export type SiteMap = Map<string, CustomOptions | SiteMap>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/docs/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beforesemicolon/builder",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Utilities to build npm packages and documentation website",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"
@@ -26,8 +26,20 @@
26
26
  "url": "https://github.com/sponsors/beforesemicolon",
27
27
  "type": "github"
28
28
  },
29
- "devDependencies": {
29
+ "dependencies": {
30
30
  "@gjsify/esbuild-plugin-transform-ext": "0.0.4",
31
+ "core-js": "^3.34.0",
32
+ "esbuild": "^0.19.10",
33
+ "esbuild-plugin-text-replace": "^1.3.0",
34
+ "front-matter": "^4.0.2",
35
+ "global-jsdom": "^9.2.0",
36
+ "highlight.js": "^11.10.0",
37
+ "isomorphic-dompurify": "^2.16.0",
38
+ "jsdom": "^23.0.1",
39
+ "marked": "^14.1.2",
40
+ "marked-highlight": "^2.1.4"
41
+ },
42
+ "devDependencies": {
31
43
  "@types/jest": "^29.5.11",
32
44
  "@types/jsdom": "^21.1.6",
33
45
  "@types/jsdom-global": "^3.0.7",
@@ -35,9 +47,6 @@
35
47
  "@types/node-sass": "^4.11.7",
36
48
  "@typescript-eslint/eslint-plugin": "^6.15.0",
37
49
  "@typescript-eslint/parser": "^6.15.0",
38
- "core-js": "^3.34.0",
39
- "esbuild": "^0.19.10",
40
- "esbuild-plugin-text-replace": "^1.3.0",
41
50
  "eslint": "^8.56.0",
42
51
  "eslint-config-prettier": "^9.1.0",
43
52
  "eslint-config-standard": "^17.1.0",
@@ -45,18 +54,9 @@
45
54
  "eslint-plugin-n": "^16.5.0",
46
55
  "eslint-plugin-prettier": "^5.1.2",
47
56
  "eslint-plugin-promise": "^6.1.1",
48
- "front-matter": "^4.0.2",
49
- "global-jsdom": "^9.2.0",
50
- "highlight.js": "^11.10.0",
51
- "install": "^0.13.0",
52
- "isomorphic-dompurify": "^2.16.0",
53
- "jsdom": "^23.0.1",
54
- "marked": "^14.1.2",
55
- "marked-highlight": "^2.1.4",
56
- "nodemon": "^3.1.7",
57
- "npm": "^10.8.3",
58
57
  "npm-run-all": "^4.1.5",
59
58
  "prettier": "3.1.1",
59
+ "nodemon": "^3.1.7",
60
60
  "tinybench": "^2.8.0",
61
61
  "ts-jest": "^29.1.1",
62
62
  "tsx": "^4.7.0",
package/.eslintignore DELETED
@@ -1 +0,0 @@
1
- src/**/*.spec.ts
package/.eslintrc.cjs DELETED
@@ -1,13 +0,0 @@
1
- module.exports = {
2
- extends: [
3
- 'eslint:recommended',
4
- 'plugin:@typescript-eslint/recommended',
5
- 'prettier',
6
- ],
7
- parser: '@typescript-eslint/parser',
8
- plugins: ['@typescript-eslint'],
9
- root: true,
10
- rules: {
11
- 'no-prototype-builtins': ['off'],
12
- },
13
- }
package/.prettierignore DELETED
@@ -1,2 +0,0 @@
1
- src/**/*.spec.ts
2
- src/docs/**/*.html
package/.prettierrc DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "trailingComma": "es5",
3
- "tabWidth": 4,
4
- "semi": false,
5
- "singleQuote": true
6
- }
@@ -1,35 +0,0 @@
1
- import esbuild, { Plugin } from 'esbuild'
2
-
3
- // the Doc exported with @beforesemicolon/html-parser is not used so no need
4
- // to include it in the final package
5
- const emptyParserDoc = {
6
- name: 'empty-parser-Doc-plugin',
7
- setup(build) {
8
- build.onResolve({ filter: /Doc$/ }, (args) => {
9
- if (args.importer.includes('@beforesemicolon/html-parser')) {
10
- return {
11
- path: args.path,
12
- namespace: 'empty-Doc',
13
- }
14
- }
15
- })
16
- build.onLoad({ filter: /.*/, namespace: 'empty-Doc' }, () => {
17
- return {
18
- contents: '',
19
- }
20
- })
21
- },
22
- } as Plugin
23
-
24
- esbuild
25
- .build({
26
- entryPoints: ['src/client.ts'],
27
- outfile: 'dist/client.js',
28
- bundle: true,
29
- keepNames: true,
30
- sourcemap: true,
31
- target: 'esnext',
32
- minify: true,
33
- plugins: [emptyParserDoc],
34
- })
35
- .catch(console.error)
@@ -1,13 +0,0 @@
1
- import { Tokens } from 'marked'
2
-
3
- export default function heading({ tokens, depth }: Tokens.Heading) {
4
- // @ts-expect-error this
5
- const text = this.parser.parseInline(tokens)
6
- const escapedText = text
7
- .toLowerCase()
8
- .replace(/[^\w]+/g, ' ')
9
- .trim()
10
- .replace(/\s/g, '-')
11
-
12
- return `<h${depth} id="${escapedText}"><a href="#${escapedText}">${text}</a></h${depth}>`
13
- }
@@ -1,10 +0,0 @@
1
- import heading from './heading.js'
2
- import code from './code.js'
3
- import link from './link.js'
4
- import { RendererObject } from 'marked'
5
-
6
- export default {
7
- heading,
8
- code,
9
- link,
10
- } as unknown as RendererObject
@@ -1,7 +0,0 @@
1
- import { Tokens } from 'marked'
2
-
3
- export default function link({ href, text }: Tokens.Link) {
4
- return `<a href="${href
5
- .replace(/\.md/, '.html')
6
- .replace(/index\.html/, '')}">${text}</a>`
7
- }
package/src/docs/run.ts DELETED
@@ -1,212 +0,0 @@
1
- import { Marked } from 'marked'
2
- import { cp, mkdir, readdir, readFile, writeFile } from 'fs/promises'
3
- import path from 'path'
4
- import fm from 'front-matter'
5
- import DOMPurify from 'isomorphic-dompurify'
6
- import { markedHighlight } from 'marked-highlight'
7
- import hljs from 'highlight.js'
8
- import defaultTemp from './templates/default.js'
9
- import { CustomOptions, PageProps, SiteMap } from './types.js'
10
- import renderer from './renderer/index.js'
11
-
12
- const layouts: Map<string, (props: PageProps) => string> = new Map()
13
-
14
- layouts.set('default', defaultTemp)
15
-
16
- let currentFileMeta: {
17
- attributes: CustomOptions
18
- siteMap: SiteMap
19
- }
20
-
21
- const marked = new Marked(
22
- markedHighlight({
23
- langPrefix: 'hljs language-',
24
- highlight(code, lang) {
25
- const language = hljs.getLanguage(lang) ? lang : 'plaintext'
26
- return hljs.highlight(code, { language }).value
27
- },
28
- })
29
- )
30
-
31
- marked.use({ renderer })
32
-
33
- const docsDir = path.resolve(process.cwd(), 'docs')
34
- const docsSiteDir = path.resolve(process.cwd(), 'website')
35
- const docsLayoutsDir = path.resolve(process.cwd(), 'docs/_layouts')
36
- const docsAssetsDir = path.resolve(process.cwd(), 'docs/assets')
37
- const docsStylesheetsDir = path.resolve(process.cwd(), 'docs/stylesheets')
38
- const docsScriptsDir = path.resolve(process.cwd(), 'docs/scripts')
39
-
40
- const traverseDirectory = async (dir: string) => {
41
- const items = await readdir(dir)
42
- const files: string[] = []
43
-
44
- for (const item of items) {
45
- const ext = path.extname(item)
46
-
47
- if (/^[._]/.test(item)) continue
48
-
49
- if (ext) {
50
- files.push(path.join(dir, item))
51
- } else if (!/(stylesheets|assets|scripts)/.test(item)) {
52
- files.push(...(await traverseDirectory(path.join(dir, item))))
53
- }
54
- }
55
-
56
- return files
57
- }
58
-
59
- marked.use({
60
- hooks: {
61
- postprocess(html: string) {
62
- const { layout = 'default', ...options } =
63
- currentFileMeta.attributes
64
-
65
- html = DOMPurify.sanitize(html)
66
-
67
- const tableOfContent = [
68
- ...html.matchAll(
69
- /<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([^<]+)<\/a>/gm
70
- ),
71
- ].map((m) => ({ path: m[2], label: m[3], level: m[1] }))
72
-
73
- return (
74
- layouts.get(layout)?.({
75
- ...options,
76
- content: html,
77
- siteMap: currentFileMeta.siteMap,
78
- tableOfContent,
79
- }) || html
80
- )
81
- },
82
- },
83
- })
84
- ;(async () => {
85
- // create website dir
86
- await mkdir(docsSiteDir, { recursive: true })
87
-
88
- try {
89
- await cp(docsAssetsDir, docsAssetsDir.replace(docsDir, docsSiteDir), {
90
- recursive: true,
91
- })
92
- } catch (e) {
93
- // ignore
94
- }
95
-
96
- try {
97
- await cp(
98
- docsStylesheetsDir,
99
- docsStylesheetsDir.replace(docsDir, docsSiteDir),
100
- { recursive: true }
101
- )
102
- } catch (e) {
103
- // ignore
104
- }
105
-
106
- try {
107
- await cp(docsScriptsDir, docsScriptsDir.replace(docsDir, docsSiteDir), {
108
- recursive: true,
109
- })
110
- } catch (e) {
111
- // ignore
112
- }
113
-
114
- try {
115
- // import the layouts first
116
- const layoutPaths = await traverseDirectory(docsLayoutsDir)
117
-
118
- for (const layoutPath of layoutPaths) {
119
- if (/\.(j|t)s$/.test(layoutPath)) {
120
- const fileName = path
121
- .basename(layoutPath)
122
- .replace(path.extname(layoutPath), '')
123
- const handler = await import(layoutPath)
124
-
125
- layouts.set(fileName, handler.default)
126
- }
127
- }
128
- } catch (e) {
129
- // ignore
130
- }
131
-
132
- const filePaths = await traverseDirectory(docsDir)
133
-
134
- const siteMap: SiteMap = new Map()
135
-
136
- ;(
137
- await Promise.all(
138
- filePaths
139
- .filter((filePath) => filePath.endsWith('.md'))
140
- .map(async (filePath) => {
141
- const content = await readFile(filePath, 'utf-8')
142
- return {
143
- filePath,
144
- // @ts-expect-error call unknown
145
- ...(fm(content) as {
146
- attributes: CustomOptions
147
- body: string
148
- }),
149
- }
150
- })
151
- )
152
- )
153
- .sort((a, b) => a.attributes.order - b.attributes.order)
154
- .map(({ attributes, body, filePath }) => {
155
- const pathname = filePath
156
- .replace(docsDir, '')
157
- .replace(/\.md/, '.html')
158
- const fileWebsitePath = filePath
159
- .replace(docsDir, docsSiteDir)
160
- .replace('.md', '.html')
161
- const fileDirWebsitePath = fileWebsitePath.replace(
162
- path.basename(fileWebsitePath),
163
- ''
164
- )
165
-
166
- const fileName = path.basename(pathname) || '/'
167
- const dir = pathname.replace(fileName, '').replace(/\/$/, '')
168
-
169
- let currentDir = siteMap
170
-
171
- dir.split('/')
172
- .filter(Boolean)
173
- .forEach((d) => {
174
- if (!currentDir.has(d)) {
175
- currentDir.set(d, new Map())
176
- }
177
-
178
- currentDir = currentDir.get(d) as SiteMap
179
- })
180
-
181
- const attrs = {
182
- ...attributes,
183
- path: pathname,
184
- } as CustomOptions
185
-
186
- if (!currentDir.has(fileName)) {
187
- currentDir.set(fileName, attrs)
188
- }
189
-
190
- return {
191
- attributes: attrs,
192
- fileWebsitePath,
193
- fileDirWebsitePath,
194
- body,
195
- siteMap,
196
- }
197
- })
198
- .forEach(
199
- async ({
200
- attributes,
201
- body,
202
- fileDirWebsitePath,
203
- fileWebsitePath,
204
- siteMap,
205
- }) => {
206
- currentFileMeta = { attributes, siteMap }
207
- const contentMd = await marked.parse(body)
208
- await mkdir(fileDirWebsitePath, { recursive: true })
209
- await writeFile(fileWebsitePath, contentMd)
210
- }
211
- )
212
- })()
package/src/docs/types.ts DELETED
@@ -1,16 +0,0 @@
1
- export interface PageProps {
2
- name: string
3
- path: string
4
- order: number
5
- title: string
6
- description: string
7
- content: string
8
- siteMap: SiteMap
9
- tableOfContent: { path: string; label: string }[]
10
- }
11
-
12
- export interface CustomOptions extends Omit<PageProps, 'content'> {
13
- layout: string
14
- }
15
-
16
- export type SiteMap = Map<string, CustomOptions | SiteMap>
package/tsconfig.json DELETED
@@ -1,24 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2015",
4
- "types": ["node"],
5
- "moduleResolution": "nodenext",
6
- "lib": ["decorators", "es5", "scripthost", "es2015.promise"],
7
- "outDir": "./dist",
8
- "module": "nodenext",
9
- "declaration": true,
10
- "declarationMap": false,
11
- "sourceMap": true,
12
- "removeComments": true,
13
- "downlevelIteration": true,
14
- "strict": true,
15
- "alwaysStrict": true,
16
- "resolveJsonModule": true,
17
- "allowSyntheticDefaultImports": true,
18
- "esModuleInterop": true,
19
- "skipLibCheck": true,
20
- "forceConsistentCasingInFileNames": true,
21
- "allowJs": true
22
- },
23
- "include": ["./src/**/*"]
24
- }