diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index fe1421d..129c190 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -4,25 +4,26 @@ name: Validate YAMLs against JSON Schema on: push: - branches: - - master pull_request: workflow_dispatch: 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@v6 + - name: Checkout repository + uses: actions/checkout@v6 - - name: Validate JSON - uses: GrantBirki/json-yaml-validate@v1.5.0 + - name: Setup Bun + uses: oven-sh/setup-bun@v2.2.0 with: - base_dir: resources - json_schema: "resource.schema.json" - 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 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/.vscode/settings.json b/.vscode/settings.json index d916240..7597f26 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { - "yaml.schemas": { - // apply schema to all resources - "resource.schema.json": "resources/*.yaml" - } -} \ No newline at end of file + "yaml.schemas": { + "resource.schema.jsonc": "resources/**/*.yaml", + "metadata.schema.jsonc": "metadata/**/*.yaml", + "database.schema.jsonc": "database.json" + } +} 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..7015c71 --- /dev/null +++ b/bun.lock @@ -0,0 +1,87 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "learningresources", + "dependencies": { + "zod": "^4.4.3", + }, + "devDependencies": { + "@types/bun": "latest", + "ajv-cli": "^5.0.0", + "ajv-formats": "^3.0.1", + }, + "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=="], + + "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/compile-database.ts b/compile-database.ts new file mode 100644 index 0000000..b6e3df8 --- /dev/null +++ b/compile-database.ts @@ -0,0 +1,93 @@ +import path from "path"; +import fs from "fs"; +import { readdir } from "node:fs/promises"; +import { DatabaseSchema, MetaSchema, ResourceSchema, type Database, 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, })).toSorted(); + const allResourceFiles = (await readdir(resourcesDir, { recursive: true, })).toSorted(); + + const database = { + metadata: [] as DatabaseMetadata[], + resources: [] as Resource[] + } satisfies Database; + 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); + } + + // 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)); + + 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..39f42fd --- /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": "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", + "description": "Java is an Object Oriented language designed by James Gosling in 1995", + "emoji": "821822045187866625", + "domains": [], + "category": { + "type": "Language", + "paradigms": [ + "Object-Oriented 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": "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": "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": "general", + "name": "General", + "description": "Resources that are broadly useful for learning programming, regardless of language.", + "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" + } + }, + { + "id": "programming-language-design", + "name": "Programming Language Design", + "description": "Resources on language design, parsers, compilers, and related concepts.", + "domains": [], + "category": { + "type": "Platform" + } + } + ], + "resources": [ + { + "name": "Learn You a Haskell", + "url": "http://learnyouahaskell.com/", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Good for beginners", + "Good reputation" + ], + "cons": [] + }, + { + "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": "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": "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 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": "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": "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": "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": "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++ - 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": "Haskell: The Craft of Functional Programming", + "url": "https://simonjohnthompson.github.io/craft3e/craft3e.pdf", + "type": [ + "Book" + ], + "teaches": [ + "haskell" + ], + "pricing": { + "model": "Free" + }, + "pros": [], + "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 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 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": "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": "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": "Javatpoint", + "url": "https://www.javatpoint.com/java-tutorial", + "type": [ + "Article" + ], + "teaches": [ + "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": [ + "Very well respected" + ] + }, + { + "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": "FreeCodeCamp.org", + "url": "https://youtu.be/F9UC9DY-vIU", + "type": [ + "Video" + ], + "teaches": [ + "kotlin" + ], + "pricing": { + "model": "Free" + }, + "pros": [ + "Video for visual learners" + ], + "cons": [] + }, + { + "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": "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": "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": "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": "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": "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": "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": "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": "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 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": "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": "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 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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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" + ] + } + ] +} \ No newline at end of file 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 new file mode 100644 index 0000000..95e4d38 --- /dev/null +++ b/index.ts @@ -0,0 +1,204 @@ +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) + */ +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", + "DevOps" + ]) + .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 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 ResourceTypeSchema = z.enum(["Video", "Article", "Interactive Tutorial", "Book", "Course"]).describe( + "The type of the resource", +); + +export 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.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()) + .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'", + ), +}).strict(); + + +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, +}).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; +export type Database = z.infer; + +function main() { + 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; + case "resource": + schema = ResourceSchema; + break; + case "database": + schema = DatabaseSchema; + break; + 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); + } + + console.log(header); + console.log(JSON.stringify(z.toJSONSchema(schema, {}), null, 2)); +} + +if (import.meta.main) { + main(); +} + 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/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/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/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/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/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/package.json b/package.json new file mode 100644 index 0000000..3df2ec1 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "learningresources", + "module": "index.ts", + "type": "module", + "private": true, + "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-database-schema": "bun run index.ts --schema database > database.schema.jsonc", + "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", + "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": { + "@types/bun": "latest", + "ajv-cli": "^5.0.0", + "ajv-formats": "^3.0.1" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "zod": "^4.4.3" + } +} \ No newline at end of file diff --git a/resource.schema.json b/resource.schema.json deleted file mode 100644 index c031dd1..0000000 --- a/resource.schema.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "$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", - "type": "object", - "required": [ - "name", - "description", - "resources" - ], - "properties": { - "name": { - "description": "The name of the language", - "type": "string" - }, - "description": { - "description": "A brief description of the language and its uses", - "type": "string", - "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.", - "type": "string" - }, - "resources": { - "description": "List of resources that can be used for learning / practicing the language", - "type": "array", - "items": { - "$ref": "#/definitions/resource" - }, - "minItems": 1, - "uniqueItems": true - } - }, - "definitions": { - "resource": { - "type": "object", - "required": [ - "name", - "url", - "pros", - "cons" - ], - "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" - }, - "price": { - "type": [ - "string", - "number" - ], - "description": "The price of the resource, if it has one. If the resource is free, omit this field." - }, - "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" - } - } - } - } - } -} \ No newline at end of file diff --git a/resource.schema.jsonc b/resource.schema.jsonc new file mode 100644 index 0000000..d4ac5d5 --- /dev/null +++ b/resource.schema.jsonc @@ -0,0 +1,126 @@ +// 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": [ + "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 +} 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/callisto.yaml b/resources/callisto.yaml deleted file mode 100644 index 9bdab61..0000000 --- a/resources/callisto.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: Callisto -description: Callisto is a concatenative low-level programming language designed by John Mesyeti Smith in March 2024 -emoji: '821822658169536542' -resources: - - name: Callisto documentation - url: https://callisto.mesyeti.uk/docs - 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 - 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 diff --git a/resources/clojure.yaml b/resources/clojure.yaml deleted file mode 100644 index bb10e5d..0000000 --- a/resources/clojure.yaml +++ /dev/null @@ -1,53 +0,0 @@ -name: Clojure -description: Clojure is a dynamic functional language from the Lisp family that runs on many different platforms -emoji: '821823652404265001' -resources: - - name: Clojure For The Brave And True - url: https://www.braveclojure.com/clojure-for-the-brave-and-true/ - 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 - pros: - - Visual explanations of core Clojure functions - cons: [ ] - - - name: 4clojure - url: https://4clojure.oxal.org/ - pros: - - Interactive exercises - cons: - - No tutorial from the ground up - - - name: Clojure by Example - url: https://github.com/inclojure-org/clojure-by-example - 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 - 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 - pros: - - Overview over almost the entire standard library - - Quick reference - cons: [ ] - - - name: Clojure beginner resources - url: https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f - pros: - - Collection of all kinds of resources to learn Clojure - cons: [ ] - diff --git a/resources/cpp.yaml b/resources/cpp.yaml deleted file mode 100644 index 2a474a6..0000000 --- a/resources/cpp.yaml +++ /dev/null @@ -1,38 +0,0 @@ -name: C++ -description: C++ is a statically typed general-purpose language designed by Bjarne Stroustrup in 1985 -emoji: '821822658169536542' -resources: - - name: C++ - Video Playlist - url: https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb - 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/ - 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 - 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/ - 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/general.yaml b/resources/general.yaml deleted file mode 100644 index 37c704d..0000000 --- a/resources/general.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: General -description: Things that are useful for learning any programming language, or don't fit into any other category -resources: - - 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/ - pros: [ Created by MIT, 'Covers subjects that most tutorials might ignore, making it a great supplementary resource'] - cons: [] - - name: Projects - description: A list of practical projects that anyone can solve in any programming language - url: https://github.com/karan/Projects - pros: [] - cons: [] diff --git a/resources/haskell.yaml b/resources/haskell.yaml deleted file mode 100644 index 0051410..0000000 --- a/resources/haskell.yaml +++ /dev/null @@ -1,47 +0,0 @@ - -name: Haskell -description: Haskell is a purely functional programming language commonly used in finance and academics -emoji: '821823367333675058' -resources: - - name: Learn you a Haskell - url: http://learnyouahaskell.com/ - pros: - - Good for beginners - - Good reputation - cons: [ ] - - - name: Haskell Programming from First Principles - url: https://haskellbook.com/ - price: 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: - - 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 - 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 - pros: [ ] - cons: [ ] - - - name: 'Haskell: The Craft of Functional Programming' - url: https://simonjohnthompson.github.io/craft3e/craft3e.pdf - pros: [ ] - cons: [ ] - diff --git a/resources/java.yaml b/resources/java.yaml deleted file mode 100644 index 38b8836..0000000 --- a/resources/java.yaml +++ /dev/null @@ -1,43 +0,0 @@ -name: Java -description: Java is an Object Oriented language designed by James Gosling in 1995 -emoji: '821822045187866625' -resources: - - name: Tutorial Spot - url: https://www.tutorialspoint.com/java/index.htm - pros: [ ] - cons: - - Slightly dated - - - name: Alex Lee - url: https://www.youtube.com/channel/UC_fFL5jgoCOrwAVoM_fBYwA - pros: - - Video series - - Covers a wide range of concepts - cons: [ ] - - - name: Bro Code - url: https://www.youtube.com/c/BroCodez - pros: - - Video series - - Has videos on many different languages and concepts - cons: [ ] - - - name: Javatpoint - url: https://www.javatpoint.com/java-tutorial - pros: [ ] - cons: [ ] - - - name: Mooc.fi - description: Comprehensive Java (and general programming) course provided by the University of Helsinki - url: https://java-programming.mooc.fi/ - pros: - - Very well respected - cons: [ ] - - - name: TheNewBoston - url: https://www.youtube.com/@thenewboston - 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/kotlin.yaml b/resources/kotlin.yaml deleted file mode 100644 index 87ca475..0000000 --- a/resources/kotlin.yaml +++ /dev/null @@ -1,20 +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' -resources: - - name: "Kotlin Official Website" - url: "https://kotlinlang.org/" - pros: [ ] - cons: [ ] - - - name: "Introduction to Kotlin (Google I/O '17)" - url: "https://www.youtube.com/watch?v=X1RVYt2QKQE" - pros: - - "Video for visual learners" - cons: [ ] - - - name: "FreeCodeCamp.org" - url: "https://youtu.be/F9UC9DY-vIU" - pros: - - "Video for visual learners" - cons: [ ] \ No newline at end of file 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/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/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/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/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/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/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/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/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/miscellaneous.yaml b/resources/miscellaneous.yaml deleted file mode 100644 index d31ce36..0000000 --- a/resources/miscellaneous.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: Miscellaneous -description: A list of resources that cover a wide range of topics, not specific to any programming language. -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 - pros: - - A huge collection of useful links - cons: - - Can be overwhelming and hard to navigate - - - name: Sololearn - url: https://www.sololearn.com/ - 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/ - 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/ - 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/ - pros: - - Extensive courses/guides for many languages and frameworks - - Balanced mix of material and projects/exercises, - cons: [ ] - diff --git a/resources/php.yaml b/resources/php.yaml deleted file mode 100644 index 8c23f87..0000000 --- a/resources/php.yaml +++ /dev/null @@ -1,63 +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: '🐘' -resources: -- name: PHP Manual - url: https://www.php.net/manual/en/ - price: 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/ - price: 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 - price: free (with subscription for full access) - 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 - price: $15/month subscription - 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 - 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/ - price: varies (usually $10–$20 during sales) - 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/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/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/programming-language-design.yaml b/resources/programming-language-design.yaml deleted file mode 100644 index e44bc04..0000000 --- a/resources/programming-language-design.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: Programming Language Design -description: Resources on language design, parsers, compilers, etc -emoji: '🔨' -resources: - - name: Crafting Interpreters - url: https://craftinginterpreters.com/ - 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 - pros: [] - cons: [] diff --git a/resources/python.yaml b/resources/python.yaml deleted file mode 100644 index e204c55..0000000 --- a/resources/python.yaml +++ /dev/null @@ -1,58 +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' -resources: -- name: Codecademy - url: https://www.codecademy.com/learn/learn-python - price: 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/ - price: 29.99 - 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/ - price: 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/ - price: 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 - price: free (with subscription) - 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 - price: varies (some courses are free, others have a fee) - 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/rust.yaml b/resources/rust.yaml deleted file mode 100644 index 5f1363c..0000000 --- a/resources/rust.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Rust -description: Rust is a multi-paradigm systems language designed by Graydon Hoare in 2010 -emoji: '821824283965128774' -resources: - - name: The Rust Programming Language (Book) - url: https://doc.rust-lang.org/book/ - pros: - - Very detailed - - Frequently updated - - Semi-Official - cons: [ ] - - - name: Rust by Example - url: https://doc.rust-lang.org/stable/rust-by-example/ - pros: - - Teaches concepts by example - - Semi-Official - cons: [ ] - - - name: Rust Crash Course | Traversy Media - url: https://www.youtube.com/watch?v=zF34dRivLOw - pros: - - Video series - cons: [ ] - diff --git a/resources/sql.yaml b/resources/sql.yaml deleted file mode 100644 index e77af07..0000000 --- a/resources/sql.yaml +++ /dev/null @@ -1,43 +0,0 @@ -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 - - - 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: 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: 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 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/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 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5a30381 --- /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 + } +}