diff --git a/src/app/monthlychallenges/(challenges)/nov-2022/data.json b/src/app/monthlychallenges/(challenges)/nov-2022/data.json new file mode 100644 index 00000000..3439887c --- /dev/null +++ b/src/app/monthlychallenges/(challenges)/nov-2022/data.json @@ -0,0 +1,1374 @@ +[ + { + "id": "1587", + "shortDescriptionMarkDown": "List of Job Boards I used when hunting for my first dev role.", + "title": "List of Job Boards I used when hunting for jobs + few more", + "urlValue": "https://dev.to/sadiejay/list-of-job-boards-i-used-when-hunting-for-jobs-few-more-2679", + "wordCount": 61, + "topics": "job hunting", + "date": "2022-11-30", + "author": { + "id": "1576", + "fullName": "Sadie Jay", + "userYourName": "sadie_jay" + } + }, + { + "id": "1585", + "shortDescriptionMarkDown": null, + "title": "3 Small Moments That Defined My Hackathon Experience", + "urlValue": "https://dev.to/sadiejay/3-small-moments-that-defined-my-hackathon-experience-89e", + "wordCount": 1351, + "topics": "Hackathons, web developement", + "date": "2022-11-30", + "author": { + "id": "1576", + "fullName": "Sadie Jay", + "userYourName": "sadie_jay" + } + }, + { + "id": "1580", + "shortDescriptionMarkDown": "This article focuses on the concept of incrementally understanding what could be causing a bug and reducing the number of varying factors and unknowns to help one keep one's sanity.", + "title": "Debugging as a Controlled Experiment", + "urlValue": "https://jocrah.hashnode.dev/debugging-as-a-controlled-experiment", + "wordCount": 1056, + "topics": "Debugging", + "date": "2022-12-30", + "author": { + "id": "1352", + "fullName": "Joshua Ocrah", + "userYourName": "Joshua Ocrah" + } + }, + { + "id": "1572", + "shortDescriptionMarkDown": "I wrote about how I structure my writing in general last November, as part of the 14,584 words I wrote for Virtual Coffee's blogging monthly challenge. This will be my 14th blog this November, and I found myself reflecting on how I get my ideas and turn them into published technical blogs.", + "title": "Writing a Technical Blog", + "urlValue": "https://dev.to/abbeyperini/writing-a-technical-blog-79o", + "wordCount": 499, + "topics": "writing", + "date": "2022-11-30", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1569", + "shortDescriptionMarkDown": "Never trust anything a user puts into your app.", + "title": "Web Security 101 - Part 2: User Input", + "urlValue": "https://dev.to/abbeyperini/web-security-101-part-2-user-input-j20", + "wordCount": 1515, + "topics": "security", + "date": "2022-11-30", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1559", + "shortDescriptionMarkDown": "The marvels of the modern world aren't possible without the contributions of us all. YOU are important. Your role is vital. So is everyone else. Let's treat each other that way.", + "title": "Without Us", + "urlValue": "https://dev.to/justinnoel/without-us-b1c", + "wordCount": 1513, + "topics": "Life, careers, people", + "date": "2022-11-30", + "author": { + "id": "1556", + "fullName": "Justin Noel", + "userYourName": "Justin Noel" + } + }, + { + "id": "1554", + "shortDescriptionMarkDown": "List of advent code challenges.", + "title": "2022 Advent Code Challenges", + "urlValue": "https://dev.to/jarvisscript/2022-advent-code-challenges-5445", + "wordCount": 879, + "topics": "Advent code challenges", + "date": "2022-11-30", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1551", + "shortDescriptionMarkDown": "In this article, I will walk through my initial points of fear and the steps I took to break through to the other side of joy.", + "title": "How I overcame the fear of learning something new and embraced the joy of learning", + "urlValue": "https://dev.to/codergirl1991/how-i-overcame-the-fear-of-learning-something-new-and-embraced-the-joy-of-learning-315i", + "wordCount": 577, + "topics": "learning", + "date": "2022-11-29", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1547", + "shortDescriptionMarkDown": "In this article, I will outline what I believe to be mistakes you should avoid making on your resumes.", + "title": "Common mistakes that developers make on resumes", + "urlValue": "https://dev.to/codergirl1991/common-mistakes-that-developers-make-on-resumes-1d00", + "wordCount": 1068, + "topics": "career", + "date": "2022-11-29", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1544", + "shortDescriptionMarkDown": "In this article, I will walk you through some methods I use to deal with imposter syndrome that will hopefully help you in your life.", + "title": "Developer Health: Tips for dealing with workplace anxieties and imposter syndrome", + "urlValue": "https://dev.to/codergirl1991/developer-health-tips-for-dealing-with-workplace-anxieties-and-imposter-syndrome-4i46", + "wordCount": 555, + "topics": "developer health", + "date": "2022-11-29", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1537", + "shortDescriptionMarkDown": null, + "title": "My Virtual Meeting Survival Strategies", + "urlValue": "https://dev.to/lillchan/my-virtual-meeting-survival-strategies-27oa", + "wordCount": 838, + "topics": null, + "date": "2022-11-29", + "author": { + "id": "1534", + "fullName": "Lillian Chan", + "userYourName": "Lillian Chan" + } + }, + { + "id": "1532", + "shortDescriptionMarkDown": "https://dev.to/abbeyperini/web-security-101-part-1-secrets-5e39", + "title": "Web Security 101 - Part 1: Secrets", + "urlValue": "https://dev.to/abbeyperini/web-security-101-part-1-secrets-5e39", + "wordCount": 1234, + "topics": "https://dev.to/abbeyperini/web-security-101-part-1-secrets-5e39", + "date": "2022-11-29", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1529", + "shortDescriptionMarkDown": null, + "title": "What Makes You Stay In A Community?", + "urlValue": "https://dev.to/adiatiayu/what-makes-you-stay-in-a-community-4go", + "wordCount": 673, + "topics": null, + "date": "2022-11-30", + "author": { + "id": "856", + "fullName": "Ayu Adiati", + "userYourName": null + } + }, + { + "id": "1524", + "shortDescriptionMarkDown": "The more I read about digital gardens, the more I wanted to build one, so I started drawing plants.", + "title": "About My Digital Garden", + "urlValue": "https://dev.to/abbeyperini/about-my-digital-garden-2o4h", + "wordCount": 514, + "topics": "digital garden", + "date": "2022-11-29", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1522", + "shortDescriptionMarkDown": "A list of tools you can use with git to make your life easier.", + "title": "#gitPanic - Tools", + "urlValue": "https://dev.to/abbeyperini/gitpanic-tools-4bbl", + "wordCount": 1155, + "topics": "git", + "date": "2022-11-29", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1518", + "shortDescriptionMarkDown": null, + "title": "how to: set up unique ssh keys per client", + "urlValue": "https://blog.spinthemoose.com/2022/11/20/how-to-configure-unique-ssh-keys-per-client/", + "wordCount": 495, + "topics": "git", + "date": "2022-11-20", + "author": { + "id": "1459", + "fullName": "David Alpert", + "userYourName": "David Alpert" + } + }, + { + "id": "1513", + "shortDescriptionMarkDown": "An article about the importance of boundaries to pursue goals/personal growth.", + "title": "Learning to Code Taught Me the Importance of Boundaries", + "urlValue": "https://dev.to/adnerdable/learning-to-code-taught-me-the-importance-of-boundaries-1odm", + "wordCount": 602, + "topics": "Mental health, adult learners, beginners", + "date": "2022-11-19", + "author": { + "id": "1414", + "fullName": "Aishe Ibrahim", + "userYourName": "Aishe Ibrahim" + } + }, + { + "id": "1508", + "shortDescriptionMarkDown": "some rumination on nearly four decades of coding", + "title": "I've Been Writing Code for 37 Years...", + "urlValue": "https://blog.spinthemoose.com/2022/11/27/ive-been-writing-code-for-37-years/", + "wordCount": 806, + "topics": "writing, coding", + "date": "2022-11-27", + "author": { + "id": "1459", + "fullName": "David Alpert", + "userYourName": "David Alpert" + } + }, + { + "id": "1505", + "shortDescriptionMarkDown": "A cyclical approach to job hunting and goals, based on the double-hit song \"Back At One\". Keeping things hip with references to 22-year-old songs.", + "title": "A Chart-Topping Approach To Your Job Search", + "urlValue": "https://dev.to/juliaseid/back-at-one-a-chart-topping-approach-to-your-job-search-11nd", + "wordCount": 1092, + "topics": "Career, developer health, Brian McKnight", + "date": "2022-11-29", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1500", + "shortDescriptionMarkDown": null, + "title": "7 Supportive Tech Communities You Want To Be Part Of", + "urlValue": "https://adiati.com/7-supportive-tech-communities-you-want-to-be-part-of", + "wordCount": 1125, + "topics": null, + "date": "2022-11-29", + "author": { + "id": "856", + "fullName": "Ayu Adiati", + "userYourName": null + } + }, + { + "id": "1494", + "shortDescriptionMarkDown": "https://blog.caitlinfloyd.com/learning-to-code-as-a-form-of-language-learning", + "title": "Learning to Code as a Form of Language Learning", + "urlValue": "https://blog.caitlinfloyd.com/learning-to-code-as-a-form-of-language-learning", + "wordCount": 1457, + "topics": "https://blog.caitlinfloyd.com/learning-to-code-as-a-form-of-language-learning", + "date": "2022-11-28", + "author": { + "id": "1230", + "fullName": "Caitlin Floyd", + "userYourName": "Caitlin Floyd" + } + }, + { + "id": "1491", + "shortDescriptionMarkDown": null, + "title": "My Experience with Chingu", + "urlValue": "https://klescode.hashnode.dev/my-experience-with-chingu", + "wordCount": 1303, + "topics": "Gaining experience as an early career developer", + "date": "2022-11-28", + "author": { + "id": "1488", + "fullName": "Klesta Luli", + "userYourName": "Klesta Luli" + } + }, + { + "id": "1484", + "shortDescriptionMarkDown": "My experiences over the past two years surfaced six principles for live co-working that maximize the value - and minimize the time investment.", + "title": "Live Co-Working: Six Keys to Success", + "urlValue": "https://sustained.substack.com/p/live-co-working-six-keys-to-success", + "wordCount": 1400, + "topics": "coworking", + "date": "2022-11-23", + "author": { + "id": "854", + "fullName": "Ray Deck", + "userYourName": null + } + }, + { + "id": "1480", + "shortDescriptionMarkDown": "In this blog, learn how to migrate your React project to TypeScript to maintain readability, consistency, and dependability. Read more here!", + "title": "How to Migrate your React Project to TypeScript", + "urlValue": "https://blog.deepgram.com/how-to-migrate-your-react-project-to-typescript/", + "wordCount": 1151, + "topics": "TypeScript", + "date": "2022-11-28", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1476", + "shortDescriptionMarkDown": "Weekly motivation and goal setting.", + "title": "What are your goals for the week of November 28?", + "urlValue": "https://dev.to/jarvisscript/what-are-your-goals-for-the-week-of-november-28-4akl", + "wordCount": 230, + "topics": "Motivation, Accountability", + "date": "2022-11-28", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1471", + "shortDescriptionMarkDown": "Steps to consider after getting the first job in tech.", + "title": "Now What : How To Keep Learning after Landing the 1st Tech job", + "urlValue": "https://dev.to/nerajno/now-what-how-to-keep-learning-after-landing-the-1st-tech-job-3nhj", + "wordCount": 1050, + "topics": "learning, career, job, careerdevelopment", + "date": "2022-11-27", + "author": { + "id": "1468", + "fullName": "Nerando Johnson", + "userYourName": "Nerando Johnson" + } + }, + { + "id": "1464", + "shortDescriptionMarkDown": "Since I was so good at procrastinating I wrote a short post to own that and prod myself into writing for real.", + "title": "Why You Should Write Anyway", + "urlValue": "https://blog.spinthemoose.com/2022/11/26/why-you-should-write-anyway/", + "wordCount": 398, + "topics": "writing", + "date": "2022-11-26", + "author": { + "id": "1459", + "fullName": "David Alpert", + "userYourName": "David Alpert" + } + }, + { + "id": "1462", + "shortDescriptionMarkDown": "While resurrecting and continuing my series on git fundamentals I discovered and published 10 old draft posts from as far back as 2009.", + "title": "Publishing Old Drafts", + "urlValue": "https://blog.spinthemoose.com/2022/11/25/publishing-old-drafts/", + "wordCount": 47, + "topics": "random, process, collaboration, throughput, ux", + "date": "2022-11-25", + "author": { + "id": "1459", + "fullName": "David Alpert", + "userYourName": "David Alpert" + } + }, + { + "id": "1457", + "shortDescriptionMarkDown": null, + "title": "#GettingBetter at Interviews: Important Q's to Ask During your Developer Job Interview", + "urlValue": "https://dev.to/danitcodes/important-qs-to-ask-during-your-junior-developer-job-interview-844", + "wordCount": 1637, + "topics": null, + "date": "2022-11-27", + "author": { + "id": "1311", + "fullName": "Danielle Thompson", + "userYourName": "Danielle Thompson" + } + }, + { + "id": "1453", + "shortDescriptionMarkDown": "Feedback helps us all to grow, and that's why it should be built into our processes.", + "title": "We All Need Good Feedback", + "urlValue": "https://dev.to/bekahhw/we-all-need-good-feedback-kgd", + "wordCount": 752, + "topics": "career", + "date": "2022-11-28", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1451", + "shortDescriptionMarkDown": null, + "title": "Getting Better at Recognizing your Accomplishments as Junior Developer (and Beyond)", + "urlValue": "https://dev.to/danitcodes/getting-better-at-recognizing-your-accomplishments-as-junior-developer-and-beyond-4goa", + "wordCount": 1482, + "topics": null, + "date": "2022-11-27", + "author": { + "id": "1311", + "fullName": "Danielle Thompson", + "userYourName": "Danielle Thompson" + } + }, + { + "id": "1448", + "shortDescriptionMarkDown": "JWT Authentication with tRPC", + "title": "Implementing JWT Authentication with TRPC and Express", + "urlValue": "https://temitayoogunsusi.hashnode.dev/implementing-jwt-authentication-with-trpc-and-express", + "wordCount": 1956, + "topics": "Authentication", + "date": "2022-11-26", + "author": { + "id": "1443", + "fullName": "Temitayo Ogunsusi", + "userYourName": "Temitayo Ogunsusi" + } + }, + { + "id": "1439", + "shortDescriptionMarkDown": "https://adiati.com/planning-and-tracking-projects-with-githubs-projects-tool", + "title": "Planning And Tracking Projects With GitHub's Projects Tool", + "urlValue": "https://adiati.com/planning-and-tracking-projects-with-githubs-projects-tool", + "wordCount": 1357, + "topics": "https://adiati.com/planning-and-tracking-projects-with-githubs-projects-tool", + "date": "2022-11-26", + "author": { + "id": "856", + "fullName": "Ayu Adiati", + "userYourName": null + } + }, + { + "id": "1436", + "shortDescriptionMarkDown": "Let's learn about the differences between useRef vs useState and uncontrolled vs controlled components!", + "title": "A Look at React Hooks: useRef vs useState", + "urlValue": "https://lo-victoria.com/a-look-at-react-hooks-useref-vs-usestate", + "wordCount": 700, + "topics": "react, web developement", + "date": "2022-11-18", + "author": { + "id": "1206", + "fullName": "Victoria Lo", + "userYourName": "Victoria Lo" + } + }, + { + "id": "1434", + "shortDescriptionMarkDown": "3 Simple Ways to Make Your Blog More Readable", + "title": "3 Simple Ways to Make Your Blog More Readable", + "urlValue": "https://www.showwcase.com/show/18703/3-simple-ways-to-make-your-blog-more-readable", + "wordCount": 714, + "topics": "blogging", + "date": "2022-11-26", + "author": { + "id": "1206", + "fullName": "Victoria Lo", + "userYourName": "Victoria Lo" + } + }, + { + "id": "1431", + "shortDescriptionMarkDown": "Use Obsidian and dataview to pull together notes for a weekly summary.", + "title": "Aggregating Weekly Notes With Obsidian and Dataview", + "urlValue": "https://brianmeeker.me/2022/11/25/aggregating-weekly-notes-with-obsidian-and-dataview/", + "wordCount": 716, + "topics": "obsidian, dataview", + "date": "2022-11-25", + "author": { + "id": "1406", + "fullName": "Brian Meeker", + "userYourName": "Brian Meeker" + } + }, + { + "id": "1427", + "shortDescriptionMarkDown": "As I evaluate my own performance over the last year and set goals for my next year as a Technical Community Builder, I wanted to share how I’ve broken down my self-evaluation and goal setting. I don’t think you need to be on a DevRel team to find this useful.", + "title": "Career Goal Setting", + "urlValue": "https://dev.to/bekahhw/career-goal-setting-3c6o", + "wordCount": 1707, + "topics": "career", + "date": "2022-11-26", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1425", + "shortDescriptionMarkDown": "In this article, I wanted to explore this a little bit and leave my thoughts on how much you should study after work.", + "title": "Should developers study 20 hours a week after work?", + "urlValue": "https://dev.to/codergirl1991/should-developers-study-20-hours-a-week-after-work-6no", + "wordCount": 614, + "topics": "career", + "date": "2022-11-25", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1422", + "shortDescriptionMarkDown": null, + "title": "Tips on Hosting a Twitter Space", + "urlValue": "https://dev.to/bekahhw/tips-on-hosting-a-twitter-space-78h", + "wordCount": 805, + "topics": "DevRel", + "date": "2022-11-25", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1412", + "shortDescriptionMarkDown": "In this article, I will show you my writing process and provide some tools that have helped me along the way.", + "title": "How to get started with technical writing - An inside look into my writing process", + "urlValue": "https://dev.to/codergirl1991/how-to-get-started-with-technical-writing-an-inside-look-into-my-writing-process-1jdl", + "wordCount": 1597, + "topics": "technical writing", + "date": "2022-11-23", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1409", + "shortDescriptionMarkDown": "How to stop Docker containers from the CLI if you only know part of the name", + "title": "Stopping Docker Containers By Partial Name", + "urlValue": "https://brianmeeker.me/2022/11/23/stopping-docker-containers-by-partial-name/", + "wordCount": 226, + "topics": "docker", + "date": "2022-11-23", + "author": { + "id": "1406", + "fullName": "Brian Meeker", + "userYourName": "Brian Meeker" + } + }, + { + "id": "1402", + "shortDescriptionMarkDown": "The best way to practice your JavaScript skills is to build small projects. In this article we will build a small app that takes in a sentence and reverses it.", + "title": "Beginner JavaScript Project: How to reverse a sentence and display it on screen", + "urlValue": "https://dev.to/codergirl1991/beginner-javascript-project-how-to-reverse-a-sentence-and-display-it-on-screen-4d03", + "wordCount": 2029, + "topics": "javascript", + "date": "2022-11-23", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1398", + "shortDescriptionMarkDown": "https://adiati.com/audio-media-accessibility-how-to-improve-audio-media-transcriptions", + "title": "Audio Media Accessibility: How To Improve Audio Media Transcriptions", + "urlValue": "https://adiati.com/audio-media-accessibility-how-to-improve-audio-media-transcriptions", + "wordCount": 1191, + "topics": "https://adiati.com/audio-media-accessibility-how-to-improve-audio-media-transcriptions", + "date": "2022-11-23", + "author": { + "id": "856", + "fullName": "Ayu Adiati", + "userYourName": null + } + }, + { + "id": "1390", + "shortDescriptionMarkDown": "Black Friday sales", + "title": "2022 Black Friday Sales for Developers", + "urlValue": "https://dev.to/jarvisscript/2022-black-friday-sales-for-developers-4dmh", + "wordCount": 927, + "topics": "Black Friday sales", + "date": "2022-11-23", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1385", + "shortDescriptionMarkDown": "I only learned about these commands because I was complaining about git not reliably tracking changes to files I made in the GUI (Finder, VS Code). Turns out git will always track file name changes, moving files, and deleting files ...if you tell it about them.", + "title": "#gitPanic - Files", + "urlValue": "https://dev.to/abbeyperini/gitpanic-files-3g83", + "wordCount": 474, + "topics": "git", + "date": "2022-11-22", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1381", + "shortDescriptionMarkDown": "When you think you've lost work, don't #gitPanic. As far as your commit history goes, git may as well be Ironborn, repeating \"what is dead may never die.\"", + "title": "#gitPanic - Removing and Restoring Work", + "urlValue": "https://virtual-coffee-group.slack.com/archives/C01GN2TLLC8/p1669152094152769", + "wordCount": 1832, + "topics": "git", + "date": "2022-11-22", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1378", + "shortDescriptionMarkDown": "Some motivation and goal-setting advice from Peloton instructors, tailored to dev life :)", + "title": "What Peloton Instructors Taught Me About Being a Dev", + "urlValue": "https://dev.to/juliaseid/what-peloton-instructors-taught-me-about-being-a-dev-3ap3", + "wordCount": 1827, + "topics": "developer health, learning", + "date": "2022-11-22", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1373", + "shortDescriptionMarkDown": "Let’s stop having bad meetings and dive into ways to make our meetings better.", + "title": "Making Better Meetings", + "urlValue": "https://dev.to/bekahhw/making-better-meetings-469m", + "wordCount": 1318, + "topics": null, + "date": "2022-11-22", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1368", + "shortDescriptionMarkDown": null, + "title": "Frontend Architecture and tooling that will lead to a more resilient codebase", + "urlValue": "https://dev.to/chad_r_stewart/frontend-architecture-and-tooling-that-will-lead-to-a-more-resilient-codebase-7ib", + "wordCount": 1962, + "topics": "architecture, front-end", + "date": "2022-10-24", + "author": { + "id": "1297", + "fullName": "Chad Stewart", + "userYourName": "Chad R. Stewart" + } + }, + { + "id": "1366", + "shortDescriptionMarkDown": null, + "title": "Making Progress: How I've learned to move towards my goals", + "urlValue": "https://dev.to/chad_r_stewart/making-progress-how-ive-learned-to-move-towards-my-goals-2jnl", + "wordCount": 2765, + "topics": "career, self improvement", + "date": "2022-11-17", + "author": { + "id": "1297", + "fullName": "Chad Stewart", + "userYourName": "Chad R. Stewart" + } + }, + { + "id": "1362", + "shortDescriptionMarkDown": "This is the first article in the series The Human Aspect of Debugging Code. It addresses how to handle assumptions and hunches when trying to find the cause of a code malfunction.", + "title": "Debugging: Navigating Hunches and Assumptions", + "urlValue": "https://jocrah.hashnode.dev/navigating-hunches-and-assumptions-when-debugging", + "wordCount": 1218, + "topics": "Debugging, Development", + "date": "2022-11-21", + "author": { + "id": "1352", + "fullName": "Joshua Ocrah", + "userYourName": "Joshua Ocrah" + } + }, + { + "id": "1359", + "shortDescriptionMarkDown": "https://dev.to/jarvisscript/what-are-your-goals-for-the-week-of-november-21-1gmm", + "title": "What are your goals for the week of November 21?", + "urlValue": "https://dev.to/jarvisscript/what-are-your-goals-for-the-week-of-november-21-1gmm", + "wordCount": 220, + "topics": "https://dev.to/jarvisscript/what-are-your-goals-for-the-week-of-november-21-1gmm", + "date": "2022-11-21", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1356", + "shortDescriptionMarkDown": "Hackathon competitions are like mini-product sprints. I've learned lessons about shipping faster from participating in a handful this year.", + "title": "Lessons from Winning Five Hackathons", + "urlValue": "https://sustained.substack.com/p/lessons-from-winning-five-hackathons", + "wordCount": 1310, + "topics": "Hackathons", + "date": "2022-11-21", + "author": { + "id": "854", + "fullName": "Ray Deck", + "userYourName": null + } + }, + { + "id": "1348", + "shortDescriptionMarkDown": "Maybe you’ve been thinking about speaking at a conference, but you’re nervous. Hopefully, this blog post will help you discover an idea and/or overcome the fear of submitting.", + "title": "Writing Your First Conference Proposal", + "urlValue": "https://dev.to/bekahhw/writing-your-first-conference-proposal-4jei", + "wordCount": 1248, + "topics": "DevRel", + "date": "2022-11-20", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1345", + "shortDescriptionMarkDown": "Asking questions is a developer superpower. Many new devs are often hesitant to ask questions though!", + "title": "Questions are a Developer Superpower", + "urlValue": "https://dev.to/alexcurtisslep/questions-are-a-developer-superpower-120o", + "wordCount": 425, + "topics": "questions, developer questions", + "date": "2022-11-18", + "author": { + "id": "1342", + "fullName": "Alex Curtis-Slep", + "userYourName": "Alex Curtis-Slep" + } + }, + { + "id": "1340", + "shortDescriptionMarkDown": null, + "title": "Mastodon Tips", + "urlValue": "https://dev.to/jarvisscript/mastodon-tips-6p8", + "wordCount": 367, + "topics": "Mastodon tips", + "date": "2022-11-20", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1337", + "shortDescriptionMarkDown": "In this article, I will walk you through how to create your own Mad Libs using HTML, CSS and JavaScript.", + "title": "Beginner JavaScript Tutorial: How to build your own Mad Libs game", + "urlValue": "https://dev.to/codergirl1991/beginner-javascript-tutorial-how-to-build-your-own-mad-libs-game-4hf8", + "wordCount": 3478, + "topics": "javascript", + "date": "2022-11-20", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1334", + "shortDescriptionMarkDown": "https://www.iamdeveloper.com/blog/have-you-moved-from-twitter-to-mastodon-for-social-media-4a37/", + "title": "Have you moved from Twitter to Mastodon for social media?", + "urlValue": "https://www.iamdeveloper.com/blog/have-you-moved-from-twitter-to-mastodon-for-social-media-4a37/", + "wordCount": 286, + "topics": "https://www.iamdeveloper.com/blog/have-you-moved-from-twitter-to-mastodon-for-social-media-4a37/", + "date": "2022-11-20", + "author": { + "id": "1172", + "fullName": "Nick Taylor", + "userYourName": "Nick Taylor" + } + }, + { + "id": "1330", + "shortDescriptionMarkDown": "Documentation in Github goes far beyond a repo README.", + "title": "#gitPanic - Documentation and Profiles", + "urlValue": "https://dev.to/abbeyperini/gitpanic-documentation-and-profiles-1end", + "wordCount": 946, + "topics": "GitHub", + "date": "2022-11-18", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1326", + "shortDescriptionMarkDown": "I participated in my first hackathon! It's funny, I've run hackathons before, but I've never been a part of one. This is an internal hackathon for Deepgram, and we were paired with people from different teams.", + "title": "Speech Racer: My first hackathon project", + "urlValue": "https://dev.to/bekahhw/speech-racer-my-first-hackathon-project-2ona", + "wordCount": 1105, + "topics": "DevRel", + "date": "2022-11-18", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1322", + "shortDescriptionMarkDown": "https://dev.to/abbeyperini/gitpanic-stash-4gll", + "title": "#gitPanic - Stash", + "urlValue": "https://dev.to/abbeyperini/gitpanic-stash-4gll", + "wordCount": 1061, + "topics": "https://dev.to/abbeyperini/gitpanic-stash-4gll", + "date": "2022-11-17", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1314", + "shortDescriptionMarkDown": null, + "title": "Getting Better at PRs and Code Reviews as a Junior Developer", + "urlValue": "https://dev.to/danitcodes/getting-better-at-prs-and-code-reviews-as-a-junior-developer-1i9a", + "wordCount": 2257, + "topics": null, + "date": "2022-11-16", + "author": { + "id": "1311", + "fullName": "Danielle Thompson", + "userYourName": "Danielle Thompson" + } + }, + { + "id": "1309", + "shortDescriptionMarkDown": "https://dev.to/abbeyperini/gitpanic-interactive-rebase-48fe", + "title": "#gitPanic - Interactive Rebase", + "urlValue": "https://dev.to/abbeyperini/gitpanic-interactive-rebase-48fe", + "wordCount": 2162, + "topics": "https://dev.to/abbeyperini/gitpanic-interactive-rebase-48fe", + "date": "2022-11-16", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1304", + "shortDescriptionMarkDown": "Understanding HEAD and refs helps with reading git logs and using git commands.", + "title": "#gitPanic - HEAD", + "urlValue": "https://dev.to/abbeyperini/gitpanic-head-37m8", + "wordCount": 695, + "topics": "git", + "date": "2022-11-16", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1301", + "shortDescriptionMarkDown": "The minimum setup required to run scripts written in typescript, without compiling them to js. Then connecting those to the built in VScode task machinery so you can execute them without leaving your browser.", + "title": "Scripting With VSCODE Tasks and Typescript", + "urlValue": "https://dev.to/kirkcodes/scripting-with-vscode-tasks-and-typescript-38h7", + "wordCount": 2300, + "topics": "typescript, scripting, vscode, automation, node", + "date": "2022-11-16", + "author": { + "id": "162", + "fullName": "Kirk Shillingford", + "userYourName": null + } + }, + { + "id": "1295", + "shortDescriptionMarkDown": null, + "title": "Why Do You Do It That Way? How To Share Your Technical Opinions So People Will Listen", + "urlValue": "https://dev.to/juliaseid/why-do-you-do-it-that-wayhow-to-share-your-technical-opinions-so-people-will-listen-487j", + "wordCount": 1626, + "topics": "writing", + "date": "2022-11-15", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1293", + "shortDescriptionMarkDown": "I'm making my writing guides public!", + "title": "I Want To Help You Write!", + "urlValue": "https://dev.to/juliaseid/i-want-to-help-you-write-2aj5", + "wordCount": 319, + "topics": "writing, community", + "date": "2022-11-15", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1291", + "shortDescriptionMarkDown": "This is one of the guides I shared in the monthly challenge kickoff - I figured I'd make it public!", + "title": "How Did You Build That? Tell A Great Technical Story", + "urlValue": "https://dev.to/juliaseid/how-did-you-build-that-tell-a-great-technical-story-40f6", + "wordCount": 1517, + "topics": "writing, learning", + "date": "2022-11-15", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1288", + "shortDescriptionMarkDown": "We practice for progress, not perfection - so start writing!", + "title": "Developers Should Write Because...", + "urlValue": "https://dev.to/juliaseid/developers-should-write-because-35h2", + "wordCount": 960, + "topics": "writing, developer health, learning", + "date": "2022-11-10", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1286", + "shortDescriptionMarkDown": "A reflection on why I'm grateful to work in tech. I hope others will share their reasons, too!", + "title": "Gratitude in Tough Times", + "urlValue": "https://dev.to/juliaseid/gratitude-in-tough-times-34k1", + "wordCount": 613, + "topics": "developer health, gratitude, mental health, inclusion, learning", + "date": "2022-11-15", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1284", + "shortDescriptionMarkDown": "I'm a regular contributor to Stoplight.io's API design blog. They don't have a search feature, but if you go back through the archives, you'll see lots of my work. If you're interested in API security, I've written several articles on it in the last year!", + "title": "A DIYer's Guide To API Tools", + "urlValue": "https://blog.stoplight.io/a-diyers-guide-to-api-tools", + "wordCount": 1430, + "topics": null, + "date": "2022-11-15", + "author": { + "id": "169", + "fullName": "Julia Seidman", + "userYourName": null + } + }, + { + "id": "1281", + "shortDescriptionMarkDown": "Learn 3 key elements of a spicy, succinct abstract.", + "title": "Three Things I've Learned About Writing Abstracts", + "urlValue": "https://luciacerchie.dev/blog/three-things-ive-learned-about-writing-abstracts", + "wordCount": 768, + "topics": "devrel, beginners, writing", + "date": "2022-10-15", + "author": { + "id": "1149", + "fullName": "Lucia Cerchie", + "userYourName": "Lucia Cerchie" + } + }, + { + "id": "1276", + "shortDescriptionMarkDown": "https://adiati.com/i-learned-about-audio-accessibility-and-more-from-improving-tech-podcast-transcriptions", + "title": "I Learned About Audio Accessibility (And More!) From Improving Tech Podcast Transcriptions", + "urlValue": "https://adiati.com/i-learned-about-audio-accessibility-and-more-from-improving-tech-podcast-transcriptions", + "wordCount": 1182, + "topics": "https://adiati.com/i-learned-about-audio-accessibility-and-more-from-improving-tech-podcast-transcriptions", + "date": "2022-11-14", + "author": { + "id": "856", + "fullName": "Ayu Adiati", + "userYourName": null + } + }, + { + "id": "1273", + "shortDescriptionMarkDown": "A set of tips on how to ask for help and do so effectively, in both synchronous and asynchronous work environments", + "title": "Effectively Asking for Help as a Software Developer", + "urlValue": "https://ramonh.dev/2022/11/13/asking-for-help/", + "wordCount": 1109, + "topics": "Collaboration, Core Skills, Open Source", + "date": "2022-11-13", + "author": { + "id": "1270", + "fullName": "Ramón Huidobro", + "userYourName": "Ramón Huidobro" + } + }, + { + "id": "1268", + "shortDescriptionMarkDown": null, + "title": "This Week in DevRel: Planning and Progress", + "urlValue": "https://dev.to/bekahhw/this-week-in-devrel-planning-and-progress-1k0k", + "wordCount": 951, + "topics": "devrel", + "date": "2022-11-11", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1264", + "shortDescriptionMarkDown": null, + "title": "What are your goals for the week of November 7?", + "urlValue": "https://dev.to/jarvisscript/what-are-your-goals-for-the-week-117-4ing", + "wordCount": 174, + "topics": "Motivation, Accountability", + "date": "2022-11-07", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1262", + "shortDescriptionMarkDown": "Post to encourage setting and working on goals.", + "title": "What are your goals for the week?", + "urlValue": "https://dev.to/jarvisscript/what-are-your-goals-for-the-week-1114-432c", + "wordCount": 185, + "topics": "Motivation", + "date": "2022-11-14", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1259", + "shortDescriptionMarkDown": "A write up on an app I wrote to pull down your Revue newsletters", + "title": "App to grab your Revue newsletters", + "urlValue": "https://www.iamdeveloper.com/blog/app-to-grab-your-revue-newsletters-1gci/", + "wordCount": 215, + "topics": "serverless,html,typescript,webdev", + "date": "2022-11-13", + "author": { + "id": "1172", + "fullName": "Nick Taylor", + "userYourName": "Nick Taylor" + } + }, + { + "id": "1256", + "shortDescriptionMarkDown": "As an open source maintainer, I love to work with new contributors and see the community grow in a positive way. But as I start to get more involved with open source projects, I have noticed a few common mistakes made by new contributors.\n\nIn this blog post, I will go over 7 commonly made mistakes by new contributors in open source projects.", + "title": "7 common mistakes new contributors make in Open Source Software", + "urlValue": "https://dev.to/codergirl1991/7-common-mistakes-new-contributors-make-in-open-source-software-2noo", + "wordCount": 1173, + "topics": "open source", + "date": "2022-11-12", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1252", + "shortDescriptionMarkDown": "Maintaining a project for Hacktoberfest", + "title": "My first HacktoberFest as a Maintainer", + "urlValue": "https://dev.to/jarvisscript/my-first-hacktoberfest-as-a-maintainer-51j1", + "wordCount": 780, + "topics": "HacktoberFest", + "date": "2022-11-11", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1248", + "shortDescriptionMarkDown": "https://dev.to/drewclem/notes-on-typescript-1p37-temp-slug-4263269?preview=7f0c285e79e4b4875a6f65fbb025ee63e74f5f024d8ce26e68d3fb34508644a920eda91c06fdcf5706f758d70b93c0a1ecb5f67438d0557df3cfe4cd", + "title": "Typescript Notes", + "urlValue": "https://dev.to/drewclem/notes-on-typescript-1p37-temp-slug-4263269?preview=7f0c285e79e4b4875a6f65fbb025ee63e74f5f024d8ce26e68d3fb34508644a920eda91c06fdcf5706f758d70b93c0a1ecb5f67438d0557df3cfe4cd", + "wordCount": 333, + "topics": "https://dev.to/drewclem/notes-on-typescript-1p37-temp-slug-4263269?preview=7f0c285e79e4b4875a6f65fbb025ee63e74f5f024d8ce26e68d3fb34508644a920eda91c06fdcf5706f758d70b93c0a1ecb5f67438d0557df3cfe4cd", + "date": "2022-11-10", + "author": { + "id": "1245", + "fullName": "Drew Clements", + "userYourName": "Drew Clements" + } + }, + { + "id": "1243", + "shortDescriptionMarkDown": "A short post showing an example of a small generic type I use sometimes when writing Typescript to improve intellisense and my developer experience by revealing the shape of Objects and Unions", + "title": "Revealing Compound Types in Typescript", + "urlValue": "https://dev.to/kirkcodes/revealing-compound-types-in-typescript-2ic8", + "wordCount": 1000, + "topics": "Typescript Developer Experience", + "date": "2022-11-10", + "author": { + "id": "162", + "fullName": "Kirk Shillingford", + "userYourName": null + } + }, + { + "id": "1237", + "shortDescriptionMarkDown": "https://adiati.com/collective-nanowrimo-lets-write-together", + "title": "Collective NaNoWriMo: Let's Write Together!", + "urlValue": "https://adiati.com/collective-nanowrimo-lets-write-together", + "wordCount": 891, + "topics": "https://adiati.com/collective-nanowrimo-lets-write-together", + "date": "2022-11-09", + "author": { + "id": "856", + "fullName": "Ayu Adiati", + "userYourName": null + } + }, + { + "id": "1228", + "shortDescriptionMarkDown": "Another Hacktoberfest has come and gone!\n\nThis was Virtual Coffee's third Hacktoberfest (🤯) and it was another great one! Our members knocked it out of the park as usual, and we wanted to take a moment to celebrate!", + "title": "Virtual Coffee Hacktoberfest 2022 Roundup", + "urlValue": "https://dev.to/virtualcoffee/virtual-coffee-hacktoberfest-2022-roundup-1c2k", + "wordCount": 507, + "topics": "Open Source, Hacktoberfest", + "date": "2022-11-02", + "author": { + "id": "1143", + "fullName": null, + "userYourName": "Dan Ott" + } + }, + { + "id": "1219", + "shortDescriptionMarkDown": "This is my Community 101 reading and listening list. Each of these provides the basics of community building and then goes in-depth to help community builders discover more about the community experience", + "title": "Reading List: The Community Builder Edition", + "urlValue": "https://dev.to/bekahhw/reading-list-the-community-builder-edition-3d2h", + "wordCount": 705, + "topics": "DevRel", + "date": "2022-11-09", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1215", + "shortDescriptionMarkDown": "Let's learn about Vite tool and why it is a developer's favourite these days!", + "title": "Introduction to Vite: The Next Generation Frontend Tooling", + "urlValue": "https://victoria2666.medium.com/introduction-to-vite-the-next-generation-frontend-tooling-f38063873f99", + "wordCount": 660, + "topics": "Web development", + "date": "2022-11-08", + "author": { + "id": "1206", + "fullName": "Victoria Lo", + "userYourName": "Victoria Lo" + } + }, + { + "id": "1213", + "shortDescriptionMarkDown": "Here's what you can do to integration PayPal checkout in your mobile apps", + "title": "The Complete Guide to Integrate a Payment Processor in Mobile Apps", + "urlValue": "https://victoria2666.medium.com/the-complete-guide-to-integrate-paypal-in-mobile-apps-4b0b5f778c07", + "wordCount": 2052, + "topics": "Mobile app development", + "date": "2022-11-09", + "author": { + "id": "1206", + "fullName": "Victoria Lo", + "userYourName": "Victoria Lo" + } + }, + { + "id": "1210", + "shortDescriptionMarkDown": "Import maps: Enhancing the developer experience for importing libraries", + "title": "Import Maps 101", + "urlValue": "https://lo-victoria.com/import-maps-101", + "wordCount": 929, + "topics": "front end", + "date": "2022-11-04", + "author": { + "id": "1206", + "fullName": "Victoria Lo", + "userYourName": "Victoria Lo" + } + }, + { + "id": "1203", + "shortDescriptionMarkDown": "When I started my current role, I had been using git in a professional setting, but not Github. I was surprised to find out how much I had to interact with other developers to get my code deployed. Let's talk about expectations when working with other developers in a repo.", + "title": "#gitPanic - Working in a Repo", + "urlValue": "https://dev.to/abbeyperini/gitpanic-working-in-a-repo-1chg", + "wordCount": 1992, + "topics": "github, git", + "date": "2022-11-08", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1192", + "shortDescriptionMarkDown": "A recap of my commits from HacktoberFest 2022.", + "title": "HacktoberFest Review", + "urlValue": "https://dev.to/jarvisscript/hacktoberfest-review-38e3", + "wordCount": 766, + "topics": "HacktoberFest", + "date": "2022-11-03", + "author": { + "id": "1189", + "fullName": "Chris Jarvis", + "userYourName": "Chris Jarvis" + } + }, + { + "id": "1187", + "shortDescriptionMarkDown": "In this article, I have created a study guide for the freeCodeCamp curriculum's entire Learn Basic CSS by Building a Cafe Menu practice project. This study guide is filled with additional information, articles, and videos to help you understand the concepts better.", + "title": "Learn CSS – Responsive Web Design Study Guide", + "urlValue": "https://www.freecodecamp.org/news/learn-css/", + "wordCount": 4000, + "topics": "CSS", + "date": "2022-11-07", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1185", + "shortDescriptionMarkDown": "This month long Hacktoberfest journey has been crazy, productive, fun and educational. Here are all of the things that I learned during Hackotberfest 2022.", + "title": "What I Learned from Maintaining a Repo During Hacktoberfest and Merging 356 PRs", + "urlValue": "https://www.freecodecamp.org/news/what-i-learned-as-a-hacktoberfest-repo-maintainer/", + "wordCount": 1756, + "topics": "hacktoberfest", + "date": "2022-11-02", + "author": { + "id": "1182", + "fullName": "Jessica Wilkins", + "userYourName": "Jessica Wilkins" + } + }, + { + "id": "1180", + "shortDescriptionMarkDown": "The last blog covered adding your changes to a remote branch, but what if other developers are working in the repo at the same time as you? How do you add changes from one branch to another?", + "title": "#gitPanic - Merging and Rebasing", + "urlValue": "https://dev.to/abbeyperini/gitpanic-merging-and-rebasing-2mo3", + "wordCount": 1588, + "topics": "git", + "date": "2022-11-07", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + }, + { + "id": "1175", + "shortDescriptionMarkDown": "A post about creating pull requests (PR) for content updates for my blog and having the PRs auto-merge as long as all the checks pass using the GitHub CLI and GitHub Actions.", + "title": "Automate and Auto-Merge Pull Requests using GitHub Actions and the GitHub CLI", + "urlValue": "https://dev.to/nickytonline/automate-and-merge-pull-requests-using-github-actions-and-the-github-cli-4lo6", + "wordCount": 1067, + "topics": "github,githubcli,githubactions,git", + "date": "2022-11-05", + "author": { + "id": "1172", + "fullName": "Nick Taylor", + "userYourName": "Nick Taylor" + } + }, + { + "id": "1170", + "shortDescriptionMarkDown": "Just because Hacktoberfest is over, doesn't mean you should quit contributing to open-source. Here are five reasons why you should continue to contribute.", + "title": "5 Reasons to Keep Contributing to Open Source Projects", + "urlValue": "https://blog.deepgram.com/5-reasons-to-keep-contributing-to-open-source-projects/", + "wordCount": 640, + "topics": "open-source", + "date": "2022-11-04", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1167", + "shortDescriptionMarkDown": "An overview of what I've been doing as a Technical Community Builder, from content creation to community events.", + "title": "This Week in DevRel: Life Moves Fast", + "urlValue": "https://dev.to/bekahhw/this-week-in-devrel-life-moves-fast-5gfc", + "wordCount": 793, + "topics": "DevRel", + "date": "2022-11-04", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1164", + "shortDescriptionMarkDown": "Overcoming imposter syndrome can be challenging, especially in an industry where there’s always something new to learn, switching companies often obtain promotions, and the pace of work can feel like you’re always running a marathon. You can overcome these feelings, though, and I want to share a couple of ways.", + "title": "Overcoming Imposter Syndrome", + "urlValue": "https://dev.to/bekahhw/overcoming-imposter-syndrome-23a3", + "wordCount": 765, + "topics": "Developer Health", + "date": "2022-11-02", + "author": { + "id": "163", + "fullName": "Bekah Hawrot Weigel", + "userYourName": null + } + }, + { + "id": "1160", + "shortDescriptionMarkDown": "https://dev.to/abbeyperini/gitpanic-git-101-10db", + "title": "#gitPanic - Git 101", + "urlValue": "https://dev.to/abbeyperini/gitpanic-git-101-10db", + "wordCount": 1222, + "topics": "https://dev.to/abbeyperini/gitpanic-git-101-10db", + "date": "2022-11-04", + "author": { + "id": "850", + "fullName": "Abbey Perini", + "userYourName": "Abbey Perini" + } + } +] diff --git a/src/app/monthlychallenges/(challenges)/nov-2022/page.tsx b/src/app/monthlychallenges/(challenges)/nov-2022/page.tsx index 3374d380..70adb213 100644 --- a/src/app/monthlychallenges/(challenges)/nov-2022/page.tsx +++ b/src/app/monthlychallenges/(challenges)/nov-2022/page.tsx @@ -1,12 +1,25 @@ import React, { Fragment } from 'react'; import slugify from '@sindresorhus/slugify'; import { createMetaData } from '@/util/createMetaData.server'; -import { CmsActions } from '@/util/api/cms.server'; -import type { - NovemberChallengeEntryAuthor, - NovemberChallengeEntry, -} from '@/util/api/types'; import DefaultLayout from '@/components/layouts/DefaultLayout'; +import data from './data.json'; + +type NovemberChallengeEntryAuthor = { + id: string | number; + fullName?: string | null; + userYourName?: string | null; +}; + +type NovemberChallengeEntry = { + title: string; + shortDescriptionMarkDown?: string | null; + id?: number | string; + urlValue: string; + wordCount: number; + topics?: string | null; + date: string; + author: NovemberChallengeEntryAuthor; +}; const handle = { listTitle: 'November, 2022: 100k words!', @@ -55,11 +68,7 @@ const goals = [ async function getData() { const { title } = handle.meta; - let api = new CmsActions(); - - const posts = await api.getNovemberChallengeEntries({ - year: 2022, - }); + const posts: NovemberChallengeEntry[] = data; let totalWordCount = 0; @@ -102,6 +111,7 @@ async function getData() { const description = `Current status: ${totalWordCount.toLocaleString()} out of ${currentGoal?.title} words`; return { + posts, // ...blog, totalWordCount, totalPosts, @@ -125,6 +135,7 @@ export default async function Challenge() { completedGoals, currentGoal, meta, + posts, } = await getData(); return ( diff --git a/src/data/mocks/events.ts b/src/data/mocks/events.ts index 23a5a9c0..4c55fed8 100644 --- a/src/data/mocks/events.ts +++ b/src/data/mocks/events.ts @@ -11,7 +11,11 @@ export function createEventsData({ rangeStart: string; rangeEnd: string; }) { - const dates = faker.date.betweens(rangeStart, rangeEnd, limit); + const dates = faker.date.betweens({ + from: rangeStart, + to: rangeEnd, + count: limit, + }); return dates.map((date) => { const startDate = DateTime.fromJSDate(date); @@ -23,7 +27,7 @@ export function createEventsData({ }); return { - id: faker.datatype.uuid(), + id: faker.string.uuid(), title: faker.lorem.sentence(7), startDateLocalized: startDate.toUTC().toString(), endDateLocalized: startDate.toUTC().plus({ hours: 1 }).toString(), diff --git a/src/data/mocks/memberData.js b/src/data/mocks/memberData.js index 29e53736..8e096caa 100644 --- a/src/data/mocks/memberData.js +++ b/src/data/mocks/memberData.js @@ -12,7 +12,7 @@ module.exports = function (data) { ...obj, [member.github.toLowerCase()]: { login: member.github, - id: faker.datatype.uuid(), + id: faker.string.uuid(), url: `https://github.com/${member.github}`, avatarUrl: 'data:image/png;base64,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OhFAAAEE6iOQw21JBZyjwPpi1BECCCCAQEQCqR2XTMCpC4sYjpoRQAABBOomkNJ1SQScsqC6o9MdAggggEB0Aqmct1jAqQqJHoj6EUAAAQTaIZDCfYsEnKKAduLSKQIIIIBATQSWOnC2gJduXFMIekEAAQQQaJPAEhfOEvCSDduMSNcIIIAAArUSmOvEyQKeu1Gt4PWFAAIIIIDAHDdOEvCcDcSCAAIIIIBALgI/+tGPuotc5CLdFa5whUO2+NnPftZd8pKX7C5xiUscsfXvf//77t///vcR94ypsZfmn/70p+7a1772IZf3a/7xj3/szjzzzG7fvn3diSeeeO7P//nPf3a/+tWvuqte9ard+c9//nP//WgBk++YaFyDAAIIILAWgV6yV7va1brnPve53XOe85xh269+9avdYx/72O5b3/rW8M/3ute9une9613dhS50oe6///1vd+9737v7yEc+Mvysl+jnP//57qSTThpVci/tG93oRoNcv/SlLw33/Pa3v+0e9rCHdR/72MeGf77BDW7QPfWpT+1uf/vbD9e94AUv6J71rGcNP7voRS867He9611v+OdRAibfUdm4CAEEEEBgJQL/+c9/upvd7GbdN7/5zUMEfIc73GF4I37lK1/Z/eQnP+nueMc7du94xzu6BzzgAd0rXvGKQdSf/exnh7fjO93pTt11r3vd7r3vfe+oqp/4xCd2L3/5y7ub3/zm5wr4RS96UffGN76x+8AHPjC83d7vfvcbBPu4xz2u+/vf/97d5ja36d7ylrd0d77znbv+/s985jPdb37zm+6CF7zg3gIm31G5uAgBBBBAYEUCz372s7uPf/zjg/Tudre7DWLt31AvfOELD8J78IMfPFRznetcZ5BgL85rXvOawxtw/8bc/3n961/fPfKRj+xOP/307kEPetDwkfSrX/3q4WePeMQjun/961/DWscdd1z36U9/epD5/e9//+7Xv/71uQK+7W1v213+8pcfruv/PPnJT+4+8YlPdF/72teGtU855ZTu61//+vCz73//+8Nb9+c+97nu1re+9e4CJt8Vp8lWCCCAAAKjCPQf/97ylrfsfvzjHw8f/97udrc79yPoBz7wgYP8+rfN/uevec1ruq985SvDR8f9W2cv7f5ttP/Tv432HxX31x04cGAQ+fve977he9x+nW984xvdDW94w+4Pf/hDd61rXat72cte1v385z8f7tv5CPpNb3pT99CHPrR7/vOfP6z5kpe8ZPjIuf8Yuhd/L+f+bbz/OLr/LviEE04Y3pgf8pCHHFvA5DtqDlyEAAIIILAigb/85S/dNa5xje6FL3zhILFb3OIWhwi4l93jH//44fvWf/zjH92lLnWp4SPni13sYsMbbv8d8U1ucpOh4p3vkPuPsa9//et3j3rUo4aPq/s/z3jGM7qnPe1p3VlnndXd85737C5+8Yt3b3/727vnPe95hwj4i1/8YnerW91quGdnz/e///3Dm/blLne5Qc692Hd+MevSl770sO4TnvCEowuYfFecJlshgAACCIwm0H803H8c/NrXvrY73/nON4is/x734Q9/eHeZy1xm+E3jl770pYOEe5f1b8dXucpVune+853d8ccfP/wC1j3ucY9hv+9+97vDvf1H0P1vS/dvur0ge5H2v+n8f//3f9173vOe4Xvdd7/73cMva73tbW/r9u/fP3xU3X8XfMUrXnF4G3/rW9/aXeACF+ie9KQnDdf8+c9/7u5+97sPH3v3H4/3b9i9hHuRf/SjH+3uete7Hilg8h09By5EAAEEEFiZQP/LTTvfqfZb92+v/VvuTW9600GU97nPfYbvaC972csOlfW/hdx/LNz/QlT/S1v9b0X3kuz/9HJ9ylOeMlzf/3nMYx4zyLN/c+4l3n+M3b8R73wv3F/zy1/+chB1/9vO/UfJ/XfMvZzve9/7Dmt8+ctfHt7Kv/e973Uf/OAHB1n3wu3d2n80fpe73KX7xS9+MbyNH/Jb0OS78iTZDgEEEEBgEYH+t557sfZvmT/84Q+HN85esE9/+tO7v/71r8Pb7pWudKVBgv2/e/Ob3zx8t/u73/1u+Ai7v/cNb3hD98lPfnL4bri/rl+n/w63f0M+/O/79r/13P+SVf8d8P/+97/hrbuX8Ote97rhDbmX9oc+9KFh/f7j6V64n/rUp7qrX/3q3aMf/eju29/+dveDH/xgeBM+V8D9F8M7r8gH/wXiRWTcjAACCCCAQEYCBwu436YXbP/G+9Of/nTYtRfohz/84e7KV77y8BbcC7H/Hrj/c+Mb33j4OLv/+8H998r9bzn33/P2/9x/vNxf/53vfGf45a2dPy9+8YuHX+Ta+SWs/q32mc98ZveFL3xhuKT/+Lr/K0l9Xf33x/1H4a961auGn/Vv6v1H4P16/cfRZ5xxRnfcKaecclb/Gfjh/+sdGZlZGgEEEEAAgWwE+hfKXoD922//3ezBf/qPkfvvj/tfkkr1p/9fwuo/mu492v9VqIP/9H7tf95Lvv8rTTufNvdvzMft37//rP4/9F9Q+4MAAggggAACeQn0f9WpF/P/AwK4+31TmSywAAAAAElFTkSuQmCC', diff --git a/src/data/mocks/podcast.server.ts b/src/data/mocks/podcast.server.ts index 2dd27382..6e85ebff 100644 --- a/src/data/mocks/podcast.server.ts +++ b/src/data/mocks/podcast.server.ts @@ -9,14 +9,14 @@ export function getEpisodes({ limit = 5 }) { return new Array(limit).fill(null).map((_, i) => { const episode = limit - i; const season = 1; - const name = faker.name.fullName(); + const name = faker.person.fullName(); return { title: `${name} - ${faker.lorem.words(4)}`, slug: `0${season}${episode < 10 ? '0' + episode : episode}-${slugify( name, )}`, - id: faker.datatype.uuid(), + id: faker.string.uuid(), metaDescription: `Season ${season}, Episode ${episode} of the Virtual Coffee Podcast`, podcastEpisode: episode, podcastSeason: season, @@ -29,7 +29,7 @@ export function getEpisodes({ limit = 5 }) { export function getEpisode({ slug }: { slug: PodcastEpisode['slug'] }) { const today = DateTime.now(); - const name = faker.name.fullName(); + const name = faker.person.fullName(); const season = parseInt(slug.slice(0, 2)); const episode = parseInt(slug.slice(2, 4)); @@ -38,7 +38,7 @@ export function getEpisode({ slug }: { slug: PodcastEpisode['slug'] }) { slug: `0${season}${episode < 10 ? '0' + episode : episode}-${slugify( name, )}`, - id: faker.datatype.uuid(), + id: faker.string.uuid(), metaDescription: `Season ${season}, Episode ${episode} of the Virtual Coffee Podcast`, podcastEpisode: episode, podcastSeason: season, @@ -52,7 +52,7 @@ export function getEpisode({ slug }: { slug: PodcastEpisode['slug'] }) { }, podcastGuests: [ { - id: faker.datatype.uuid(), + id: faker.string.uuid(), guestName: name, guestBio: { renderHtml: `

${faker.lorem.sentence()}

`, diff --git a/src/util/api/cms.server.ts b/src/util/api/cms.server.ts deleted file mode 100644 index 3e30520e..00000000 --- a/src/util/api/cms.server.ts +++ /dev/null @@ -1,628 +0,0 @@ -import { GraphQLClient, gql } from 'graphql-request'; -import { DateTime } from 'luxon'; -import { CmsError } from '@/util/api/util'; -import type { Event, User, NovemberChallengeEntry } from './types'; -import { ics } from 'calendar-link'; - -export function getIcsLink(event: Event) { - return ics({ - title: event.title, - start: event.startDateLocalized, - end: event.endDateLocalized, - description: event.eventCalendarDescription, - }); -} - -export class CmsActions { - client: GraphQLClient; - user: User | null = null; - constructor() { - if (!process.env.CMS_URL || !process.env.CMS_TOKEN) { - throw new CmsError('Missing API credentials'); - } else { - this.client = new GraphQLClient(`${process.env.CMS_URL}/api`, { - headers: { - Authorization: `bearer ${process.env.CMS_TOKEN}`, - }, - }); - } - } - - // async enhanceEvent(event: Event): Promise { - // event.eventCalendarDescription = await sanitizeHtml( - // event.eventCalendarDescription || '', - // ); - - // return { ...event, eventIcsLink: getIcsLink(event) }; - // } - - // async authenticate(request: Request) { - // let user = await getUser(request); - // if (!user) { - // throw new CmsError('User not found'); - // } - // this.user = user; - // this.client.setHeader('Authorization', `JWT ${user.jwt}`); - // } - - // async getCalendarEntryByCalendarId({ id }: { id: string | number }): Promise<{ - // id: number; - // title: string; - // calendarVisibility: CalendarVisibility; - // }> { - // const query = gql` - // query GetUpcomingEvent($id: [QueryArgument]) { - // entry(calendar: $id, section: "calendars") { - // ... on calendars_default_Entry { - // id - // title - // calendarVisibility - // } - // } - // } - // `; - - // const response = await this.client.request(query, { - // id, - // }); - - // if (!response?.entry) { - // throw new CmsError( - // 'There was an error fetching the calendar entry.', - // response, - // ); - // } - - // return response.entry; - // } - - // async getCalendars(): Promise< - // { - // handle: string; - // name: string; - // icsHash: string; - // id: number | string; - // }[] - // > { - // const query = `query getCalendars { - // solspace_calendar { - // calendars { - // handle - // name - // icsHash - // id - // } - // } - // } - // `; - - // const response = await this.client.request(query); - - // if (!response?.solspace_calendar?.calendars?.length) { - // throw new CmsError('There was an error fetching calendars.', response); - // } - - // return response.solspace_calendar.calendars; - // } - - // async getCalendar(handle: string): Promise<{ - // handle: string; - // name: string; - // icsHash: string; - // id: number | string; - // }> { - // const query = gql` - // query getCalendars($handle: [String]) { - // solspace_calendar { - // calendar(handle: $handle) { - // handle - // name - // icsHash - // id - // } - // } - // } - // `; - - // const response = await this.client.request(query, { handle }); - - // if (!response?.solspace_calendar?.calendar) { - // throw new CmsError('There was an error fetching the calendar.', response); - // } - - // return response.solspace_calendar.calendar; - // } - - // async getAllCalendarHandles(): Promise { - // const calendars = await this.getCalendars(); - - // if (!calendars?.length) { - // throw new CmsError('There was an error fetching the event.'); - // } - - // return calendars.map((c) => c.handle); - // } - - // async getEventByUid({ uid }: { uid: string }): Promise { - // const calendarHandles = await this.getAllCalendarHandles(); - - // // event gets one event. if it is a recurring event, it will get the first one in the range. - // const query = gql` - // query GetUpcomingEvent( - // $rangeStart: String! - // $rangeEnd: String! - // $uid: [String] - // ) { - // solspace_calendar { - // event( - // uid: $uid - // loadOccurrences: true - // rangeStart: $rangeStart - // rangeEnd: $rangeEnd - // ) { - // id - // uid - // calendarId - // title - // rrule - // startDateLocalized - // endDateLocalized - // ${calendarHandles.map( - // (handle) => ` - // ... on ${handle}_Event { - // eventVisibility - // eventJoinLink - // eventLink - // eventCalendarDescription - // }`, - // )} - // } - // } - // } - // `; - - // // - // const rangeStart = DateTime.now().minus({ hours: 12 }).toISO(); - // const rangeEnd = DateTime.now().plus({ hours: 12 }).toISO(); - - // const response = await this.client.request(query, { - // uid, - // rangeStart, - // rangeEnd, - // }); - - // if (!response?.solspace_calendar) { - // throw new CmsError('There was an error fetching the event.', response); - // } - - // return await this.enhanceEvent(response.solspace_calendar.event); - // } - - // async getEventsInRange({ - // rangeStart: specifiedRangeStart, - // rangeEnd: specifiedRangeEnd, - // calendars, - // limit, - // }: { - // rangeStart?: string; - // rangeEnd?: string; - // calendars?: string[]; - // limit?: number; - // }): Promise { - // let calendarHandles = calendars || (await this.getAllCalendarHandles()); - - // // event gets one event. if it is a recurring event, it will get the first one in the range. - // const query = gql` - // query GetUpcomingEvents( - // $rangeStart: String! - // $rangeEnd: String! - // $limit:Int - // ) { - // solspace_calendar { - // events( - // loadOccurrences: true - // rangeStart: $rangeStart - // rangeEnd: $rangeEnd - // limit: $limit - // ) { - // id - // uid - // calendarId - // title - // rrule - // startDateLocalized - // endDateLocalized - // ${calendarHandles.map( - // (handle) => ` - // ... on ${handle}_Event { - // eventVisibility - // eventJoinLink - // eventLink - // eventCalendarDescription - // }`, - // )} - // } - // } - // } - // `; - - // // - // const rangeStart = - // specifiedRangeStart || DateTime.now().set({ hour: 0 }).toISO(); - // const rangeEnd = - // specifiedRangeEnd || - // DateTime.now().set({ hour: 0 }).plus({ days: 30 }).toISO(); - - // const response = await this.client.request(query, { - // limit, - // rangeStart, - // rangeEnd, - // }); - - // if (!response?.solspace_calendar) { - // throw new CmsError('There was an error fetching events.', response); - // } - - // return await Promise.all( - // response.solspace_calendar.events.map(this.enhanceEvent), - // ); - // } - - // async getEventJoinLink(event: Event, request: Request) { - // let returnJson: EventLoaderData | null = null; - - // if (!event) { - // returnJson = { - // type: 'error', - // message: 'Event not found. Please check your event link and try again.', - // }; - // return returnJson; - // } - - // const safeEvent: SafeEvent = { - // id: event.id, - // uid: event.uid, - // title: event.title, - // rrule: event.rrule, - // calendarId: event.calendarId, - // startDateLocalized: event.startDateLocalized, - // endDateLocalized: event.endDateLocalized, - // eventVisibility: event.eventVisibility, - // eventCalendarDescription: event.eventCalendarDescription, - // eventLink: event.eventLink, - // }; - - // // check timing - // const now = DateTime.now(); - // const startTime = DateTime.fromISO(event.startDateLocalized).setZone( - // 'America/New_York', - // ); - // const endTime = DateTime.fromISO(event.endDateLocalized).setZone( - // 'America/New_York', - // ); - - // if (now < startTime.minus({ minutes: 10 })) { - // returnJson = { - // type: 'timing', - // message: `The event hasn't started yet!`, - // event: safeEvent, - // }; - // return returnJson; - // } - - // if (now > endTime.plus({ hours: 2 })) { - // returnJson = { - // type: 'timing', - // message: `This event has already ended.`, - // event: safeEvent, - // }; - // return returnJson; - // } - - // // check visibility - - // let visibility = event.eventVisibility; - - // if (!visibility || visibility === 'default') { - // // we need to get the parent calendar and check it's visibility - // const calendar: Calendar = await this.getCalendarEntryByCalendarId({ - // id: event.calendarId, - // }); - - // if (!calendar) { - // return { - // message: - // 'Calendar not found. Please check your event link and try again.', - // } as EventLoaderData; - // } - - // visibility = calendar.calendarVisibility; - // } - - // if (visibility === 'public') { - // if (event.eventJoinLink) { - // returnJson = { - // type: 'success', - // event: safeEvent, - // }; - // return returnJson; - // } - - // returnJson = { - // type: 'noLink', - // message: `This event has no link.`, - // event: safeEvent, - // }; - // return returnJson; - // } - - // // if it's not public, then authenticate - // let user: User = await getUser(request); - - // if (user) { - // if ( - // visibility === 'membersOnly' && - // user.schema !== 'Full Members Schema' - // ) { - // returnJson = { - // type: 'permissions', - // message: `This event is for members only.`, - // event: safeEvent, - // }; - // return returnJson; - // } - - // if (event.eventJoinLink) { - // returnJson = { - // type: 'success', - // event: safeEvent, - // }; - // return returnJson; - // } - - // returnJson = { - // type: 'noLink', - // message: `This event has no link.`, - // event: safeEvent, - // }; - // return returnJson; - // } - - // throw new CmsError('There was an error checking this event.'); - // } - - // async getMonthlyChallenges(): Promise< - // { - // title: string; - // month: string; - // shortDescription: string; - // id: number | string; - // }[] - // > { - // const query = `query getMonthlyChallenges { - // entries(section: "monthlyChallenges") { - // ... on monthlyChallenges_default_Entry { - // id - // title - // month - // shortDescription - // } - // } - // } - // `; - - // const response = await this.client.request(query); - - // if (!response?.entries) { - // throw new CmsError('There was an error fetching challenges.', response); - // } - - // return response.entries; - // } - - async getNovemberChallengeEntries( - { - authorId, - orderBy, - year, - }: { - authorId?: number | string; - orderBy?: string; - year?: number; - } = { - authorId: undefined, - orderBy: undefined, - year: DateTime.now().year, - }, - ) { - if (!year) { - year = DateTime.now().year; - } - - const query = `query getNovemberChallengeEntries($before:String,$after:String, $authorId: [QueryArgument], $orderBy: String = "dateCreated DESC") { - entries( - section: "mcWritingChallengeSubmissions" - authorId: $authorId - orderBy: $orderBy - before: $before - after: $after - ) { - ... on mcWritingChallengeSubmissions_default_Entry { - id - shortDescriptionMarkDown - title - urlValue - wordCount - topics - date @formatDateTime(format: "Y-m-d") - author { - ... on User { - id - fullName - userYourName - } - } - } - } - } - - `; - - const response = await this.client.request<{ - entries: NovemberChallengeEntry[]; - }>(query, { - authorId, - orderBy, - before: `${year + 1}-01-01`, - after: `${year}-01-01`, - }); - - if (!response?.entries) { - throw new CmsError( - 'There was an error fetching challenge entries.', - response, - ); - } - - return response.entries; - } - - // async getNovemberChallengeEntry({ id }: { id?: number | string }) { - // const query = `query getNovemberChallengeEntry($id: [QueryArgument]) { - // entry( - // id: $id - // ) { - // ... on mcWritingChallengeSubmissions_default_Entry { - // id - // shortDescriptionMarkDown - // title - // urlValue - // wordCount - // topics - // date @formatDateTime (format: "Y-m-d") - // author { - // ... on User { - // id - // userYourName - // } - // } - // } - // } - // } - - // `; - - // const response = await this.client.request<{ - // entry: NovemberChallengeEntry; - // }>(query, { id }); - - // if (!response?.entry) { - // throw new CmsError( - // 'There was an error fetching challenge entry.', - // response, - // ); - // } - - // return response.entry; - // } - - // async saveNovemberChallengeEntry(post: { - // title: string; - // shortDescriptionMarkDown?: string | null; - // id?: number | string | null; - // urlValue: string; - // wordCount: number; - // topics?: string | null; - // date: string; - // }) { - // invariant(this.user, 'You must be logged in to save a post.'); - - // const query = `mutation SaveMcWritingChallengeSubmission($authorId: ID, $wordCount: Number, $urlValue: String, $topics: String, $shortDescriptionMarkDown: String, $date: DateTime, $title:String, $id:ID) { - // save_mcWritingChallengeSubmissions_default_Entry( - // id:$id - // authorId: $authorId - // wordCount: $wordCount - // urlValue: $urlValue - // topics: $topics - // title: $title - // shortDescriptionMarkDown: $shortDescriptionMarkDown - // date: $date - // ) { - // id - // title - // topics - // shortDescriptionMarkDown - // date @formatDateTime (format: "Y-m-d") - // urlValue - // wordCount - // author { - // ... on User { - // id - // userYourName - // } - // } - // } - // } - - // `; - - // const response = await this.client.request<{ - // save_mcWritingChallengeSubmissions_default_Entry: NovemberChallengeEntry; - // }>(query, { - // ...post, - // authorId: this.user.user.id, - // }); - - // if (!response?.save_mcWritingChallengeSubmissions_default_Entry) { - // throw new CmsError('There was an error saving entry.', response); - // } - - // return response.save_mcWritingChallengeSubmissions_default_Entry; - // } - - // async getUserProfile({ - // id, - // email, - // }: { - // id?: number | string; - // email?: string; - // }) { - // const query = `query getMemberProfile($email: [String], $id: [QueryArgument]) { - // user(email: $email, id: $id) { - // ... on User { - // id - // email - // enabled - // status - // trashed - // userPronouns - // userTwitterUserName - // userGithubusername - // userAllowSocialSharing - // userPreferredTimeZone - // userYourName - // } - // } - // } - // `; - - // const response = await this.client.request<{ - // user: UserProfile; - // }>(query, { id, email }); - - // if (typeof response.user === 'undefined') { - // throw new CmsError('There was an error fetching user profile.', response); - // } - - // if ( - // !response.user || - // !response.user.enabled || - // response.user.trashed || - // response.user.status !== 'active' - // ) { - // return null; - // } - - // return response.user; - // } -} diff --git a/src/util/api/types.ts b/src/util/api/types.ts deleted file mode 100644 index 9324e840..00000000 --- a/src/util/api/types.ts +++ /dev/null @@ -1,103 +0,0 @@ -export type CalendarVisibility = 'membersOnly' | 'pendingMembers' | 'public'; -export type EventVisibility = CalendarVisibility | 'default'; - -export type Event = { - id: string; - uid: string; - title: string; - rrule?: string; - calendarId: string | number; - startDateLocalized: string; - endDateLocalized: string; - eventVisibility?: EventVisibility; - eventJoinLink?: string; - eventLink?: string; - eventCalendarDescription?: string; - eventIcsLink?: string; -}; - -export type SafeEvent = Omit; - -export type Calendar = { - id: number; - title: string; - calendarVisibility: CalendarVisibility; -}; - -export enum UserSchema { - FullMembersSchema = 'Full Members Schema', - PendingMembersSchema = 'Pending Members Schema', -} - -export type UserProfile = { - id: string | number; - email: string; - enabled: boolean; - status: string; - trashed: boolean; - fullName?: string; - userPronouns?: string; - userTwitterUserName?: string; - userGithubusername?: string; - userAllowSocialSharing?: boolean; - userPreferredTimeZone?: string; - userYourName?: string; -}; - -export type User = { - jwt: string; - jwtExpiresAt: number; - refreshToken: string; - refreshTokenExpiresAt: number; - schema: UserSchema; - user: Pick< - UserProfile, - 'id' | 'email' | 'enabled' | 'status' | 'userYourName' - >; -}; - -export type EventLoaderData = { - message?: string; - event?: SafeEvent; - type: 'error' | 'timing' | 'permissions' | 'noLink' | 'success'; -}; - -export type ActionData = { - formError?: string; - fieldErrors?: ErrorsType; - fields?: FieldsType; -}; - -export type NovemberChallengeEntryAuthor = Pick< - UserProfile, - 'id' | 'userYourName' | 'fullName' ->; - -export type NovemberChallengeEntry = { - title: string; - shortDescriptionMarkDown?: string; - id?: number | string; - urlValue: string; - wordCount: number; - topics?: string; - date: string; - author: NovemberChallengeEntryAuthor; -}; - -export type NovemberChallengeActionData = ActionData<{ - title: string | undefined; - shortDescriptionMarkDown?: string | undefined; - id?: string | undefined | null; - urlValue: string | undefined; - wordCount: string | undefined; - topics?: string | undefined; - date: string | undefined; -}>; - -export type RegisterExistingUserActionData = ActionData<{ - email: string | undefined; - password: string | undefined; - userYourName: string | undefined; - userPronouns?: string | undefined | null; - userSlackId: string | undefined; -}>; diff --git a/src/util/api/userlookup.server.ts b/src/util/api/userlookup.server.ts deleted file mode 100644 index 1a8e77fa..00000000 --- a/src/util/api/userlookup.server.ts +++ /dev/null @@ -1,79 +0,0 @@ -import Airtable from 'airtable'; - -var base = new Airtable({ - apiKey: process.env.MEMBERSHIP_AIRTABLE_API_KEY, -}).base('appGHm8ztVWug6UxH'); - -type Profile = { - Name?: string; - Email?: string; - GitHubUsername?: string; - TwitterUsername?: string; - Pronouns?: string; - AllowSocialSharing?: boolean; - PreferredTimeZone?: string; -}; - -export const findMemberProfile = async (email: string) => { - const results = await base('member_profiles') - .select({ - filterByFormula: `FIND("${email}", {Email})`, - fields: [ - 'Name', - 'Email', - 'GitHubUsername', - 'TwitterUsername', - 'Pronouns', - 'AllowSocialSharing', - 'PreferredTimeZone', - ], - }) - .firstPage(); - - // get the latest defined value for each field - return results.reduce((acc, curr) => { - return { - ...acc, - ...curr.fields, - }; - }, {} as Profile); -}; - -type SignUpFormResponse = { - email?: string; - pronouns?: string; - githubUsername?: string; - twitterUsername?: string; - howDidYouHearAboutUs?: string; - journey?: string; - codeInterests?: string; - virtualCoffee?: string; - approved?: boolean; -}; - -export const findMemberSignInForm = async (email: string) => { - const results = await base('membership_form') - .select({ - filterByFormula: `FIND("${email}", {email})`, - fields: [ - 'email', - 'pronouns', - 'githubUsername', - 'twitterUsername', - 'howDidYouHearAboutUs', - 'journey', - 'codeInterests', - 'virtualCoffee', - 'approved', - ], - }) - .firstPage(); - - // get the latest defined value for each field - return results.reduce((acc, curr) => { - return { - ...acc, - ...curr.fields, - }; - }, {} as SignUpFormResponse); -}; diff --git a/src/util/api/util.ts b/src/util/api/util.ts deleted file mode 100644 index 9075a422..00000000 --- a/src/util/api/util.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class CmsError extends Error { - data: any; - constructor(message: string, data?: any) { - super(message); - this.data = data; - } -} - -export type CmsErrors = Error | InstanceType;