Deno is better

This commit is contained in:
Lucàs
2023-05-06 14:01:38 +02:00
parent d8f009ac1e
commit 31f70d319f
35 changed files with 668 additions and 828 deletions
+18
View File
@@ -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);
}
}
+12
View File
@@ -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
View File
@@ -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()
}
}
+24
View File
@@ -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);
}
}
-6
View File
@@ -1,6 +0,0 @@
type FooterBadge = {
title: string
shield: string
}
export default FooterBadge;
-7
View File
@@ -1,7 +0,0 @@
type Link = {
title: string
shield: string
url: string
}
export default Link;
-32
View File
@@ -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;
-37
View File
@@ -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;
}
}
-18
View File
@@ -1,18 +0,0 @@
import FooterBadge from '../core/FooterBadge';
const footerBadges: FooterBadge[] = [
{
title: 'Profile Views',
shield: 'https://komarev.com/ghpvc/?username=lucasvbr&amp;label=Profile%20views&amp;color=0e75b6&amp;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;
-31
View File
@@ -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;
-39
View File
@@ -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);
}
-24
View File
@@ -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));
});
+18
View File
@@ -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);
}
}
+14
View File
@@ -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);
}
}
+25
View File
@@ -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;
};
}