blazed-past-us 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -0
- package/bolt.png +0 -0
- package/dist/cli/build.d.ts +2 -0
- package/dist/cli/build.js +50 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/install-scaffold.d.ts +2 -0
- package/dist/cli/install-scaffold.js +42 -0
- package/dist/cli/install-scaffold.js.map +1 -0
- package/dist/engine/getters.d.ts +8 -0
- package/dist/engine/getters.js +41 -0
- package/dist/engine/getters.js.map +1 -0
- package/dist/engine/render.d.ts +3 -0
- package/dist/engine/render.js +22 -0
- package/dist/engine/render.js.map +1 -0
- package/dist/engine/utils.d.ts +7 -0
- package/dist/engine/utils.js +46 -0
- package/dist/engine/utils.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/server/file-builder.d.ts +4 -0
- package/dist/server/file-builder.js +24 -0
- package/dist/server/file-builder.js.map +1 -0
- package/dist/server/parse-markdown.d.ts +8 -0
- package/dist/server/parse-markdown.js +24 -0
- package/dist/server/parse-markdown.js.map +1 -0
- package/dist/template/index.html +26 -0
- package/dist/template/package-lock.json +1617 -0
- package/dist/template/package.json +18 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-Bold.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-BoldItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-ExtraBold.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-ExtraBoldItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-ExtraLight.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-ExtraLightItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-Italic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-Light.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-LightItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-Medium.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-MediumItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-Regular.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-SemiBold.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-SemiBoldItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-Thin.ttf +0 -0
- package/dist/template/src/assets/fonts/inter/Inter_28pt-ThinItalic.ttf +0 -0
- package/dist/template/src/assets/fonts/pt/PTSerifCaption-Regular.ttf +0 -0
- package/dist/template/src/config.json +6 -0
- package/dist/template/src/main.js +12 -0
- package/dist/template/src/posts/I-think-squirrels-are-pretty-cool.md +9 -0
- package/dist/template/src/posts/this-is-a-post-title.md +11 -0
- package/dist/template/src/router.js +23 -0
- package/dist/template/src/styles/flicker.css +125 -0
- package/dist/template/src/styles/fonts.css +44 -0
- package/dist/template/src/styles/logo.css +40 -0
- package/dist/template/src/styles/post-card.css +23 -0
- package/dist/template/src/styles/styles.css +95 -0
- package/dist/template/src/views/home.js +18 -0
- package/dist/template/src/views/notFound.js +3 -0
- package/dist/template/src/views/post.js +16 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./bolt.png" width="200">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Blazed Past Us..
|
|
6
|
+
|
|
7
|
+
**Silver Surfer asked:**
|
|
8
|
+
_"How fast can a dev blog go?"_
|
|
9
|
+
|
|
10
|
+
**Gas Git, intrigued, answered:**
|
|
11
|
+
_"I don't know… shall we see?"_
|
|
12
|
+
|
|
13
|
+
**Silver Surfer looked dubious and curious:**
|
|
14
|
+
_"Very well… let the cosmos bear witness."_
|
|
15
|
+
|
|
16
|
+
## Notes
|
|
17
|
+
|
|
18
|
+
- The post file name will be the title.
|
|
19
|
+
- There is no need to add the title within the .md file, this will be set by the meta data.
|
|
20
|
+
- Post tags are written in every post on the very top as `**tags:** tag1, tag2,...`
|
|
21
|
+
- The descriptions of the posts will be a brief showcase of the first paragraph (below the tags).
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
#### ⚠️ Package still not available in the npm registry (🧪 under development).
|
|
26
|
+
|
|
27
|
+
### Set up scaffold:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
npx blazed-past-us
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Install dependencies:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
npm i
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Run locally:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
npm run dev
|
|
43
|
+
```
|
package/bolt.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseMarkdown } from '../server/parse-markdown.js';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import fsPromises from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { log } from '../engine/utils.js';
|
|
7
|
+
import { generatePostMetadata, writeTransformedPostFile, } from '../server/file-builder.js';
|
|
8
|
+
/**
|
|
9
|
+
* CLI entry point.
|
|
10
|
+
* Resolves project paths and builds bundle.
|
|
11
|
+
*/
|
|
12
|
+
(function main() {
|
|
13
|
+
const root = process.cwd();
|
|
14
|
+
const paths = initPaths(root);
|
|
15
|
+
buildBundle(paths);
|
|
16
|
+
})();
|
|
17
|
+
/**
|
|
18
|
+
* Initializes the input and output paths for posts.
|
|
19
|
+
*
|
|
20
|
+
* @param root Project root (where CLI was invoked).
|
|
21
|
+
* @returns Paths used to read source posts and write parsed output.
|
|
22
|
+
*/
|
|
23
|
+
function initPaths(root) {
|
|
24
|
+
return {
|
|
25
|
+
input: path.resolve(root, 'src/posts'),
|
|
26
|
+
output: path.resolve(root, 'dist/posts'),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Processes all post files:
|
|
31
|
+
*
|
|
32
|
+
* parses Markdown to HTML, generates metadata,
|
|
33
|
+
* writes transformed files, and emits a JSON index.
|
|
34
|
+
*/
|
|
35
|
+
async function buildBundle(paths) {
|
|
36
|
+
const postsFiles = fs.readdirSync(paths.input);
|
|
37
|
+
const data = [];
|
|
38
|
+
for (const [i, filename] of postsFiles.entries()) {
|
|
39
|
+
const filePath = path.join(paths.input, filename);
|
|
40
|
+
const postHtmlContent = await parseMarkdown(filePath);
|
|
41
|
+
const htmlFilename = filename.replace('.md', '.html');
|
|
42
|
+
await generatePostMetadata(data, i, filePath, htmlFilename);
|
|
43
|
+
await fsPromises.mkdir(paths.output, { recursive: true });
|
|
44
|
+
await writeTransformedPostFile(path.join(paths.output, htmlFilename), postHtmlContent, filename);
|
|
45
|
+
}
|
|
46
|
+
const jsonPosts = JSON.stringify(data);
|
|
47
|
+
fs.writeFileSync(path.join(paths.output, '/data.json'), jsonPosts);
|
|
48
|
+
log('all posts have been parsed into HTML ✅', 'yellow');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,CAAC,SAAS,IAAI;IACZ,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,WAAW,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC,CAAC,EAAE,CAAC;AAEL;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;QACtC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;KACzC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CAAC,KAAiB;IAC1C,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAoB,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEtD,MAAM,oBAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC5D,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,MAAM,wBAAwB,CAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,eAAe,EACf,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;IACnE,GAAG,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { log } from '../engine/utils.js';
|
|
5
|
+
const dir = {
|
|
6
|
+
template: path.resolve(import.meta.dirname, '../template'),
|
|
7
|
+
target: process.cwd(),
|
|
8
|
+
};
|
|
9
|
+
copyRecursive(dir.template, dir.target);
|
|
10
|
+
log('scafolld all set! 👷', 'green');
|
|
11
|
+
function copyRecursive(src, destination) {
|
|
12
|
+
const srcPathExists = fs.existsSync(src);
|
|
13
|
+
if (!srcPathExists) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (fs.statSync(src).isDirectory()) {
|
|
17
|
+
/**
|
|
18
|
+
* Make a folder at the destination path with the same name
|
|
19
|
+
* as the one in src.
|
|
20
|
+
*/
|
|
21
|
+
if (!fs.existsSync(destination)) {
|
|
22
|
+
fs.mkdirSync(destination);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Copy the content of the src folder to the destination only if
|
|
26
|
+
* it already does not exist. (to avoid unwanted overrites)
|
|
27
|
+
*/
|
|
28
|
+
fs.readdirSync(src).forEach((item) => {
|
|
29
|
+
const itemSrcPath = path.join(src, item);
|
|
30
|
+
const itemDestinationPath = path.join(destination, item);
|
|
31
|
+
if (fs.existsSync(itemDestinationPath) &&
|
|
32
|
+
fs.statSync(itemDestinationPath).isFile()) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
copyRecursive(itemSrcPath, itemDestinationPath);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
fs.copyFileSync(src, destination);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=install-scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-scaffold.js","sourceRoot":"","sources":["../../src/cli/install-scaffold.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,GAAG,GAAG;IACV,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;IAC1D,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE;CACtB,CAAC;AAEF,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AACxC,GAAG,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAErC,SAAS,aAAa,CAAC,GAAW,EAAE,WAAmB;IACrD,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC;;;WAGG;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED;;;WAGG;QACH,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAEzD,IACE,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC;gBAClC,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,MAAM,EAAE,EACzC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,aAAa,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PostData, Config, PostDataType } from '../types';
|
|
2
|
+
declare function getPostData(postsMetaData: PostData[], id: string, option: PostDataType): string | Date | undefined;
|
|
3
|
+
declare function getPostHtml(postsMetaData: PostData[], root: HTMLElement, postId: string): Promise<String | void>;
|
|
4
|
+
declare function getPostsMetaData(config: Config): Promise<PostData[]>;
|
|
5
|
+
declare function getTitle(htmlFilename: string): string;
|
|
6
|
+
declare function getBrief(fileContent: string, lines: number): string;
|
|
7
|
+
declare function getTags(fileContent: string): string[];
|
|
8
|
+
export { getPostData, getPostHtml, getPostsMetaData, getTitle, getTags, getBrief, };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function getPostData(postsMetaData, id, option) {
|
|
2
|
+
return postsMetaData.find((post) => post.id === id)?.[option];
|
|
3
|
+
}
|
|
4
|
+
async function getPostHtml(postsMetaData, root, postId) {
|
|
5
|
+
const filename = postsMetaData.find((post) => post.id === postId)?.filename;
|
|
6
|
+
const html = await fetch(`./posts/${filename}`)
|
|
7
|
+
.then((resp) => resp.text())
|
|
8
|
+
.then((htmlString) => (root.innerHTML = htmlString))
|
|
9
|
+
.catch((error) => console.error(error));
|
|
10
|
+
return html;
|
|
11
|
+
}
|
|
12
|
+
async function getPostsMetaData(config) {
|
|
13
|
+
const resp = await fetch(config.posts_data_path);
|
|
14
|
+
const data = await resp.json();
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
function getTitle(htmlFilename) {
|
|
18
|
+
return htmlFilename.replace('.html', '').replaceAll('-', ' ');
|
|
19
|
+
}
|
|
20
|
+
function getBrief(fileContent, lines) {
|
|
21
|
+
const A = fileContent
|
|
22
|
+
.split('\n')
|
|
23
|
+
.splice(1)
|
|
24
|
+
.filter((str) => !str.includes('tags') && str.length > 10) || '';
|
|
25
|
+
let brief = '';
|
|
26
|
+
for (let l = 0; l < lines; l++) {
|
|
27
|
+
brief += A[l];
|
|
28
|
+
}
|
|
29
|
+
return brief.replace(/\r/g, ' ');
|
|
30
|
+
}
|
|
31
|
+
function getTags(fileContent) {
|
|
32
|
+
return (fileContent
|
|
33
|
+
.split('\n')
|
|
34
|
+
?.find((str) => str.includes('**tags:**'))
|
|
35
|
+
?.split('**tags:**')
|
|
36
|
+
?.slice(1)[0]
|
|
37
|
+
?.split(',')
|
|
38
|
+
.map((str) => str.trim()) || []);
|
|
39
|
+
}
|
|
40
|
+
export { getPostData, getPostHtml, getPostsMetaData, getTitle, getTags, getBrief, };
|
|
41
|
+
//# sourceMappingURL=getters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getters.js","sourceRoot":"","sources":["../../src/engine/getters.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAClB,aAAyB,EACzB,EAAU,EACV,MAAoB;IAEpB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,aAAyB,EACzB,IAAiB,EACjB,MAAc;IAEd,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CACjC,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CACvC,EAAE,QAAQ,CAAC;IAEZ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,WAAW,QAAQ,EAAE,CAAC;SAC5C,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC3B,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;SACnD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAc;IAC5C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAE/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,YAAoB;IACpC,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,WAAmB,EAAE,KAAa;IAClD,MAAM,CAAC,GACL,WAAW;SACR,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,CAAC;SACT,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAErE,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,OAAO,CAAC,WAAmB;IAClC,OAAO,CACL,WAAW;SACR,KAAK,CAAC,IAAI,CAAC;QACZ,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1C,EAAE,KAAK,CAAC,WAAW,CAAC;QACpB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACb,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAClC,CAAC;AACJ,CAAC;AAED,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACP,QAAQ,GACT,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { postExists, inject } from './utils.js';
|
|
2
|
+
function render(view, root, views, postsMetaData, postId) {
|
|
3
|
+
const r = root;
|
|
4
|
+
const { home, post, notFound } = views;
|
|
5
|
+
switch (view) {
|
|
6
|
+
case 'home':
|
|
7
|
+
inject(r, home());
|
|
8
|
+
break;
|
|
9
|
+
case 'post':
|
|
10
|
+
if (postId && postExists(postsMetaData, postId)) {
|
|
11
|
+
post(postId).then((html) => inject(r, html));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
inject(r, notFound());
|
|
15
|
+
}
|
|
16
|
+
break;
|
|
17
|
+
default:
|
|
18
|
+
inject(r, notFound());
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export { render };
|
|
22
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/engine/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGhD,SAAS,MAAM,CACb,IAAU,EACV,IAAiB,EACjB,KAAY,EACZ,aAAyB,EACzB,MAAe;IAEf,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEvC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAClB,MAAM;QAER,KAAK,MAAM;YACT,IAAI,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxB,CAAC;YACD,MAAM;QAER;YACE,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MsgColor } from '../types';
|
|
2
|
+
declare function postExists(postsMetaData: any[], id: string): boolean;
|
|
3
|
+
declare function beautifyDate(d: Date | undefined): undefined | string;
|
|
4
|
+
declare function showCosmicSpeed(el: HTMLElement): void;
|
|
5
|
+
declare function inject(root: HTMLElement, html: string): void;
|
|
6
|
+
declare function log(msg: string, color: MsgColor): void;
|
|
7
|
+
export { postExists, beautifyDate, showCosmicSpeed, inject, log };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
3
|
+
function postExists(postsMetaData, id) {
|
|
4
|
+
return postsMetaData.some((post) => post.id === id);
|
|
5
|
+
}
|
|
6
|
+
function beautifyDate(d) {
|
|
7
|
+
if (!d)
|
|
8
|
+
return;
|
|
9
|
+
const date = new Date(d);
|
|
10
|
+
return date.toLocaleString('en-US', {
|
|
11
|
+
day: 'numeric',
|
|
12
|
+
year: 'numeric',
|
|
13
|
+
month: 'long',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function showCosmicSpeed(el) {
|
|
17
|
+
new PerformanceObserver((list) => {
|
|
18
|
+
list.getEntries().forEach((en) => {
|
|
19
|
+
if (en.name === 'first-contentful-paint') {
|
|
20
|
+
el.innerHTML = `<span>${en.startTime} ms</span>`;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}).observe({ type: 'paint', buffered: true });
|
|
24
|
+
}
|
|
25
|
+
function inject(root, html) {
|
|
26
|
+
root.innerHTML = html;
|
|
27
|
+
}
|
|
28
|
+
function log(msg, color) {
|
|
29
|
+
let coloredMsg;
|
|
30
|
+
switch (color) {
|
|
31
|
+
case 'yellow':
|
|
32
|
+
coloredMsg = chalk.yellow(msg);
|
|
33
|
+
break;
|
|
34
|
+
case 'green':
|
|
35
|
+
coloredMsg = chalk.green(msg);
|
|
36
|
+
break;
|
|
37
|
+
case 'red':
|
|
38
|
+
coloredMsg = chalk.red(msg);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
coloredMsg = msg;
|
|
42
|
+
}
|
|
43
|
+
console.log(`${chalk.blue(pkg.name + ' v' + pkg.version)} ${coloredMsg}`);
|
|
44
|
+
}
|
|
45
|
+
export { postExists, beautifyDate, showCosmicSpeed, inject, log };
|
|
46
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAG3D,SAAS,UAAU,CAAC,aAAoB,EAAE,EAAU;IAClD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,CAAmB;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAClC,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,EAAe;IACtC,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC/B,IAAI,EAAE,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gBACzC,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,SAAS,YAAY,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,MAAM,CAAC,IAAiB,EAAE,IAAY;IAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,GAAG,CAAC,GAAW,EAAE,KAAe;IACvC,IAAI,UAAkB,CAAC;IAEvB,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM;QAER,KAAK,OAAO;YACV,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM;QAER,KAAK,KAAK;YACR,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM;QAER;YACE,UAAU,GAAG,GAAG,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { PostData } from '../types';
|
|
2
|
+
declare function writeTransformedPostFile(outputPath: string, postHtmlContent: string, filename: string): Promise<void>;
|
|
3
|
+
declare function generatePostMetadata(data: Array<PostData>, i: number, filePath: string, htmlFilename: string): Promise<void>;
|
|
4
|
+
export { generatePostMetadata, writeTransformedPostFile };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getTitle, getBrief, getTags } from '../engine/getters.js';
|
|
3
|
+
import fsPromises from 'node:fs/promises';
|
|
4
|
+
async function writeTransformedPostFile(outputPath, postHtmlContent, filename) {
|
|
5
|
+
await fsPromises
|
|
6
|
+
.writeFile(outputPath, postHtmlContent, 'utf-8')
|
|
7
|
+
.then(() => console.log(chalk.green(`✔ ${filename}`)))
|
|
8
|
+
.catch((error) => console.error(error));
|
|
9
|
+
}
|
|
10
|
+
async function generatePostMetadata(data, i, filePath, htmlFilename) {
|
|
11
|
+
const stats = await fsPromises.stat(filePath);
|
|
12
|
+
const fileContent = await fsPromises.readFile(filePath, 'utf-8');
|
|
13
|
+
data.push({
|
|
14
|
+
id: i.toString(),
|
|
15
|
+
filename: htmlFilename,
|
|
16
|
+
title: getTitle(htmlFilename),
|
|
17
|
+
brief: getBrief(fileContent, 3),
|
|
18
|
+
tags: getTags(fileContent),
|
|
19
|
+
created: stats.birthtime,
|
|
20
|
+
modified: stats.mtime,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export { generatePostMetadata, writeTransformedPostFile };
|
|
24
|
+
//# sourceMappingURL=file-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-builder.js","sourceRoot":"","sources":["../../src/server/file-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,KAAK,UAAU,wBAAwB,CACrC,UAAkB,EAClB,eAAuB,EACvB,QAAgB;IAEhB,MAAM,UAAU;SACb,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC;SAC/C,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;SACrD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAqB,EACrB,CAAS,EACT,QAAgB,EAChB,YAAoB;IAEpB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEjE,IAAI,CAAC,IAAI,CAAC;QACR,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;QAChB,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC;QAC7B,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC;QAC1B,OAAO,EAAE,KAAK,CAAC,SAAS;QACxB,QAAQ,EAAE,KAAK,CAAC,KAAK;KACtB,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a Markdown file to HTML with syntax highlighting.
|
|
3
|
+
*
|
|
4
|
+
* Uses remark and rehype to parse Markdown, transform it to HTML,
|
|
5
|
+
* and apply pretty code highlighting.
|
|
6
|
+
*/
|
|
7
|
+
declare function parseMarkdown(path: string): Promise<string>;
|
|
8
|
+
export { parseMarkdown };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { remark } from 'remark';
|
|
3
|
+
import remarkParse from 'remark-parse';
|
|
4
|
+
import remarkRehype from 'remark-rehype';
|
|
5
|
+
import rehypePrettyCode from 'rehype-pretty-code';
|
|
6
|
+
import rehypeStringify from 'rehype-stringify';
|
|
7
|
+
/**
|
|
8
|
+
* Converts a Markdown file to HTML with syntax highlighting.
|
|
9
|
+
*
|
|
10
|
+
* Uses remark and rehype to parse Markdown, transform it to HTML,
|
|
11
|
+
* and apply pretty code highlighting.
|
|
12
|
+
*/
|
|
13
|
+
async function parseMarkdown(path) {
|
|
14
|
+
const markdown = await readFile(path);
|
|
15
|
+
const result = await remark()
|
|
16
|
+
.use(remarkParse)
|
|
17
|
+
.use(remarkRehype)
|
|
18
|
+
.use(rehypePrettyCode, { theme: 'github-dark' })
|
|
19
|
+
.use(rehypeStringify)
|
|
20
|
+
.process(markdown);
|
|
21
|
+
return result.value;
|
|
22
|
+
}
|
|
23
|
+
export { parseMarkdown };
|
|
24
|
+
//# sourceMappingURL=parse-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-markdown.js","sourceRoot":"","sources":["../../src/server/parse-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAE/C;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE;SAC1B,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,YAAY,CAAC;SACjB,GAAG,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;SAC/C,GAAG,CAAC,eAAe,CAAC;SACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB,OAAO,MAAM,CAAC,KAAe,CAAC;AAChC,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<link href="./src/styles/styles.css" rel="stylesheet" />
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<header>
|
|
10
|
+
<div class="logo">
|
|
11
|
+
<div class="wrapper">
|
|
12
|
+
<div class="top"></div>
|
|
13
|
+
<div class="bottom"></div>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
<div>
|
|
17
|
+
<div class="top">
|
|
18
|
+
<a class="title" href="/">blazed-past-us</a>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="bottom neon" id="speed"></div>
|
|
21
|
+
</div>
|
|
22
|
+
</header>
|
|
23
|
+
<div id="root"></div>
|
|
24
|
+
<script type="module" src="./src/main.js"></script>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|