From e82b93d812d3900b017fa80be8a850d39dfc296d Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Sun, 10 May 2026 18:36:39 +0100 Subject: [PATCH 01/22] refactor: Improve pricing in schema --- resource.schema.json | 57 ++++++++++++--- resources/callisto.yaml | 6 +- resources/clojure.yaml | 14 ++++ resources/cpp.yaml | 8 +++ resources/general.yaml | 11 ++- resources/haskell.yaml | 53 ++++++++------ resources/java.yaml | 16 ++++- resources/kotlin.yaml | 6 ++ resources/miscellaneous.yaml | 11 ++- resources/php.yaml | 22 +++--- resources/programming-language-design.yaml | 4 ++ resources/python.yaml | 19 +++-- resources/rust.yaml | 6 ++ resources/sql.yaml | 82 ++++++++++++---------- 14 files changed, 224 insertions(+), 91 deletions(-) diff --git a/resource.schema.json b/resource.schema.json index c031dd1..27bef3d 100644 --- a/resource.schema.json +++ b/resource.schema.json @@ -20,7 +20,7 @@ "maxLength": 256 }, "emoji": { - "description": "A Unicode emoji glyph or Discord emoji ID to represent the resource, if applicable. The emoji must be part of the main DevDen server, which isn't great design but there's not really a better way of doing it.", + "description": "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", "type": "string" }, "resources": { @@ -39,8 +39,7 @@ "required": [ "name", "url", - "pros", - "cons" + "pricing" ], "properties": { "name": { @@ -56,12 +55,52 @@ "type": "string", "description": "URL to the resource" }, - "price": { - "type": [ - "string", - "number" - ], - "description": "The price of the resource, if it has one. If the resource is free, omit this field." + "pricing": { + "type": "object", + "description": "Details about the cost of the resource.", + "oneOf": [ + { + "properties": { + "model": { + "type": "string", + "description": "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. ", + "enum": [ + "Free", + "Freemium" + ] + }, + "amount": false + }, + "required": [ + "model" + ] + }, + { + "properties": { + "model": { + "type": "string", + "description": "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly).", + "enum": [ + "Subscription", + "One Time" + ] + }, + "amount": { + "description": "The price of this resource, in US Dollars.", + "type": "number", + "exclusiveMinimum": 0, + "examples": [ + 15, + 99.99 + ] + } + }, + "required": [ + "model", + "amount" + ] + } + ] }, "pros": { "type": "array", diff --git a/resources/callisto.yaml b/resources/callisto.yaml index 9bdab61..4597eb0 100644 --- a/resources/callisto.yaml +++ b/resources/callisto.yaml @@ -1,9 +1,11 @@ name: Callisto description: Callisto is a concatenative low-level programming language designed by John Mesyeti Smith in March 2024 -emoji: '821822658169536542' +emoji: "821822658169536542" resources: - name: Callisto documentation url: https://callisto.mesyeti.uk/docs + pricing: + model: 'Free' pros: - made by the creator of callisto - thorough explanation @@ -11,6 +13,8 @@ resources: cons: [] - name: Callisto tour url: https://callisto.mesyeti.uk/tour + pricing: + model: 'Free' pros: - made by the creator callisto - explains the basics of stack based programming so you can easily get started with callisto diff --git a/resources/clojure.yaml b/resources/clojure.yaml index bb10e5d..3712d85 100644 --- a/resources/clojure.yaml +++ b/resources/clojure.yaml @@ -4,6 +4,8 @@ emoji: '821823652404265001' resources: - name: Clojure For The Brave And True url: https://www.braveclojure.com/clojure-for-the-brave-and-true/ + pricing: + model: 'Free' pros: - Complete guide through most of the language - Assumes no prior knowledge of functional programming or Lisp @@ -11,12 +13,16 @@ resources: - name: Functions Explained Through Patterns url: http://blog.josephwilk.net/clojure/functions-explained-through-patterns.html + pricing: + model: 'Free' pros: - Visual explanations of core Clojure functions cons: [ ] - name: 4clojure url: https://4clojure.oxal.org/ + pricing: + model: 'Free' pros: - Interactive exercises cons: @@ -24,6 +30,8 @@ resources: - name: Clojure by Example url: https://github.com/inclojure-org/clojure-by-example + pricing: + model: 'Free' pros: - Hands-on learning - Crash Course @@ -32,6 +40,8 @@ resources: - name: Clojure for Java Programmers url: https://www.youtube.com/watch?v=P76Vbsk_3J0 + pricing: + model: 'Free' pros: - Video series - Explains the ideas behind Clojure @@ -40,6 +50,8 @@ resources: - name: Clojure API Cheatsheet url: https://clojure.org/api/cheatsheet + pricing: + model: 'Free' pros: - Overview over almost the entire standard library - Quick reference @@ -47,6 +59,8 @@ resources: - name: Clojure beginner resources url: https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f + pricing: + model: 'Free' pros: - Collection of all kinds of resources to learn Clojure cons: [ ] diff --git a/resources/cpp.yaml b/resources/cpp.yaml index 2a474a6..0f0bb4d 100644 --- a/resources/cpp.yaml +++ b/resources/cpp.yaml @@ -4,6 +4,8 @@ emoji: '821822658169536542' resources: - name: C++ - Video Playlist url: https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb + pricing: + model: 'Free' pros: - Teaches a large portion of the language's workings for best usage - Thorough explanations @@ -12,6 +14,8 @@ resources: - name: cppreference.com url: https://en.cppreference.com/ + pricing: + model: 'Free' pros: - Documentation about the entirety of the language and the standard library - Apt for everyone in the learning spectrum, from beginners to advanced users @@ -20,6 +24,8 @@ resources: - name: C++ Core Guidelines url: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines + pricing: + model: 'Free' pros: - Collection of best practices for most aspects of the language - Bite-sized titled entries, making it easy to navigate @@ -29,6 +35,8 @@ resources: - name: Modernes C++ url: https://www.modernescpp.com/ + pricing: + model: 'Free' pros: - Large series of blog posts about often less taught APIs and best practices - Very detailed explanations with explicit examples diff --git a/resources/general.yaml b/resources/general.yaml index 37c704d..b83a11a 100644 --- a/resources/general.yaml +++ b/resources/general.yaml @@ -3,11 +3,18 @@ description: Things that are useful for learning any programming language, or do resources: - name: The Missing Semester of Your CS Education description: Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc + pricing: + model: "Free" url: https://missing.csail.mit.edu/ - pros: [ Created by MIT, 'Covers subjects that most tutorials might ignore, making it a great supplementary resource'] - cons: [] + pros: + [ + Created by MIT, + "Covers subjects that most tutorials might ignore, making it a great supplementary resource", + ] - name: Projects description: A list of practical projects that anyone can solve in any programming language + pricing: + model: "Free" url: https://github.com/karan/Projects pros: [] cons: [] diff --git a/resources/haskell.yaml b/resources/haskell.yaml index 0051410..59d87db 100644 --- a/resources/haskell.yaml +++ b/resources/haskell.yaml @@ -1,47 +1,56 @@ - name: Haskell description: Haskell is a purely functional programming language commonly used in finance and academics -emoji: '821823367333675058' +emoji: "821823367333675058" resources: - name: Learn you a Haskell url: http://learnyouahaskell.com/ - pros: + pricing: + model: "Free" + pros: - Good for beginners - Good reputation - cons: [ ] - + cons: [] + - name: Haskell Programming from First Principles url: https://haskellbook.com/ - price: 59 - pros: + pricing: + model: "One Time" + amount: 59 + pros: - Very good reputation - Covers a very wide range of content - cons: - - Pricey! - + - name: Write Yourself a Scheme in 48 hours url: https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours - pros: + pricing: + model: "Free" + pros: - Designed for beginners - Learn by making a real project (creating your own small programming language) - cons: + cons: - Moves quite quickly - + - name: Haskell Wikibooks url: https://en.wikibooks.org/wiki/Haskell - pros: + pricing: + model: "Free" + pros: - Wide range of content - Explains most things fairly simply cons: - Some information may be outdated - - name: 'Functional Programming in Haskell: Supercharge Your Coding' + - name: "Functional Programming in Haskell: Supercharge Your Coding" url: https://www.futurelearn.com/courses/functional-programming-haskell - pros: [ ] - cons: [ ] - - - name: 'Haskell: The Craft of Functional Programming' - url: https://simonjohnthompson.github.io/craft3e/craft3e.pdf - pros: [ ] - cons: [ ] + pricing: + model: "Free" + pros: [] + cons: + - May be a waitlist to get access + - name: "Haskell: The Craft of Functional Programming" + url: https://simonjohnthompson.github.io/craft3e/craft3e.pdf + pricing: + model: "Free" + pros: [] + cons: [] diff --git a/resources/java.yaml b/resources/java.yaml index 38b8836..df7d3fc 100644 --- a/resources/java.yaml +++ b/resources/java.yaml @@ -4,12 +4,16 @@ emoji: '821822045187866625' resources: - name: Tutorial Spot url: https://www.tutorialspoint.com/java/index.htm + pricing: + model: "Free" pros: [ ] cons: - Slightly dated - name: Alex Lee url: https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA + pricing: + model: "Free" pros: - Video series - Covers a wide range of concepts @@ -17,6 +21,8 @@ resources: - name: Bro Code url: https://www.youtube.com/c/BroCodez + pricing: + model: "Free" pros: - Video series - Has videos on many different languages and concepts @@ -24,18 +30,22 @@ resources: - name: Javatpoint url: https://www.javatpoint.com/java-tutorial - pros: [ ] - cons: [ ] + pricing: + model: "Free" + - name: Mooc.fi description: Comprehensive Java (and general programming) course provided by the University of Helsinki url: https://java-programming.mooc.fi/ + pricing: + model: "Free" pros: - Very well respected - cons: [ ] - name: TheNewBoston url: https://www.youtube.com/@thenewboston + pricing: + model: "Free" pros: - Beginner and intermediate video series - Short, but a lot of videos (146 videos combined in both playlists) diff --git a/resources/kotlin.yaml b/resources/kotlin.yaml index 87ca475..3ecdd2d 100644 --- a/resources/kotlin.yaml +++ b/resources/kotlin.yaml @@ -4,17 +4,23 @@ emoji: '888496555529744395' resources: - name: "Kotlin Official Website" url: "https://kotlinlang.org/" + pricing: + model: "Free" pros: [ ] cons: [ ] - name: "Introduction to Kotlin (Google I/O '17)" url: "https://www.youtube.com/watch?v=X1RVYt2QKQE" + pricing: + model: "Free" pros: - "Video for visual learners" cons: [ ] - name: "FreeCodeCamp.org" url: "https://youtu.be/F9UC9DY-vIU" + pricing: + model: "Free" pros: - "Video for visual learners" cons: [ ] \ No newline at end of file diff --git a/resources/miscellaneous.yaml b/resources/miscellaneous.yaml index d31ce36..bd518c2 100644 --- a/resources/miscellaneous.yaml +++ b/resources/miscellaneous.yaml @@ -4,7 +4,8 @@ emoji: '⚙️' resources: - name: Every link I wish I had as a beginner url: https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner - price: Mostly free, some paid resources are included + pricing: + model: "Free" pros: - A huge collection of useful links cons: @@ -12,6 +13,8 @@ resources: - name: Sololearn url: https://www.sololearn.com/ + pricing: + model: "Freemium" pros: - Easy to use - Lots of languages to choose from @@ -21,6 +24,8 @@ resources: - name: LeetCode url: https://leetcode.com/ + pricing: + model: "Freemium" pros: - Fun and difficult problems to solve cons: @@ -29,6 +34,8 @@ resources: - name: Codecademy url: https://www.codecademy.com/ + pricing: + model: "Freemium" pros: - Excellent guided learning platform - Beginner-friendly but continues into advanced content @@ -41,6 +48,8 @@ resources: - name: Programiz url: https://www.programiz.com/ + pricing: + model: "Freemium" pros: - Extensive courses/guides for many languages and frameworks - Balanced mix of material and projects/exercises, diff --git a/resources/php.yaml b/resources/php.yaml index 8c23f87..76f9fa7 100644 --- a/resources/php.yaml +++ b/resources/php.yaml @@ -4,7 +4,8 @@ emoji: '🐘' resources: - name: PHP Manual url: https://www.php.net/manual/en/ - price: free + pricing: + model: 'Free' pros: - Comprehensive and up-to-date documentation - Includes tutorials, guides, and reference material @@ -14,7 +15,8 @@ resources: - name: W3Schools PHP Tutorial url: https://www.w3schools.com/php/ - price: free + pricing: + model: 'Free' pros: - Beginner-friendly and easy to navigate - Includes interactive examples and a "Try it Yourself" feature @@ -24,7 +26,8 @@ resources: - name: Codecademy PHP Course url: https://www.codecademy.com/learn/learn-php - price: free (with subscription for full access) + pricing: + model: 'Freemium' pros: - Interactive lessons and quizzes - Hands-on experience writing PHP code @@ -34,17 +37,17 @@ resources: - name: Laracasts PHP Basics url: https://laracasts.com/series/php-for-beginners - price: $15/month subscription + pricing: + model: 'Free' pros: - Video tutorials by experienced developers - Covers beginner to intermediate PHP topics - Focus on practical, real-world applications - cons: - - Requires a subscription - name: PHP The Right Way url: https://phptherightway.com/ - price: free + pricing: + model: 'Free' pros: - Community-driven guide to modern PHP practices - Covers best practices, tools, and resources @@ -54,7 +57,10 @@ resources: - name: Udemy PHP Courses url: https://www.udemy.com/topic/php/ - price: varies (usually $10–$20 during sales) + pricing: + model: 'One Time' + amount: 29.99 + pros: - Wide variety of courses for all skill levels - Affordable and often discounted diff --git a/resources/programming-language-design.yaml b/resources/programming-language-design.yaml index e44bc04..f60e4a2 100644 --- a/resources/programming-language-design.yaml +++ b/resources/programming-language-design.yaml @@ -4,6 +4,8 @@ emoji: '🔨' resources: - name: Crafting Interpreters url: https://craftinginterpreters.com/ + pricing: + model: "Free" pros: - Covers lexing, parsing, interpreting, type checking, and compiling - Starts from scratch, designed for beginners @@ -12,5 +14,7 @@ resources: - name: Awesome Compilers url: https://github.com/aalhour/awesome-compilers description: Curated list of resources for all things compilers + pricing: + model: "Free" pros: [] cons: [] diff --git a/resources/python.yaml b/resources/python.yaml index e204c55..57ea909 100644 --- a/resources/python.yaml +++ b/resources/python.yaml @@ -4,7 +4,8 @@ emoji: '821824146270715936' resources: - name: Codecademy url: https://www.codecademy.com/learn/learn-python - price: free + pricing: + model: "Free" pros: - Interactive lessons and quizzes - Hands-on experience writing Python code @@ -13,7 +14,9 @@ resources: - May not cover more advanced topics in depth - name: Learn Python the Hard Way url: https://learnpythonthehardway.org/ - price: 29.99 + pricing: + model: "One Time" + amount: 29.00 pros: - Comprehensive and in-depth coverage of Python - Includes quizzes and exercises to test your knowledge @@ -22,7 +25,8 @@ resources: - May be too challenging for some learners - name: Python for Everybody url: https://www.py4e.com/ - price: free + pricing: + model: "Free" pros: - Suitable for absolute beginners - Covers key Python concepts and libraries @@ -31,7 +35,8 @@ resources: - May not cover more advanced topics in depth - name: Python documentation url: https://docs.python.org/3/ - price: free + pricing: + model: "Free" pros: - Comprehensive and up-to-date documentation - Includes tutorials, guides, and reference material @@ -40,7 +45,8 @@ resources: - May be too technical and dry for some learners - name: Python for Data Science url: https://www.datacamp.com/courses/intro-to-python-for-data-science - price: free (with subscription) + pricing: + model: "Freemium" pros: - Focuses on using Python for data analysis and machine learning - Interactive lessons and hands-on experience writing Python code @@ -49,7 +55,8 @@ resources: - May not cover more general Python concepts in depth - name: Python on Coursera url: https://www.coursera.org/courses?query=python - price: varies (some courses are free, others have a fee) + pricing: + model: "Freemium" pros: - Wide variety of courses and specialization tracks - Taught by experienced instructors from top universities diff --git a/resources/rust.yaml b/resources/rust.yaml index 5f1363c..73646cc 100644 --- a/resources/rust.yaml +++ b/resources/rust.yaml @@ -4,6 +4,8 @@ emoji: '821824283965128774' resources: - name: The Rust Programming Language (Book) url: https://doc.rust-lang.org/book/ + pricing: + model: "Free" pros: - Very detailed - Frequently updated @@ -12,6 +14,8 @@ resources: - name: Rust by Example url: https://doc.rust-lang.org/stable/rust-by-example/ + pricing: + model: "Free" pros: - Teaches concepts by example - Semi-Official @@ -19,6 +23,8 @@ resources: - name: Rust Crash Course | Traversy Media url: https://www.youtube.com/watch?v=zF34dRivLOw + pricing: + model: "Free" pros: - Video series cons: [ ] diff --git a/resources/sql.yaml b/resources/sql.yaml index e77af07..0c65776 100644 --- a/resources/sql.yaml +++ b/resources/sql.yaml @@ -1,43 +1,47 @@ -name: SQL +name: SQL description: SQL (Structured Query Language) is a standard programming language for managing and manipulating databases. -emoji: '💾' -resources: - - name: SQL Tutorial by W3Schools - url: https://www.w3schools.com/sql/ - price: free - pros: - - Beginner-friendly and easy to understand - - Interactive "Try it Yourself" feature for practicing SQL - - Covers essential SQL commands and concepts - cons: - - Lacks depth for advanced SQL topics +emoji: "💾" +resources: + - name: SQL Tutorial by W3Schools + url: https://www.w3schools.com/sql/ + pricing: + model: "Free" + pros: + - Beginner-friendly and easy to understand + - Interactive "Try it Yourself" feature for practicing SQL + - Covers essential SQL commands and concepts + cons: + - Lacks depth for advanced SQL topics - - name: SQL Manual by PostgreSQL (or Other RDBMS) - url: https://www.postgresql.org/docs/ - price: free - pros: - - Official and comprehensive documentation - - Includes advanced topics and features specific to PostgreSQL - - Reliable and up-to-date - cons: - - Can be technical and dense for beginners + - name: SQL Manual by PostgreSQL (or Other RDBMS) + url: https://www.postgresql.org/docs/ + pricing: + model: "Free" + pros: + - Official and comprehensive documentation + - Includes advanced topics and features specific to PostgreSQL + - Reliable and up-to-date + cons: + - Can be technical and dense for beginners - - name: Khan Academy SQL Course - url: https://www.khanacademy.org/computing/computer-programming/sql - price: free - pros: - - Excellent for beginners - - Video tutorials combined with interactive exercises - - Covers practical examples and common use cases - cons: - - Focused more on basic and intermediate concepts + - name: Khan Academy SQL Course + url: https://www.khanacademy.org/computing/computer-programming/sql + pricing: + model: "Free" + pros: + - Excellent for beginners + - Video tutorials combined with interactive exercises + - Covers practical examples and common use cases + cons: + - Focused more on basic and intermediate concepts - - name: Codecademy Learn SQL Course - url: https://www.codecademy.com/learn/learn-sql - price: free (with subscription for full access) - pros: - - Hands-on, interactive lessons and quizzes - - Beginner to intermediate SQL concepts covered - - Provides experience with real-world database scenarios - cons: - - Full access requires a subscription + - name: Codecademy Learn SQL Course + url: https://www.codecademy.com/learn/learn-sql + pricing: + model: "Freemium" + pros: + - Hands-on, interactive lessons and quizzes + - Beginner to intermediate SQL concepts covered + - Provides experience with real-world database scenarios + cons: + - Full access requires a subscription From 936cbb7ecc1aaa653e68d092ba7a5ab409277f5f Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 11:21:44 +0100 Subject: [PATCH 02/22] refactor: Improve file structure --- resources/{ => languages}/callisto.yaml | 0 resources/{ => languages}/clojure.yaml | 0 resources/{ => languages}/cpp.yaml | 0 resources/{ => languages}/haskell.yaml | 0 resources/{ => languages}/java.yaml | 0 resources/{ => languages}/kotlin.yaml | 0 resources/{ => languages}/php.yaml | 0 resources/{ => languages}/python.yaml | 0 resources/{ => languages}/rust.yaml | 0 resources/{ => languages}/sql.yaml | 0 resources/{ => platforms}/miscellaneous.yaml | 0 resources/{ => theory}/general.yaml | 0 resources/{ => theory}/programming-language-design.yaml | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename resources/{ => languages}/callisto.yaml (100%) rename resources/{ => languages}/clojure.yaml (100%) rename resources/{ => languages}/cpp.yaml (100%) rename resources/{ => languages}/haskell.yaml (100%) rename resources/{ => languages}/java.yaml (100%) rename resources/{ => languages}/kotlin.yaml (100%) rename resources/{ => languages}/php.yaml (100%) rename resources/{ => languages}/python.yaml (100%) rename resources/{ => languages}/rust.yaml (100%) rename resources/{ => languages}/sql.yaml (100%) rename resources/{ => platforms}/miscellaneous.yaml (100%) rename resources/{ => theory}/general.yaml (100%) rename resources/{ => theory}/programming-language-design.yaml (100%) diff --git a/resources/callisto.yaml b/resources/languages/callisto.yaml similarity index 100% rename from resources/callisto.yaml rename to resources/languages/callisto.yaml diff --git a/resources/clojure.yaml b/resources/languages/clojure.yaml similarity index 100% rename from resources/clojure.yaml rename to resources/languages/clojure.yaml diff --git a/resources/cpp.yaml b/resources/languages/cpp.yaml similarity index 100% rename from resources/cpp.yaml rename to resources/languages/cpp.yaml diff --git a/resources/haskell.yaml b/resources/languages/haskell.yaml similarity index 100% rename from resources/haskell.yaml rename to resources/languages/haskell.yaml diff --git a/resources/java.yaml b/resources/languages/java.yaml similarity index 100% rename from resources/java.yaml rename to resources/languages/java.yaml diff --git a/resources/kotlin.yaml b/resources/languages/kotlin.yaml similarity index 100% rename from resources/kotlin.yaml rename to resources/languages/kotlin.yaml diff --git a/resources/php.yaml b/resources/languages/php.yaml similarity index 100% rename from resources/php.yaml rename to resources/languages/php.yaml diff --git a/resources/python.yaml b/resources/languages/python.yaml similarity index 100% rename from resources/python.yaml rename to resources/languages/python.yaml diff --git a/resources/rust.yaml b/resources/languages/rust.yaml similarity index 100% rename from resources/rust.yaml rename to resources/languages/rust.yaml diff --git a/resources/sql.yaml b/resources/languages/sql.yaml similarity index 100% rename from resources/sql.yaml rename to resources/languages/sql.yaml diff --git a/resources/miscellaneous.yaml b/resources/platforms/miscellaneous.yaml similarity index 100% rename from resources/miscellaneous.yaml rename to resources/platforms/miscellaneous.yaml diff --git a/resources/general.yaml b/resources/theory/general.yaml similarity index 100% rename from resources/general.yaml rename to resources/theory/general.yaml diff --git a/resources/programming-language-design.yaml b/resources/theory/programming-language-design.yaml similarity index 100% rename from resources/programming-language-design.yaml rename to resources/theory/programming-language-design.yaml From f1aee925461f9ec524b97d781f69e4e25a2320c8 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 11:27:25 +0100 Subject: [PATCH 03/22] feat: Setup TS scema --- .gitignore | 34 ++++++++++++++++++++++++++++++++++ biome.json | 34 ++++++++++++++++++++++++++++++++++ bun.lock | 31 +++++++++++++++++++++++++++++++ index.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 15 +++++++++++++++ tsconfig.json | 30 ++++++++++++++++++++++++++++++ 6 files changed, 194 insertions(+) create mode 100644 .gitignore create mode 100644 biome.json create mode 100644 bun.lock create mode 100644 index.ts create mode 100644 package.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a14702c --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..c1277a3 --- /dev/null +++ b/biome.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..c610ebc --- /dev/null +++ b/bun.lock @@ -0,0 +1,31 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "learningresources", + "dependencies": { + "zod": "^4.4.3", + }, + "devDependencies": { + "@types/bun": "latest", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="], + + "@types/node": ["@types/node@25.6.2", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw=="], + + "bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + } +} diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..a5c7890 --- /dev/null +++ b/index.ts @@ -0,0 +1,50 @@ +import { z } from "zod"; + +/** + * The Pricing of a Resource, which can either be Free/Freemium or Paid (Subscription/One Time) + */ +const PricingSchema = z.union([ + z.object({ + model: z.enum(["Free", "Freemium"]).describe( + "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. " + ), + }).strict(), + + z.object({ + model: z.enum(["Subscription", "One Time"]).describe( + "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly)." + ), + amount: z.number().gt(0) + .describe("The price of this resource, in US Dollars."), + }) +]).describe("Details about the cost of the resource."); + + +const ResourceSchema = z.object({ + name: z.string().describe("The official name of the resource"), + description: z.string().max(256).optional().describe("A brief description of the resource"), + url: z.string().url().describe("URL to the resource"), + pricing: PricingSchema, + pros: z.array(z.string()).optional().describe( + "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'" + ), + cons: z.array(z.string()).optional().describe( + "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'" + ), +}); + +export const LanguageResourceSchema = z.object({ + name: z.string().describe("The name of the language"), + description: z.string().max(256).describe("A brief description of the language and its uses"), + emoji: z.string().optional().describe( + "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image." + ), + resources: z.array(ResourceSchema) + .min(1) + .describe("List of resources that can be used for learning / practicing the language"), +}).describe("Set of resources that can be used for learning programming"); + + +export type Pricing = z.infer; +export type Resource = z.infer; +export type LanguageResource = z.infer; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..7fc8416 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "learningresources", + "module": "index.ts", + "type": "module", + "private": true, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "zod": "^4.4.3" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b2e7497 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + "types": ["bun"], + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} From e905b586d51e64ff059d07a99cee4c916074dcbe Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 12:48:18 +0100 Subject: [PATCH 04/22] chore: Update VSCode Config to apply schema to new file structure --- .vscode/settings.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d916240..b46d3d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,5 @@ { - "yaml.schemas": { - // apply schema to all resources - "resource.schema.json": "resources/*.yaml" - } -} \ No newline at end of file + "yaml.schemas": { + "resource.schema.json": "resources/**/*.yaml", + } +} From 4499178d5167600772479286a5aec68dbaec72e3 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 12:51:28 +0100 Subject: [PATCH 05/22] feat: Add Zod-generated JSON schema and meta field --- index.ts | 130 ++++++--- package.json | 29 +- resource.schema.json | 260 +++++++++++------- resources/languages/callisto.yaml | 4 + resources/languages/clojure.yaml | 5 + resources/languages/cpp.yaml | 8 + resources/languages/haskell.yaml | 5 + resources/languages/java.yaml | 5 + resources/languages/kotlin.yaml | 18 +- resources/languages/php.yaml | 132 ++++----- resources/languages/python.yaml | 119 ++++---- resources/languages/rust.yaml | 18 +- resources/languages/sql.yaml | 4 + resources/platforms/miscellaneous.yaml | 2 + resources/theory/general.yaml | 2 + .../theory/programming-language-design.yaml | 4 +- tsconfig.json | 50 ++-- 17 files changed, 497 insertions(+), 298 deletions(-) diff --git a/index.ts b/index.ts index a5c7890..97d4684 100644 --- a/index.ts +++ b/index.ts @@ -3,48 +3,114 @@ import { z } from "zod"; /** * The Pricing of a Resource, which can either be Free/Freemium or Paid (Subscription/One Time) */ -const PricingSchema = z.union([ - z.object({ - model: z.enum(["Free", "Freemium"]).describe( - "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. " - ), - }).strict(), +const PricingSchema = z + .union([ + z + .object({ + model: z + .enum(["Free", "Freemium"]) + .describe( + "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. ", + ), + }) + .strict(), + + z.object({ + model: z + .enum(["Subscription", "One Time"]) + .describe( + "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly).", + ), + amount: z + .number() + .gt(0) + .describe("The price of this resource, in US Dollars."), + }), + ]) + .describe("Details about the cost of the resource."); + +export const LanguageDomainSchema = z.enum([ + "Web Development", + "Data Science", + "Mobile Development", + "Game Development", + "Systems Programming", + "Scripting", + "General Purpose" +]).describe("A domain that a programming language may be used in."); +export const ProgrammingParadigmSchema = z.enum([ + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming", + "Logic Programming" +]).describe("A programming paradigm."); + +export const ResourceTypeSchema = z.discriminatedUnion("type", [ z.object({ - model: z.enum(["Subscription", "One Time"]).describe( - "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly)." - ), - amount: z.number().gt(0) - .describe("The price of this resource, in US Dollars."), - }) -]).describe("Details about the cost of the resource."); + type: z.literal("Language"), + domains: z.array(LanguageDomainSchema).describe("The domain(s) that the programming language is commonly used in, or best suited for."), + paradigms: z.array(ProgrammingParadigmSchema).describe("The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc."), + }), + z.object({ + type: z.literal("Platform") + }).describe( + "A platform used to learn programming, which may teach a variety of languages and concepts." + ) +]).describe("The type of the resource set") const ResourceSchema = z.object({ name: z.string().describe("The official name of the resource"), - description: z.string().max(256).optional().describe("A brief description of the resource"), - url: z.string().url().describe("URL to the resource"), + description: z + .string() + .max(256) + .optional() + .describe("A brief description of the resource"), + url: z.url().describe("URL to the resource"), pricing: PricingSchema, - pros: z.array(z.string()).optional().describe( - "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'" - ), - cons: z.array(z.string()).optional().describe( - "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'" - ), + pros: z + .array(z.string()) + .optional() + .describe( + "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'", + ), + cons: z + .array(z.string()) + .optional() + .describe( + "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", + ), }); -export const LanguageResourceSchema = z.object({ - name: z.string().describe("The name of the language"), - description: z.string().max(256).describe("A brief description of the language and its uses"), - emoji: z.string().optional().describe( - "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image." - ), - resources: z.array(ResourceSchema) - .min(1) - .describe("List of resources that can be used for learning / practicing the language"), -}).describe("Set of resources that can be used for learning programming"); +export const LanguageResourceSchema = z + .object({ + name: z.string().describe("The name of the language"), + meta: ResourceTypeSchema, + description: z + .string() + .max(256) + .describe("A brief description of the language and its uses"), + emoji: z + .string() + .optional() + .describe( + "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", + ), + resources: z + .array(ResourceSchema) + .min(1) + .describe( + "List of resources that can be used for learning / practicing the language", + ), + }) + .describe("Set of resources that can be used for learning programming"); export type Pricing = z.infer; export type Resource = z.infer; -export type LanguageResource = z.infer; \ No newline at end of file +export type LanguageResource = z.infer; + + +console.log('// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY') +console.log(JSON.stringify(z.toJSONSchema(LanguageResourceSchema, {}), null, 2)); \ No newline at end of file diff --git a/package.json b/package.json index 7fc8416..4262097 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,18 @@ { - "name": "learningresources", - "module": "index.ts", - "type": "module", - "private": true, - "devDependencies": { - "@types/bun": "latest" - }, - "peerDependencies": { - "typescript": "^5" - }, - "dependencies": { - "zod": "^4.4.3" - } + "name": "learningresources", + "module": "index.ts", + "type": "module", + "private": true, + "scripts": { + "gen-schema": "bun run index.ts > resource.schema.json" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "zod": "^4.4.3" + } } diff --git a/resource.schema.json b/resource.schema.json index 27bef3d..49e625e 100644 --- a/resource.schema.json +++ b/resource.schema.json @@ -1,122 +1,182 @@ +// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/TheDeveloperDen/LanguageResources/schema.json", - "title": "Language Resources", - "description": "Set of resources that can be used for learning programming", + "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", - "required": [ - "name", - "description", - "resources" - ], "properties": { "name": { - "description": "The name of the language", - "type": "string" + "type": "string", + "description": "The name of the language" + }, + "meta": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Language" + }, + "domains": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Web Development", + "Data Science", + "Mobile Development", + "Game Development", + "Systems Programming", + "Scripting", + "General Purpose" + ], + "description": "A domain that a programming language may be used in." + }, + "description": "The domain(s) that the programming language is commonly used in, or best suited for." + }, + "paradigms": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming", + "Logic Programming" + ], + "description": "A programming paradigm." + }, + "description": "The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc." + } + }, + "required": [ + "type", + "domains", + "paradigms" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Platform" + } + }, + "required": [ + "type" + ], + "additionalProperties": false, + "description": "A platform used to learn programming, which may teach a variety of languages and concepts." + } + ], + "description": "The type of the resource set" }, "description": { - "description": "A brief description of the language and its uses", "type": "string", - "maxLength": 256 + "maxLength": 256, + "description": "A brief description of the language and its uses" }, "emoji": { "description": "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", "type": "string" }, "resources": { - "description": "List of resources that can be used for learning / practicing the language", + "minItems": 1, "type": "array", "items": { - "$ref": "#/definitions/resource" - }, - "minItems": 1, - "uniqueItems": true - } - }, - "definitions": { - "resource": { - "type": "object", - "required": [ - "name", - "url", - "pricing" - ], - "properties": { - "name": { - "type": "string", - "description": "The official name of the resource" - }, - "description": { - "type": "string", - "description": "A brief description of the resource", - "maxLength": 256 - }, - "url": { - "type": "string", - "description": "URL to the resource" - }, - "pricing": { - "type": "object", - "description": "Details about the cost of the resource.", - "oneOf": [ - { - "properties": { - "model": { - "type": "string", - "description": "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. ", - "enum": [ - "Free", - "Freemium" - ] + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The official name of the resource" + }, + "description": { + "description": "A brief description of the resource", + "type": "string", + "maxLength": 256 + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL to the resource" + }, + "pricing": { + "anyOf": [ + { + "type": "object", + "properties": { + "model": { + "type": "string", + "enum": [ + "Free", + "Freemium" + ], + "description": "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. " + } }, - "amount": false + "required": [ + "model" + ], + "additionalProperties": false }, - "required": [ - "model" - ] - }, - { - "properties": { - "model": { - "type": "string", - "description": "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly).", - "enum": [ - "Subscription", - "One Time" - ] + { + "type": "object", + "properties": { + "model": { + "type": "string", + "enum": [ + "Subscription", + "One Time" + ], + "description": "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly)." + }, + "amount": { + "type": "number", + "exclusiveMinimum": 0, + "description": "The price of this resource, in US Dollars." + } }, - "amount": { - "description": "The price of this resource, in US Dollars.", - "type": "number", - "exclusiveMinimum": 0, - "examples": [ - 15, - 99.99 - ] - } - }, - "required": [ - "model", - "amount" - ] + "required": [ + "model", + "amount" + ], + "additionalProperties": false + } + ], + "description": "Details about the cost of the resource." + }, + "pros": { + "description": "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'", + "type": "array", + "items": { + "type": "string" + } + }, + "cons": { + "description": "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", + "type": "array", + "items": { + "type": "string" } - ] - }, - "pros": { - "type": "array", - "description": "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'", - "items": { - "type": "string" } }, - "cons": { - "type": "array", - "description": "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", - "items": { - "type": "string" - } - } - } + "required": [ + "name", + "url", + "pricing" + ], + "additionalProperties": false + }, + "description": "List of resources that can be used for learning / practicing the language" } - } -} \ No newline at end of file + }, + "required": [ + "name", + "meta", + "description", + "resources" + ], + "additionalProperties": false, + "description": "Set of resources that can be used for learning programming" +} diff --git a/resources/languages/callisto.yaml b/resources/languages/callisto.yaml index 4597eb0..6273053 100644 --- a/resources/languages/callisto.yaml +++ b/resources/languages/callisto.yaml @@ -1,6 +1,10 @@ name: Callisto description: Callisto is a concatenative low-level programming language designed by John Mesyeti Smith in March 2024 emoji: "821822658169536542" +meta: + type: 'Language' + domains: [] + paradigms: [] resources: - name: Callisto documentation url: https://callisto.mesyeti.uk/docs diff --git a/resources/languages/clojure.yaml b/resources/languages/clojure.yaml index 3712d85..64ff987 100644 --- a/resources/languages/clojure.yaml +++ b/resources/languages/clojure.yaml @@ -1,6 +1,11 @@ name: Clojure description: Clojure is a dynamic functional language from the Lisp family that runs on many different platforms emoji: '821823652404265001' +meta: + type: 'Language' + domains: [] + paradigms: + - 'Functional Programming' resources: - name: Clojure For The Brave And True url: https://www.braveclojure.com/clojure-for-the-brave-and-true/ diff --git a/resources/languages/cpp.yaml b/resources/languages/cpp.yaml index 0f0bb4d..ca01f03 100644 --- a/resources/languages/cpp.yaml +++ b/resources/languages/cpp.yaml @@ -1,6 +1,14 @@ name: C++ description: C++ is a statically typed general-purpose language designed by Bjarne Stroustrup in 1985 emoji: '821822658169536542' +meta: + type: 'Language' + domains: + - 'Systems Programming' + - 'Game Development' + paradigms: + - 'Object-Oriented Programming' + - 'Procedural Programming' resources: - name: C++ - Video Playlist url: https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb diff --git a/resources/languages/haskell.yaml b/resources/languages/haskell.yaml index 59d87db..874ca3e 100644 --- a/resources/languages/haskell.yaml +++ b/resources/languages/haskell.yaml @@ -1,6 +1,11 @@ name: Haskell description: Haskell is a purely functional programming language commonly used in finance and academics emoji: "821823367333675058" +meta: + type: "Language" + domains: [] + paradigms: + - "Functional Programming" resources: - name: Learn you a Haskell url: http://learnyouahaskell.com/ diff --git a/resources/languages/java.yaml b/resources/languages/java.yaml index df7d3fc..5ddb25f 100644 --- a/resources/languages/java.yaml +++ b/resources/languages/java.yaml @@ -1,6 +1,11 @@ name: Java description: Java is an Object Oriented language designed by James Gosling in 1995 emoji: '821822045187866625' +meta: + type: 'Language' + domains: [] + paradigms: + - 'Object-Oriented Programming' resources: - name: Tutorial Spot url: https://www.tutorialspoint.com/java/index.htm diff --git a/resources/languages/kotlin.yaml b/resources/languages/kotlin.yaml index 3ecdd2d..4d57ff3 100644 --- a/resources/languages/kotlin.yaml +++ b/resources/languages/kotlin.yaml @@ -1,13 +1,21 @@ name: Kotlin description: "Kotlin is a multi-paradigm programming language created by JetBrains that runs on the JVM, JS, and Native Platforms" -emoji: '888496555529744395' +emoji: "888496555529744395" +meta: + type: "Language" + domains: + - "Mobile Development" + paradigms: + - "Object-Oriented Programming" + - "Functional Programming" + - "Procedural Programming" resources: - name: "Kotlin Official Website" url: "https://kotlinlang.org/" pricing: model: "Free" - pros: [ ] - cons: [ ] + pros: [] + cons: [] - name: "Introduction to Kotlin (Google I/O '17)" url: "https://www.youtube.com/watch?v=X1RVYt2QKQE" @@ -15,7 +23,7 @@ resources: model: "Free" pros: - "Video for visual learners" - cons: [ ] + cons: [] - name: "FreeCodeCamp.org" url: "https://youtu.be/F9UC9DY-vIU" @@ -23,4 +31,4 @@ resources: model: "Free" pros: - "Video for visual learners" - cons: [ ] \ No newline at end of file + cons: [] diff --git a/resources/languages/php.yaml b/resources/languages/php.yaml index 76f9fa7..fd34b25 100644 --- a/resources/languages/php.yaml +++ b/resources/languages/php.yaml @@ -1,69 +1,77 @@ -name: PHP -description: PHP is a widely-used, open-source, server-side scripting language designed for web development. It is particularly suitable for creating dynamic and interactive websites. -emoji: '🐘' -resources: -- name: PHP Manual - url: https://www.php.net/manual/en/ - pricing: - model: 'Free' - pros: - - Comprehensive and up-to-date documentation - - Includes tutorials, guides, and reference material - - Suitable for beginners and experienced developers alike - cons: - - May be too technical and dry for some learners +name: PHP +description: PHP is a widely-used, open-source, server-side scripting language designed for web development. It is particularly suitable for creating dynamic and interactive websites. +emoji: "🐘" +meta: + type: "Language" + domains: + - "Web Development" + paradigms: + - "Procedural Programming" + - "Object-Oriented Programming" + - "Functional Programming" +resources: + - name: PHP Manual + url: https://www.php.net/manual/en/ + pricing: + model: "Free" + pros: + - Comprehensive and up-to-date documentation + - Includes tutorials, guides, and reference material + - Suitable for beginners and experienced developers alike + cons: + - May be too technical and dry for some learners -- name: W3Schools PHP Tutorial - url: https://www.w3schools.com/php/ - pricing: - model: 'Free' - pros: - - Beginner-friendly and easy to navigate - - Includes interactive examples and a "Try it Yourself" feature - - Covers essential PHP concepts and syntax - cons: - - May lack depth on advanced topics + - name: W3Schools PHP Tutorial + url: https://www.w3schools.com/php/ + pricing: + model: "Free" + pros: + - Beginner-friendly and easy to navigate + - Includes interactive examples and a "Try it Yourself" feature + - Covers essential PHP concepts and syntax + cons: + - May lack depth on advanced topics -- name: Codecademy PHP Course - url: https://www.codecademy.com/learn/learn-php - pricing: - model: 'Freemium' - pros: - - Interactive lessons and quizzes - - Hands-on experience writing PHP code - - Covers modern PHP features and best practices - cons: - - Full access requires a subscription + - name: Codecademy PHP Course + url: https://www.codecademy.com/learn/learn-php + pricing: + model: "Freemium" + pros: + - Interactive lessons and quizzes + - Hands-on experience writing PHP code + - Covers modern PHP features and best practices + cons: + - Full access requires a subscription -- name: Laracasts PHP Basics - url: https://laracasts.com/series/php-for-beginners - pricing: - model: 'Free' - pros: - - Video tutorials by experienced developers - - Covers beginner to intermediate PHP topics - - Focus on practical, real-world applications + - name: Laracasts PHP Basics + url: https://laracasts.com/series/php-for-beginners + pricing: + model: "Free" + pros: + - Video tutorials by experienced developers + - Covers beginner to intermediate PHP topics + - Focus on practical, real-world applications -- name: PHP The Right Way - url: https://phptherightway.com/ - pricing: - model: 'Free' - pros: - - Community-driven guide to modern PHP practices - - Covers best practices, tools, and resources - - Regularly updated - cons: - - Assumes basic familiarity with PHP + - name: PHP The Right Way + url: https://phptherightway.com/ + pricing: + model: "Free" + pros: + - Community-driven guide to modern PHP practices + - Covers best practices, tools, and resources + - Regularly updated + cons: + - Assumes basic familiarity with PHP -- name: Udemy PHP Courses - url: https://www.udemy.com/topic/php/ - pricing: - model: 'One Time' + - name: Udemy PHP Courses + url: https://www.udemy.com/topic/php/ + pricing: + model: "One Time" amount: 29.99 - pros: - - Wide variety of courses for all skill levels - - Affordable and often discounted - - Lifetime access to purchased courses - cons: - - Quality may vary between courses + pros: + - Wide variety of courses for all skill levels + - Affordable and often discounted + - Lifetime access to purchased courses + cons: + - Quality may vary between courses diff --git a/resources/languages/python.yaml b/resources/languages/python.yaml index 57ea909..b88fa43 100644 --- a/resources/languages/python.yaml +++ b/resources/languages/python.yaml @@ -1,65 +1,74 @@ name: Python description: Python is a powerful, high-level, dynamically typed, interpreted programming language. It is used in a wide range of fields, including web development, data analysis, and artificial intelligence. -emoji: '821824146270715936' +emoji: "821824146270715936" +meta: + type: "Language" + domains: + - "Web Development" + - "Data Science" + - "Scripting" + paradigms: + - "Object-Oriented Programming" + - "Procedural Programming" resources: -- name: Codecademy - url: https://www.codecademy.com/learn/learn-python - pricing: + - name: Codecademy + url: https://www.codecademy.com/learn/learn-python + pricing: model: "Free" - pros: - - Interactive lessons and quizzes - - Hands-on experience writing Python code - - Introduction to key Python concepts and libraries - cons: - - May not cover more advanced topics in depth -- name: Learn Python the Hard Way - url: https://learnpythonthehardway.org/ - pricing: + pros: + - Interactive lessons and quizzes + - Hands-on experience writing Python code + - Introduction to key Python concepts and libraries + cons: + - May not cover more advanced topics in depth + - name: Learn Python the Hard Way + url: https://learnpythonthehardway.org/ + pricing: model: "One Time" amount: 29.00 - pros: - - Comprehensive and in-depth coverage of Python - - Includes quizzes and exercises to test your knowledge - - Suitable for beginners and experienced programmers alike - cons: - - May be too challenging for some learners -- name: Python for Everybody - url: https://www.py4e.com/ - pricing: + pros: + - Comprehensive and in-depth coverage of Python + - Includes quizzes and exercises to test your knowledge + - Suitable for beginners and experienced programmers alike + cons: + - May be too challenging for some learners + - name: Python for Everybody + url: https://www.py4e.com/ + pricing: model: "Free" - pros: - - Suitable for absolute beginners - - Covers key Python concepts and libraries - - Includes quizzes and exercises to test your knowledge - cons: - - May not cover more advanced topics in depth -- name: Python documentation - url: https://docs.python.org/3/ - pricing: + pros: + - Suitable for absolute beginners + - Covers key Python concepts and libraries + - Includes quizzes and exercises to test your knowledge + cons: + - May not cover more advanced topics in depth + - name: Python documentation + url: https://docs.python.org/3/ + pricing: model: "Free" - pros: - - Comprehensive and up-to-date documentation - - Includes tutorials, guides, and reference material - - Suitable for beginners and experienced programmers alike - cons: - - May be too technical and dry for some learners -- name: Python for Data Science - url: https://www.datacamp.com/courses/intro-to-python-for-data-science - pricing: + pros: + - Comprehensive and up-to-date documentation + - Includes tutorials, guides, and reference material + - Suitable for beginners and experienced programmers alike + cons: + - May be too technical and dry for some learners + - name: Python for Data Science + url: https://www.datacamp.com/courses/intro-to-python-for-data-science + pricing: model: "Freemium" - pros: - - Focuses on using Python for data analysis and machine learning - - Interactive lessons and hands-on experience writing Python code - - Introduction to key Python libraries for data science - cons: - - May not cover more general Python concepts in depth -- name: Python on Coursera - url: https://www.coursera.org/courses?query=python - pricing: + pros: + - Focuses on using Python for data analysis and machine learning + - Interactive lessons and hands-on experience writing Python code + - Introduction to key Python libraries for data science + cons: + - May not cover more general Python concepts in depth + - name: Python on Coursera + url: https://www.coursera.org/courses?query=python + pricing: model: "Freemium" - pros: - - Wide variety of courses and specialization tracks - - Taught by experienced instructors from top universities - - Many courses include quizzes, projects, and certificates - cons: - - Some courses may have prerequisites or require a subscription + pros: + - Wide variety of courses and specialization tracks + - Taught by experienced instructors from top universities + - Many courses include quizzes, projects, and certificates + cons: + - Some courses may have prerequisites or require a subscription diff --git a/resources/languages/rust.yaml b/resources/languages/rust.yaml index 73646cc..c5e2bcd 100644 --- a/resources/languages/rust.yaml +++ b/resources/languages/rust.yaml @@ -1,6 +1,15 @@ name: Rust description: Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010 -emoji: '821824283965128774' +emoji: "821824283965128774" +meta: + type: "Language" + domains: + - "Systems Programming" + - "Web Development" + - "Game Development" + paradigms: + - "Procedural Programming" + - "Functional Programming" resources: - name: The Rust Programming Language (Book) url: https://doc.rust-lang.org/book/ @@ -10,7 +19,7 @@ resources: - Very detailed - Frequently updated - Semi-Official - cons: [ ] + cons: [] - name: Rust by Example url: https://doc.rust-lang.org/stable/rust-by-example/ @@ -19,7 +28,7 @@ resources: pros: - Teaches concepts by example - Semi-Official - cons: [ ] + cons: [] - name: Rust Crash Course | Traversy Media url: https://www.youtube.com/watch?v=zF34dRivLOw @@ -27,5 +36,4 @@ resources: model: "Free" pros: - Video series - cons: [ ] - + cons: [] diff --git a/resources/languages/sql.yaml b/resources/languages/sql.yaml index 0c65776..d7852f3 100644 --- a/resources/languages/sql.yaml +++ b/resources/languages/sql.yaml @@ -1,6 +1,10 @@ name: SQL description: SQL (Structured Query Language) is a standard programming language for managing and manipulating databases. emoji: "💾" +meta: + type: "Language" + domains: [] + paradigms: [] resources: - name: SQL Tutorial by W3Schools url: https://www.w3schools.com/sql/ diff --git a/resources/platforms/miscellaneous.yaml b/resources/platforms/miscellaneous.yaml index bd518c2..2805d89 100644 --- a/resources/platforms/miscellaneous.yaml +++ b/resources/platforms/miscellaneous.yaml @@ -1,6 +1,8 @@ name: Miscellaneous description: A list of resources that cover a wide range of topics, not specific to any programming language. emoji: '⚙️' +meta: + type: 'Platform' resources: - name: Every link I wish I had as a beginner url: https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner diff --git a/resources/theory/general.yaml b/resources/theory/general.yaml index b83a11a..f24c6b6 100644 --- a/resources/theory/general.yaml +++ b/resources/theory/general.yaml @@ -1,5 +1,7 @@ name: General description: Things that are useful for learning any programming language, or don't fit into any other category +meta: + type: 'Platform' resources: - name: The Missing Semester of Your CS Education description: Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc diff --git a/resources/theory/programming-language-design.yaml b/resources/theory/programming-language-design.yaml index f60e4a2..dd198a8 100644 --- a/resources/theory/programming-language-design.yaml +++ b/resources/theory/programming-language-design.yaml @@ -1,6 +1,8 @@ name: Programming Language Design description: Resources on language design, parsers, compilers, etc -emoji: '🔨' +emoji: "🔨" +meta: + type: "Platform" resources: - name: Crafting Interpreters url: https://craftinginterpreters.com/ diff --git a/tsconfig.json b/tsconfig.json index b2e7497..5a30381 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,30 +1,30 @@ { - "compilerOptions": { - // Environment setup & latest features - "lib": ["ESNext"], - "target": "ESNext", - "module": "Preserve", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, - "types": ["bun"], + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + "types": ["bun"], - // Bundler mode - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, - // Best practices - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, - "noImplicitOverride": true, + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, - // Some stricter flags (disabled by default) - "noUnusedLocals": false, - "noUnusedParameters": false, - "noPropertyAccessFromIndexSignature": false - } + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } } From cb0a68774baed37a892161935fd59d2e4f1d68b5 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 13:30:33 +0100 Subject: [PATCH 06/22] start moving to new improved schema --- .vscode/settings.json | 3 +- index.ts | 135 +++++++++++++++-------- metadata.schema.jsonc | 104 ++++++++++++++++++ metadata/languages/haskell.yaml | 8 ++ metadata/topics/git.yaml | 10 ++ resource.schema.json | 182 ------------------------------- resource.schema.jsonc | 1 + resources/languages/haskell.yaml | 9 +- 8 files changed, 215 insertions(+), 237 deletions(-) create mode 100644 metadata.schema.jsonc create mode 100644 metadata/languages/haskell.yaml create mode 100644 metadata/topics/git.yaml delete mode 100644 resource.schema.json create mode 100644 resource.schema.jsonc diff --git a/.vscode/settings.json b/.vscode/settings.json index b46d3d2..9788ff9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "yaml.schemas": { - "resource.schema.json": "resources/**/*.yaml", + "resource.schema.jsonc": "resources/**/*.yaml", + "metadata.schema.jsonc": "metadata/**/*.yaml", } } diff --git a/index.ts b/index.ts index 97d4684..49088e9 100644 --- a/index.ts +++ b/index.ts @@ -1,3 +1,4 @@ +import { parseArgs } from "util"; import { z } from "zod"; /** @@ -29,36 +30,48 @@ const PricingSchema = z ]) .describe("Details about the cost of the resource."); -export const LanguageDomainSchema = z.enum([ - "Web Development", - "Data Science", - "Mobile Development", - "Game Development", - "Systems Programming", - "Scripting", - "General Purpose" -]).describe("A domain that a programming language may be used in."); - -export const ProgrammingParadigmSchema = z.enum([ - "Object-Oriented Programming", - "Functional Programming", - "Procedural Programming", - "Logic Programming" -]).describe("A programming paradigm."); +export const LanguageDomainSchema = z + .enum([ + "Web Development", + "Data Science", + "Mobile Development", + "Game Development", + "Systems Programming", + "Scripting", + "General Purpose", + "DevOps" + ]) + .describe("A domain that a programming language may be used in."); -export const ResourceTypeSchema = z.discriminatedUnion("type", [ - z.object({ - type: z.literal("Language"), - domains: z.array(LanguageDomainSchema).describe("The domain(s) that the programming language is commonly used in, or best suited for."), - paradigms: z.array(ProgrammingParadigmSchema).describe("The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc."), - }), - z.object({ - type: z.literal("Platform") - }).describe( - "A platform used to learn programming, which may teach a variety of languages and concepts." - ) -]).describe("The type of the resource set") +export const ProgrammingParadigmSchema = z + .enum([ + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming", + "Logic Programming", + ]) + .describe("A programming paradigm."); +export const ResourceCategorySchema = z + .discriminatedUnion("type", [ + z.object({ + type: z.literal("Language"), + paradigms: z + .array(ProgrammingParadigmSchema) + .describe( + "The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc.", + ), + }), + z.object({ + type: z.literal("Platform"), + }).describe( + "A platform used to learn programming, which may teach a variety of languages and concepts.", + ), + z.object({ + type: z.literal("Tool"), + }) + ]) + .describe("The category of the resource"); const ResourceSchema = z.object({ name: z.string().describe("The official name of the resource"), @@ -83,21 +96,8 @@ const ResourceSchema = z.object({ ), }); - export const LanguageResourceSchema = z .object({ - name: z.string().describe("The name of the language"), - meta: ResourceTypeSchema, - description: z - .string() - .max(256) - .describe("A brief description of the language and its uses"), - emoji: z - .string() - .optional() - .describe( - "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", - ), resources: z .array(ResourceSchema) .min(1) @@ -107,10 +107,53 @@ export const LanguageResourceSchema = z }) .describe("Set of resources that can be used for learning programming"); -export type Pricing = z.infer; -export type Resource = z.infer; -export type LanguageResource = z.infer; +export const MetaSchema = z.object({ + name: z + .string() + .describe( + "The name of the language, tool, etc being described by this metadata.", + ), + description: z + .string() + .describe( + "A brief description of the language, tool, etc being described by this metadata.", + ), + emoji: z + .string() + .optional() + .describe( + "A Unicode emoji glyph to represent the entity, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", + ), + domains: z + .array(LanguageDomainSchema) + .describe( + "The domain(s) that the entity is commonly used in, or best suited for.", + ), + category: ResourceCategorySchema, +}); + +const header = "// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY"; + +const { values, positionals } = parseArgs({ + args: Bun.argv, + options: { + schema: { + type: "string", + }, + }, + strict: true, + allowPositionals: true, +}); +let schema: z.ZodObject; +switch (values.schema?.toLowerCase()) { + case "metadata": + schema = MetaSchema; + break; + default: + console.error(`Unknown schema: ${values.schema}`); + process.exit(1); +} -console.log('// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY') -console.log(JSON.stringify(z.toJSONSchema(LanguageResourceSchema, {}), null, 2)); \ No newline at end of file +console.log(header); +console.log(JSON.stringify(z.toJSONSchema(schema, {}), null, 2)); diff --git a/metadata.schema.jsonc b/metadata.schema.jsonc new file mode 100644 index 0000000..1189669 --- /dev/null +++ b/metadata.schema.jsonc @@ -0,0 +1,104 @@ +// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the language, tool, etc being described by this metadata." + }, + "description": { + "type": "string", + "description": "A brief description of the language, tool, etc being described by this metadata." + }, + "emoji": { + "description": "A Unicode emoji glyph to represent the entity, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", + "type": "string" + }, + "domains": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Web Development", + "Data Science", + "Mobile Development", + "Game Development", + "Systems Programming", + "Scripting", + "General Purpose", + "DevOps" + ], + "description": "A domain that a programming language may be used in." + }, + "description": "The domain(s) that the entity is commonly used in, or best suited for." + }, + "category": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Language" + }, + "paradigms": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming", + "Logic Programming" + ], + "description": "A programming paradigm." + }, + "description": "The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc." + } + }, + "required": [ + "type", + "paradigms" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Platform" + } + }, + "required": [ + "type" + ], + "additionalProperties": false, + "description": "A platform used to learn programming, which may teach a variety of languages and concepts." + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Tool" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + } + ], + "description": "The category of the resource" + } + }, + "required": [ + "name", + "description", + "domains", + "category" + ], + "additionalProperties": false +} diff --git a/metadata/languages/haskell.yaml b/metadata/languages/haskell.yaml new file mode 100644 index 0000000..d37abcc --- /dev/null +++ b/metadata/languages/haskell.yaml @@ -0,0 +1,8 @@ +name: Haskell +description: Haskell is a purely functional programming language commonly used in finance and academics +emoji: "821823367333675058" +domains: [] +category: + type: "Language" + paradigms: + - "Functional Programming" diff --git a/metadata/topics/git.yaml b/metadata/topics/git.yaml new file mode 100644 index 0000000..fda4226 --- /dev/null +++ b/metadata/topics/git.yaml @@ -0,0 +1,10 @@ +name: Git +description: A distributed version control system for tracking changes in source code during software development. +emoji: 🔀 +category: + type: "Tool" +domains: + - DevOps + +# beginner-friendliness: 3 +# related-entities: [ "GitHub", "Bash"] diff --git a/resource.schema.json b/resource.schema.json deleted file mode 100644 index 49e625e..0000000 --- a/resource.schema.json +++ /dev/null @@ -1,182 +0,0 @@ -// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the language" - }, - "meta": { - "oneOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "Language" - }, - "domains": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "Web Development", - "Data Science", - "Mobile Development", - "Game Development", - "Systems Programming", - "Scripting", - "General Purpose" - ], - "description": "A domain that a programming language may be used in." - }, - "description": "The domain(s) that the programming language is commonly used in, or best suited for." - }, - "paradigms": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "Object-Oriented Programming", - "Functional Programming", - "Procedural Programming", - "Logic Programming" - ], - "description": "A programming paradigm." - }, - "description": "The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc." - } - }, - "required": [ - "type", - "domains", - "paradigms" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "Platform" - } - }, - "required": [ - "type" - ], - "additionalProperties": false, - "description": "A platform used to learn programming, which may teach a variety of languages and concepts." - } - ], - "description": "The type of the resource set" - }, - "description": { - "type": "string", - "maxLength": 256, - "description": "A brief description of the language and its uses" - }, - "emoji": { - "description": "A Unicode emoji glyph to represent the resource, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", - "type": "string" - }, - "resources": { - "minItems": 1, - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The official name of the resource" - }, - "description": { - "description": "A brief description of the resource", - "type": "string", - "maxLength": 256 - }, - "url": { - "type": "string", - "format": "uri", - "description": "URL to the resource" - }, - "pricing": { - "anyOf": [ - { - "type": "object", - "properties": { - "model": { - "type": "string", - "enum": [ - "Free", - "Freemium" - ], - "description": "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. " - } - }, - "required": [ - "model" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "model": { - "type": "string", - "enum": [ - "Subscription", - "One Time" - ], - "description": "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly)." - }, - "amount": { - "type": "number", - "exclusiveMinimum": 0, - "description": "The price of this resource, in US Dollars." - } - }, - "required": [ - "model", - "amount" - ], - "additionalProperties": false - } - ], - "description": "Details about the cost of the resource." - }, - "pros": { - "description": "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'", - "type": "array", - "items": { - "type": "string" - } - }, - "cons": { - "description": "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "name", - "url", - "pricing" - ], - "additionalProperties": false - }, - "description": "List of resources that can be used for learning / practicing the language" - } - }, - "required": [ - "name", - "meta", - "description", - "resources" - ], - "additionalProperties": false, - "description": "Set of resources that can be used for learning programming" -} diff --git a/resource.schema.jsonc b/resource.schema.jsonc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/resource.schema.jsonc @@ -0,0 +1 @@ +{} diff --git a/resources/languages/haskell.yaml b/resources/languages/haskell.yaml index 874ca3e..292b685 100644 --- a/resources/languages/haskell.yaml +++ b/resources/languages/haskell.yaml @@ -1,11 +1,4 @@ -name: Haskell -description: Haskell is a purely functional programming language commonly used in finance and academics -emoji: "821823367333675058" -meta: - type: "Language" - domains: [] - paradigms: - - "Functional Programming" + resources: - name: Learn you a Haskell url: http://learnyouahaskell.com/ From ea393e79936a64b9344e558e674fe70c792df394 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 13:33:22 +0100 Subject: [PATCH 07/22] ci: Make yaml action run on any branch --- .github/workflows/validate.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index ae01f20..ee96b73 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -4,8 +4,6 @@ name: Validate YAMLs against JSON Schema on: push: - branches: - - master pull_request: workflow_dispatch: @@ -23,6 +21,6 @@ jobs: uses: GrantBirki/json-yaml-validate@v1.5.0 with: base_dir: resources - json_schema: "resource.schema.json" + json_schema: "resource.schema.jsonc" yaml_as_json: "true" # enable YAML to JSON conversion comment: "true" # enable comment mode From 5a5067cb447611812ac016d34ec7c001169e5ada Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 13:49:51 +0100 Subject: [PATCH 08/22] start refactoring to new resources format --- bun.lock | 56 +++++++++++ index.ts | 39 ++++++-- package.json | 11 ++- resource.schema.jsonc | 117 ++++++++++++++++++++++- resources/books/learn-you-a-haskell.yaml | 11 +++ resources/languages/callisto.yaml | 26 ----- 6 files changed, 220 insertions(+), 40 deletions(-) create mode 100644 resources/books/learn-you-a-haskell.yaml delete mode 100644 resources/languages/callisto.yaml diff --git a/bun.lock b/bun.lock index c610ebc..7015c71 100644 --- a/bun.lock +++ b/bun.lock @@ -9,6 +9,8 @@ }, "devDependencies": { "@types/bun": "latest", + "ajv-cli": "^5.0.0", + "ajv-formats": "^3.0.1", }, "peerDependencies": { "typescript": "^5", @@ -20,12 +22,66 @@ "@types/node": ["@types/node@25.6.2", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw=="], + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + + "ajv-cli": ["ajv-cli@5.0.0", "", { "dependencies": { "ajv": "^8.0.0", "fast-json-patch": "^2.0.0", "glob": "^7.1.0", "js-yaml": "^3.14.0", "json-schema-migrate": "^2.0.0", "json5": "^2.1.3", "minimist": "^1.2.0" }, "peerDependencies": { "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"], "bin": { "ajv": "dist/index.js" } }, "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ=="], + + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@1.1.14", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g=="], + "bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-json-patch": ["fast-json-patch@2.2.1", "", { "dependencies": { "fast-deep-equal": "^2.0.1" } }, "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig=="], + + "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "json-schema-migrate": ["json-schema-migrate@2.0.0", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "fast-json-patch/fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="], } } diff --git a/index.ts b/index.ts index 49088e9..d9eb514 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,25 @@ +import path from "path"; import { parseArgs } from "util"; import { z } from "zod"; +import fs from "node:fs"; + + +const topicsDir = path.join(__dirname, "./metadata/topics"); +const languagesDir = path.join(__dirname, "./metadata/languages"); + +const validTopics = fs.readdirSync(topicsDir).map(f => f.replace(".yaml", "")); +const validLanguages = fs.readdirSync(languagesDir).map(f => f.replace(".yaml", "")); + +const allValidTags = [...validTopics, ...validLanguages]; + +if (allValidTags.length === 0) { + throw new Error("No metadata entities found!"); +} + +const EntityTagEnum = z.enum([ + allValidTags[0], + ...allValidTags.slice(1) +] as [string, ...string[]]); /** * The Pricing of a Resource, which can either be Free/Freemium or Paid (Subscription/One Time) @@ -73,6 +93,10 @@ export const ResourceCategorySchema = z ]) .describe("The category of the resource"); +const ResourceTypeSchema = z.enum(["Video", "Article", "Interactive Tutorial", "Book", "Course"]).describe( + "The type of the resource", +); + const ResourceSchema = z.object({ name: z.string().describe("The official name of the resource"), description: z @@ -81,6 +105,8 @@ const ResourceSchema = z.object({ .optional() .describe("A brief description of the resource"), url: z.url().describe("URL to the resource"), + type: z.array(ResourceTypeSchema).min(1, "Must specify at least one resource type").describe("The type(s) of the resource, e.g. 'Video', 'Book', 'Course', etc."), + teaches: z.array(EntityTagEnum).min(1, "Must teach at least one topic").describe("The topics that this resource teaches."), pricing: PricingSchema, pros: z .array(z.string()) @@ -96,16 +122,6 @@ const ResourceSchema = z.object({ ), }); -export const LanguageResourceSchema = z - .object({ - resources: z - .array(ResourceSchema) - .min(1) - .describe( - "List of resources that can be used for learning / practicing the language", - ), - }) - .describe("Set of resources that can be used for learning programming"); export const MetaSchema = z.object({ name: z @@ -150,6 +166,9 @@ switch (values.schema?.toLowerCase()) { case "metadata": schema = MetaSchema; break; + case "resource": + schema = ResourceSchema; + break; default: console.error(`Unknown schema: ${values.schema}`); process.exit(1); diff --git a/package.json b/package.json index 4262097..e5e94f8 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,15 @@ "type": "module", "private": true, "scripts": { - "gen-schema": "bun run index.ts > resource.schema.json" + "gen-resource-schema": "bun run index.ts --schema resource > resource.schema.jsonc", + "gen-meta-schema": "bun run index.ts --schema metadata > metadata.schema.jsonc", + "gen-schemas": "bun run gen-resource-schema && bun run gen-meta-schema", + "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats" }, "devDependencies": { - "@types/bun": "latest" + "@types/bun": "latest", + "ajv-cli": "^5.0.0", + "ajv-formats": "^3.0.1" }, "peerDependencies": { "typescript": "^5" @@ -15,4 +20,4 @@ "dependencies": { "zod": "^4.4.3" } -} +} \ No newline at end of file diff --git a/resource.schema.jsonc b/resource.schema.jsonc index 0967ef4..4b8a701 100644 --- a/resource.schema.jsonc +++ b/resource.schema.jsonc @@ -1 +1,116 @@ -{} +// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The official name of the resource" + }, + "description": { + "description": "A brief description of the resource", + "type": "string", + "maxLength": 256 + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL to the resource" + }, + "type": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "enum": [ + "Video", + "Article", + "Interactive Tutorial", + "Book", + "Course" + ], + "description": "The type of the resource" + }, + "description": "The type(s) of the resource, e.g. 'Video', 'Book', 'Course', etc." + }, + "teaches": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "enum": [ + "git", + "haskell" + ] + }, + "description": "The topics that this resource teaches." + }, + "pricing": { + "anyOf": [ + { + "type": "object", + "properties": { + "model": { + "type": "string", + "enum": [ + "Free", + "Freemium" + ], + "description": "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. " + } + }, + "required": [ + "model" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "model": { + "type": "string", + "enum": [ + "Subscription", + "One Time" + ], + "description": "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly)." + }, + "amount": { + "type": "number", + "exclusiveMinimum": 0, + "description": "The price of this resource, in US Dollars." + } + }, + "required": [ + "model", + "amount" + ], + "additionalProperties": false + } + ], + "description": "Details about the cost of the resource." + }, + "pros": { + "description": "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'", + "type": "array", + "items": { + "type": "string" + } + }, + "cons": { + "description": "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "name", + "url", + "type", + "teaches", + "pricing" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/resources/books/learn-you-a-haskell.yaml b/resources/books/learn-you-a-haskell.yaml new file mode 100644 index 0000000..36c69e4 --- /dev/null +++ b/resources/books/learn-you-a-haskell.yaml @@ -0,0 +1,11 @@ +name: Learn You a Haskell +type: [Book] +url: http://learnyouahaskell.com/ +pricing: + model: Free +teaches: + - haskell +pros: + - Good for beginners + - Good reputation +cons: [] diff --git a/resources/languages/callisto.yaml b/resources/languages/callisto.yaml deleted file mode 100644 index 6273053..0000000 --- a/resources/languages/callisto.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Callisto -description: Callisto is a concatenative low-level programming language designed by John Mesyeti Smith in March 2024 -emoji: "821822658169536542" -meta: - type: 'Language' - domains: [] - paradigms: [] -resources: - - name: Callisto documentation - url: https://callisto.mesyeti.uk/docs - pricing: - model: 'Free' - pros: - - made by the creator of callisto - - thorough explanation - - useful if you know the basics of stack based programming - cons: [] - - name: Callisto tour - url: https://callisto.mesyeti.uk/tour - pricing: - model: 'Free' - pros: - - made by the creator callisto - - explains the basics of stack based programming so you can easily get started with callisto - cons: - - nowhere near finished From 6a09cd044994e2690a04b0b277189f3cde4eabf2 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 17:01:06 +0100 Subject: [PATCH 09/22] refactor: Big refactor of file structure and separate schemas --- metadata/languages/clojure.yaml | 8 ++ metadata/languages/cpp.yaml | 11 +++ metadata/languages/java.yaml | 8 ++ metadata/languages/kotlin.yaml | 11 +++ metadata/languages/php.yaml | 10 +++ metadata/languages/python.yaml | 12 +++ metadata/languages/rust.yaml | 12 +++ metadata/languages/sql.yaml | 6 ++ metadata/topics/general.yaml | 5 ++ .../topics/programming-language-design.yaml | 5 ++ resource.schema.jsonc | 12 ++- resources/languages/clojure.yaml | 72 ----------------- .../languages/clojure/api_cheatsheet.yaml | 11 +++ .../languages/clojure/beginner_resources.yaml | 10 +++ resources/languages/clojure/by_example.yaml | 12 +++ .../clojure/for_java_programmers.yaml | 12 +++ .../clojure/for_the_brave_and_true.yaml | 11 +++ resources/languages/clojure/four_clojure.yaml | 11 +++ .../functions_explained_through_patterns.yaml | 10 +++ resources/languages/cpp.yaml | 54 ------------- resources/languages/cpp/core_guidelines.yaml | 13 ++++ resources/languages/cpp/cppreference.yaml | 12 +++ resources/languages/cpp/modernes_cpp.yaml | 13 ++++ resources/languages/cpp/video_playlist.yaml | 12 +++ resources/languages/haskell.yaml | 54 ------------- .../craft_of_functional_programming.yaml | 9 +++ ...l_programming_supercharge_your_coding.yaml | 10 +++ ...ell_programming_from_first_principles.yaml | 11 +++ .../languages/haskell/haskell_wikibooks.yaml | 12 +++ .../haskell/write_yourself_in_48_hours.yaml | 12 +++ resources/languages/java.yaml | 58 -------------- resources/languages/java/alex_lee.yaml | 11 +++ resources/languages/java/bro_code.yaml | 11 +++ resources/languages/java/javatpoint.yaml | 7 ++ resources/languages/java/mooc_fi.yaml | 10 +++ resources/languages/java/thenewboston.yaml | 12 +++ resources/languages/java/tutorial_spot.yaml | 10 +++ resources/languages/kotlin.yaml | 34 -------- .../languages/kotlin/freecodecamp_org.yaml | 10 +++ .../kotlin/introduction_to_kotlin.yaml | 10 +++ .../languages/kotlin/official_website.yaml | 9 +++ resources/languages/php.yaml | 77 ------------------- .../languages/php/codecademy_course.yaml | 13 ++++ resources/languages/php/laracasts_basics.yaml | 11 +++ resources/languages/php/php_manual.yaml | 13 ++++ .../languages/php/php_the_right_way.yaml | 13 ++++ resources/languages/php/udemy_courses.yaml | 14 ++++ .../languages/php/w3schools_tutorial.yaml | 13 ++++ resources/languages/python.yaml | 74 ------------------ resources/languages/python/codecademy.yaml | 13 ++++ .../python/learn_python_the_hard_way.yaml | 14 ++++ .../python/python_documentation.yaml | 13 ++++ .../python/python_for_data_science.yaml | 13 ++++ .../python/python_for_everybody.yaml | 13 ++++ .../languages/python/python_on_coursera.yaml | 13 ++++ resources/languages/rust.yaml | 39 ---------- resources/languages/rust/rust_book.yaml | 12 +++ resources/languages/rust/rust_by_example.yaml | 11 +++ .../languages/rust/rust_crash_course.yaml | 10 +++ resources/languages/sql.yaml | 51 ------------ .../sql/codecademy_learn_course.yaml | 13 ++++ .../languages/sql/khan_academy_course.yaml | 13 ++++ .../languages/sql/manual_postgresql.yaml | 13 ++++ .../languages/sql/tutorial_w3schools.yaml | 13 ++++ resources/platforms/codecademy.yaml | 16 ++++ ...every_link_i_wish_i_had_as_a_beginner.yaml | 11 +++ resources/platforms/leetcode.yaml | 12 +++ resources/platforms/miscellaneous.yaml | 59 -------------- resources/platforms/programiz.yaml | 11 +++ resources/platforms/sololearn.yaml | 13 ++++ resources/theory/general.yaml | 22 ------ resources/theory/general_projects.yaml | 10 +++ ...missing_semester_of_your_cs_education.yaml | 11 +++ .../theory/programming-language-design.yaml | 22 ------ .../awesome_compilers.yaml | 10 +++ .../crafting_interpreters.yaml | 12 +++ 76 files changed, 717 insertions(+), 617 deletions(-) create mode 100644 metadata/languages/clojure.yaml create mode 100644 metadata/languages/cpp.yaml create mode 100644 metadata/languages/java.yaml create mode 100644 metadata/languages/kotlin.yaml create mode 100644 metadata/languages/php.yaml create mode 100644 metadata/languages/python.yaml create mode 100644 metadata/languages/rust.yaml create mode 100644 metadata/languages/sql.yaml create mode 100644 metadata/topics/general.yaml create mode 100644 metadata/topics/programming-language-design.yaml delete mode 100644 resources/languages/clojure.yaml create mode 100644 resources/languages/clojure/api_cheatsheet.yaml create mode 100644 resources/languages/clojure/beginner_resources.yaml create mode 100644 resources/languages/clojure/by_example.yaml create mode 100644 resources/languages/clojure/for_java_programmers.yaml create mode 100644 resources/languages/clojure/for_the_brave_and_true.yaml create mode 100644 resources/languages/clojure/four_clojure.yaml create mode 100644 resources/languages/clojure/functions_explained_through_patterns.yaml delete mode 100644 resources/languages/cpp.yaml create mode 100644 resources/languages/cpp/core_guidelines.yaml create mode 100644 resources/languages/cpp/cppreference.yaml create mode 100644 resources/languages/cpp/modernes_cpp.yaml create mode 100644 resources/languages/cpp/video_playlist.yaml delete mode 100644 resources/languages/haskell.yaml create mode 100644 resources/languages/haskell/craft_of_functional_programming.yaml create mode 100644 resources/languages/haskell/functional_programming_supercharge_your_coding.yaml create mode 100644 resources/languages/haskell/haskell_programming_from_first_principles.yaml create mode 100644 resources/languages/haskell/haskell_wikibooks.yaml create mode 100644 resources/languages/haskell/write_yourself_in_48_hours.yaml delete mode 100644 resources/languages/java.yaml create mode 100644 resources/languages/java/alex_lee.yaml create mode 100644 resources/languages/java/bro_code.yaml create mode 100644 resources/languages/java/javatpoint.yaml create mode 100644 resources/languages/java/mooc_fi.yaml create mode 100644 resources/languages/java/thenewboston.yaml create mode 100644 resources/languages/java/tutorial_spot.yaml delete mode 100644 resources/languages/kotlin.yaml create mode 100644 resources/languages/kotlin/freecodecamp_org.yaml create mode 100644 resources/languages/kotlin/introduction_to_kotlin.yaml create mode 100644 resources/languages/kotlin/official_website.yaml delete mode 100644 resources/languages/php.yaml create mode 100644 resources/languages/php/codecademy_course.yaml create mode 100644 resources/languages/php/laracasts_basics.yaml create mode 100644 resources/languages/php/php_manual.yaml create mode 100644 resources/languages/php/php_the_right_way.yaml create mode 100644 resources/languages/php/udemy_courses.yaml create mode 100644 resources/languages/php/w3schools_tutorial.yaml delete mode 100644 resources/languages/python.yaml create mode 100644 resources/languages/python/codecademy.yaml create mode 100644 resources/languages/python/learn_python_the_hard_way.yaml create mode 100644 resources/languages/python/python_documentation.yaml create mode 100644 resources/languages/python/python_for_data_science.yaml create mode 100644 resources/languages/python/python_for_everybody.yaml create mode 100644 resources/languages/python/python_on_coursera.yaml delete mode 100644 resources/languages/rust.yaml create mode 100644 resources/languages/rust/rust_book.yaml create mode 100644 resources/languages/rust/rust_by_example.yaml create mode 100644 resources/languages/rust/rust_crash_course.yaml delete mode 100644 resources/languages/sql.yaml create mode 100644 resources/languages/sql/codecademy_learn_course.yaml create mode 100644 resources/languages/sql/khan_academy_course.yaml create mode 100644 resources/languages/sql/manual_postgresql.yaml create mode 100644 resources/languages/sql/tutorial_w3schools.yaml create mode 100644 resources/platforms/codecademy.yaml create mode 100644 resources/platforms/every_link_i_wish_i_had_as_a_beginner.yaml create mode 100644 resources/platforms/leetcode.yaml delete mode 100644 resources/platforms/miscellaneous.yaml create mode 100644 resources/platforms/programiz.yaml create mode 100644 resources/platforms/sololearn.yaml delete mode 100644 resources/theory/general.yaml create mode 100644 resources/theory/general_projects.yaml create mode 100644 resources/theory/missing_semester_of_your_cs_education.yaml delete mode 100644 resources/theory/programming-language-design.yaml create mode 100644 resources/theory/programming-language-design/awesome_compilers.yaml create mode 100644 resources/theory/programming-language-design/crafting_interpreters.yaml diff --git a/metadata/languages/clojure.yaml b/metadata/languages/clojure.yaml new file mode 100644 index 0000000..157e7f5 --- /dev/null +++ b/metadata/languages/clojure.yaml @@ -0,0 +1,8 @@ +name: Clojure +description: Clojure is a dynamic functional language from the Lisp family that runs on many different platforms +emoji: "821823652404265001" +domains: [] +category: + type: "Language" + paradigms: + - "Functional Programming" diff --git a/metadata/languages/cpp.yaml b/metadata/languages/cpp.yaml new file mode 100644 index 0000000..56223fd --- /dev/null +++ b/metadata/languages/cpp.yaml @@ -0,0 +1,11 @@ +name: C++ +description: C++ is a statically typed general-purpose language designed by Bjarne Stroustrup in 1985 +emoji: "821822658169536542" +domains: + - "Systems Programming" + - "Game Development" +category: + type: "Language" + paradigms: + - "Object-Oriented Programming" + - "Procedural Programming" diff --git a/metadata/languages/java.yaml b/metadata/languages/java.yaml new file mode 100644 index 0000000..f1be2c2 --- /dev/null +++ b/metadata/languages/java.yaml @@ -0,0 +1,8 @@ +name: Java +description: Java is an Object Oriented language designed by James Gosling in 1995 +emoji: "821822045187866625" +domains: [] +category: + type: "Language" + paradigms: + - "Object-Oriented Programming" diff --git a/metadata/languages/kotlin.yaml b/metadata/languages/kotlin.yaml new file mode 100644 index 0000000..1dd1ba0 --- /dev/null +++ b/metadata/languages/kotlin.yaml @@ -0,0 +1,11 @@ +name: Kotlin +description: Kotlin is a multi-paradigm programming language created by JetBrains that runs on the JVM, JS, and Native Platforms +emoji: "888496555529744395" +domains: + - "Mobile Development" +category: + type: "Language" + paradigms: + - "Object-Oriented Programming" + - "Functional Programming" + - "Procedural Programming" diff --git a/metadata/languages/php.yaml b/metadata/languages/php.yaml new file mode 100644 index 0000000..a5b0378 --- /dev/null +++ b/metadata/languages/php.yaml @@ -0,0 +1,10 @@ +name: PHP +description: PHP is a widely-used, open-source, server-side scripting language designed for web development. It is particularly suitable for creating dynamic and interactive websites. +domains: + - "Web Development" +category: + type: "Language" + paradigms: + - "Procedural Programming" + - "Object-Oriented Programming" + - "Functional Programming" diff --git a/metadata/languages/python.yaml b/metadata/languages/python.yaml new file mode 100644 index 0000000..2886c5e --- /dev/null +++ b/metadata/languages/python.yaml @@ -0,0 +1,12 @@ +name: Python +description: Python is a powerful, high-level, dynamically typed, interpreted programming language. It is used in a wide range of fields, including web development, data analysis, and artificial intelligence. +emoji: "821824146270715936" +domains: + - "Web Development" + - "Data Science" + - "Scripting" +category: + type: "Language" + paradigms: + - "Object-Oriented Programming" + - "Procedural Programming" diff --git a/metadata/languages/rust.yaml b/metadata/languages/rust.yaml new file mode 100644 index 0000000..be0acdd --- /dev/null +++ b/metadata/languages/rust.yaml @@ -0,0 +1,12 @@ +name: Rust +description: Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010 +emoji: "821824283965128774" +domains: + - "Systems Programming" + - "Web Development" + - "Game Development" +category: + type: "Language" + paradigms: + - "Procedural Programming" + - "Functional Programming" diff --git a/metadata/languages/sql.yaml b/metadata/languages/sql.yaml new file mode 100644 index 0000000..5a41d45 --- /dev/null +++ b/metadata/languages/sql.yaml @@ -0,0 +1,6 @@ +name: SQL +description: SQL (Structured Query Language) is a standard programming language for managing and manipulating databases. +domains: [] +category: + type: "Language" + paradigms: [] diff --git a/metadata/topics/general.yaml b/metadata/topics/general.yaml new file mode 100644 index 0000000..159d63d --- /dev/null +++ b/metadata/topics/general.yaml @@ -0,0 +1,5 @@ +name: General +description: Resources that are broadly useful for learning programming, regardless of language. +domains: [] +category: + type: "Platform" diff --git a/metadata/topics/programming-language-design.yaml b/metadata/topics/programming-language-design.yaml new file mode 100644 index 0000000..8c8c053 --- /dev/null +++ b/metadata/topics/programming-language-design.yaml @@ -0,0 +1,5 @@ +name: Programming Language Design +description: Resources on language design, parsers, compilers, and related concepts. +domains: [] +category: + type: "Platform" diff --git a/resource.schema.jsonc b/resource.schema.jsonc index 4b8a701..d4ac5d5 100644 --- a/resource.schema.jsonc +++ b/resource.schema.jsonc @@ -39,7 +39,17 @@ "items": { "type": "string", "enum": [ + "general", + "programming-language-design", "git", + "clojure", + "cpp", + "java", + "rust", + "sql", + "php", + "python", + "kotlin", "haskell" ] }, @@ -113,4 +123,4 @@ "pricing" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/resources/languages/clojure.yaml b/resources/languages/clojure.yaml deleted file mode 100644 index 64ff987..0000000 --- a/resources/languages/clojure.yaml +++ /dev/null @@ -1,72 +0,0 @@ -name: Clojure -description: Clojure is a dynamic functional language from the Lisp family that runs on many different platforms -emoji: '821823652404265001' -meta: - type: 'Language' - domains: [] - paradigms: - - 'Functional Programming' -resources: - - name: Clojure For The Brave And True - url: https://www.braveclojure.com/clojure-for-the-brave-and-true/ - pricing: - model: 'Free' - pros: - - Complete guide through most of the language - - Assumes no prior knowledge of functional programming or Lisp - cons: [ ] - - - name: Functions Explained Through Patterns - url: http://blog.josephwilk.net/clojure/functions-explained-through-patterns.html - pricing: - model: 'Free' - pros: - - Visual explanations of core Clojure functions - cons: [ ] - - - name: 4clojure - url: https://4clojure.oxal.org/ - pricing: - model: 'Free' - pros: - - Interactive exercises - cons: - - No tutorial from the ground up - - - name: Clojure by Example - url: https://github.com/inclojure-org/clojure-by-example - pricing: - model: 'Free' - pros: - - Hands-on learning - - Crash Course - cons: - - No thorough explanations for complete programming beginners - - - name: Clojure for Java Programmers - url: https://www.youtube.com/watch?v=P76Vbsk_3J0 - pricing: - model: 'Free' - pros: - - Video series - - Explains the ideas behind Clojure - cons: - - Mostly aimed at people from an OOP background - - - name: Clojure API Cheatsheet - url: https://clojure.org/api/cheatsheet - pricing: - model: 'Free' - pros: - - Overview over almost the entire standard library - - Quick reference - cons: [ ] - - - name: Clojure beginner resources - url: https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f - pricing: - model: 'Free' - pros: - - Collection of all kinds of resources to learn Clojure - cons: [ ] - diff --git a/resources/languages/clojure/api_cheatsheet.yaml b/resources/languages/clojure/api_cheatsheet.yaml new file mode 100644 index 0000000..c05c400 --- /dev/null +++ b/resources/languages/clojure/api_cheatsheet.yaml @@ -0,0 +1,11 @@ +name: Clojure API Cheatsheet +type: [Article] +url: https://clojure.org/api/cheatsheet +pricing: + model: Free +teaches: + - clojure +pros: + - Overview over almost the entire standard library + - Quick reference +cons: [] diff --git a/resources/languages/clojure/beginner_resources.yaml b/resources/languages/clojure/beginner_resources.yaml new file mode 100644 index 0000000..7ff7d53 --- /dev/null +++ b/resources/languages/clojure/beginner_resources.yaml @@ -0,0 +1,10 @@ +name: Clojure beginner resources +type: [Article] +url: https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f +pricing: + model: Free +teaches: + - clojure +pros: + - Collection of all kinds of resources to learn Clojure +cons: [] diff --git a/resources/languages/clojure/by_example.yaml b/resources/languages/clojure/by_example.yaml new file mode 100644 index 0000000..c30c5a6 --- /dev/null +++ b/resources/languages/clojure/by_example.yaml @@ -0,0 +1,12 @@ +name: Clojure by Example +type: [Article] +url: https://github.com/inclojure-org/clojure-by-example +pricing: + model: Free +teaches: + - clojure +pros: + - Hands-on learning + - Crash Course +cons: + - No thorough explanations for complete programming beginners diff --git a/resources/languages/clojure/for_java_programmers.yaml b/resources/languages/clojure/for_java_programmers.yaml new file mode 100644 index 0000000..575ff0f --- /dev/null +++ b/resources/languages/clojure/for_java_programmers.yaml @@ -0,0 +1,12 @@ +name: Clojure for Java Programmers +type: [Video] +url: https://www.youtube.com/watch?v=P76Vbsk_3J0 +pricing: + model: Free +teaches: + - clojure +pros: + - Video series + - Explains the ideas behind Clojure +cons: + - Mostly aimed at people from an OOP background diff --git a/resources/languages/clojure/for_the_brave_and_true.yaml b/resources/languages/clojure/for_the_brave_and_true.yaml new file mode 100644 index 0000000..c00a1cd --- /dev/null +++ b/resources/languages/clojure/for_the_brave_and_true.yaml @@ -0,0 +1,11 @@ +name: Clojure For The Brave And True +type: [Book] +url: https://www.braveclojure.com/clojure-for-the-brave-and-true/ +pricing: + model: Free +teaches: + - clojure +pros: + - Complete guide through most of the language + - Assumes no prior knowledge of functional programming or Lisp +cons: [] diff --git a/resources/languages/clojure/four_clojure.yaml b/resources/languages/clojure/four_clojure.yaml new file mode 100644 index 0000000..13dc0f6 --- /dev/null +++ b/resources/languages/clojure/four_clojure.yaml @@ -0,0 +1,11 @@ +name: 4clojure +type: [Interactive Tutorial] +url: https://4clojure.oxal.org/ +pricing: + model: Free +teaches: + - clojure +pros: + - Interactive exercises +cons: + - No tutorial from the ground up diff --git a/resources/languages/clojure/functions_explained_through_patterns.yaml b/resources/languages/clojure/functions_explained_through_patterns.yaml new file mode 100644 index 0000000..121ceb4 --- /dev/null +++ b/resources/languages/clojure/functions_explained_through_patterns.yaml @@ -0,0 +1,10 @@ +name: Functions Explained Through Patterns +type: [Article] +url: http://blog.josephwilk.net/clojure/functions-explained-through-patterns.html +pricing: + model: Free +teaches: + - clojure +pros: + - Visual explanations of core Clojure functions +cons: [] diff --git a/resources/languages/cpp.yaml b/resources/languages/cpp.yaml deleted file mode 100644 index ca01f03..0000000 --- a/resources/languages/cpp.yaml +++ /dev/null @@ -1,54 +0,0 @@ -name: C++ -description: C++ is a statically typed general-purpose language designed by Bjarne Stroustrup in 1985 -emoji: '821822658169536542' -meta: - type: 'Language' - domains: - - 'Systems Programming' - - 'Game Development' - paradigms: - - 'Object-Oriented Programming' - - 'Procedural Programming' -resources: - - name: C++ - Video Playlist - url: https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb - pricing: - model: 'Free' - pros: - - Teaches a large portion of the language's workings for best usage - - Thorough explanations - - Useful for absolute beginners as well as intermediate level - cons: [] - - - name: cppreference.com - url: https://en.cppreference.com/ - pricing: - model: 'Free' - pros: - - Documentation about the entirety of the language and the standard library - - Apt for everyone in the learning spectrum, from beginners to advanced users - cons: - - The site can become confusing and overwhelming to navigate - - - name: C++ Core Guidelines - url: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines - pricing: - model: 'Free' - pros: - - Collection of best practices for most aspects of the language - - Bite-sized titled entries, making it easy to navigate - - Contains examples to take as guide - cons: - - Requires some prior understanding of the language - - - name: Modernes C++ - url: https://www.modernescpp.com/ - pricing: - model: 'Free' - pros: - - Large series of blog posts about often less taught APIs and best practices - - Very detailed explanations with explicit examples - - Posts about new features less frequently found on the internet - cons: - - Requires intermediate-advanced knowledge of the language and its feature-set - diff --git a/resources/languages/cpp/core_guidelines.yaml b/resources/languages/cpp/core_guidelines.yaml new file mode 100644 index 0000000..6223f48 --- /dev/null +++ b/resources/languages/cpp/core_guidelines.yaml @@ -0,0 +1,13 @@ +name: C++ Core Guidelines +type: [Article] +url: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines +pricing: + model: Free +teaches: + - cpp +pros: + - Collection of best practices for most aspects of the language + - Bite-sized titled entries, making it easy to navigate + - Contains examples to take as guide +cons: + - Requires some prior understanding of the language diff --git a/resources/languages/cpp/cppreference.yaml b/resources/languages/cpp/cppreference.yaml new file mode 100644 index 0000000..13b9b03 --- /dev/null +++ b/resources/languages/cpp/cppreference.yaml @@ -0,0 +1,12 @@ +name: cppreference.com +type: [Article] +url: https://en.cppreference.com/ +pricing: + model: Free +teaches: + - cpp +pros: + - Documentation about the entirety of the language and the standard library + - Apt for everyone in the learning spectrum, from beginners to advanced users +cons: + - The site can become confusing and overwhelming to navigate diff --git a/resources/languages/cpp/modernes_cpp.yaml b/resources/languages/cpp/modernes_cpp.yaml new file mode 100644 index 0000000..b802ce8 --- /dev/null +++ b/resources/languages/cpp/modernes_cpp.yaml @@ -0,0 +1,13 @@ +name: Modernes C++ +type: [Article] +url: https://www.modernescpp.com/ +pricing: + model: Free +teaches: + - cpp +pros: + - Large series of blog posts about often less taught APIs and best practices + - Very detailed explanations with explicit examples + - Posts about new features less frequently found on the internet +cons: + - Requires intermediate-advanced knowledge of the language and its feature-set diff --git a/resources/languages/cpp/video_playlist.yaml b/resources/languages/cpp/video_playlist.yaml new file mode 100644 index 0000000..1726a1c --- /dev/null +++ b/resources/languages/cpp/video_playlist.yaml @@ -0,0 +1,12 @@ +name: C++ - Video Playlist +type: [Video] +url: https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb +pricing: + model: Free +teaches: + - cpp +pros: + - Teaches a large portion of the language's workings for best usage + - Thorough explanations + - Useful for absolute beginners as well as intermediate level +cons: [] diff --git a/resources/languages/haskell.yaml b/resources/languages/haskell.yaml deleted file mode 100644 index 292b685..0000000 --- a/resources/languages/haskell.yaml +++ /dev/null @@ -1,54 +0,0 @@ - -resources: - - name: Learn you a Haskell - url: http://learnyouahaskell.com/ - pricing: - model: "Free" - pros: - - Good for beginners - - Good reputation - cons: [] - - - name: Haskell Programming from First Principles - url: https://haskellbook.com/ - pricing: - model: "One Time" - amount: 59 - pros: - - Very good reputation - - Covers a very wide range of content - - - name: Write Yourself a Scheme in 48 hours - url: https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours - pricing: - model: "Free" - pros: - - Designed for beginners - - Learn by making a real project (creating your own small programming language) - cons: - - Moves quite quickly - - - name: Haskell Wikibooks - url: https://en.wikibooks.org/wiki/Haskell - pricing: - model: "Free" - pros: - - Wide range of content - - Explains most things fairly simply - cons: - - Some information may be outdated - - - name: "Functional Programming in Haskell: Supercharge Your Coding" - url: https://www.futurelearn.com/courses/functional-programming-haskell - pricing: - model: "Free" - pros: [] - cons: - - May be a waitlist to get access - - - name: "Haskell: The Craft of Functional Programming" - url: https://simonjohnthompson.github.io/craft3e/craft3e.pdf - pricing: - model: "Free" - pros: [] - cons: [] diff --git a/resources/languages/haskell/craft_of_functional_programming.yaml b/resources/languages/haskell/craft_of_functional_programming.yaml new file mode 100644 index 0000000..0aab495 --- /dev/null +++ b/resources/languages/haskell/craft_of_functional_programming.yaml @@ -0,0 +1,9 @@ +name: "Haskell: The Craft of Functional Programming" +type: [Book] +url: https://simonjohnthompson.github.io/craft3e/craft3e.pdf +pricing: + model: Free +teaches: + - haskell +pros: [] +cons: [] diff --git a/resources/languages/haskell/functional_programming_supercharge_your_coding.yaml b/resources/languages/haskell/functional_programming_supercharge_your_coding.yaml new file mode 100644 index 0000000..718bbca --- /dev/null +++ b/resources/languages/haskell/functional_programming_supercharge_your_coding.yaml @@ -0,0 +1,10 @@ +name: "Functional Programming in Haskell: Supercharge Your Coding" +type: [Course] +url: https://www.futurelearn.com/courses/functional-programming-haskell +pricing: + model: Free +teaches: + - haskell +pros: [] +cons: + - May be a waitlist to get access diff --git a/resources/languages/haskell/haskell_programming_from_first_principles.yaml b/resources/languages/haskell/haskell_programming_from_first_principles.yaml new file mode 100644 index 0000000..13bfff9 --- /dev/null +++ b/resources/languages/haskell/haskell_programming_from_first_principles.yaml @@ -0,0 +1,11 @@ +name: Haskell Programming from First Principles +type: [Book] +url: https://haskellbook.com/ +pricing: + model: "One Time" + amount: 59 +teaches: + - haskell +pros: + - Very good reputation + - Covers a very wide range of content diff --git a/resources/languages/haskell/haskell_wikibooks.yaml b/resources/languages/haskell/haskell_wikibooks.yaml new file mode 100644 index 0000000..7049b84 --- /dev/null +++ b/resources/languages/haskell/haskell_wikibooks.yaml @@ -0,0 +1,12 @@ +name: Haskell Wikibooks +type: [Book] +url: https://en.wikibooks.org/wiki/Haskell +pricing: + model: Free +teaches: + - haskell +pros: + - Wide range of content + - Explains most things fairly simply +cons: + - Some information may be outdated diff --git a/resources/languages/haskell/write_yourself_in_48_hours.yaml b/resources/languages/haskell/write_yourself_in_48_hours.yaml new file mode 100644 index 0000000..593a0f9 --- /dev/null +++ b/resources/languages/haskell/write_yourself_in_48_hours.yaml @@ -0,0 +1,12 @@ +name: Write Yourself a Scheme in 48 hours +type: [Book] +url: https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours +pricing: + model: Free +teaches: + - haskell +pros: + - Designed for beginners + - Learn by making a real project (creating your own small programming language) +cons: + - Moves quite quickly diff --git a/resources/languages/java.yaml b/resources/languages/java.yaml deleted file mode 100644 index 5ddb25f..0000000 --- a/resources/languages/java.yaml +++ /dev/null @@ -1,58 +0,0 @@ -name: Java -description: Java is an Object Oriented language designed by James Gosling in 1995 -emoji: '821822045187866625' -meta: - type: 'Language' - domains: [] - paradigms: - - 'Object-Oriented Programming' -resources: - - name: Tutorial Spot - url: https://www.tutorialspoint.com/java/index.htm - pricing: - model: "Free" - pros: [ ] - cons: - - Slightly dated - - - name: Alex Lee - url: https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA - pricing: - model: "Free" - pros: - - Video series - - Covers a wide range of concepts - cons: [ ] - - - name: Bro Code - url: https://www.youtube.com/c/BroCodez - pricing: - model: "Free" - pros: - - Video series - - Has videos on many different languages and concepts - cons: [ ] - - - name: Javatpoint - url: https://www.javatpoint.com/java-tutorial - pricing: - model: "Free" - - - - name: Mooc.fi - description: Comprehensive Java (and general programming) course provided by the University of Helsinki - url: https://java-programming.mooc.fi/ - pricing: - model: "Free" - pros: - - Very well respected - - - name: TheNewBoston - url: https://www.youtube.com/@thenewboston - pricing: - model: "Free" - pros: - - Beginner and intermediate video series - - Short, but a lot of videos (146 videos combined in both playlists) - cons: - - Videos may be outdated (2009 - 2012) diff --git a/resources/languages/java/alex_lee.yaml b/resources/languages/java/alex_lee.yaml new file mode 100644 index 0000000..9ce0abe --- /dev/null +++ b/resources/languages/java/alex_lee.yaml @@ -0,0 +1,11 @@ +name: Alex Lee +type: [Video] +url: https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA +pricing: + model: Free +teaches: + - java +pros: + - Video series + - Covers a wide range of concepts +cons: [] diff --git a/resources/languages/java/bro_code.yaml b/resources/languages/java/bro_code.yaml new file mode 100644 index 0000000..ebd6bb9 --- /dev/null +++ b/resources/languages/java/bro_code.yaml @@ -0,0 +1,11 @@ +name: Bro Code +type: [Video] +url: https://www.youtube.com/c/BroCodez +pricing: + model: Free +teaches: + - java +pros: + - Video series + - Has videos on many different languages and concepts +cons: [] diff --git a/resources/languages/java/javatpoint.yaml b/resources/languages/java/javatpoint.yaml new file mode 100644 index 0000000..a1ee3d4 --- /dev/null +++ b/resources/languages/java/javatpoint.yaml @@ -0,0 +1,7 @@ +name: Javatpoint +type: [Article] +url: https://www.javatpoint.com/java-tutorial +pricing: + model: Free +teaches: + - java diff --git a/resources/languages/java/mooc_fi.yaml b/resources/languages/java/mooc_fi.yaml new file mode 100644 index 0000000..e2ae62e --- /dev/null +++ b/resources/languages/java/mooc_fi.yaml @@ -0,0 +1,10 @@ +name: Mooc.fi +description: Comprehensive Java (and general programming) course provided by the University of Helsinki +type: [Course] +url: https://java-programming.mooc.fi/ +pricing: + model: Free +teaches: + - java +pros: + - Very well respected diff --git a/resources/languages/java/thenewboston.yaml b/resources/languages/java/thenewboston.yaml new file mode 100644 index 0000000..e8c2955 --- /dev/null +++ b/resources/languages/java/thenewboston.yaml @@ -0,0 +1,12 @@ +name: TheNewBoston +type: [Video] +url: https://www.youtube.com/@thenewboston +pricing: + model: Free +teaches: + - java +pros: + - Beginner and intermediate video series + - Short, but a lot of videos (146 videos combined in both playlists) +cons: + - Videos may be outdated (2009 - 2012) diff --git a/resources/languages/java/tutorial_spot.yaml b/resources/languages/java/tutorial_spot.yaml new file mode 100644 index 0000000..e5ce298 --- /dev/null +++ b/resources/languages/java/tutorial_spot.yaml @@ -0,0 +1,10 @@ +name: Tutorial Spot +type: [Article] +url: https://www.tutorialspoint.com/java/index.htm +pricing: + model: Free +teaches: + - java +pros: [] +cons: + - Slightly dated diff --git a/resources/languages/kotlin.yaml b/resources/languages/kotlin.yaml deleted file mode 100644 index 4d57ff3..0000000 --- a/resources/languages/kotlin.yaml +++ /dev/null @@ -1,34 +0,0 @@ -name: Kotlin -description: "Kotlin is a multi-paradigm programming language created by JetBrains that runs on the JVM, JS, and Native Platforms" -emoji: "888496555529744395" -meta: - type: "Language" - domains: - - "Mobile Development" - paradigms: - - "Object-Oriented Programming" - - "Functional Programming" - - "Procedural Programming" -resources: - - name: "Kotlin Official Website" - url: "https://kotlinlang.org/" - pricing: - model: "Free" - pros: [] - cons: [] - - - name: "Introduction to Kotlin (Google I/O '17)" - url: "https://www.youtube.com/watch?v=X1RVYt2QKQE" - pricing: - model: "Free" - pros: - - "Video for visual learners" - cons: [] - - - name: "FreeCodeCamp.org" - url: "https://youtu.be/F9UC9DY-vIU" - pricing: - model: "Free" - pros: - - "Video for visual learners" - cons: [] diff --git a/resources/languages/kotlin/freecodecamp_org.yaml b/resources/languages/kotlin/freecodecamp_org.yaml new file mode 100644 index 0000000..20c632a --- /dev/null +++ b/resources/languages/kotlin/freecodecamp_org.yaml @@ -0,0 +1,10 @@ +name: FreeCodeCamp.org +type: [Video] +url: https://youtu.be/F9UC9DY-vIU +pricing: + model: Free +teaches: + - kotlin +pros: + - Video for visual learners +cons: [] diff --git a/resources/languages/kotlin/introduction_to_kotlin.yaml b/resources/languages/kotlin/introduction_to_kotlin.yaml new file mode 100644 index 0000000..41cc3df --- /dev/null +++ b/resources/languages/kotlin/introduction_to_kotlin.yaml @@ -0,0 +1,10 @@ +name: Introduction to Kotlin (Google I/O '17) +type: [Video] +url: https://www.youtube.com/watch?v=X1RVYt2QKQE +pricing: + model: Free +teaches: + - kotlin +pros: + - Video for visual learners +cons: [] diff --git a/resources/languages/kotlin/official_website.yaml b/resources/languages/kotlin/official_website.yaml new file mode 100644 index 0000000..4e4cb83 --- /dev/null +++ b/resources/languages/kotlin/official_website.yaml @@ -0,0 +1,9 @@ +name: Kotlin Official Website +type: [Article] +url: https://kotlinlang.org/ +pricing: + model: Free +teaches: + - kotlin +pros: [] +cons: [] diff --git a/resources/languages/php.yaml b/resources/languages/php.yaml deleted file mode 100644 index fd34b25..0000000 --- a/resources/languages/php.yaml +++ /dev/null @@ -1,77 +0,0 @@ -name: PHP -description: PHP is a widely-used, open-source, server-side scripting language designed for web development. It is particularly suitable for creating dynamic and interactive websites. -emoji: "🐘" -meta: - type: "Language" - domains: - - "Web Development" - paradigms: - - "Procedural Programming" - - "Object-Oriented Programming" - - "Functional Programming" -resources: - - name: PHP Manual - url: https://www.php.net/manual/en/ - pricing: - model: "Free" - pros: - - Comprehensive and up-to-date documentation - - Includes tutorials, guides, and reference material - - Suitable for beginners and experienced developers alike - cons: - - May be too technical and dry for some learners - - - name: W3Schools PHP Tutorial - url: https://www.w3schools.com/php/ - pricing: - model: "Free" - pros: - - Beginner-friendly and easy to navigate - - Includes interactive examples and a "Try it Yourself" feature - - Covers essential PHP concepts and syntax - cons: - - May lack depth on advanced topics - - - name: Codecademy PHP Course - url: https://www.codecademy.com/learn/learn-php - pricing: - model: "Freemium" - pros: - - Interactive lessons and quizzes - - Hands-on experience writing PHP code - - Covers modern PHP features and best practices - cons: - - Full access requires a subscription - - - name: Laracasts PHP Basics - url: https://laracasts.com/series/php-for-beginners - pricing: - model: "Free" - pros: - - Video tutorials by experienced developers - - Covers beginner to intermediate PHP topics - - Focus on practical, real-world applications - - - name: PHP The Right Way - url: https://phptherightway.com/ - pricing: - model: "Free" - pros: - - Community-driven guide to modern PHP practices - - Covers best practices, tools, and resources - - Regularly updated - cons: - - Assumes basic familiarity with PHP - - - name: Udemy PHP Courses - url: https://www.udemy.com/topic/php/ - pricing: - model: "One Time" - amount: 29.99 - - pros: - - Wide variety of courses for all skill levels - - Affordable and often discounted - - Lifetime access to purchased courses - cons: - - Quality may vary between courses diff --git a/resources/languages/php/codecademy_course.yaml b/resources/languages/php/codecademy_course.yaml new file mode 100644 index 0000000..254dd2e --- /dev/null +++ b/resources/languages/php/codecademy_course.yaml @@ -0,0 +1,13 @@ +name: Codecademy PHP Course +type: [Interactive Tutorial] +url: https://www.codecademy.com/learn/learn-php +pricing: + model: Freemium +teaches: + - php +pros: + - Interactive lessons and quizzes + - Hands-on experience writing PHP code + - Covers modern PHP features and best practices +cons: + - Full access requires a subscription diff --git a/resources/languages/php/laracasts_basics.yaml b/resources/languages/php/laracasts_basics.yaml new file mode 100644 index 0000000..16dfab8 --- /dev/null +++ b/resources/languages/php/laracasts_basics.yaml @@ -0,0 +1,11 @@ +name: Laracasts PHP Basics +type: [Video] +url: https://laracasts.com/series/php-for-beginners +pricing: + model: Free +teaches: + - php +pros: + - Video tutorials by experienced developers + - Covers beginner to intermediate PHP topics + - Focus on practical, real-world applications diff --git a/resources/languages/php/php_manual.yaml b/resources/languages/php/php_manual.yaml new file mode 100644 index 0000000..c4dacb0 --- /dev/null +++ b/resources/languages/php/php_manual.yaml @@ -0,0 +1,13 @@ +name: PHP Manual +type: [Article] +url: https://www.php.net/manual/en/ +pricing: + model: Free +teaches: + - php +pros: + - Comprehensive and up-to-date documentation + - Includes tutorials, guides, and reference material + - Suitable for beginners and experienced developers alike +cons: + - May be too technical and dry for some learners diff --git a/resources/languages/php/php_the_right_way.yaml b/resources/languages/php/php_the_right_way.yaml new file mode 100644 index 0000000..a41e799 --- /dev/null +++ b/resources/languages/php/php_the_right_way.yaml @@ -0,0 +1,13 @@ +name: PHP The Right Way +type: [Article] +url: https://phptherightway.com/ +pricing: + model: Free +teaches: + - php +pros: + - Community-driven guide to modern PHP practices + - Covers best practices, tools, and resources + - Regularly updated +cons: + - Assumes basic familiarity with PHP diff --git a/resources/languages/php/udemy_courses.yaml b/resources/languages/php/udemy_courses.yaml new file mode 100644 index 0000000..b25136a --- /dev/null +++ b/resources/languages/php/udemy_courses.yaml @@ -0,0 +1,14 @@ +name: Udemy PHP Courses +type: [Course] +url: https://www.udemy.com/topic/php/ +pricing: + model: "One Time" + amount: 29.99 +teaches: + - php +pros: + - Wide variety of courses for all skill levels + - Affordable and often discounted + - Lifetime access to purchased courses +cons: + - Quality may vary between courses diff --git a/resources/languages/php/w3schools_tutorial.yaml b/resources/languages/php/w3schools_tutorial.yaml new file mode 100644 index 0000000..30cee10 --- /dev/null +++ b/resources/languages/php/w3schools_tutorial.yaml @@ -0,0 +1,13 @@ +name: W3Schools PHP Tutorial +type: [Interactive Tutorial] +url: https://www.w3schools.com/php/ +pricing: + model: Free +teaches: + - php +pros: + - Beginner-friendly and easy to navigate + - Includes interactive examples and a "Try it Yourself" feature + - Covers essential PHP concepts and syntax +cons: + - May lack depth on advanced topics diff --git a/resources/languages/python.yaml b/resources/languages/python.yaml deleted file mode 100644 index b88fa43..0000000 --- a/resources/languages/python.yaml +++ /dev/null @@ -1,74 +0,0 @@ -name: Python -description: Python is a powerful, high-level, dynamically typed, interpreted programming language. It is used in a wide range of fields, including web development, data analysis, and artificial intelligence. -emoji: "821824146270715936" -meta: - type: "Language" - domains: - - "Web Development" - - "Data Science" - - "Scripting" - paradigms: - - "Object-Oriented Programming" - - "Procedural Programming" -resources: - - name: Codecademy - url: https://www.codecademy.com/learn/learn-python - pricing: - model: "Free" - pros: - - Interactive lessons and quizzes - - Hands-on experience writing Python code - - Introduction to key Python concepts and libraries - cons: - - May not cover more advanced topics in depth - - name: Learn Python the Hard Way - url: https://learnpythonthehardway.org/ - pricing: - model: "One Time" - amount: 29.00 - pros: - - Comprehensive and in-depth coverage of Python - - Includes quizzes and exercises to test your knowledge - - Suitable for beginners and experienced programmers alike - cons: - - May be too challenging for some learners - - name: Python for Everybody - url: https://www.py4e.com/ - pricing: - model: "Free" - pros: - - Suitable for absolute beginners - - Covers key Python concepts and libraries - - Includes quizzes and exercises to test your knowledge - cons: - - May not cover more advanced topics in depth - - name: Python documentation - url: https://docs.python.org/3/ - pricing: - model: "Free" - pros: - - Comprehensive and up-to-date documentation - - Includes tutorials, guides, and reference material - - Suitable for beginners and experienced programmers alike - cons: - - May be too technical and dry for some learners - - name: Python for Data Science - url: https://www.datacamp.com/courses/intro-to-python-for-data-science - pricing: - model: "Freemium" - pros: - - Focuses on using Python for data analysis and machine learning - - Interactive lessons and hands-on experience writing Python code - - Introduction to key Python libraries for data science - cons: - - May not cover more general Python concepts in depth - - name: Python on Coursera - url: https://www.coursera.org/courses?query=python - pricing: - model: "Freemium" - pros: - - Wide variety of courses and specialization tracks - - Taught by experienced instructors from top universities - - Many courses include quizzes, projects, and certificates - cons: - - Some courses may have prerequisites or require a subscription diff --git a/resources/languages/python/codecademy.yaml b/resources/languages/python/codecademy.yaml new file mode 100644 index 0000000..ee1f2df --- /dev/null +++ b/resources/languages/python/codecademy.yaml @@ -0,0 +1,13 @@ +name: Codecademy +type: [Interactive Tutorial] +url: https://www.codecademy.com/learn/learn-python +pricing: + model: Free +teaches: + - python +pros: + - Interactive lessons and quizzes + - Hands-on experience writing Python code + - Introduction to key Python concepts and libraries +cons: + - May not cover more advanced topics in depth diff --git a/resources/languages/python/learn_python_the_hard_way.yaml b/resources/languages/python/learn_python_the_hard_way.yaml new file mode 100644 index 0000000..ee9ed2e --- /dev/null +++ b/resources/languages/python/learn_python_the_hard_way.yaml @@ -0,0 +1,14 @@ +name: Learn Python the Hard Way +type: [Book] +url: https://learnpythonthehardway.org/ +pricing: + model: "One Time" + amount: 29 +teaches: + - python +pros: + - Comprehensive and in-depth coverage of Python + - Includes quizzes and exercises to test your knowledge + - Suitable for beginners and experienced programmers alike +cons: + - May be too challenging for some learners diff --git a/resources/languages/python/python_documentation.yaml b/resources/languages/python/python_documentation.yaml new file mode 100644 index 0000000..3d7f4eb --- /dev/null +++ b/resources/languages/python/python_documentation.yaml @@ -0,0 +1,13 @@ +name: Python documentation +type: [Article] +url: https://docs.python.org/3/ +pricing: + model: Free +teaches: + - python +pros: + - Comprehensive and up-to-date documentation + - Includes tutorials, guides, and reference material + - Suitable for beginners and experienced programmers alike +cons: + - May be too technical and dry for some learners diff --git a/resources/languages/python/python_for_data_science.yaml b/resources/languages/python/python_for_data_science.yaml new file mode 100644 index 0000000..232d116 --- /dev/null +++ b/resources/languages/python/python_for_data_science.yaml @@ -0,0 +1,13 @@ +name: Python for Data Science +type: [Course] +url: https://www.datacamp.com/courses/intro-to-python-for-data-science +pricing: + model: Freemium +teaches: + - python +pros: + - Focuses on using Python for data analysis and machine learning + - Interactive lessons and hands-on experience writing Python code + - Introduction to key Python libraries for data science +cons: + - May not cover more general Python concepts in depth diff --git a/resources/languages/python/python_for_everybody.yaml b/resources/languages/python/python_for_everybody.yaml new file mode 100644 index 0000000..eb20c0e --- /dev/null +++ b/resources/languages/python/python_for_everybody.yaml @@ -0,0 +1,13 @@ +name: Python for Everybody +type: [Course] +url: https://www.py4e.com/ +pricing: + model: Free +teaches: + - python +pros: + - Suitable for absolute beginners + - Covers key Python concepts and libraries + - Includes quizzes and exercises to test your knowledge +cons: + - May not cover more advanced topics in depth diff --git a/resources/languages/python/python_on_coursera.yaml b/resources/languages/python/python_on_coursera.yaml new file mode 100644 index 0000000..7a10196 --- /dev/null +++ b/resources/languages/python/python_on_coursera.yaml @@ -0,0 +1,13 @@ +name: Python on Coursera +type: [Course] +url: https://www.coursera.org/courses?query=python +pricing: + model: Freemium +teaches: + - python +pros: + - Wide variety of courses and specialization tracks + - Taught by experienced instructors from top universities + - Many courses include quizzes, projects, and certificates +cons: + - Some courses may have prerequisites or require a subscription diff --git a/resources/languages/rust.yaml b/resources/languages/rust.yaml deleted file mode 100644 index c5e2bcd..0000000 --- a/resources/languages/rust.yaml +++ /dev/null @@ -1,39 +0,0 @@ -name: Rust -description: Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010 -emoji: "821824283965128774" -meta: - type: "Language" - domains: - - "Systems Programming" - - "Web Development" - - "Game Development" - paradigms: - - "Procedural Programming" - - "Functional Programming" -resources: - - name: The Rust Programming Language (Book) - url: https://doc.rust-lang.org/book/ - pricing: - model: "Free" - pros: - - Very detailed - - Frequently updated - - Semi-Official - cons: [] - - - name: Rust by Example - url: https://doc.rust-lang.org/stable/rust-by-example/ - pricing: - model: "Free" - pros: - - Teaches concepts by example - - Semi-Official - cons: [] - - - name: Rust Crash Course | Traversy Media - url: https://www.youtube.com/watch?v=zF34dRivLOw - pricing: - model: "Free" - pros: - - Video series - cons: [] diff --git a/resources/languages/rust/rust_book.yaml b/resources/languages/rust/rust_book.yaml new file mode 100644 index 0000000..327ae66 --- /dev/null +++ b/resources/languages/rust/rust_book.yaml @@ -0,0 +1,12 @@ +name: The Rust Programming Language (Book) +type: [Book] +url: https://doc.rust-lang.org/book/ +pricing: + model: Free +teaches: + - rust +pros: + - Very detailed + - Frequently updated + - Semi-Official +cons: [] diff --git a/resources/languages/rust/rust_by_example.yaml b/resources/languages/rust/rust_by_example.yaml new file mode 100644 index 0000000..dce9457 --- /dev/null +++ b/resources/languages/rust/rust_by_example.yaml @@ -0,0 +1,11 @@ +name: Rust by Example +type: [Book] +url: https://doc.rust-lang.org/stable/rust-by-example/ +pricing: + model: Free +teaches: + - rust +pros: + - Teaches concepts by example + - Semi-Official +cons: [] diff --git a/resources/languages/rust/rust_crash_course.yaml b/resources/languages/rust/rust_crash_course.yaml new file mode 100644 index 0000000..92711c3 --- /dev/null +++ b/resources/languages/rust/rust_crash_course.yaml @@ -0,0 +1,10 @@ +name: Rust Crash Course | Traversy Media +type: [Video] +url: https://www.youtube.com/watch?v=zF34dRivLOw +pricing: + model: Free +teaches: + - rust +pros: + - Video series +cons: [] diff --git a/resources/languages/sql.yaml b/resources/languages/sql.yaml deleted file mode 100644 index d7852f3..0000000 --- a/resources/languages/sql.yaml +++ /dev/null @@ -1,51 +0,0 @@ -name: SQL -description: SQL (Structured Query Language) is a standard programming language for managing and manipulating databases. -emoji: "💾" -meta: - type: "Language" - domains: [] - paradigms: [] -resources: - - name: SQL Tutorial by W3Schools - url: https://www.w3schools.com/sql/ - pricing: - model: "Free" - pros: - - Beginner-friendly and easy to understand - - Interactive "Try it Yourself" feature for practicing SQL - - Covers essential SQL commands and concepts - cons: - - Lacks depth for advanced SQL topics - - - name: SQL Manual by PostgreSQL (or Other RDBMS) - url: https://www.postgresql.org/docs/ - pricing: - model: "Free" - pros: - - Official and comprehensive documentation - - Includes advanced topics and features specific to PostgreSQL - - Reliable and up-to-date - cons: - - Can be technical and dense for beginners - - - name: Khan Academy SQL Course - url: https://www.khanacademy.org/computing/computer-programming/sql - pricing: - model: "Free" - pros: - - Excellent for beginners - - Video tutorials combined with interactive exercises - - Covers practical examples and common use cases - cons: - - Focused more on basic and intermediate concepts - - - name: Codecademy Learn SQL Course - url: https://www.codecademy.com/learn/learn-sql - pricing: - model: "Freemium" - pros: - - Hands-on, interactive lessons and quizzes - - Beginner to intermediate SQL concepts covered - - Provides experience with real-world database scenarios - cons: - - Full access requires a subscription diff --git a/resources/languages/sql/codecademy_learn_course.yaml b/resources/languages/sql/codecademy_learn_course.yaml new file mode 100644 index 0000000..6e8069f --- /dev/null +++ b/resources/languages/sql/codecademy_learn_course.yaml @@ -0,0 +1,13 @@ +name: Codecademy Learn SQL Course +type: [Interactive Tutorial] +url: https://www.codecademy.com/learn/learn-sql +pricing: + model: Freemium +teaches: + - sql +pros: + - Hands-on, interactive lessons and quizzes + - Beginner to intermediate SQL concepts covered + - Provides experience with real-world database scenarios +cons: + - Full access requires a subscription diff --git a/resources/languages/sql/khan_academy_course.yaml b/resources/languages/sql/khan_academy_course.yaml new file mode 100644 index 0000000..7736379 --- /dev/null +++ b/resources/languages/sql/khan_academy_course.yaml @@ -0,0 +1,13 @@ +name: Khan Academy SQL Course +type: [Course] +url: https://www.khanacademy.org/computing/computer-programming/sql +pricing: + model: Free +teaches: + - sql +pros: + - Excellent for beginners + - Video tutorials combined with interactive exercises + - Covers practical examples and common use cases +cons: + - Focused more on basic and intermediate concepts diff --git a/resources/languages/sql/manual_postgresql.yaml b/resources/languages/sql/manual_postgresql.yaml new file mode 100644 index 0000000..3ddbd7e --- /dev/null +++ b/resources/languages/sql/manual_postgresql.yaml @@ -0,0 +1,13 @@ +name: SQL Manual by PostgreSQL (or Other RDBMS) +type: [Article] +url: https://www.postgresql.org/docs/ +pricing: + model: Free +teaches: + - sql +pros: + - Official and comprehensive documentation + - Includes advanced topics and features specific to PostgreSQL + - Reliable and up-to-date +cons: + - Can be technical and dense for beginners diff --git a/resources/languages/sql/tutorial_w3schools.yaml b/resources/languages/sql/tutorial_w3schools.yaml new file mode 100644 index 0000000..e4f52f7 --- /dev/null +++ b/resources/languages/sql/tutorial_w3schools.yaml @@ -0,0 +1,13 @@ +name: SQL Tutorial by W3Schools +type: [Interactive Tutorial] +url: https://www.w3schools.com/sql/ +pricing: + model: Free +teaches: + - sql +pros: + - Beginner-friendly and easy to understand + - Interactive "Try it Yourself" feature for practicing SQL + - Covers essential SQL commands and concepts +cons: + - Lacks depth for advanced SQL topics diff --git a/resources/platforms/codecademy.yaml b/resources/platforms/codecademy.yaml new file mode 100644 index 0000000..8f9955f --- /dev/null +++ b/resources/platforms/codecademy.yaml @@ -0,0 +1,16 @@ +name: Codecademy +type: [Interactive Tutorial] +url: https://www.codecademy.com/ +pricing: + model: Freemium +teaches: + - general +pros: + - Excellent guided learning platform + - Beginner-friendly but continues into advanced content + - Fully in-browser and zero setup + - Very useful paid features including career track bootcamps +cons: + - Some content requires a paid subscription + - Limited coverage of some topics (free plan) + - Only select languages and frameworks available diff --git a/resources/platforms/every_link_i_wish_i_had_as_a_beginner.yaml b/resources/platforms/every_link_i_wish_i_had_as_a_beginner.yaml new file mode 100644 index 0000000..1a727e5 --- /dev/null +++ b/resources/platforms/every_link_i_wish_i_had_as_a_beginner.yaml @@ -0,0 +1,11 @@ +name: Every link I wish I had as a beginner +type: [Article] +url: https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner +pricing: + model: Free +teaches: + - general +pros: + - A huge collection of useful links +cons: + - Can be overwhelming and hard to navigate diff --git a/resources/platforms/leetcode.yaml b/resources/platforms/leetcode.yaml new file mode 100644 index 0000000..5eda05c --- /dev/null +++ b/resources/platforms/leetcode.yaml @@ -0,0 +1,12 @@ +name: LeetCode +type: [Interactive Tutorial] +url: https://leetcode.com/ +pricing: + model: Freemium +teaches: + - general +pros: + - Fun and difficult problems to solve +cons: + - Not very beginner friendly + - Some content requires a paid account diff --git a/resources/platforms/miscellaneous.yaml b/resources/platforms/miscellaneous.yaml deleted file mode 100644 index 2805d89..0000000 --- a/resources/platforms/miscellaneous.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: Miscellaneous -description: A list of resources that cover a wide range of topics, not specific to any programming language. -emoji: '⚙️' -meta: - type: 'Platform' -resources: - - name: Every link I wish I had as a beginner - url: https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner - pricing: - model: "Free" - pros: - - A huge collection of useful links - cons: - - Can be overwhelming and hard to navigate - - - name: Sololearn - url: https://www.sololearn.com/ - pricing: - model: "Freemium" - pros: - - Easy to use - - Lots of languages to choose from - cons: - - Doesn't teach things in a real world example - - Doesn't cover some topics very deeply - - - name: LeetCode - url: https://leetcode.com/ - pricing: - model: "Freemium" - pros: - - Fun and difficult problems to solve - cons: - - Not very beginner friendly - - Some content requires a paid account - - - name: Codecademy - url: https://www.codecademy.com/ - pricing: - model: "Freemium" - pros: - - Excellent guided learning platform - - Beginner-friendly but continues into advanced content - - Fully in-browser and zero setup - - Very useful paid features including career track bootcamps - cons: - - Some content requires a paid subscription - - Limited coverage of some topics (free plan) - - Only select languages and frameworks available - - - name: Programiz - url: https://www.programiz.com/ - pricing: - model: "Freemium" - pros: - - Extensive courses/guides for many languages and frameworks - - Balanced mix of material and projects/exercises, - cons: [ ] - diff --git a/resources/platforms/programiz.yaml b/resources/platforms/programiz.yaml new file mode 100644 index 0000000..4035a95 --- /dev/null +++ b/resources/platforms/programiz.yaml @@ -0,0 +1,11 @@ +name: Programiz +type: [Interactive Tutorial] +url: https://www.programiz.com/ +pricing: + model: Freemium +teaches: + - general +pros: + - Extensive courses/guides for many languages and frameworks + - Balanced mix of material and projects/exercises +cons: [] diff --git a/resources/platforms/sololearn.yaml b/resources/platforms/sololearn.yaml new file mode 100644 index 0000000..1aac013 --- /dev/null +++ b/resources/platforms/sololearn.yaml @@ -0,0 +1,13 @@ +name: Sololearn +type: [Interactive Tutorial] +url: https://www.sololearn.com/ +pricing: + model: Freemium +teaches: + - general +pros: + - Easy to use + - Lots of languages to choose from +cons: + - Doesn't teach things in a real world example + - Doesn't cover some topics very deeply diff --git a/resources/theory/general.yaml b/resources/theory/general.yaml deleted file mode 100644 index f24c6b6..0000000 --- a/resources/theory/general.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: General -description: Things that are useful for learning any programming language, or don't fit into any other category -meta: - type: 'Platform' -resources: - - name: The Missing Semester of Your CS Education - description: Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc - pricing: - model: "Free" - url: https://missing.csail.mit.edu/ - pros: - [ - Created by MIT, - "Covers subjects that most tutorials might ignore, making it a great supplementary resource", - ] - - name: Projects - description: A list of practical projects that anyone can solve in any programming language - pricing: - model: "Free" - url: https://github.com/karan/Projects - pros: [] - cons: [] diff --git a/resources/theory/general_projects.yaml b/resources/theory/general_projects.yaml new file mode 100644 index 0000000..2f7c55a --- /dev/null +++ b/resources/theory/general_projects.yaml @@ -0,0 +1,10 @@ +name: Projects +description: A list of practical projects that anyone can solve in any programming language +type: [Article] +url: https://github.com/karan/Projects +pricing: + model: Free +teaches: + - general +pros: [] +cons: [] diff --git a/resources/theory/missing_semester_of_your_cs_education.yaml b/resources/theory/missing_semester_of_your_cs_education.yaml new file mode 100644 index 0000000..04fdb64 --- /dev/null +++ b/resources/theory/missing_semester_of_your_cs_education.yaml @@ -0,0 +1,11 @@ +name: The Missing Semester of Your CS Education +description: Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc +type: [Course] +url: https://missing.csail.mit.edu/ +pricing: + model: Free +teaches: + - general +pros: + - Created by MIT + - Covers subjects that most tutorials might ignore, making it a great supplementary resource diff --git a/resources/theory/programming-language-design.yaml b/resources/theory/programming-language-design.yaml deleted file mode 100644 index dd198a8..0000000 --- a/resources/theory/programming-language-design.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: Programming Language Design -description: Resources on language design, parsers, compilers, etc -emoji: "🔨" -meta: - type: "Platform" -resources: - - name: Crafting Interpreters - url: https://craftinginterpreters.com/ - pricing: - model: "Free" - pros: - - Covers lexing, parsing, interpreting, type checking, and compiling - - Starts from scratch, designed for beginners - cons: - - Doesn't cover the theoretical side much - - name: Awesome Compilers - url: https://github.com/aalhour/awesome-compilers - description: Curated list of resources for all things compilers - pricing: - model: "Free" - pros: [] - cons: [] diff --git a/resources/theory/programming-language-design/awesome_compilers.yaml b/resources/theory/programming-language-design/awesome_compilers.yaml new file mode 100644 index 0000000..45833df --- /dev/null +++ b/resources/theory/programming-language-design/awesome_compilers.yaml @@ -0,0 +1,10 @@ +name: Awesome Compilers +description: Curated list of resources for all things compilers +type: [Article] +url: https://github.com/aalhour/awesome-compilers +pricing: + model: Free +teaches: + - programming-language-design +pros: [] +cons: [] diff --git a/resources/theory/programming-language-design/crafting_interpreters.yaml b/resources/theory/programming-language-design/crafting_interpreters.yaml new file mode 100644 index 0000000..319bc0a --- /dev/null +++ b/resources/theory/programming-language-design/crafting_interpreters.yaml @@ -0,0 +1,12 @@ +name: Crafting Interpreters +type: [Book] +url: https://craftinginterpreters.com/ +pricing: + model: Free +teaches: + - programming-language-design +pros: + - Covers lexing, parsing, interpreting, type checking, and compiling + - Starts from scratch, designed for beginners +cons: + - Doesn't cover the theoretical side much From 03260c988e323408ecec379784ad6b7cd0ea2bbe Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 18:32:25 +0100 Subject: [PATCH 10/22] feat: add database compilation script --- compile-database.ts | 85 +++ database.json | 1202 +++++++++++++++++++++++++++++++++++++++++++ index.ts | 60 ++- 3 files changed, 1322 insertions(+), 25 deletions(-) create mode 100644 compile-database.ts create mode 100644 database.json diff --git a/compile-database.ts b/compile-database.ts new file mode 100644 index 0000000..ffbc6e9 --- /dev/null +++ b/compile-database.ts @@ -0,0 +1,85 @@ +import path from "path"; +import fs from "fs"; +import { readdir } from "node:fs/promises"; +import { MetaSchema, ResourceSchema, type Meta, type Resource } from "."; +import { YAML } from "bun"; + +type DatabaseMetadata = { + id: string; +} & Meta + + +async function buildDatabase() { + const metaDir = path.join(__dirname, "./metadata"); + const resourcesDir = path.join(__dirname, "./resources"); + + const allMetaFiles = await readdir(metaDir, { recursive: true, }); + const allResourceFiles = await readdir(resourcesDir, { recursive: true, }); + + const database = { + metadata: [] as DatabaseMetadata[], + resources: [] as Resource[] + }; + let hasErrors = false; + + for (const file of allMetaFiles.filter(f => f.endsWith(".yaml"))) { + const filePath = path.join(metaDir, file); + const fileContent = await fs.promises.readFile(filePath, "utf-8"); + + const entityId = path.basename(file, ".yaml"); + + const data = YAML.parse(fileContent); + const result = MetaSchema.safeParse(data); + + if (!result.success) { + console.error(`Validation Error in Metadata: ${file}`); + console.error(result.error.issues); + hasErrors = true; + } else { + database.metadata.push({ id: entityId, ...result.data }); + } + } + + const validTags = new Set(database.metadata.map(meta => meta.id)); + + for (const file of allResourceFiles.filter(f => f.endsWith(".yaml"))) { + const filePath = path.join(resourcesDir, file); + const fileContent = await fs.promises.readFile(filePath, "utf-8"); + + const data = YAML.parse(fileContent); + const result = ResourceSchema.safeParse(data); + + if (!result.success) { + console.error(`Validation Error in Resource: ${file}`); + console.error(result.error.issues); + hasErrors = true; + continue; + } + + const invalidTags = result.data.teaches.filter(tag => !validTags.has(tag)); + if (invalidTags.length > 0) { + console.error(`Relational Error in Resource: ${file}`); + console.error(`Unknown tags in 'teaches': [${invalidTags.join(", ")}]`); + console.error(`Ensure a corresponding metadata file exists.`); + hasErrors = true; + continue; + } + + database.resources.push(result.data); + } + + if (hasErrors) { + console.error("Build failed due to validation errors."); + process.exit(1); + } + + const outputPath = path.join(__dirname, "./database.json"); + await fs.promises.writeFile(outputPath, JSON.stringify(database, null, 2)); + + console.log(`Success! Compiled ${database.metadata.length} entities and ${database.resources.length} resources.`); +} + +buildDatabase().catch(err => { + console.error("Unexpected error during build:", err); + process.exit(1); +}); diff --git a/database.json b/database.json new file mode 100644 index 0000000..542a207 --- /dev/null +++ b/database.json @@ -0,0 +1,1202 @@ +{ + "metadata": [ + { + "id": "clojure", + "name": "Clojure", + "description": "Clojure is a dynamic functional language from the Lisp family that runs on many different platforms", + "emoji": "821823652404265001", + "domains": [], + "category": { + "type": "Language", + "paradigms": [ + "Functional Programming" + ] + } + }, + { + "id": "cpp", + "name": "C++", + "description": "C++ is a statically typed general-purpose language designed by Bjarne Stroustrup in 1985", + "emoji": "821822658169536542", + "domains": [ + "Systems Programming", + "Game Development" + ], + "category": { + "type": "Language", + "paradigms": [ + "Object-Oriented Programming", + "Procedural Programming" + ] + } + }, + { + "id": "java", + "name": "Java", + "description": "Java is an Object Oriented language designed by James Gosling in 1995", + "emoji": "821822045187866625", + "domains": [], + "category": { + "type": "Language", + "paradigms": [ + "Object-Oriented Programming" + ] + } + }, + { + "id": "rust", + "name": "Rust", + "description": "Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010", + "emoji": "821824283965128774", + "domains": [ + "Systems Programming", + "Web Development", + "Game Development" + ], + "category": { + "type": "Language", + "paradigms": [ + "Procedural Programming", + "Functional Programming" + ] + } + }, + { + "id": "sql", + "name": "SQL", + "description": "SQL (Structured Query Language) is a standard programming language for managing and manipulating databases.", + "domains": [], + "category": { + "type": "Language", + "paradigms": [] + } + }, + { + "id": "php", + "name": "PHP", + "description": "PHP is a widely-used, open-source, server-side scripting language designed for web development. It is particularly suitable for creating dynamic and interactive websites.", + "domains": [ + "Web Development" + ], + "category": { + "type": "Language", + "paradigms": [ + "Procedural Programming", + "Object-Oriented Programming", + "Functional Programming" + ] + } + }, + { + "id": "python", + "name": "Python", + "description": "Python is a powerful, high-level, dynamically typed, interpreted programming language. It is used in a wide range of fields, including web development, data analysis, and artificial intelligence.", + "emoji": "821824146270715936", + "domains": [ + "Web Development", + "Data Science", + "Scripting" + ], + "category": { + "type": "Language", + "paradigms": [ + "Object-Oriented Programming", + "Procedural Programming" + ] + } + }, + { + "id": "kotlin", + "name": "Kotlin", + "description": "Kotlin is a multi-paradigm programming language created by JetBrains that runs on the JVM, JS, and Native Platforms", + "emoji": "888496555529744395", + "domains": [ + "Mobile Development" + ], + "category": { + "type": "Language", + "paradigms": [ + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming" + ] + } + }, + { + "id": "haskell", + "name": "Haskell", + "description": "Haskell is a purely functional programming language commonly used in finance and academics", + "emoji": "821823367333675058", + "domains": [], + "category": { + "type": "Language", + "paradigms": [ + "Functional Programming" + ] + } + }, + { + "id": "general", + "name": "General", + "description": "Resources that are broadly useful for learning programming, regardless of language.", + "domains": [], + "category": { + "type": "Platform" + } + }, + { + "id": "programming-language-design", + "name": "Programming Language Design", + "description": "Resources on language design, parsers, compilers, and related concepts.", + "domains": [], + "category": { + "type": "Platform" + } + }, + { + "id": "git", + "name": "Git", + "description": "A distributed version control system for tracking changes in source code during software development.", + "emoji": "🔀", + "domains": [ + "DevOps" + ], + "category": { + "type": "Tool" + } + } + ], + "resources": [ + { + "name": "Programiz", + "url": "https://www.programiz.com/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Extensive courses/guides for many languages and frameworks", + "Balanced mix of material and projects/exercises" + ], + "cons": [] + }, + { + "name": "Every link I wish I had as a beginner", + "url": "https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner", + "type": [ + "Article" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "A huge collection of useful links" + ], + "cons": [ + "Can be overwhelming and hard to navigate" + ] + }, + { + "name": "Codecademy", + "url": "https://www.codecademy.com/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Excellent guided learning platform", + "Beginner-friendly but continues into advanced content", + "Fully in-browser and zero setup", + "Very useful paid features including career track bootcamps" + ], + "cons": [ + "Some content requires a paid subscription", + "Limited coverage of some topics (free plan)", + "Only select languages and frameworks available" + ] + }, + { + "name": "Sololearn", + "url": "https://www.sololearn.com/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Easy to use", + "Lots of languages to choose from" + ], + "cons": [ + "Doesn't teach things in a real world example", + "Doesn't cover some topics very deeply" + ] + }, + { + "name": "LeetCode", + "url": "https://leetcode.com/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Fun and difficult problems to solve" + ], + "cons": [ + "Not very beginner friendly", + "Some content requires a paid account" + ] + }, + { + "name": "Learn You a Haskell", + "url": "http://learnyouahaskell.com/", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Good for beginners", + "Good reputation" + ], + "cons": [] + }, + { + "name": "Projects", + "description": "A list of practical projects that anyone can solve in any programming language", + "url": "https://github.com/karan/Projects", + "type": [ + "Article" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [] + }, + { + "name": "The Missing Semester of Your CS Education", + "description": "Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc", + "url": "https://missing.csail.mit.edu/", + "type": [ + "Course" + ], + "teaches": [ + "general" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Created by MIT", + "Covers subjects that most tutorials might ignore, making it a great supplementary resource" + ] + }, + { + "name": "Crafting Interpreters", + "url": "https://craftinginterpreters.com/", + "type": [ + "Book" + ], + "teaches": [ + "programming-language-design" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Covers lexing, parsing, interpreting, type checking, and compiling", + "Starts from scratch, designed for beginners" + ], + "cons": [ + "Doesn't cover the theoretical side much" + ] + }, + { + "name": "Awesome Compilers", + "description": "Curated list of resources for all things compilers", + "url": "https://github.com/aalhour/awesome-compilers", + "type": [ + "Article" + ], + "teaches": [ + "programming-language-design" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [] + }, + { + "name": "Python for Data Science", + "url": "https://www.datacamp.com/courses/intro-to-python-for-data-science", + "type": [ + "Course" + ], + "teaches": [ + "python" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Focuses on using Python for data analysis and machine learning", + "Interactive lessons and hands-on experience writing Python code", + "Introduction to key Python libraries for data science" + ], + "cons": [ + "May not cover more general Python concepts in depth" + ] + }, + { + "name": "Python on Coursera", + "url": "https://www.coursera.org/courses?query=python", + "type": [ + "Course" + ], + "teaches": [ + "python" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Wide variety of courses and specialization tracks", + "Taught by experienced instructors from top universities", + "Many courses include quizzes, projects, and certificates" + ], + "cons": [ + "Some courses may have prerequisites or require a subscription" + ] + }, + { + "name": "Python for Everybody", + "url": "https://www.py4e.com/", + "type": [ + "Course" + ], + "teaches": [ + "python" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Suitable for absolute beginners", + "Covers key Python concepts and libraries", + "Includes quizzes and exercises to test your knowledge" + ], + "cons": [ + "May not cover more advanced topics in depth" + ] + }, + { + "name": "Codecademy", + "url": "https://www.codecademy.com/learn/learn-python", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "python" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Interactive lessons and quizzes", + "Hands-on experience writing Python code", + "Introduction to key Python concepts and libraries" + ], + "cons": [ + "May not cover more advanced topics in depth" + ] + }, + { + "name": "Learn Python the Hard Way", + "url": "https://learnpythonthehardway.org/", + "type": [ + "Book" + ], + "teaches": [ + "python" + ], + "pricing": { + "model": "One Time", + "amount": 29 + }, + "pros": [ + "Comprehensive and in-depth coverage of Python", + "Includes quizzes and exercises to test your knowledge", + "Suitable for beginners and experienced programmers alike" + ], + "cons": [ + "May be too challenging for some learners" + ] + }, + { + "name": "Python documentation", + "url": "https://docs.python.org/3/", + "type": [ + "Article" + ], + "teaches": [ + "python" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Comprehensive and up-to-date documentation", + "Includes tutorials, guides, and reference material", + "Suitable for beginners and experienced programmers alike" + ], + "cons": [ + "May be too technical and dry for some learners" + ] + }, + { + "name": "The Rust Programming Language (Book)", + "url": "https://doc.rust-lang.org/book/", + "type": [ + "Book" + ], + "teaches": [ + "rust" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Very detailed", + "Frequently updated", + "Semi-Official" + ], + "cons": [] + }, + { + "name": "Rust Crash Course | Traversy Media", + "url": "https://www.youtube.com/watch?v=zF34dRivLOw", + "type": [ + "Video" + ], + "teaches": [ + "rust" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video series" + ], + "cons": [] + }, + { + "name": "Rust by Example", + "url": "https://doc.rust-lang.org/stable/rust-by-example/", + "type": [ + "Book" + ], + "teaches": [ + "rust" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Teaches concepts by example", + "Semi-Official" + ], + "cons": [] + }, + { + "name": "PHP The Right Way", + "url": "https://phptherightway.com/", + "type": [ + "Article" + ], + "teaches": [ + "php" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Community-driven guide to modern PHP practices", + "Covers best practices, tools, and resources", + "Regularly updated" + ], + "cons": [ + "Assumes basic familiarity with PHP" + ] + }, + { + "name": "Laracasts PHP Basics", + "url": "https://laracasts.com/series/php-for-beginners", + "type": [ + "Video" + ], + "teaches": [ + "php" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video tutorials by experienced developers", + "Covers beginner to intermediate PHP topics", + "Focus on practical, real-world applications" + ] + }, + { + "name": "W3Schools PHP Tutorial", + "url": "https://www.w3schools.com/php/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "php" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Beginner-friendly and easy to navigate", + "Includes interactive examples and a \"Try it Yourself\" feature", + "Covers essential PHP concepts and syntax" + ], + "cons": [ + "May lack depth on advanced topics" + ] + }, + { + "name": "PHP Manual", + "url": "https://www.php.net/manual/en/", + "type": [ + "Article" + ], + "teaches": [ + "php" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Comprehensive and up-to-date documentation", + "Includes tutorials, guides, and reference material", + "Suitable for beginners and experienced developers alike" + ], + "cons": [ + "May be too technical and dry for some learners" + ] + }, + { + "name": "Udemy PHP Courses", + "url": "https://www.udemy.com/topic/php/", + "type": [ + "Course" + ], + "teaches": [ + "php" + ], + "pricing": { + "model": "One Time", + "amount": 29.99 + }, + "pros": [ + "Wide variety of courses for all skill levels", + "Affordable and often discounted", + "Lifetime access to purchased courses" + ], + "cons": [ + "Quality may vary between courses" + ] + }, + { + "name": "Codecademy PHP Course", + "url": "https://www.codecademy.com/learn/learn-php", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "php" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Interactive lessons and quizzes", + "Hands-on experience writing PHP code", + "Covers modern PHP features and best practices" + ], + "cons": [ + "Full access requires a subscription" + ] + }, + { + "name": "SQL Tutorial by W3Schools", + "url": "https://www.w3schools.com/sql/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "sql" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Beginner-friendly and easy to understand", + "Interactive \"Try it Yourself\" feature for practicing SQL", + "Covers essential SQL commands and concepts" + ], + "cons": [ + "Lacks depth for advanced SQL topics" + ] + }, + { + "name": "Khan Academy SQL Course", + "url": "https://www.khanacademy.org/computing/computer-programming/sql", + "type": [ + "Course" + ], + "teaches": [ + "sql" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Excellent for beginners", + "Video tutorials combined with interactive exercises", + "Covers practical examples and common use cases" + ], + "cons": [ + "Focused more on basic and intermediate concepts" + ] + }, + { + "name": "Codecademy Learn SQL Course", + "url": "https://www.codecademy.com/learn/learn-sql", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "sql" + ], + "pricing": { + "model": "Freemium" + }, + "pros": [ + "Hands-on, interactive lessons and quizzes", + "Beginner to intermediate SQL concepts covered", + "Provides experience with real-world database scenarios" + ], + "cons": [ + "Full access requires a subscription" + ] + }, + { + "name": "SQL Manual by PostgreSQL (or Other RDBMS)", + "url": "https://www.postgresql.org/docs/", + "type": [ + "Article" + ], + "teaches": [ + "sql" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Official and comprehensive documentation", + "Includes advanced topics and features specific to PostgreSQL", + "Reliable and up-to-date" + ], + "cons": [ + "Can be technical and dense for beginners" + ] + }, + { + "name": "4clojure", + "url": "https://4clojure.oxal.org/", + "type": [ + "Interactive Tutorial" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Interactive exercises" + ], + "cons": [ + "No tutorial from the ground up" + ] + }, + { + "name": "Clojure API Cheatsheet", + "url": "https://clojure.org/api/cheatsheet", + "type": [ + "Article" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Overview over almost the entire standard library", + "Quick reference" + ], + "cons": [] + }, + { + "name": "Clojure beginner resources", + "url": "https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f", + "type": [ + "Article" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Collection of all kinds of resources to learn Clojure" + ], + "cons": [] + }, + { + "name": "Functions Explained Through Patterns", + "url": "http://blog.josephwilk.net/clojure/functions-explained-through-patterns.html", + "type": [ + "Article" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Visual explanations of core Clojure functions" + ], + "cons": [] + }, + { + "name": "Clojure For The Brave And True", + "url": "https://www.braveclojure.com/clojure-for-the-brave-and-true/", + "type": [ + "Book" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Complete guide through most of the language", + "Assumes no prior knowledge of functional programming or Lisp" + ], + "cons": [] + }, + { + "name": "Clojure for Java Programmers", + "url": "https://www.youtube.com/watch?v=P76Vbsk_3J0", + "type": [ + "Video" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video series", + "Explains the ideas behind Clojure" + ], + "cons": [ + "Mostly aimed at people from an OOP background" + ] + }, + { + "name": "Clojure by Example", + "url": "https://github.com/inclojure-org/clojure-by-example", + "type": [ + "Article" + ], + "teaches": [ + "clojure" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Hands-on learning", + "Crash Course" + ], + "cons": [ + "No thorough explanations for complete programming beginners" + ] + }, + { + "name": "C++ - Video Playlist", + "url": "https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb", + "type": [ + "Video" + ], + "teaches": [ + "cpp" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Teaches a large portion of the language's workings for best usage", + "Thorough explanations", + "Useful for absolute beginners as well as intermediate level" + ], + "cons": [] + }, + { + "name": "Modernes C++", + "url": "https://www.modernescpp.com/", + "type": [ + "Article" + ], + "teaches": [ + "cpp" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Large series of blog posts about often less taught APIs and best practices", + "Very detailed explanations with explicit examples", + "Posts about new features less frequently found on the internet" + ], + "cons": [ + "Requires intermediate-advanced knowledge of the language and its feature-set" + ] + }, + { + "name": "C++ Core Guidelines", + "url": "https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines", + "type": [ + "Article" + ], + "teaches": [ + "cpp" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Collection of best practices for most aspects of the language", + "Bite-sized titled entries, making it easy to navigate", + "Contains examples to take as guide" + ], + "cons": [ + "Requires some prior understanding of the language" + ] + }, + { + "name": "cppreference.com", + "url": "https://en.cppreference.com/", + "type": [ + "Article" + ], + "teaches": [ + "cpp" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Documentation about the entirety of the language and the standard library", + "Apt for everyone in the learning spectrum, from beginners to advanced users" + ], + "cons": [ + "The site can become confusing and overwhelming to navigate" + ] + }, + { + "name": "TheNewBoston", + "url": "https://www.youtube.com/@thenewboston", + "type": [ + "Video" + ], + "teaches": [ + "java" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Beginner and intermediate video series", + "Short, but a lot of videos (146 videos combined in both playlists)" + ], + "cons": [ + "Videos may be outdated (2009 - 2012)" + ] + }, + { + "name": "Tutorial Spot", + "url": "https://www.tutorialspoint.com/java/index.htm", + "type": [ + "Article" + ], + "teaches": [ + "java" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [ + "Slightly dated" + ] + }, + { + "name": "Bro Code", + "url": "https://www.youtube.com/c/BroCodez", + "type": [ + "Video" + ], + "teaches": [ + "java" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video series", + "Has videos on many different languages and concepts" + ], + "cons": [] + }, + { + "name": "Mooc.fi", + "description": "Comprehensive Java (and general programming) course provided by the University of Helsinki", + "url": "https://java-programming.mooc.fi/", + "type": [ + "Course" + ], + "teaches": [ + "java" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Very well respected" + ] + }, + { + "name": "Alex Lee", + "url": "https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA", + "type": [ + "Video" + ], + "teaches": [ + "java" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video series", + "Covers a wide range of concepts" + ], + "cons": [] + }, + { + "name": "Javatpoint", + "url": "https://www.javatpoint.com/java-tutorial", + "type": [ + "Article" + ], + "teaches": [ + "java" + ], + "pricing": { + "model": "Free" + } + }, + { + "name": "Introduction to Kotlin (Google I/O '17)", + "url": "https://www.youtube.com/watch?v=X1RVYt2QKQE", + "type": [ + "Video" + ], + "teaches": [ + "kotlin" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video for visual learners" + ], + "cons": [] + }, + { + "name": "Kotlin Official Website", + "url": "https://kotlinlang.org/", + "type": [ + "Article" + ], + "teaches": [ + "kotlin" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [] + }, + { + "name": "FreeCodeCamp.org", + "url": "https://youtu.be/F9UC9DY-vIU", + "type": [ + "Video" + ], + "teaches": [ + "kotlin" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video for visual learners" + ], + "cons": [] + }, + { + "name": "Functional Programming in Haskell: Supercharge Your Coding", + "url": "https://www.futurelearn.com/courses/functional-programming-haskell", + "type": [ + "Course" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [ + "May be a waitlist to get access" + ] + }, + { + "name": "Haskell Wikibooks", + "url": "https://en.wikibooks.org/wiki/Haskell", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Wide range of content", + "Explains most things fairly simply" + ], + "cons": [ + "Some information may be outdated" + ] + }, + { + "name": "Write Yourself a Scheme in 48 hours", + "url": "https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Designed for beginners", + "Learn by making a real project (creating your own small programming language)" + ], + "cons": [ + "Moves quite quickly" + ] + }, + { + "name": "Haskell Programming from First Principles", + "url": "https://haskellbook.com/", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "One Time", + "amount": 59 + }, + "pros": [ + "Very good reputation", + "Covers a very wide range of content" + ] + }, + { + "name": "Haskell: The Craft of Functional Programming", + "url": "https://simonjohnthompson.github.io/craft3e/craft3e.pdf", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [] + } + ] +} \ No newline at end of file diff --git a/index.ts b/index.ts index d9eb514..d77e922 100644 --- a/index.ts +++ b/index.ts @@ -97,7 +97,7 @@ const ResourceTypeSchema = z.enum(["Video", "Article", "Interactive Tutorial", " "The type of the resource", ); -const ResourceSchema = z.object({ +export const ResourceSchema = z.object({ name: z.string().describe("The official name of the resource"), description: z .string() @@ -148,31 +148,41 @@ export const MetaSchema = z.object({ category: ResourceCategorySchema, }); -const header = "// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY"; +export type Meta = z.infer; +export type Resource = z.infer; -const { values, positionals } = parseArgs({ - args: Bun.argv, - options: { - schema: { - type: "string", - }, - }, - strict: true, - allowPositionals: true, -}); +function main() { + const header = "// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY"; -let schema: z.ZodObject; -switch (values.schema?.toLowerCase()) { - case "metadata": - schema = MetaSchema; - break; - case "resource": - schema = ResourceSchema; - break; - default: - console.error(`Unknown schema: ${values.schema}`); - process.exit(1); + const { values, positionals } = parseArgs({ + args: Bun.argv, + options: { + schema: { + type: "string", + }, + }, + strict: true, + allowPositionals: true, + }); + + let schema: z.ZodObject; + switch (values.schema?.toLowerCase()) { + case "metadata": + schema = MetaSchema; + break; + case "resource": + schema = ResourceSchema; + break; + case undefined: + return; + default: + console.error(`Unknown schema: ${values.schema}`); + process.exit(1); + } + + console.log(header); + console.log(JSON.stringify(z.toJSONSchema(schema, {}), null, 2)); } -console.log(header); -console.log(JSON.stringify(z.toJSONSchema(schema, {}), null, 2)); +main(); + From 75a116e25f970af9f93ebab4972fbef65369de49 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 18:32:59 +0100 Subject: [PATCH 11/22] ci: Update GH action versio --- .github/workflows/validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index ee96b73..2067c6d 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v3 - name: Validate JSON - uses: GrantBirki/json-yaml-validate@v1.5.0 + uses: GrantBirki/json-yaml-validate@v5.0.0 with: base_dir: resources json_schema: "resource.schema.jsonc" From 82ab39e67f06f8d87b54cf22ed477e5df918ae15 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 18:38:03 +0100 Subject: [PATCH 12/22] feat: better schemas --- compile-database.ts | 12 +- database.schema.jsonc | 251 ++++++++++++++++++++++++++++++++++++++++++ index.ts | 17 ++- package.json | 8 +- 4 files changed, 282 insertions(+), 6 deletions(-) create mode 100644 database.schema.jsonc diff --git a/compile-database.ts b/compile-database.ts index ffbc6e9..df461d3 100644 --- a/compile-database.ts +++ b/compile-database.ts @@ -1,7 +1,7 @@ import path from "path"; import fs from "fs"; import { readdir } from "node:fs/promises"; -import { MetaSchema, ResourceSchema, type Meta, type Resource } from "."; +import { DatabaseSchema, MetaSchema, ResourceSchema, type Database, type Meta, type Resource } from "."; import { YAML } from "bun"; type DatabaseMetadata = { @@ -19,7 +19,7 @@ async function buildDatabase() { const database = { metadata: [] as DatabaseMetadata[], resources: [] as Resource[] - }; + } satisfies Database; let hasErrors = false; for (const file of allMetaFiles.filter(f => f.endsWith(".yaml"))) { @@ -73,6 +73,14 @@ async function buildDatabase() { process.exit(1); } + // verify the entire database against the schema before writing + const finalResult = DatabaseSchema.safeParse(database); + if (!finalResult.success) { + console.error("Final Database Validation Error:"); + console.error(finalResult.error.issues); + process.exit(1); + } + const outputPath = path.join(__dirname, "./database.json"); await fs.promises.writeFile(outputPath, JSON.stringify(database, null, 2)); diff --git a/database.schema.jsonc b/database.schema.jsonc new file mode 100644 index 0000000..d7fb2bc --- /dev/null +++ b/database.schema.jsonc @@ -0,0 +1,251 @@ +// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "metadata": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the language, tool, etc being described by this metadata." + }, + "description": { + "type": "string", + "description": "A brief description of the language, tool, etc being described by this metadata." + }, + "emoji": { + "description": "A Unicode emoji glyph to represent the entity, if applicable. If there is no suitable (Unicode) emoji, omit this field. Consumers may choose to ignore this field, or replace it with a custom image.", + "type": "string" + }, + "domains": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Web Development", + "Data Science", + "Mobile Development", + "Game Development", + "Systems Programming", + "Scripting", + "General Purpose", + "DevOps" + ], + "description": "A domain that a programming language may be used in." + }, + "description": "The domain(s) that the entity is commonly used in, or best suited for." + }, + "category": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Language" + }, + "paradigms": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming", + "Logic Programming" + ], + "description": "A programming paradigm." + }, + "description": "The programming paradigms that this language focuses on, e.g. 'Object-Oriented Programming', 'Functional Programming', 'Procedural Programming', etc." + } + }, + "required": [ + "type", + "paradigms" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Platform" + } + }, + "required": [ + "type" + ], + "additionalProperties": false, + "description": "A platform used to learn programming, which may teach a variety of languages and concepts." + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Tool" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + } + ], + "description": "The category of the resource" + }, + "id": { + "type": "string", + "description": "The unique identifier of the entity" + } + }, + "required": [ + "name", + "description", + "domains", + "category", + "id" + ], + "additionalProperties": false + }, + "description": "List of all entities in the system" + }, + "resources": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The official name of the resource" + }, + "description": { + "description": "A brief description of the resource", + "type": "string", + "maxLength": 256 + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL to the resource" + }, + "type": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "enum": [ + "Video", + "Article", + "Interactive Tutorial", + "Book", + "Course" + ], + "description": "The type of the resource" + }, + "description": "The type(s) of the resource, e.g. 'Video', 'Book', 'Course', etc." + }, + "teaches": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "enum": [ + "general", + "programming-language-design", + "git", + "clojure", + "cpp", + "java", + "rust", + "sql", + "php", + "python", + "kotlin", + "haskell" + ] + }, + "description": "The topics that this resource teaches." + }, + "pricing": { + "anyOf": [ + { + "type": "object", + "properties": { + "model": { + "type": "string", + "enum": [ + "Free", + "Freemium" + ], + "description": "The Free(mium) Pricing Model of this resource. 'Free' should be used for resources where 100% (or close) of the content is free. 'Freemium' describes a pricing model where the core content is available for free, but features paid extensions. If the resource has a freemium model but the free portion is very limited, consider using 'Paid' instead and providing an estimated price for the full version. " + } + }, + "required": [ + "model" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "model": { + "type": "string", + "enum": [ + "Subscription", + "One Time" + ], + "description": "The Paid Pricing Model of this resource. 'Subscription' means the resource is paid on a recurring basis (e.g. monthly or yearly), while 'One Time' means the resource is paid with a single upfront payment. If the price varies or is not fixed, provide a close approximation. Note that the subscription renewal cycle is not specified, so if the price has different renewal cycles, provide the most common or default one (usually monthly)." + }, + "amount": { + "type": "number", + "exclusiveMinimum": 0, + "description": "The price of this resource, in US Dollars." + } + }, + "required": [ + "model", + "amount" + ], + "additionalProperties": false + } + ], + "description": "Details about the cost of the resource." + }, + "pros": { + "description": "Array of pros for using the resource, e.g. 'explains difficult concepts with good analogies'", + "type": "array", + "items": { + "type": "string" + } + }, + "cons": { + "description": "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "name", + "url", + "type", + "teaches", + "pricing" + ], + "additionalProperties": false + }, + "description": "List of all learning resources" + } + }, + "required": [ + "metadata", + "resources" + ], + "additionalProperties": false +} diff --git a/index.ts b/index.ts index d77e922..867f804 100644 --- a/index.ts +++ b/index.ts @@ -148,13 +148,23 @@ export const MetaSchema = z.object({ category: ResourceCategorySchema, }); +export const CompiledMetaSchema = MetaSchema.extend({ + id: z.string().describe("The unique identifier of the entity"), +}); + +export const DatabaseSchema = z.object({ + metadata: z.array(CompiledMetaSchema).describe("List of all entities in the system"), + resources: z.array(ResourceSchema).describe("List of all learning resources"), +}); + export type Meta = z.infer; export type Resource = z.infer; +export type Database = z.infer; function main() { const header = "// Generated by index.ts - DO NOT EDIT THIS FILE DIRECTLY"; - const { values, positionals } = parseArgs({ + const { values, positionals: _ } = parseArgs({ args: Bun.argv, options: { schema: { @@ -173,7 +183,10 @@ function main() { case "resource": schema = ResourceSchema; break; - case undefined: + case "database": + schema = DatabaseSchema; + break; + case undefined: // passed with no arguments, bit of a hack since this file is also used as a library return; default: console.error(`Unknown schema: ${values.schema}`); diff --git a/package.json b/package.json index e5e94f8..cdf00f6 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,12 @@ "scripts": { "gen-resource-schema": "bun run index.ts --schema resource > resource.schema.jsonc", "gen-meta-schema": "bun run index.ts --schema metadata > metadata.schema.jsonc", - "gen-schemas": "bun run gen-resource-schema && bun run gen-meta-schema", - "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats" + "gen-database-schema": "bun run index.ts --schema database > database.schema.jsonc", + "gen-schemas": "bun run gen-resource-schema && bun run gen-meta-schema && bun run gen-database-schema", + "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats", + "validate-metadata": "ajv validate -s metadata.schema.jsonc -d 'metadata/**/*.yaml' --spec=draft2020 -c ajv-formats", + "validate-database": "touch database.json && ajv validate -s database.schema.jsonc -d database.json --spec=draft2020 -c ajv-formats", + "validate": "bun run gen-schemas && bun run validate-resources && bun run validate-metadata && bun run validate-database", }, "devDependencies": { "@types/bun": "latest", From d74d321002a7f08dfd6c4a429d6ca90e97053494 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 18:44:06 +0100 Subject: [PATCH 13/22] ci: update validate action --- .github/workflows/validate.yml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 2067c6d..129c190 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -9,18 +9,21 @@ on: permissions: contents: read - pull-requests: write # enable write permissions for pull request comments jobs: - verify-yaml: + validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Checkout repository + uses: actions/checkout@v6 - - name: Validate JSON - uses: GrantBirki/json-yaml-validate@v5.0.0 + - name: Setup Bun + uses: oven-sh/setup-bun@v2.2.0 with: - base_dir: resources - json_schema: "resource.schema.jsonc" - yaml_as_json: "true" # enable YAML to JSON conversion - comment: "true" # enable comment mode + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Run validation suite + run: bun run validate \ No newline at end of file From e66c6355aa76ce21dc980a1d2113d4eef5dc3e0c Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 18:46:59 +0100 Subject: [PATCH 14/22] chore: remove trailing comma --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cdf00f6..ce001ef 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats", "validate-metadata": "ajv validate -s metadata.schema.jsonc -d 'metadata/**/*.yaml' --spec=draft2020 -c ajv-formats", "validate-database": "touch database.json && ajv validate -s database.schema.jsonc -d database.json --spec=draft2020 -c ajv-formats", - "validate": "bun run gen-schemas && bun run validate-resources && bun run validate-metadata && bun run validate-database", + "validate": "bun run gen-schemas && bun run validate-resources && bun run validate-metadata && bun run validate-database" }, "devDependencies": { "@types/bun": "latest", From f5833726d6544ef5c5f9a9a815b05c1c7aa0b9e0 Mon Sep 17 00:00:00 2001 From: Alex Wood Date: Mon, 11 May 2026 19:01:31 +0100 Subject: [PATCH 15/22] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ce001ef..b1b6f1d 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,11 @@ "gen-resource-schema": "bun run index.ts --schema resource > resource.schema.jsonc", "gen-meta-schema": "bun run index.ts --schema metadata > metadata.schema.jsonc", "gen-database-schema": "bun run index.ts --schema database > database.schema.jsonc", + "gen-database": "bun run index.ts > database.json", "gen-schemas": "bun run gen-resource-schema && bun run gen-meta-schema && bun run gen-database-schema", "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats", "validate-metadata": "ajv validate -s metadata.schema.jsonc -d 'metadata/**/*.yaml' --spec=draft2020 -c ajv-formats", - "validate-database": "touch database.json && ajv validate -s database.schema.jsonc -d database.json --spec=draft2020 -c ajv-formats", + "validate-database": "bun run gen-database && ajv validate -s database.schema.jsonc -d database.json --spec=draft2020 -c ajv-formats", "validate": "bun run gen-schemas && bun run validate-resources && bun run validate-metadata && bun run validate-database" }, "devDependencies": { From 757214376aee11c2519886b38cb54937723006c2 Mon Sep 17 00:00:00 2001 From: Alex Wood Date: Mon, 11 May 2026 19:03:38 +0100 Subject: [PATCH 16/22] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/index.ts b/index.ts index 867f804..e378697 100644 --- a/index.ts +++ b/index.ts @@ -197,5 +197,7 @@ function main() { console.log(JSON.stringify(z.toJSONSchema(schema, {}), null, 2)); } -main(); +if (import.meta.main) { + main(); +} From 6310b71b1eb0afac5ec69b4d68721ae82753eaf5 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 19:02:33 +0100 Subject: [PATCH 17/22] refactor: make schemas strict --- index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.ts b/index.ts index e378697..6785545 100644 --- a/index.ts +++ b/index.ts @@ -120,7 +120,7 @@ export const ResourceSchema = z.object({ .describe( "Array of cons for using the resource, e.g. 'only teaches the basics rather than more advanced concepts'", ), -}); +}).strict(); export const MetaSchema = z.object({ @@ -146,16 +146,16 @@ export const MetaSchema = z.object({ "The domain(s) that the entity is commonly used in, or best suited for.", ), category: ResourceCategorySchema, -}); +}).strict(); export const CompiledMetaSchema = MetaSchema.extend({ id: z.string().describe("The unique identifier of the entity"), -}); +}).strict(); export const DatabaseSchema = z.object({ metadata: z.array(CompiledMetaSchema).describe("List of all entities in the system"), resources: z.array(ResourceSchema).describe("List of all learning resources"), -}); +}).strict(); export type Meta = z.infer; export type Resource = z.infer; From 159071854897424246f286d386954d7d8eb7d3a9 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 19:03:27 +0100 Subject: [PATCH 18/22] build: improve vscode config --- .vscode/settings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9788ff9..7597f26 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,6 @@ "yaml.schemas": { "resource.schema.jsonc": "resources/**/*.yaml", "metadata.schema.jsonc": "metadata/**/*.yaml", + "database.schema.jsonc": "database.json" } } From c0e13525fcf5014e41dfff7870e1a609db20eb07 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 19:05:11 +0100 Subject: [PATCH 19/22] fix: improve cli --- index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/index.ts b/index.ts index 6785545..95e4d38 100644 --- a/index.ts +++ b/index.ts @@ -186,8 +186,9 @@ function main() { case "database": schema = DatabaseSchema; break; - case undefined: // passed with no arguments, bit of a hack since this file is also used as a library - return; + case undefined: + console.error("No schema specified. Use --schema to specify which schema to generate (e.g. --schema resource)"); + process.exit(1); default: console.error(`Unknown schema: ${values.schema}`); process.exit(1); From b9adea84f06106aa34bc980091f01468aef9b94e Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 19:06:37 +0100 Subject: [PATCH 20/22] build: fix gen-database command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b1b6f1d..ab5b61d 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "gen-resource-schema": "bun run index.ts --schema resource > resource.schema.jsonc", "gen-meta-schema": "bun run index.ts --schema metadata > metadata.schema.jsonc", "gen-database-schema": "bun run index.ts --schema database > database.schema.jsonc", - "gen-database": "bun run index.ts > database.json", + "gen-database": "bun run compile-database.ts > database.json", "gen-schemas": "bun run gen-resource-schema && bun run gen-meta-schema && bun run gen-database-schema", "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats", "validate-metadata": "ajv validate -s metadata.schema.jsonc -d 'metadata/**/*.yaml' --spec=draft2020 -c ajv-formats", From a78c9b0365bfc5ed9d35e64df09bd18400f85a46 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 19:07:59 +0100 Subject: [PATCH 21/22] fix: fix the gen-database script again --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab5b61d..3df2ec1 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "gen-resource-schema": "bun run index.ts --schema resource > resource.schema.jsonc", "gen-meta-schema": "bun run index.ts --schema metadata > metadata.schema.jsonc", "gen-database-schema": "bun run index.ts --schema database > database.schema.jsonc", - "gen-database": "bun run compile-database.ts > database.json", + "gen-database": "bun run compile-database.ts", "gen-schemas": "bun run gen-resource-schema && bun run gen-meta-schema && bun run gen-database-schema", "validate-resources": "ajv validate -s resource.schema.jsonc -d 'resources/**/*.yaml' --spec=draft2020 -c ajv-formats", "validate-metadata": "ajv validate -s metadata.schema.jsonc -d 'metadata/**/*.yaml' --spec=draft2020 -c ajv-formats", From 0d0ab35ebd0fced4beed1448dda9098f75f81eb5 Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Mon, 11 May 2026 19:08:31 +0100 Subject: [PATCH 22/22] fix: make compile-database deterministic --- compile-database.ts | 4 +- database.json | 956 ++++++++++++++++++++++---------------------- 2 files changed, 480 insertions(+), 480 deletions(-) diff --git a/compile-database.ts b/compile-database.ts index df461d3..b6e3df8 100644 --- a/compile-database.ts +++ b/compile-database.ts @@ -13,8 +13,8 @@ async function buildDatabase() { const metaDir = path.join(__dirname, "./metadata"); const resourcesDir = path.join(__dirname, "./resources"); - const allMetaFiles = await readdir(metaDir, { recursive: true, }); - const allResourceFiles = await readdir(resourcesDir, { recursive: true, }); + const allMetaFiles = (await readdir(metaDir, { recursive: true, })).toSorted(); + const allResourceFiles = (await readdir(resourcesDir, { recursive: true, })).toSorted(); const database = { metadata: [] as DatabaseMetadata[], diff --git a/database.json b/database.json index 542a207..39f42fd 100644 --- a/database.json +++ b/database.json @@ -30,6 +30,19 @@ ] } }, + { + "id": "haskell", + "name": "Haskell", + "description": "Haskell is a purely functional programming language commonly used in finance and academics", + "emoji": "821823367333675058", + "domains": [], + "category": { + "type": "Language", + "paradigms": [ + "Functional Programming" + ] + } + }, { "id": "java", "name": "Java", @@ -44,33 +57,22 @@ } }, { - "id": "rust", - "name": "Rust", - "description": "Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010", - "emoji": "821824283965128774", + "id": "kotlin", + "name": "Kotlin", + "description": "Kotlin is a multi-paradigm programming language created by JetBrains that runs on the JVM, JS, and Native Platforms", + "emoji": "888496555529744395", "domains": [ - "Systems Programming", - "Web Development", - "Game Development" + "Mobile Development" ], "category": { "type": "Language", "paradigms": [ - "Procedural Programming", - "Functional Programming" + "Object-Oriented Programming", + "Functional Programming", + "Procedural Programming" ] } }, - { - "id": "sql", - "name": "SQL", - "description": "SQL (Structured Query Language) is a standard programming language for managing and manipulating databases.", - "domains": [], - "category": { - "type": "Language", - "paradigms": [] - } - }, { "id": "php", "name": "PHP", @@ -106,33 +108,31 @@ } }, { - "id": "kotlin", - "name": "Kotlin", - "description": "Kotlin is a multi-paradigm programming language created by JetBrains that runs on the JVM, JS, and Native Platforms", - "emoji": "888496555529744395", + "id": "rust", + "name": "Rust", + "description": "Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010", + "emoji": "821824283965128774", "domains": [ - "Mobile Development" + "Systems Programming", + "Web Development", + "Game Development" ], "category": { "type": "Language", "paradigms": [ - "Object-Oriented Programming", - "Functional Programming", - "Procedural Programming" + "Procedural Programming", + "Functional Programming" ] } }, { - "id": "haskell", - "name": "Haskell", - "description": "Haskell is a purely functional programming language commonly used in finance and academics", - "emoji": "821823367333675058", + "id": "sql", + "name": "SQL", + "description": "SQL (Structured Query Language) is a standard programming language for managing and manipulating databases.", "domains": [], "category": { "type": "Language", - "paradigms": [ - "Functional Programming" - ] + "paradigms": [] } }, { @@ -144,15 +144,6 @@ "type": "Platform" } }, - { - "id": "programming-language-design", - "name": "Programming Language Design", - "description": "Resources on language design, parsers, compilers, and related concepts.", - "domains": [], - "category": { - "type": "Platform" - } - }, { "id": "git", "name": "Git", @@ -164,482 +155,487 @@ "category": { "type": "Tool" } + }, + { + "id": "programming-language-design", + "name": "Programming Language Design", + "description": "Resources on language design, parsers, compilers, and related concepts.", + "domains": [], + "category": { + "type": "Platform" + } } ], "resources": [ { - "name": "Programiz", - "url": "https://www.programiz.com/", + "name": "Learn You a Haskell", + "url": "http://learnyouahaskell.com/", "type": [ - "Interactive Tutorial" + "Book" ], "teaches": [ - "general" + "haskell" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Extensive courses/guides for many languages and frameworks", - "Balanced mix of material and projects/exercises" + "Good for beginners", + "Good reputation" ], "cons": [] }, { - "name": "Every link I wish I had as a beginner", - "url": "https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner", + "name": "Clojure API Cheatsheet", + "url": "https://clojure.org/api/cheatsheet", "type": [ "Article" ], "teaches": [ - "general" + "clojure" ], "pricing": { "model": "Free" }, "pros": [ - "A huge collection of useful links" + "Overview over almost the entire standard library", + "Quick reference" ], - "cons": [ - "Can be overwhelming and hard to navigate" - ] + "cons": [] }, { - "name": "Codecademy", - "url": "https://www.codecademy.com/", + "name": "Clojure beginner resources", + "url": "https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f", "type": [ - "Interactive Tutorial" + "Article" ], "teaches": [ - "general" + "clojure" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Excellent guided learning platform", - "Beginner-friendly but continues into advanced content", - "Fully in-browser and zero setup", - "Very useful paid features including career track bootcamps" + "Collection of all kinds of resources to learn Clojure" ], - "cons": [ - "Some content requires a paid subscription", - "Limited coverage of some topics (free plan)", - "Only select languages and frameworks available" - ] + "cons": [] }, { - "name": "Sololearn", - "url": "https://www.sololearn.com/", + "name": "Clojure by Example", + "url": "https://github.com/inclojure-org/clojure-by-example", "type": [ - "Interactive Tutorial" + "Article" ], "teaches": [ - "general" + "clojure" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Easy to use", - "Lots of languages to choose from" + "Hands-on learning", + "Crash Course" ], "cons": [ - "Doesn't teach things in a real world example", - "Doesn't cover some topics very deeply" + "No thorough explanations for complete programming beginners" ] }, { - "name": "LeetCode", - "url": "https://leetcode.com/", + "name": "Clojure for Java Programmers", + "url": "https://www.youtube.com/watch?v=P76Vbsk_3J0", "type": [ - "Interactive Tutorial" + "Video" ], "teaches": [ - "general" + "clojure" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Fun and difficult problems to solve" + "Video series", + "Explains the ideas behind Clojure" ], "cons": [ - "Not very beginner friendly", - "Some content requires a paid account" + "Mostly aimed at people from an OOP background" ] }, { - "name": "Learn You a Haskell", - "url": "http://learnyouahaskell.com/", + "name": "Clojure For The Brave And True", + "url": "https://www.braveclojure.com/clojure-for-the-brave-and-true/", "type": [ "Book" ], "teaches": [ - "haskell" + "clojure" ], "pricing": { "model": "Free" }, "pros": [ - "Good for beginners", - "Good reputation" + "Complete guide through most of the language", + "Assumes no prior knowledge of functional programming or Lisp" ], "cons": [] }, { - "name": "Projects", - "description": "A list of practical projects that anyone can solve in any programming language", - "url": "https://github.com/karan/Projects", + "name": "4clojure", + "url": "https://4clojure.oxal.org/", "type": [ - "Article" + "Interactive Tutorial" ], "teaches": [ - "general" + "clojure" ], "pricing": { "model": "Free" }, - "pros": [], - "cons": [] + "pros": [ + "Interactive exercises" + ], + "cons": [ + "No tutorial from the ground up" + ] }, { - "name": "The Missing Semester of Your CS Education", - "description": "Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc", - "url": "https://missing.csail.mit.edu/", + "name": "Functions Explained Through Patterns", + "url": "http://blog.josephwilk.net/clojure/functions-explained-through-patterns.html", "type": [ - "Course" + "Article" ], "teaches": [ - "general" + "clojure" ], "pricing": { "model": "Free" }, "pros": [ - "Created by MIT", - "Covers subjects that most tutorials might ignore, making it a great supplementary resource" - ] + "Visual explanations of core Clojure functions" + ], + "cons": [] }, { - "name": "Crafting Interpreters", - "url": "https://craftinginterpreters.com/", + "name": "C++ Core Guidelines", + "url": "https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines", "type": [ - "Book" + "Article" ], "teaches": [ - "programming-language-design" + "cpp" ], "pricing": { "model": "Free" }, "pros": [ - "Covers lexing, parsing, interpreting, type checking, and compiling", - "Starts from scratch, designed for beginners" + "Collection of best practices for most aspects of the language", + "Bite-sized titled entries, making it easy to navigate", + "Contains examples to take as guide" ], "cons": [ - "Doesn't cover the theoretical side much" + "Requires some prior understanding of the language" ] }, { - "name": "Awesome Compilers", - "description": "Curated list of resources for all things compilers", - "url": "https://github.com/aalhour/awesome-compilers", + "name": "cppreference.com", + "url": "https://en.cppreference.com/", "type": [ "Article" ], "teaches": [ - "programming-language-design" + "cpp" ], "pricing": { "model": "Free" }, - "pros": [], - "cons": [] + "pros": [ + "Documentation about the entirety of the language and the standard library", + "Apt for everyone in the learning spectrum, from beginners to advanced users" + ], + "cons": [ + "The site can become confusing and overwhelming to navigate" + ] }, { - "name": "Python for Data Science", - "url": "https://www.datacamp.com/courses/intro-to-python-for-data-science", + "name": "Modernes C++", + "url": "https://www.modernescpp.com/", "type": [ - "Course" + "Article" ], "teaches": [ - "python" + "cpp" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Focuses on using Python for data analysis and machine learning", - "Interactive lessons and hands-on experience writing Python code", - "Introduction to key Python libraries for data science" + "Large series of blog posts about often less taught APIs and best practices", + "Very detailed explanations with explicit examples", + "Posts about new features less frequently found on the internet" ], "cons": [ - "May not cover more general Python concepts in depth" + "Requires intermediate-advanced knowledge of the language and its feature-set" ] }, { - "name": "Python on Coursera", - "url": "https://www.coursera.org/courses?query=python", + "name": "C++ - Video Playlist", + "url": "https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb", "type": [ - "Course" + "Video" ], "teaches": [ - "python" + "cpp" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Wide variety of courses and specialization tracks", - "Taught by experienced instructors from top universities", - "Many courses include quizzes, projects, and certificates" + "Teaches a large portion of the language's workings for best usage", + "Thorough explanations", + "Useful for absolute beginners as well as intermediate level" ], - "cons": [ - "Some courses may have prerequisites or require a subscription" - ] + "cons": [] }, { - "name": "Python for Everybody", - "url": "https://www.py4e.com/", + "name": "Haskell: The Craft of Functional Programming", + "url": "https://simonjohnthompson.github.io/craft3e/craft3e.pdf", "type": [ - "Course" + "Book" ], "teaches": [ - "python" + "haskell" ], "pricing": { "model": "Free" }, - "pros": [ - "Suitable for absolute beginners", - "Covers key Python concepts and libraries", - "Includes quizzes and exercises to test your knowledge" - ], - "cons": [ - "May not cover more advanced topics in depth" - ] + "pros": [], + "cons": [] }, { - "name": "Codecademy", - "url": "https://www.codecademy.com/learn/learn-python", + "name": "Functional Programming in Haskell: Supercharge Your Coding", + "url": "https://www.futurelearn.com/courses/functional-programming-haskell", "type": [ - "Interactive Tutorial" + "Course" ], "teaches": [ - "python" + "haskell" ], "pricing": { "model": "Free" }, - "pros": [ - "Interactive lessons and quizzes", - "Hands-on experience writing Python code", - "Introduction to key Python concepts and libraries" - ], + "pros": [], "cons": [ - "May not cover more advanced topics in depth" + "May be a waitlist to get access" ] }, { - "name": "Learn Python the Hard Way", - "url": "https://learnpythonthehardway.org/", + "name": "Haskell Programming from First Principles", + "url": "https://haskellbook.com/", "type": [ "Book" ], "teaches": [ - "python" + "haskell" ], "pricing": { "model": "One Time", - "amount": 29 + "amount": 59 }, "pros": [ - "Comprehensive and in-depth coverage of Python", - "Includes quizzes and exercises to test your knowledge", - "Suitable for beginners and experienced programmers alike" - ], - "cons": [ - "May be too challenging for some learners" + "Very good reputation", + "Covers a very wide range of content" ] }, { - "name": "Python documentation", - "url": "https://docs.python.org/3/", + "name": "Haskell Wikibooks", + "url": "https://en.wikibooks.org/wiki/Haskell", "type": [ - "Article" + "Book" ], "teaches": [ - "python" + "haskell" ], "pricing": { "model": "Free" }, "pros": [ - "Comprehensive and up-to-date documentation", - "Includes tutorials, guides, and reference material", - "Suitable for beginners and experienced programmers alike" + "Wide range of content", + "Explains most things fairly simply" ], "cons": [ - "May be too technical and dry for some learners" + "Some information may be outdated" ] }, { - "name": "The Rust Programming Language (Book)", - "url": "https://doc.rust-lang.org/book/", + "name": "Write Yourself a Scheme in 48 hours", + "url": "https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours", "type": [ "Book" ], "teaches": [ - "rust" + "haskell" ], "pricing": { "model": "Free" }, "pros": [ - "Very detailed", - "Frequently updated", - "Semi-Official" + "Designed for beginners", + "Learn by making a real project (creating your own small programming language)" ], - "cons": [] + "cons": [ + "Moves quite quickly" + ] }, { - "name": "Rust Crash Course | Traversy Media", - "url": "https://www.youtube.com/watch?v=zF34dRivLOw", + "name": "Alex Lee", + "url": "https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA", "type": [ "Video" ], "teaches": [ - "rust" + "java" ], "pricing": { "model": "Free" }, "pros": [ - "Video series" + "Video series", + "Covers a wide range of concepts" ], "cons": [] }, { - "name": "Rust by Example", - "url": "https://doc.rust-lang.org/stable/rust-by-example/", + "name": "Bro Code", + "url": "https://www.youtube.com/c/BroCodez", "type": [ - "Book" + "Video" ], "teaches": [ - "rust" + "java" ], "pricing": { "model": "Free" }, "pros": [ - "Teaches concepts by example", - "Semi-Official" + "Video series", + "Has videos on many different languages and concepts" ], "cons": [] }, { - "name": "PHP The Right Way", - "url": "https://phptherightway.com/", + "name": "Javatpoint", + "url": "https://www.javatpoint.com/java-tutorial", "type": [ "Article" ], "teaches": [ - "php" + "java" + ], + "pricing": { + "model": "Free" + } + }, + { + "name": "Mooc.fi", + "description": "Comprehensive Java (and general programming) course provided by the University of Helsinki", + "url": "https://java-programming.mooc.fi/", + "type": [ + "Course" + ], + "teaches": [ + "java" ], "pricing": { "model": "Free" }, "pros": [ - "Community-driven guide to modern PHP practices", - "Covers best practices, tools, and resources", - "Regularly updated" - ], - "cons": [ - "Assumes basic familiarity with PHP" + "Very well respected" ] }, { - "name": "Laracasts PHP Basics", - "url": "https://laracasts.com/series/php-for-beginners", + "name": "TheNewBoston", + "url": "https://www.youtube.com/@thenewboston", "type": [ "Video" ], "teaches": [ - "php" + "java" ], "pricing": { "model": "Free" }, "pros": [ - "Video tutorials by experienced developers", - "Covers beginner to intermediate PHP topics", - "Focus on practical, real-world applications" + "Beginner and intermediate video series", + "Short, but a lot of videos (146 videos combined in both playlists)" + ], + "cons": [ + "Videos may be outdated (2009 - 2012)" ] }, { - "name": "W3Schools PHP Tutorial", - "url": "https://www.w3schools.com/php/", + "name": "Tutorial Spot", + "url": "https://www.tutorialspoint.com/java/index.htm", "type": [ - "Interactive Tutorial" + "Article" ], "teaches": [ - "php" + "java" ], "pricing": { "model": "Free" }, - "pros": [ - "Beginner-friendly and easy to navigate", - "Includes interactive examples and a \"Try it Yourself\" feature", - "Covers essential PHP concepts and syntax" - ], + "pros": [], "cons": [ - "May lack depth on advanced topics" + "Slightly dated" ] }, { - "name": "PHP Manual", - "url": "https://www.php.net/manual/en/", + "name": "FreeCodeCamp.org", + "url": "https://youtu.be/F9UC9DY-vIU", "type": [ - "Article" + "Video" ], "teaches": [ - "php" + "kotlin" ], "pricing": { "model": "Free" }, "pros": [ - "Comprehensive and up-to-date documentation", - "Includes tutorials, guides, and reference material", - "Suitable for beginners and experienced developers alike" + "Video for visual learners" ], - "cons": [ - "May be too technical and dry for some learners" - ] + "cons": [] }, { - "name": "Udemy PHP Courses", - "url": "https://www.udemy.com/topic/php/", + "name": "Introduction to Kotlin (Google I/O '17)", + "url": "https://www.youtube.com/watch?v=X1RVYt2QKQE", "type": [ - "Course" + "Video" ], "teaches": [ - "php" + "kotlin" ], "pricing": { - "model": "One Time", - "amount": 29.99 + "model": "Free" }, "pros": [ - "Wide variety of courses for all skill levels", - "Affordable and often discounted", - "Lifetime access to purchased courses" + "Video for visual learners" ], - "cons": [ - "Quality may vary between courses" - ] + "cons": [] + }, + { + "name": "Kotlin Official Website", + "url": "https://kotlinlang.org/", + "type": [ + "Article" + ], + "teaches": [ + "kotlin" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "cons": [] }, { "name": "Codecademy PHP Course", @@ -663,540 +659,544 @@ ] }, { - "name": "SQL Tutorial by W3Schools", - "url": "https://www.w3schools.com/sql/", + "name": "Laracasts PHP Basics", + "url": "https://laracasts.com/series/php-for-beginners", "type": [ - "Interactive Tutorial" + "Video" ], "teaches": [ - "sql" + "php" ], "pricing": { "model": "Free" }, "pros": [ - "Beginner-friendly and easy to understand", - "Interactive \"Try it Yourself\" feature for practicing SQL", - "Covers essential SQL commands and concepts" - ], - "cons": [ - "Lacks depth for advanced SQL topics" + "Video tutorials by experienced developers", + "Covers beginner to intermediate PHP topics", + "Focus on practical, real-world applications" ] }, { - "name": "Khan Academy SQL Course", - "url": "https://www.khanacademy.org/computing/computer-programming/sql", + "name": "PHP Manual", + "url": "https://www.php.net/manual/en/", "type": [ - "Course" + "Article" ], "teaches": [ - "sql" + "php" ], "pricing": { "model": "Free" }, "pros": [ - "Excellent for beginners", - "Video tutorials combined with interactive exercises", - "Covers practical examples and common use cases" + "Comprehensive and up-to-date documentation", + "Includes tutorials, guides, and reference material", + "Suitable for beginners and experienced developers alike" ], "cons": [ - "Focused more on basic and intermediate concepts" + "May be too technical and dry for some learners" ] }, { - "name": "Codecademy Learn SQL Course", - "url": "https://www.codecademy.com/learn/learn-sql", + "name": "PHP The Right Way", + "url": "https://phptherightway.com/", "type": [ - "Interactive Tutorial" + "Article" ], "teaches": [ - "sql" + "php" ], "pricing": { - "model": "Freemium" + "model": "Free" }, "pros": [ - "Hands-on, interactive lessons and quizzes", - "Beginner to intermediate SQL concepts covered", - "Provides experience with real-world database scenarios" + "Community-driven guide to modern PHP practices", + "Covers best practices, tools, and resources", + "Regularly updated" ], "cons": [ - "Full access requires a subscription" + "Assumes basic familiarity with PHP" ] }, { - "name": "SQL Manual by PostgreSQL (or Other RDBMS)", - "url": "https://www.postgresql.org/docs/", + "name": "Udemy PHP Courses", + "url": "https://www.udemy.com/topic/php/", "type": [ - "Article" + "Course" ], "teaches": [ - "sql" + "php" ], "pricing": { - "model": "Free" + "model": "One Time", + "amount": 29.99 }, "pros": [ - "Official and comprehensive documentation", - "Includes advanced topics and features specific to PostgreSQL", - "Reliable and up-to-date" + "Wide variety of courses for all skill levels", + "Affordable and often discounted", + "Lifetime access to purchased courses" ], "cons": [ - "Can be technical and dense for beginners" + "Quality may vary between courses" ] }, { - "name": "4clojure", - "url": "https://4clojure.oxal.org/", + "name": "W3Schools PHP Tutorial", + "url": "https://www.w3schools.com/php/", "type": [ "Interactive Tutorial" ], "teaches": [ - "clojure" + "php" ], "pricing": { "model": "Free" }, "pros": [ - "Interactive exercises" + "Beginner-friendly and easy to navigate", + "Includes interactive examples and a \"Try it Yourself\" feature", + "Covers essential PHP concepts and syntax" ], "cons": [ - "No tutorial from the ground up" + "May lack depth on advanced topics" ] }, { - "name": "Clojure API Cheatsheet", - "url": "https://clojure.org/api/cheatsheet", + "name": "Codecademy", + "url": "https://www.codecademy.com/learn/learn-python", "type": [ - "Article" + "Interactive Tutorial" ], "teaches": [ - "clojure" + "python" ], "pricing": { "model": "Free" }, "pros": [ - "Overview over almost the entire standard library", - "Quick reference" + "Interactive lessons and quizzes", + "Hands-on experience writing Python code", + "Introduction to key Python concepts and libraries" ], - "cons": [] + "cons": [ + "May not cover more advanced topics in depth" + ] }, { - "name": "Clojure beginner resources", - "url": "https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f", + "name": "Learn Python the Hard Way", + "url": "https://learnpythonthehardway.org/", "type": [ - "Article" + "Book" ], "teaches": [ - "clojure" + "python" ], "pricing": { - "model": "Free" + "model": "One Time", + "amount": 29 }, "pros": [ - "Collection of all kinds of resources to learn Clojure" + "Comprehensive and in-depth coverage of Python", + "Includes quizzes and exercises to test your knowledge", + "Suitable for beginners and experienced programmers alike" ], - "cons": [] + "cons": [ + "May be too challenging for some learners" + ] }, { - "name": "Functions Explained Through Patterns", - "url": "http://blog.josephwilk.net/clojure/functions-explained-through-patterns.html", + "name": "Python documentation", + "url": "https://docs.python.org/3/", "type": [ "Article" ], "teaches": [ - "clojure" + "python" ], "pricing": { "model": "Free" }, "pros": [ - "Visual explanations of core Clojure functions" + "Comprehensive and up-to-date documentation", + "Includes tutorials, guides, and reference material", + "Suitable for beginners and experienced programmers alike" ], - "cons": [] + "cons": [ + "May be too technical and dry for some learners" + ] }, { - "name": "Clojure For The Brave And True", - "url": "https://www.braveclojure.com/clojure-for-the-brave-and-true/", + "name": "Python for Data Science", + "url": "https://www.datacamp.com/courses/intro-to-python-for-data-science", "type": [ - "Book" + "Course" ], "teaches": [ - "clojure" + "python" ], "pricing": { - "model": "Free" + "model": "Freemium" }, "pros": [ - "Complete guide through most of the language", - "Assumes no prior knowledge of functional programming or Lisp" + "Focuses on using Python for data analysis and machine learning", + "Interactive lessons and hands-on experience writing Python code", + "Introduction to key Python libraries for data science" ], - "cons": [] + "cons": [ + "May not cover more general Python concepts in depth" + ] }, { - "name": "Clojure for Java Programmers", - "url": "https://www.youtube.com/watch?v=P76Vbsk_3J0", + "name": "Python for Everybody", + "url": "https://www.py4e.com/", "type": [ - "Video" + "Course" ], "teaches": [ - "clojure" + "python" ], "pricing": { "model": "Free" }, "pros": [ - "Video series", - "Explains the ideas behind Clojure" + "Suitable for absolute beginners", + "Covers key Python concepts and libraries", + "Includes quizzes and exercises to test your knowledge" ], "cons": [ - "Mostly aimed at people from an OOP background" + "May not cover more advanced topics in depth" ] }, { - "name": "Clojure by Example", - "url": "https://github.com/inclojure-org/clojure-by-example", + "name": "Python on Coursera", + "url": "https://www.coursera.org/courses?query=python", "type": [ - "Article" + "Course" ], "teaches": [ - "clojure" + "python" ], "pricing": { - "model": "Free" + "model": "Freemium" }, "pros": [ - "Hands-on learning", - "Crash Course" + "Wide variety of courses and specialization tracks", + "Taught by experienced instructors from top universities", + "Many courses include quizzes, projects, and certificates" ], "cons": [ - "No thorough explanations for complete programming beginners" + "Some courses may have prerequisites or require a subscription" ] }, { - "name": "C++ - Video Playlist", - "url": "https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb", + "name": "The Rust Programming Language (Book)", + "url": "https://doc.rust-lang.org/book/", "type": [ - "Video" + "Book" ], "teaches": [ - "cpp" + "rust" ], "pricing": { "model": "Free" }, "pros": [ - "Teaches a large portion of the language's workings for best usage", - "Thorough explanations", - "Useful for absolute beginners as well as intermediate level" + "Very detailed", + "Frequently updated", + "Semi-Official" ], "cons": [] }, { - "name": "Modernes C++", - "url": "https://www.modernescpp.com/", + "name": "Rust by Example", + "url": "https://doc.rust-lang.org/stable/rust-by-example/", "type": [ - "Article" + "Book" ], "teaches": [ - "cpp" + "rust" ], "pricing": { "model": "Free" }, "pros": [ - "Large series of blog posts about often less taught APIs and best practices", - "Very detailed explanations with explicit examples", - "Posts about new features less frequently found on the internet" + "Teaches concepts by example", + "Semi-Official" ], - "cons": [ - "Requires intermediate-advanced knowledge of the language and its feature-set" - ] + "cons": [] }, { - "name": "C++ Core Guidelines", - "url": "https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines", + "name": "Rust Crash Course | Traversy Media", + "url": "https://www.youtube.com/watch?v=zF34dRivLOw", "type": [ - "Article" + "Video" ], "teaches": [ - "cpp" + "rust" ], "pricing": { "model": "Free" }, "pros": [ - "Collection of best practices for most aspects of the language", - "Bite-sized titled entries, making it easy to navigate", - "Contains examples to take as guide" + "Video series" ], - "cons": [ - "Requires some prior understanding of the language" - ] + "cons": [] }, { - "name": "cppreference.com", - "url": "https://en.cppreference.com/", + "name": "Codecademy Learn SQL Course", + "url": "https://www.codecademy.com/learn/learn-sql", "type": [ - "Article" + "Interactive Tutorial" ], "teaches": [ - "cpp" + "sql" ], "pricing": { - "model": "Free" + "model": "Freemium" }, "pros": [ - "Documentation about the entirety of the language and the standard library", - "Apt for everyone in the learning spectrum, from beginners to advanced users" + "Hands-on, interactive lessons and quizzes", + "Beginner to intermediate SQL concepts covered", + "Provides experience with real-world database scenarios" ], "cons": [ - "The site can become confusing and overwhelming to navigate" + "Full access requires a subscription" ] }, { - "name": "TheNewBoston", - "url": "https://www.youtube.com/@thenewboston", + "name": "Khan Academy SQL Course", + "url": "https://www.khanacademy.org/computing/computer-programming/sql", "type": [ - "Video" + "Course" ], "teaches": [ - "java" + "sql" ], "pricing": { "model": "Free" }, "pros": [ - "Beginner and intermediate video series", - "Short, but a lot of videos (146 videos combined in both playlists)" + "Excellent for beginners", + "Video tutorials combined with interactive exercises", + "Covers practical examples and common use cases" ], "cons": [ - "Videos may be outdated (2009 - 2012)" + "Focused more on basic and intermediate concepts" ] }, { - "name": "Tutorial Spot", - "url": "https://www.tutorialspoint.com/java/index.htm", + "name": "SQL Manual by PostgreSQL (or Other RDBMS)", + "url": "https://www.postgresql.org/docs/", "type": [ "Article" ], "teaches": [ - "java" + "sql" ], "pricing": { "model": "Free" }, - "pros": [], + "pros": [ + "Official and comprehensive documentation", + "Includes advanced topics and features specific to PostgreSQL", + "Reliable and up-to-date" + ], "cons": [ - "Slightly dated" + "Can be technical and dense for beginners" ] }, { - "name": "Bro Code", - "url": "https://www.youtube.com/c/BroCodez", + "name": "SQL Tutorial by W3Schools", + "url": "https://www.w3schools.com/sql/", "type": [ - "Video" + "Interactive Tutorial" ], "teaches": [ - "java" + "sql" ], "pricing": { "model": "Free" }, "pros": [ - "Video series", - "Has videos on many different languages and concepts" + "Beginner-friendly and easy to understand", + "Interactive \"Try it Yourself\" feature for practicing SQL", + "Covers essential SQL commands and concepts" ], - "cons": [] + "cons": [ + "Lacks depth for advanced SQL topics" + ] }, { - "name": "Mooc.fi", - "description": "Comprehensive Java (and general programming) course provided by the University of Helsinki", - "url": "https://java-programming.mooc.fi/", + "name": "Codecademy", + "url": "https://www.codecademy.com/", "type": [ - "Course" + "Interactive Tutorial" ], "teaches": [ - "java" + "general" ], "pricing": { - "model": "Free" + "model": "Freemium" }, "pros": [ - "Very well respected" + "Excellent guided learning platform", + "Beginner-friendly but continues into advanced content", + "Fully in-browser and zero setup", + "Very useful paid features including career track bootcamps" + ], + "cons": [ + "Some content requires a paid subscription", + "Limited coverage of some topics (free plan)", + "Only select languages and frameworks available" ] }, { - "name": "Alex Lee", - "url": "https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA", + "name": "Every link I wish I had as a beginner", + "url": "https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner", "type": [ - "Video" + "Article" ], "teaches": [ - "java" + "general" ], "pricing": { "model": "Free" }, "pros": [ - "Video series", - "Covers a wide range of concepts" - ], - "cons": [] - }, - { - "name": "Javatpoint", - "url": "https://www.javatpoint.com/java-tutorial", - "type": [ - "Article" - ], - "teaches": [ - "java" + "A huge collection of useful links" ], - "pricing": { - "model": "Free" - } + "cons": [ + "Can be overwhelming and hard to navigate" + ] }, { - "name": "Introduction to Kotlin (Google I/O '17)", - "url": "https://www.youtube.com/watch?v=X1RVYt2QKQE", + "name": "LeetCode", + "url": "https://leetcode.com/", "type": [ - "Video" + "Interactive Tutorial" ], "teaches": [ - "kotlin" + "general" ], "pricing": { - "model": "Free" + "model": "Freemium" }, "pros": [ - "Video for visual learners" + "Fun and difficult problems to solve" ], - "cons": [] + "cons": [ + "Not very beginner friendly", + "Some content requires a paid account" + ] }, { - "name": "Kotlin Official Website", - "url": "https://kotlinlang.org/", + "name": "Programiz", + "url": "https://www.programiz.com/", "type": [ - "Article" + "Interactive Tutorial" ], "teaches": [ - "kotlin" + "general" ], "pricing": { - "model": "Free" + "model": "Freemium" }, - "pros": [], + "pros": [ + "Extensive courses/guides for many languages and frameworks", + "Balanced mix of material and projects/exercises" + ], "cons": [] }, { - "name": "FreeCodeCamp.org", - "url": "https://youtu.be/F9UC9DY-vIU", + "name": "Sololearn", + "url": "https://www.sololearn.com/", "type": [ - "Video" + "Interactive Tutorial" ], "teaches": [ - "kotlin" + "general" ], "pricing": { - "model": "Free" + "model": "Freemium" }, "pros": [ - "Video for visual learners" + "Easy to use", + "Lots of languages to choose from" ], - "cons": [] + "cons": [ + "Doesn't teach things in a real world example", + "Doesn't cover some topics very deeply" + ] }, { - "name": "Functional Programming in Haskell: Supercharge Your Coding", - "url": "https://www.futurelearn.com/courses/functional-programming-haskell", + "name": "Projects", + "description": "A list of practical projects that anyone can solve in any programming language", + "url": "https://github.com/karan/Projects", "type": [ - "Course" + "Article" ], "teaches": [ - "haskell" + "general" ], "pricing": { "model": "Free" }, "pros": [], - "cons": [ - "May be a waitlist to get access" - ] + "cons": [] }, { - "name": "Haskell Wikibooks", - "url": "https://en.wikibooks.org/wiki/Haskell", + "name": "The Missing Semester of Your CS Education", + "description": "Covers the often overlooked subjects in practical CS - shells, editors, debugging, etc", + "url": "https://missing.csail.mit.edu/", "type": [ - "Book" + "Course" ], "teaches": [ - "haskell" + "general" ], "pricing": { "model": "Free" }, "pros": [ - "Wide range of content", - "Explains most things fairly simply" - ], - "cons": [ - "Some information may be outdated" + "Created by MIT", + "Covers subjects that most tutorials might ignore, making it a great supplementary resource" ] }, { - "name": "Write Yourself a Scheme in 48 hours", - "url": "https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours", + "name": "Awesome Compilers", + "description": "Curated list of resources for all things compilers", + "url": "https://github.com/aalhour/awesome-compilers", "type": [ - "Book" + "Article" ], "teaches": [ - "haskell" + "programming-language-design" ], "pricing": { "model": "Free" }, - "pros": [ - "Designed for beginners", - "Learn by making a real project (creating your own small programming language)" - ], - "cons": [ - "Moves quite quickly" - ] + "pros": [], + "cons": [] }, { - "name": "Haskell Programming from First Principles", - "url": "https://haskellbook.com/", + "name": "Crafting Interpreters", + "url": "https://craftinginterpreters.com/", "type": [ "Book" ], "teaches": [ - "haskell" + "programming-language-design" ], "pricing": { - "model": "One Time", - "amount": 59 + "model": "Free" }, "pros": [ - "Very good reputation", - "Covers a very wide range of content" - ] - }, - { - "name": "Haskell: The Craft of Functional Programming", - "url": "https://simonjohnthompson.github.io/craft3e/craft3e.pdf", - "type": [ - "Book" - ], - "teaches": [ - "haskell" + "Covers lexing, parsing, interpreting, type checking, and compiling", + "Starts from scratch, designed for beginners" ], - "pricing": { - "model": "Free" - }, - "pros": [], - "cons": [] + "cons": [ + "Doesn't cover the theoretical side much" + ] } ] } \ No newline at end of file