mirror of
https://github.com/LucasVbr/LucasVbr.git
synced 2026-07-09 14:27:46 +00:00
Deno is better ✨
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
import ImageComponent from '../components/ImageComponent.ts';
|
||||
import type BannerModel from '../models/BannerModel.ts';
|
||||
import BannerUrlBuilder from './url_builder/BannerUrlBuilder.ts';
|
||||
|
||||
export default class Banner {
|
||||
|
||||
constructor(private model: BannerModel) {
|
||||
};
|
||||
|
||||
toString(): string {
|
||||
const url = new BannerUrlBuilder()
|
||||
.setParameters({...this.model})
|
||||
.build()
|
||||
;
|
||||
|
||||
return ImageComponent(this.model.text1, url);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import Skill from './Skill.ts';
|
||||
import Banner from './Banner.ts';
|
||||
import Link from './Link.ts';
|
||||
|
||||
export default function makeContext(viewConfig) {
|
||||
return {
|
||||
...viewConfig,
|
||||
banner: new Banner(viewConfig.banner).toString(),
|
||||
links: viewConfig.links.map(link => (new Link(link)).toString()),
|
||||
skills: viewConfig.skills.map(skill => (new Skill(skill)).toString()),
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
import BadgeUrlBuilder from './url_builder/BadgeUrlBuilder.ts';
|
||||
import ImageComponent from '../components/ImageComponent.ts';
|
||||
import LinkModel from '../models/LinkModel.ts';
|
||||
import LinkComponent from '../components/LinkComponent.ts';
|
||||
|
||||
export default class Link {
|
||||
|
||||
constructor(private model: LinkModel) {}
|
||||
|
||||
handleLabel() {
|
||||
const {label: badge} = this.model;
|
||||
const defaultLogo = badge.message.toLowerCase().replace(/\s+/g, '')
|
||||
|
||||
const url = new BadgeUrlBuilder()
|
||||
.setParameters({
|
||||
...badge,
|
||||
style: "for-the-badge",
|
||||
logo: badge.logo ?? defaultLogo,
|
||||
color: badge.color ?? '000',
|
||||
},
|
||||
)
|
||||
.build()
|
||||
;
|
||||
|
||||
return ImageComponent(badge.message, url);
|
||||
}
|
||||
|
||||
toString(): string {
|
||||
const label = this.handleLabel().toString()
|
||||
return LinkComponent(label, this.model.url).toString()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import BadgeUrlBuilder from './url_builder/BadgeUrlBuilder.ts';
|
||||
import ImageComponent from '../components/ImageComponent.ts';
|
||||
import type SkillModel from '../models/SkillModel.ts';
|
||||
|
||||
export default class Skill {
|
||||
|
||||
constructor(private model: SkillModel) {};
|
||||
|
||||
toString(): string {
|
||||
const defaultLogo = this.model.message.toLowerCase().replace(/\s+/g, '');
|
||||
|
||||
const url = new BadgeUrlBuilder()
|
||||
.setParameters({
|
||||
...this.model,
|
||||
color: this.model.color ?? '000',
|
||||
logo: this.model.logo ?? defaultLogo
|
||||
},
|
||||
)
|
||||
.build()
|
||||
;
|
||||
|
||||
return ImageComponent(this.model.message, url);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
type FooterBadge = {
|
||||
title: string
|
||||
shield: string
|
||||
}
|
||||
|
||||
export default FooterBadge;
|
||||
@@ -1,7 +0,0 @@
|
||||
type Link = {
|
||||
title: string
|
||||
shield: string
|
||||
url: string
|
||||
}
|
||||
|
||||
export default Link;
|
||||
@@ -1,32 +0,0 @@
|
||||
class Log {
|
||||
colors = {
|
||||
red: '\x1b[31m',
|
||||
green: '\x1b[32m',
|
||||
yellow: '\x1b[33m',
|
||||
};
|
||||
|
||||
private readonly logFunction: (message?: any, ...optionalParams: any[]) => void;
|
||||
|
||||
constructor(logFunction: (message?: any, ...optionalParams: any[]) => void) {
|
||||
this.logFunction = logFunction;
|
||||
}
|
||||
|
||||
info(message: string): void {
|
||||
this.logFunction(message);
|
||||
}
|
||||
|
||||
success(message: string): void {
|
||||
this.logFunction(this.colors.green, message);
|
||||
}
|
||||
|
||||
error(message: string): void {
|
||||
this.logFunction(this.colors.red, message);
|
||||
}
|
||||
|
||||
warning(message: string): void {
|
||||
this.logFunction(this.colors.yellow, message);
|
||||
}
|
||||
}
|
||||
|
||||
const log = new Log(console.log);
|
||||
export default log;
|
||||
@@ -1,37 +0,0 @@
|
||||
import {SimpleIcon} from 'simple-icons/types';
|
||||
|
||||
export default class Skill {
|
||||
private title: string;
|
||||
private slug: string;
|
||||
private shield: string;
|
||||
|
||||
constructor(icon: SimpleIcon) {
|
||||
this.title = icon.title;
|
||||
this.slug = icon.slug;
|
||||
this.shield = this.buildShield(icon);
|
||||
}
|
||||
|
||||
private buildShield(icon: SimpleIcon): string {
|
||||
const baseUrl = 'https://img.shields.io/static/v1';
|
||||
const params = {
|
||||
label: '',
|
||||
message: icon.title,
|
||||
color: icon.hex,
|
||||
logo: icon.slug,
|
||||
logoColor: 'white',
|
||||
};
|
||||
|
||||
const shieldUrl = new URL(baseUrl);
|
||||
Object.entries(params).forEach(param => {
|
||||
const [key, value] = param;
|
||||
shieldUrl.searchParams.append(key, value);
|
||||
});
|
||||
return shieldUrl.toString();
|
||||
}
|
||||
|
||||
public static sortBySlug(a: Skill, b: Skill) {
|
||||
if (a.slug < b.slug) return -1;
|
||||
if (a.slug > b.slug) return 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
import FooterBadge from '../core/FooterBadge';
|
||||
|
||||
const footerBadges: FooterBadge[] = [
|
||||
{
|
||||
title: 'Profile Views',
|
||||
shield: 'https://komarev.com/ghpvc/?username=lucasvbr&label=Profile%20views&color=0e75b6&style=flat',
|
||||
},
|
||||
{
|
||||
title: "FreeCodeCamp Points",
|
||||
shield: "https://img.shields.io/freecodecamp/points/lucasvbr?label=FreeCodeCamp%20points"
|
||||
},
|
||||
{
|
||||
title: "Made with love",
|
||||
shield: "https://img.shields.io/badge/-made%20with%20%E2%9D%A4%EF%B8%8F-red"
|
||||
}
|
||||
];
|
||||
|
||||
export default footerBadges;
|
||||
@@ -1,31 +0,0 @@
|
||||
import Link from '../core/Link';
|
||||
|
||||
const links: Link[] = [
|
||||
{
|
||||
title: 'Portfolio',
|
||||
shield: 'https://img.shields.io/badge/my_portfolio-000?style=for-the-badge&logo=ko-fi&logoColor=white',
|
||||
url: 'https://lucasvbr.github.io/links/?portfolio',
|
||||
},
|
||||
{
|
||||
title: 'Linkedin Profile',
|
||||
shield: 'https://img.shields.io/badge/linkedin-0e76a8?style=for-the-badge&logo=linkedin&logoColor=white',
|
||||
url: 'https://www.linkedin.com/in/lucasvbr',
|
||||
},
|
||||
{
|
||||
title: 'FreeCodeCamp Profile',
|
||||
shield: 'https://img.shields.io/badge/freecodecamp-0a0a23?style=for-the-badge&logo=freecodecamp&logoColor=white',
|
||||
url: 'https://www.freecodecamp.org/LucasVbr',
|
||||
},
|
||||
{
|
||||
title: 'OpenClassRooms Profile',
|
||||
shield: 'https://img.shields.io/badge/openclassrooms-7451eb?style=for-the-badge&logo=openclassrooms&logoColor=white',
|
||||
url: 'https://openclassrooms.com/fr/members/97j9zltv6225',
|
||||
},
|
||||
{
|
||||
title: 'Exercism Profile',
|
||||
shield: 'https://img.shields.io/badge/exercism-2e57e8?style=for-the-badge&logo=exercism&logoColor=white',
|
||||
url: 'https://exercism.org/profiles/LucasVbr',
|
||||
},
|
||||
];
|
||||
|
||||
export default links;
|
||||
@@ -1,39 +0,0 @@
|
||||
import {SimpleIcon} from 'simple-icons/types';
|
||||
import icons from 'simple-icons';
|
||||
import Skill from '../core/Skill';
|
||||
|
||||
const LIST_OF_ICONS: SimpleIcon[] = [
|
||||
icons.siAngular,
|
||||
icons.siSymfony,
|
||||
icons.siGit,
|
||||
icons.siHtml5,
|
||||
icons.siFigma,
|
||||
icons.siJavascript,
|
||||
icons.siGnubash,
|
||||
icons.siAndroid,
|
||||
icons.siBulma,
|
||||
icons.siMariadb,
|
||||
icons.siSqlite,
|
||||
icons.siCss3,
|
||||
icons.siMysql,
|
||||
icons.siPython,
|
||||
icons.siC,
|
||||
icons.siPostgresql,
|
||||
icons.siPhp,
|
||||
icons.siBootstrap,
|
||||
icons.siExpress,
|
||||
icons.siNodedotjs,
|
||||
icons.siDeno,
|
||||
icons.siTypescript,
|
||||
icons.siOcaml,
|
||||
icons.siMongodb,
|
||||
icons.siReact,
|
||||
icons.siDocker,
|
||||
icons.siPug,
|
||||
icons.siNunjucks,
|
||||
];
|
||||
|
||||
export default function getSkills(): Skill[] {
|
||||
return LIST_OF_ICONS.map((icon: SimpleIcon) => new Skill(icon)).
|
||||
sort(Skill.sortBySlug);
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import {writeFile} from 'fs/promises';
|
||||
import nunjucks from 'nunjucks';
|
||||
import getSkills from './data/skills';
|
||||
import Skill from './core/Skill';
|
||||
import log from './core/Log';
|
||||
import links from './data/links';
|
||||
import footerBadges from './data/footerBadges';
|
||||
|
||||
const TEMPLATE_FILE: string = 'README.njk';
|
||||
const OUTPUT_FILE: string = 'README.md';
|
||||
|
||||
const skills: Skill[] = getSkills();
|
||||
|
||||
nunjucks.configure('views/');
|
||||
nunjucks.render(TEMPLATE_FILE, {skills, links, footerBadges}, (err, renderView : string | null) => {
|
||||
if (err) {
|
||||
log.error(err.message)
|
||||
return;
|
||||
}
|
||||
|
||||
writeFile(OUTPUT_FILE, renderView ?? "")
|
||||
.then(() => log.success(`${OUTPUT_FILE} successfully generated`))
|
||||
.catch((err: string) => console.error(err));
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import type BadgeModel from '../../models/BadgeModel.ts';
|
||||
import UrlBuilder from './UrlBuilder.ts';
|
||||
|
||||
export default class BadgeUrlBuilder extends UrlBuilder {
|
||||
static BASE_URL = 'https://img.shields.io/static/v1';
|
||||
static DEFAULT_PARAMETERS: BadgeModel = {style: 'flat', label: " ", logoColor: "white"};
|
||||
|
||||
constructor(parameters?: BadgeModel) {
|
||||
super(BadgeUrlBuilder.BASE_URL,
|
||||
parameters,
|
||||
BadgeUrlBuilder.DEFAULT_PARAMETERS,
|
||||
);
|
||||
};
|
||||
|
||||
public setParameters(parameters: BadgeModel): this {
|
||||
return super.setParameters(parameters);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import UrlBuilder from './UrlBuilder.ts';
|
||||
import type BannerModel from '../../models/BannerModel.ts';
|
||||
|
||||
export default class BannerUrlBuilder extends UrlBuilder {
|
||||
static BASE_URL = 'https://svg-banners.vercel.app/api';
|
||||
|
||||
constructor(parameters: BannerModel) {
|
||||
super(BannerUrlBuilder.BASE_URL, parameters, {});
|
||||
}
|
||||
|
||||
public setParameters(parameters: BannerModel): this {
|
||||
return super.setParameters(parameters);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
export default abstract class UrlBuilder {
|
||||
|
||||
private parameters;
|
||||
|
||||
protected constructor(
|
||||
private baseUrl: string,
|
||||
parameters,
|
||||
private defaultParameters,
|
||||
) {
|
||||
this.parameters = {...defaultParameters, ...parameters};
|
||||
};
|
||||
|
||||
setParameters(parameters) {
|
||||
this.parameters = {...this.parameters, ...parameters};
|
||||
return this;
|
||||
}
|
||||
|
||||
build(): URL {
|
||||
const url = new URL(this.baseUrl);
|
||||
for (const [key, value] of Object.entries(this.parameters)) {
|
||||
if (value) url.searchParams.set(key, value);
|
||||
}
|
||||
return url;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user