feat(blog): add file-based blog with dynamic slugs, MDX content and layout shell

- Introduced blog routing using Next.js App Router
- Implemented dynamic [slug] pages for blog posts
- Added MDX-based content loading via lib/posts
- Integrated shared TopBar layout with navigation
- Established clear content, lib and component separation
This commit is contained in:
PascalSchattenburg
2026-01-22 14:14:15 +01:00
parent b717952234
commit d147843c76
10412 changed files with 2475583 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
/*
This is a simple promise queue that allows you to limit the number of concurrent promises
that are running at any given time. It's used to limit the number of concurrent
prefetch requests that are being made to the server but could be used for other
things as well.
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "PromiseQueue", {
enumerable: true,
get: function() {
return PromiseQueue;
}
});
class PromiseQueue {
#maxConcurrency;
#runningCount;
#queue;
constructor(maxConcurrency = 5){
this.#maxConcurrency = maxConcurrency;
this.#runningCount = 0;
this.#queue = [];
}
enqueue(promiseFn) {
let taskResolve;
let taskReject;
const taskPromise = new Promise((resolve, reject)=>{
taskResolve = resolve;
taskReject = reject;
});
const task = async ()=>{
try {
this.#runningCount++;
const result = await promiseFn();
taskResolve(result);
} catch (error) {
taskReject(error);
} finally{
this.#runningCount--;
this.#processNext();
}
};
const enqueueResult = {
promiseFn: taskPromise,
task
};
// wonder if we should take a LIFO approach here
this.#queue.push(enqueueResult);
this.#processNext();
return taskPromise;
}
bump(promiseFn) {
const index = this.#queue.findIndex((item)=>item.promiseFn === promiseFn);
if (index > -1) {
const bumpedItem = this.#queue.splice(index, 1)[0];
this.#queue.unshift(bumpedItem);
this.#processNext(true);
}
}
#processNext(forced = false) {
if ((this.#runningCount < this.#maxConcurrency || forced) && this.#queue.length > 0) {
this.#queue.shift()?.task();
}
}
}
if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
Object.defineProperty(exports.default, '__esModule', { value: true });
Object.assign(exports.default, exports);
module.exports = exports.default;
}
//# sourceMappingURL=promise-queue.js.map