From f7756b06766fc4c388591767a9c885a72be0ab0c Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 11 Feb 2025 15:52:30 +0400 Subject: [PATCH] cv editor added --- docs/cv-maker/assets/index-BqA5Dcdy.js | 30 + docs/cv-maker/assets/index-yRNwTtQE.css | 1 + docs/cv-maker/index.html | 70 + docs/cv-maker/john-doe.json | 277 ++++ docs/cv-maker/resume-schema.json | 285 ++++ docs/index.html | 1 + .../{index-BdFVq0_I.js => index-BDzOqd_w.js} | 4 +- .../assets/index-BEXZ83O-.css | 1 + .../assets/index-BzQa5oof.css | 1 - docs/telegram-bot-playground/index.html | 6 +- makefile | 6 +- package.json | 7 +- pnpm-lock.yaml | 1401 ++++++++++++++++- src/common/editor/_editor.ts | 43 - src/common/editor/init.ts | 39 +- src/common/editor/make.ts | 61 + .../{ts-text-model.ts => text-model.ts} | 48 +- src/common/utils.ts | 13 +- src/cv-maker/core/info.ts | 45 + src/cv-maker/core/schema.ts | 90 ++ src/cv-maker/core/template.tsx | 229 +++ src/cv-maker/core/utils.ts | 29 + src/cv-maker/index.html | 70 + src/cv-maker/main.ts | 122 ++ src/cv-maker/scripts/deploy.ts | 62 + src/cv-maker/scripts/gen-pdf.ts | 26 + src/cv-maker/scripts/render.ts | 14 + src/cv-maker/scripts/schema.ts | 10 + src/cv-maker/static/john-doe.json | 277 ++++ src/cv-maker/static/resume-schema.json | 285 ++++ src/cv-maker/style.css | 194 +++ src/tg-bot-playground/bot-launcher/_main.ts | 2 +- src/tg-bot-playground/bot-launcher/run.ts | 2 +- src/tg-bot-playground/index.html | 2 +- src/tg-bot-playground/main.ts | 4 +- src/tg-bot-playground/styles.css | 2 +- test/{worker.test.ts => tg-worker.test.ts} | 0 tsconfig.json | 9 +- vite.config.ts | 13 + 39 files changed, 3644 insertions(+), 137 deletions(-) create mode 100644 docs/cv-maker/assets/index-BqA5Dcdy.js create mode 100644 docs/cv-maker/assets/index-yRNwTtQE.css create mode 100644 docs/cv-maker/index.html create mode 100644 docs/cv-maker/john-doe.json create mode 100644 docs/cv-maker/resume-schema.json rename docs/telegram-bot-playground/assets/{index-BdFVq0_I.js => index-BDzOqd_w.js} (98%) create mode 100644 docs/telegram-bot-playground/assets/index-BEXZ83O-.css delete mode 100644 docs/telegram-bot-playground/assets/index-BzQa5oof.css delete mode 100644 src/common/editor/_editor.ts create mode 100644 src/common/editor/make.ts rename src/common/editor/{ts-text-model.ts => text-model.ts} (56%) create mode 100644 src/cv-maker/core/info.ts create mode 100644 src/cv-maker/core/schema.ts create mode 100644 src/cv-maker/core/template.tsx create mode 100644 src/cv-maker/core/utils.ts create mode 100644 src/cv-maker/index.html create mode 100644 src/cv-maker/main.ts create mode 100644 src/cv-maker/scripts/deploy.ts create mode 100644 src/cv-maker/scripts/gen-pdf.ts create mode 100644 src/cv-maker/scripts/render.ts create mode 100644 src/cv-maker/scripts/schema.ts create mode 100644 src/cv-maker/static/john-doe.json create mode 100644 src/cv-maker/static/resume-schema.json create mode 100644 src/cv-maker/style.css rename test/{worker.test.ts => tg-worker.test.ts} (100%) diff --git a/docs/cv-maker/assets/index-BqA5Dcdy.js b/docs/cv-maker/assets/index-BqA5Dcdy.js new file mode 100644 index 0000000..f8ea340 --- /dev/null +++ b/docs/cv-maker/assets/index-BqA5Dcdy.js @@ -0,0 +1,30 @@ +var nb=Object.defineProperty;var Dl=e=>{throw TypeError(e)};var rb=(e,t,n)=>t in e?nb(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var u=(e,t,n)=>rb(e,typeof t!="symbol"?t+"":t,n),Ul=(e,t,n)=>t.has(e)||Dl("Cannot "+n);var Bl=(e,t,n)=>(Ul(e,t,"read from private field"),n?n.call(e):t.get(e)),ql=(e,t,n)=>t.has(e)?Dl("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),Jl=(e,t,n,r)=>(Ul(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();var Mc=!1,Rc=!1,hn=[],Cc=-1;function sb(e){ob(e)}function ob(e){hn.includes(e)||hn.push(e),cb()}function ib(e){let t=hn.indexOf(e);t!==-1&&t>Cc&&hn.splice(t,1)}function cb(){!Rc&&!Mc&&(Mc=!0,queueMicrotask(ab))}function ab(){Mc=!1,Rc=!0;for(let e=0;ee.effect(t,{scheduler:n=>{Nc?sb(n):n()}}),Rh=e.raw}function Vl(e){Rn=e}function fb(e){let t=()=>{};return[r=>{let s=Rn(r);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(s),t=()=>{s!==void 0&&(e._x_effects.delete(s),yr(s))},s},()=>{t()}]}function Ch(e,t){let n=!0,r,s=Rn(()=>{let o=e();JSON.stringify(o),n?r=o:queueMicrotask(()=>{t(o,r),r=o}),n=!1});return()=>yr(s)}var Nh=[],Fh=[],Ph=[];function db(e){Ph.push(e)}function za(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Fh.push(t))}function jh(e){Nh.push(e)}function Lh(e,t,n){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(n)}function Kh(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([n,r])=>{(t===void 0||t.includes(n))&&(r.forEach(s=>s()),delete e._x_attributeCleanups[n])})}function hb(e){var t,n;for((t=e._x_effects)==null||t.forEach(ib);(n=e._x_cleanups)!=null&&n.length;)e._x_cleanups.pop()()}var Ya=new MutationObserver(eu),Za=!1;function Qa(){Ya.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),Za=!0}function Dh(){pb(),Ya.disconnect(),Za=!1}var Mr=[];function pb(){let e=Ya.takeRecords();Mr.push(()=>e.length>0&&eu(e));let t=Mr.length;queueMicrotask(()=>{if(Mr.length===t)for(;Mr.length>0;)Mr.shift()()})}function re(e){if(!Za)return e();Dh();let t=e();return Qa(),t}var Xa=!1,Io=[];function mb(){Xa=!0}function gb(){Xa=!1,eu(Io),Io=[]}function eu(e){if(Xa){Io=Io.concat(e);return}let t=[],n=new Set,r=new Map,s=new Map;for(let o=0;o{i.nodeType===1&&i._x_marker&&n.add(i)}),e[o].addedNodes.forEach(i=>{if(i.nodeType===1){if(n.has(i)){n.delete(i);return}i._x_marker||t.push(i)}})),e[o].type==="attributes")){let i=e[o].target,c=e[o].attributeName,a=e[o].oldValue,l=()=>{r.has(i)||r.set(i,[]),r.get(i).push({name:c,value:i.getAttribute(c)})},f=()=>{s.has(i)||s.set(i,[]),s.get(i).push(c)};i.hasAttribute(c)&&a===null?l():i.hasAttribute(c)?(f(),l()):f()}s.forEach((o,i)=>{Kh(i,o)}),r.forEach((o,i)=>{Nh.forEach(c=>c(i,o))});for(let o of n)t.some(i=>i.contains(o))||Fh.forEach(i=>i(o));for(let o of t)o.isConnected&&Ph.forEach(i=>i(o));t=null,n=null,r=null,s=null}function Uh(e){return ws(Zn(e))}function Ss(e,t,n){return e._x_dataStack=[t,...Zn(n||e)],()=>{e._x_dataStack=e._x_dataStack.filter(r=>r!==t)}}function Zn(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?Zn(e.host):e.parentNode?Zn(e.parentNode):[]}function ws(e){return new Proxy({objects:e},_b)}var _b={ownKeys({objects:e}){return Array.from(new Set(e.flatMap(t=>Object.keys(t))))},has({objects:e},t){return t==Symbol.unscopables?!1:e.some(n=>Object.prototype.hasOwnProperty.call(n,t)||Reflect.has(n,t))},get({objects:e},t,n){return t=="toJSON"?yb:Reflect.get(e.find(r=>Reflect.has(r,t))||{},t,n)},set({objects:e},t,n,r){const s=e.find(i=>Object.prototype.hasOwnProperty.call(i,t))||e[e.length-1],o=Object.getOwnPropertyDescriptor(s,t);return o!=null&&o.set&&(o!=null&&o.get)?o.set.call(r,n)||!0:Reflect.set(s,t,n)}};function yb(){return Reflect.ownKeys(this).reduce((t,n)=>(t[n]=Reflect.get(this,n),t),{})}function Bh(e){let t=r=>typeof r=="object"&&!Array.isArray(r)&&r!==null,n=(r,s="")=>{Object.entries(Object.getOwnPropertyDescriptors(r)).forEach(([o,{value:i,enumerable:c}])=>{if(c===!1||i===void 0||typeof i=="object"&&i!==null&&i.__v_skip)return;let a=s===""?o:`${s}.${o}`;typeof i=="object"&&i!==null&&i._x_interceptor?r[o]=i.initialize(e,a,o):t(i)&&i!==r&&!(i instanceof Element)&&n(i,a)})};return n(e)}function qh(e,t=()=>{}){let n={initialValue:void 0,_x_interceptor:!0,initialize(r,s,o){return e(this.initialValue,()=>bb(r,s),i=>Fc(r,s,i),s,o)}};return t(n),r=>{if(typeof r=="object"&&r!==null&&r._x_interceptor){let s=n.initialize.bind(n);n.initialize=(o,i,c)=>{let a=r.initialize(o,i,c);return n.initialValue=a,s(o,i,c)}}else n.initialValue=r;return n}}function bb(e,t){return t.split(".").reduce((n,r)=>n[r],e)}function Fc(e,t,n){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=n;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Fc(e[t[0]],t.slice(1),n)}}var Jh={};function ht(e,t){Jh[e]=t}function Pc(e,t){let n=Sb(t);return Object.entries(Jh).forEach(([r,s])=>{Object.defineProperty(e,`$${r}`,{get(){return s(t,n)},enumerable:!1})}),e}function Sb(e){let[t,n]=Yh(e),r={interceptor:qh,...t};return za(e,n),r}function wb(e,t,n,...r){try{return n(...r)}catch(s){rs(s,e,t)}}function rs(e,t,n=void 0){e=Object.assign(e??{message:"No error message given."},{el:t,expression:n}),console.warn(`Alpine Expression Error: ${e.message} + +${n?'Expression: "'+n+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var fo=!0;function Vh(e){let t=fo;fo=!1;let n=e();return fo=t,n}function pn(e,t,n={}){let r;return Re(e,t)(s=>r=s,n),r}function Re(...e){return Hh(...e)}var Hh=Wh;function vb(e){Hh=e}function Wh(e,t){let n={};Pc(n,e);let r=[n,...Zn(e)],s=typeof t=="function"?kb(r,t):Eb(r,t,e);return wb.bind(null,e,t,s)}function kb(e,t){return(n=()=>{},{scope:r={},params:s=[]}={})=>{let o=t.apply(ws([r,...e]),s);Ao(n,o)}}var ec={};function Ob(e,t){if(ec[e])return ec[e];let n=Object.getPrototypeOf(async function(){}).constructor,r=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,o=(()=>{try{let i=new n(["__self","scope"],`with (scope) { __self.result = ${r} }; __self.finished = true; return __self.result;`);return Object.defineProperty(i,"name",{value:`[Alpine] ${e}`}),i}catch(i){return rs(i,t,e),Promise.resolve()}})();return ec[e]=o,o}function Eb(e,t,n){let r=Ob(t,n);return(s=()=>{},{scope:o={},params:i=[]}={})=>{r.result=void 0,r.finished=!1;let c=ws([o,...e]);if(typeof r=="function"){let a=r(r,c).catch(l=>rs(l,n,t));r.finished?(Ao(s,r.result,c,i,n),r.result=void 0):a.then(l=>{Ao(s,l,c,i,n)}).catch(l=>rs(l,n,t)).finally(()=>r.result=void 0)}}}function Ao(e,t,n,r,s){if(fo&&typeof t=="function"){let o=t.apply(n,r);o instanceof Promise?o.then(i=>Ao(e,i,n,r)).catch(i=>rs(i,s,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var tu="x-";function br(e=""){return tu+e}function Tb(e){tu=e}var Mo={};function pe(e,t){return Mo[e]=t,{before(n){if(!Mo[n]){console.warn(String.raw`Cannot find directive \`${n}\`. \`${e}\` will use the default order of execution`);return}const r=un.indexOf(n);un.splice(r>=0?r:un.indexOf("DEFAULT"),0,e)}}}function xb(e){return Object.keys(Mo).includes(e)}function nu(e,t,n){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([c,a])=>({name:c,value:a})),i=Gh(o);o=o.map(c=>i.find(a=>a.name===c.name)?{name:`x-bind:${c.name}`,value:`"${c.value}"`}:c),t=t.concat(o)}let r={};return t.map(Xh((o,i)=>r[o]=i)).filter(tp).map(Ab(r,n)).sort(Mb).map(o=>Ib(e,o))}function Gh(e){return Array.from(e).map(Xh()).filter(t=>!tp(t))}var jc=!1,Ur=new Map,zh=Symbol();function $b(e){jc=!0;let t=Symbol();zh=t,Ur.set(t,[]);let n=()=>{for(;Ur.get(t).length;)Ur.get(t).shift()();Ur.delete(t)},r=()=>{jc=!1,n()};e(n),r()}function Yh(e){let t=[],n=c=>t.push(c),[r,s]=fb(e);return t.push(s),[{Alpine:vs,effect:r,cleanup:n,evaluateLater:Re.bind(Re,e),evaluate:pn.bind(pn,e)},()=>t.forEach(c=>c())]}function Ib(e,t){let n=()=>{},r=Mo[t.type]||n,[s,o]=Yh(e);Lh(e,t.original,o);let i=()=>{e._x_ignore||e._x_ignoreSelf||(r.inline&&r.inline(e,t,s),r=r.bind(r,e,t,s),jc?Ur.get(zh).push(r):r())};return i.runCleanups=o,i}var Zh=(e,t)=>({name:n,value:r})=>(n.startsWith(e)&&(n=n.replace(e,t)),{name:n,value:r}),Qh=e=>e;function Xh(e=()=>{}){return({name:t,value:n})=>{let{name:r,value:s}=ep.reduce((o,i)=>i(o),{name:t,value:n});return r!==t&&e(r,t),{name:r,value:s}}}var ep=[];function ru(e){ep.push(e)}function tp({name:e}){return np().test(e)}var np=()=>new RegExp(`^${tu}([^:^.]+)\\b`);function Ab(e,t){return({name:n,value:r})=>{let s=n.match(np()),o=n.match(/:([a-zA-Z0-9\-_:]+)/),i=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],c=t||e[n]||n;return{type:s?s[1]:null,value:o?o[1]:null,modifiers:i.map(a=>a.replace(".","")),expression:r,original:c}}}var Lc="DEFAULT",un=["ignore","ref","data","id","anchor","bind","init","for","model","modelable","transition","show","if",Lc,"teleport"];function Mb(e,t){let n=un.indexOf(e.type)===-1?Lc:e.type,r=un.indexOf(t.type)===-1?Lc:t.type;return un.indexOf(n)-un.indexOf(r)}function zr(e,t,n={}){e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0,composed:!0,cancelable:!0}))}function wn(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(s=>wn(s,t));return}let n=!1;if(t(e,()=>n=!0),n)return;let r=e.firstElementChild;for(;r;)wn(r,t),r=r.nextElementSibling}function Ze(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var Hl=!1;function Rb(){Hl&&Ze("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),Hl=!0,document.body||Ze("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` + + CV Maker + + + + + + +
+ + + + +
+ + +
+
+ +
+ +
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/docs/cv-maker/john-doe.json b/docs/cv-maker/john-doe.json new file mode 100644 index 0000000..7489300 --- /dev/null +++ b/docs/cv-maker/john-doe.json @@ -0,0 +1,277 @@ +{ + "$schema": "./resume-schema.json", + "me": { + "name": "John Doe", + "email": "john@gmail.com", + "phone": "+000 000 00 00", + "location": "Europe, UTC+2", + "expertise": [ + "Frontend", "UI/UX" + ], + "expertSummary": [ + "Skillful frontend developer with UX/UI practical experience" + ], + "profiles": [ + { + "url": "https://github.com/microsoft/TypeScript", + "icon": "github black" + }, + { + "url": "https://stackoverflow.com/", + "icon": "stack-overflow darkorange" + }, + { + "url": "https://www.linkedin.com/", + "icon": "linkedin dodgerblue" + }, + { + "url": "https://t.me/johndoe____", + "icon": "telegram steelblue" + }, + { + "url": "https://wa.me/0000000", + "icon": "whatsapp green" + } + ] + }, + "technologies": [ + { + "id": "typescript", + "name": "TypeScript", + "category": "programming language", + "url": "https://www.typescriptlang.org/" + }, + { + "id": "javascript", + "name": "JavaScript", + "category": "programming language", + "url": "https://en.wikipedia.org/wiki/JavaScript" + }, + { + "id": "scala", + "name": "Scala", + "category": "programming language", + "url": "https://www.scala-lang.org/" + }, + { + "id": "play-framework", + "name": "Play Framework", + "category": "framework", + "url": "https://en.wikipedia.org/wiki/Play_Framework" + }, + { + "id": "java", + "name": "Java", + "category": "programming language", + "url": "https://en.wikipedia.org/wiki/Java_(programming_language)" + }, + { + "id": "aws", + "name": "AWS", + "category": "cloud computing", + "url": "https://aws.amazon.com/" + }, + { + "id": "gcp", + "name": "Google Cloud Platform", + "category": "cloud computing", + "url": "https://en.wikipedia.org/wiki/Google_Cloud_Platform" + }, + { + "id": "mysql", + "name": "MySQL", + "category": "database", + "url": "https://en.wikipedia.org/wiki/MySQL" + }, + { + "id": "h2", + "name": "H2", + "category": "database", + "url": "https://en.wikipedia.org/wiki/H2_(database)" + }, + { + "id": "postgres", + "name": "PostgreSQL", + "category": "database", + "url": "https://en.wikipedia.org/wiki/PostgreSQL" + }, + { + "id": "bootstrap", + "name": "Bootstrap", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/Bootstrap_(front-end_framework)" + }, + { + "id": "vuejs", + "name": "VueJS", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/Vue.js" + }, + { + "id": "angularjs", + "name": "AngularJS", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/AngularJS" + }, + + { + "id": "azure", + "name": "Azure", + "category": "cloud computing", + "url": "https://azure.microsoft.com/" + }, + { + "id": "jenkins", + "name": "Jenkins", + "category": "devops tool", + "url": "https://en.wikipedia.org/wiki/Jenkins_(software)" + }, + { + "id": "bitbucket", + "name": "Bitbucket", + "category": "collaboration tool", + "url": "https://en.wikipedia.org/wiki/Bitbucket" + }, + { + "id": "browserstack", + "name": "BrowserStack", + "category": "testing", + "url": "https://en.wikipedia.org/wiki/BrowserStack" + }, + { + "id": "jira", + "name": "Jira", + "category": "collaboration tool", + "url": "https://en.wikipedia.org/wiki/Jira_(software)" + }, + { + "id": "confluence", + "name": "Confluence", + "category": "collaboration tool", + "url": "https://en.wikipedia.org/wiki/Confluence_(software)" + }, + { + "id": "contentful", + "name": "Contentful", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/Contentful" + }, + { + "id": "vitest", + "name": "Vitest", + "category": "testing", + "url": "https://vitest.dev/" + }, + { + "id": "scalatest", + "name": "ScalaTest", + "category": "testing", + "url": "https://www.scalatest.org/" + }, + + { + "id": "jest", + "name": "Jest", + "category": "testing", + "url": "https://jestjs.io/" + }, + { + "id": "serverless-framework", + "name": "Serverless Framework", + "category": "framework", + "url": "https://en.wikipedia.org/wiki/Serverless_Framework" + }, + { + "id": "scrum", + "name": "Scrum", + "category": "collaboration tool", + "url": "https://en.wikipedia.org/wiki/Scrum_(software_development)" + }, + { + "id": "jquery", + "name": "jQuery", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/Scrum_(software_development)" + }, + { + "id": "docker", + "name": "Docker", + "category": "devops tool", + "url": "https://en.wikipedia.org/wiki/Docker_(software)" + }, + { + "id": "react", + "name": "React", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/React_(software)" + }, + { + "id": "electron", + "name": "Electron", + "category": "frontend", + "url": "https://en.wikipedia.org/wiki/Electron_(software_framework)" + }, + { + "id": "akka", + "name": "Akka", + "category": "framework", + "url": "https://en.wikipedia.org/wiki/Akka_(toolkit)" + } + ], + "employmentHistory": [ + { + "companyName": "Green been", + "workType": "hybrid", + "location": { "country": "Finland", "city": "Helsinki" }, + "companyDescription": "Software development outsourcing company", + "website": "https://google.com/", + "position": "Senior Software Engineer", + "start": "2024-04", + "end": "2024-12", + "projects": [ + { + "order": 1, + "client": { + "name": "Unknown client", + "description": "Food Company" + }, + "title": "Market place", + "roles": ["Typescript frontend developer"], + "stack": ["typescript", "vitest", "aws"], + "tools": ["jenkins", "bitbucket", "browserstack", "contentful", "jira", "scrum", "confluence"], + "achivements": [ + { + "technical": "Developed a frontend application using AlpineJS and HTMX", + "human": "Developed a frontend application using AlpineJS and HTMX" + } + ] + } + ] + }, + { + "companyName": "Nice coffee", + "workType": "on-site", + "companyDescription": "Software development outsourcing company", + "location": { "country": "United Kingdom", "city": "London" }, + "website": "https://google.com/", + "position": "Senior Software Engineer", + "start": "2020-01", + "end": "2023-12", + "projects": [ + { + "order": 1, + "title": "Market place", + "roles": ["UX Designer", "Frontend Developer"], + "stack": ["typescript"], + "tools": ["figma"], + "achivements": [ + { + "technical": "Designed", + "human": "Designed a nice web page" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/cv-maker/resume-schema.json b/docs/cv-maker/resume-schema.json new file mode 100644 index 0000000..205ac82 --- /dev/null +++ b/docs/cv-maker/resume-schema.json @@ -0,0 +1,285 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$defs": { + "ResumeObject": { + "type": "object", + "required": [ + "me", + "technologies", + "employmentHistory" + ], + "properties": { + "$schema": { + "$ref": "#/$defs/NonEmptyString" + }, + "me": { + "$ref": "#/$defs/Me" + }, + "technologies": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/ProjectTechnology" + } + }, + "employmentHistory": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/EmploymentRecord" + } + } + }, + "additionalProperties": false + }, + "NonEmptyString": { + "type": "string", + "description": "a non empty string", + "title": "nonEmptyString", + "minLength": 1 + }, + "Me": { + "type": "object", + "required": [ + "name", + "expertise", + "email", + "profiles", + "expertSummary" + ], + "properties": { + "name": { + "$ref": "#/$defs/NonEmptyString" + }, + "expertise": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "location": { + "$ref": "#/$defs/NonEmptyString" + }, + "phone": { + "$ref": "#/$defs/NonEmptyString" + }, + "email": { + "$ref": "#/$defs/NonEmptyString" + }, + "profiles": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": [ + "url", + "icon" + ], + "properties": { + "url": { + "$ref": "#/$defs/NonEmptyString", + "description": "a string matching the pattern https:\\/\\/", + "pattern": "https:\\/\\/" + }, + "icon": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "additionalProperties": false + } + }, + "expertSummary": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + } + }, + "additionalProperties": false + }, + "ProjectTechnology": { + "type": "object", + "required": [ + "id", + "name", + "category" + ], + "properties": { + "id": { + "$ref": "#/$defs/NonEmptyString" + }, + "name": { + "$ref": "#/$defs/NonEmptyString" + }, + "category": { + "type": "string", + "enum": [ + "programming language", + "framework", + "cloud computing", + "database", + "devops tool", + "testing", + "collaboration tool", + "frontend", + "other" + ] + }, + "version": { + "$ref": "#/$defs/NonEmptyString" + }, + "url": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "additionalProperties": false + }, + "EmploymentRecord": { + "type": "object", + "required": [ + "position", + "workType", + "companyName", + "companyDescription", + "website", + "start", + "end", + "location", + "projects" + ], + "properties": { + "position": { + "$ref": "#/$defs/NonEmptyString" + }, + "workType": { + "type": "string", + "enum": [ + "hybrid", + "on-site", + "remote" + ] + }, + "companyName": { + "$ref": "#/$defs/NonEmptyString" + }, + "companyDescription": { + "$ref": "#/$defs/NonEmptyString" + }, + "website": { + "$ref": "#/$defs/NonEmptyString", + "description": "a string matching the pattern https:\\/\\/", + "pattern": "https:\\/\\/" + }, + "start": { + "$ref": "#/$defs/NonEmptyString" + }, + "end": { + "$ref": "#/$defs/NonEmptyString" + }, + "location": { + "type": "object", + "required": [], + "properties": { + "city": { + "$ref": "#/$defs/NonEmptyString" + }, + "country": { + "$ref": "#/$defs/NonEmptyString" + }, + "timezone": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "additionalProperties": false + }, + "projects": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/ProjectDetails" + } + } + }, + "additionalProperties": false + }, + "ProjectDetails": { + "type": "object", + "required": [ + "order", + "title", + "stack", + "tools", + "roles", + "achivements" + ], + "properties": { + "order": { + "type": "number" + }, + "client": { + "type": "object", + "required": [ + "name", + "description" + ], + "properties": { + "name": { + "$ref": "#/$defs/NonEmptyString" + }, + "description": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "additionalProperties": false + }, + "title": { + "$ref": "#/$defs/NonEmptyString" + }, + "stack": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "tools": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "roles": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "achivements": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": [ + "technical" + ], + "properties": { + "technical": { + "$ref": "#/$defs/NonEmptyString" + }, + "human": { + "$ref": "#/$defs/NonEmptyString" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "$ref": "#/$defs/ResumeObject" +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 41884c5..6540f0d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -55,6 +55,7 @@ diff --git a/docs/telegram-bot-playground/assets/index-BdFVq0_I.js b/docs/telegram-bot-playground/assets/index-BDzOqd_w.js similarity index 98% rename from docs/telegram-bot-playground/assets/index-BdFVq0_I.js rename to docs/telegram-bot-playground/assets/index-BDzOqd_w.js index f06a64d..d452f49 100644 --- a/docs/telegram-bot-playground/assets/index-BdFVq0_I.js +++ b/docs/telegram-bot-playground/assets/index-BDzOqd_w.js @@ -2,7 +2,7 @@ var co=Object.defineProperty;var Un=e=>{throw TypeError(e)};var fo=(e,t,r)=>t in ${r?'Expression: "'+r+`" -`:""}`,t),setTimeout(()=>{throw e},0)}var Ot=!0;function Zi(e){let t=Ot;Ot=!1;let r=e();return Ot=t,r}function be(e,t,r={}){let n;return N(e,t)(i=>n=i,r),n}function N(...e){return Qi(...e)}var Qi=es;function To(e){Qi=e}function es(e,t){let r={};vr(r,e);let n=[r,...je(e)],i=typeof t=="function"?jo(n,t):$o(n,t,e);return Io.bind(null,e,t,i)}function jo(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let s=t.apply(ht([n,...e]),i);Tt(r,s)}}var ir={};function No(e,t){if(ir[e])return ir[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,s=(()=>{try{let a=new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`);return Object.defineProperty(a,"name",{value:`[Alpine] ${e}`}),a}catch(a){return et(a,t,e),Promise.resolve()}})();return ir[e]=s,s}function $o(e,t,r){let n=No(t,r);return(i=()=>{},{scope:s={},params:a=[]}={})=>{n.result=void 0,n.finished=!1;let o=ht([s,...e]);if(typeof n=="function"){let u=n(n,o).catch(l=>et(l,r,t));n.finished?(Tt(i,n.result,o,a,r),n.result=void 0):u.then(l=>{Tt(i,l,o,a,r)}).catch(l=>et(l,r,t)).finally(()=>n.result=void 0)}}}function Tt(e,t,r,n,i){if(Ot&&typeof t=="function"){let s=t.apply(r,n);s instanceof Promise?s.then(a=>Tt(e,a,r,n)).catch(a=>et(a,i,t)):e(s)}else typeof t=="object"&&t instanceof Promise?t.then(s=>e(s)):e(t)}var nn="x-";function De(e=""){return nn+e}function Ro(e){nn=e}var jt={};function S(e,t){return jt[e]=t,{before(r){if(!jt[r]){console.warn(String.raw`Cannot find directive \`${r}\`. \`${e}\` will use the default order of execution`);return}const n=ge.indexOf(r);ge.splice(n>=0?n:ge.indexOf("DEFAULT"),0,e)}}}function Lo(e){return Object.keys(jt).includes(e)}function sn(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let s=Object.entries(e._x_virtualDirectives).map(([o,u])=>({name:o,value:u})),a=ts(s);s=s.map(o=>a.find(u=>u.name===o.name)?{name:`x-bind:${o.name}`,value:`"${o.value}"`}:o),t=t.concat(s)}let n={};return t.map(as((s,a)=>n[s]=a)).filter(us).map(Bo(n,r)).sort(Do).map(s=>Fo(e,s))}function ts(e){return Array.from(e).map(as()).filter(t=>!us(t))}var mr=!1,Ge=new Map,rs=Symbol();function Po(e){mr=!0;let t=Symbol();rs=t,Ge.set(t,[]);let r=()=>{for(;Ge.get(t).length;)Ge.get(t).shift()();Ge.delete(t)},n=()=>{mr=!1,r()};e(r),n()}function ns(e){let t=[],r=o=>t.push(o),[n,i]=mo(e);return t.push(i),[{Alpine:pt,effect:n,cleanup:r,evaluateLater:N.bind(N,e),evaluate:be.bind(be,e)},()=>t.forEach(o=>o())]}function Fo(e,t){let r=()=>{},n=jt[t.type]||r,[i,s]=ns(e);Hi(e,t.original,s);let a=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),mr?Ge.get(rs).push(n):n())};return a.runCleanups=s,a}var is=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),ss=e=>e;function as(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=os.reduce((s,a)=>a(s),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var os=[];function an(e){os.push(e)}function us({name:e}){return ls().test(e)}var ls=()=>new RegExp(`^${nn}([^:^.]+)\\b`);function Bo(e,t){return({name:r,value:n})=>{let i=r.match(ls()),s=r.match(/:([a-zA-Z0-9\-_:]+)/),a=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],o=t||e[r]||r;return{type:i?i[1]:null,value:s?s[1]:null,modifiers:a.map(u=>u.replace(".","")),expression:n,original:o}}}var xr="DEFAULT",ge=["ignore","ref","data","id","anchor","bind","init","for","model","modelable","transition","show","if",xr,"teleport"];function Do(e,t){let r=ge.indexOf(e.type)===-1?xr:e.type,n=ge.indexOf(t.type)===-1?xr:t.type;return ge.indexOf(r)-ge.indexOf(n)}function Xe(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function Se(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>Se(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)Se(n,t),n=n.nextElementSibling}function D(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var Vn=!1;function Jo(){Vn&&D("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),Vn=!0,document.body||D("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` - + + @@ -62,7 +62,7 @@

Telegram Bot Playground 🤖

-
+