From 31051e3e86f1e7cc7afe795854c747a616855824 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Thu, 2 Jan 2025 17:35:32 +0000 Subject: [PATCH 01/13] add vitest package, update pre-commit scripts to include the test command, adding 2 different test commands (one for ci, one for coverage but both will perform the same tests), update various ignore lists so we don't lint or spell check test output files --- .github/workflows/pre-commit-checks.yml | 3 + .gitignore | 1 + .husky/pre-commit | 1 + .prettierignore | 3 +- cspell.json | 1 + eslint.config.js | 2 +- package-lock.json | 1032 ++++++++++++++++++++++- package.json | 8 +- src/utils/slugify.test.ts | 53 ++ src/utils/slugify.ts | 13 +- tests/setup.ts | 4 + vite.config.ts | 7 + 12 files changed, 1109 insertions(+), 19 deletions(-) create mode 100644 src/utils/slugify.test.ts create mode 100644 tests/setup.ts diff --git a/.github/workflows/pre-commit-checks.yml b/.github/workflows/pre-commit-checks.yml index 99b60582..c30b6817 100644 --- a/.github/workflows/pre-commit-checks.yml +++ b/.github/workflows/pre-commit-checks.yml @@ -27,5 +27,8 @@ jobs: - name: Run lint run: npm run lint + - name: Run tests + run: npm run test-ci + - name: Run build run: npm run build diff --git a/.gitignore b/.gitignore index b6cdf575..806e0798 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ lerna-debug.log* node_modules dist dist-ssr +coverage *.local *.tsbuildinfo diff --git a/.husky/pre-commit b/.husky/pre-commit index 0a42c304..aaa9ed1a 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,3 +1,4 @@ npm run cspell npm run lint +npm run test-ci npm run build diff --git a/.prettierignore b/.prettierignore index 18855ec0..e4d40eac 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,8 +1,9 @@ node_modules dist +coverage snippets public .vite coverage package-lock.json -.md \ No newline at end of file +.md diff --git a/cspell.json b/cspell.json index 86c63589..86b905fa 100644 --- a/cspell.json +++ b/cspell.json @@ -11,6 +11,7 @@ "ignorePaths": [ "node_modules", "dist", + "coverage", "public" ] } diff --git a/eslint.config.js b/eslint.config.js index 6bc47fe1..cbda2ce1 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -23,7 +23,7 @@ function legacyPlugin(name, alias = name) { } export default tseslint.config( - { ignores: ["node_modules", "dist", "build"] }, + { ignores: ["node_modules", "dist", "coverage"] }, { extends: [ js.configs.recommended, diff --git a/package-lock.json b/package-lock.json index bc4dad3c..a4a93f4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", "@vitejs/plugin-react-swc": "^3.5.0", + "@vitest/coverage-v8": "^2.1.8", "cspell": "^8.17.1", "eslint": "^9.11.1", "eslint-config-prettier": "^9.1.0", @@ -39,7 +40,54 @@ "typescript": "^5.5.3", "typescript-eslint": "^8.7.0", "vite": "^5.4.8", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^2.1.8" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/runtime": { @@ -53,6 +101,25 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "node_modules/@cspell/cspell-bundled-dicts": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.17.1.tgz", @@ -1131,6 +1198,80 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1175,6 +1316,16 @@ "node": ">=12.4.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -1953,6 +2104,144 @@ "vite": "^4 || ^5 || ^6" } }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.8.tgz", + "integrity": "sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.8", + "vitest": "2.1.8" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.1.8", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", @@ -1990,6 +2279,18 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2166,6 +2467,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2209,6 +2519,15 @@ "node": ">=8" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2265,6 +2584,22 @@ "node": ">=6" } }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", @@ -2319,6 +2654,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, "node_modules/clear-module": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", @@ -2661,6 +3005,15 @@ } } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2727,6 +3080,18 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/enhanced-resolve": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", @@ -2860,6 +3225,12 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -3406,6 +3777,15 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3415,6 +3795,15 @@ "node": ">=0.10.0" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3577,6 +3966,22 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -3737,6 +4142,26 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3749,6 +4174,30 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-directory": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", @@ -3956,6 +4405,12 @@ "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==" }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -4246,6 +4701,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -4467,14 +4931,64 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/iterator.prototype": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", - "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "reflect.getprototypeof": "^1.0.8", @@ -4484,6 +4998,21 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4600,6 +5129,12 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true + }, "node_modules/lowlight": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", @@ -4613,6 +5148,47 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4665,6 +5241,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/motion-dom": { "version": "11.14.3", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.3.tgz", @@ -4883,6 +5468,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "node_modules/parent-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", @@ -4936,6 +5527,37 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5544,6 +6166,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5568,6 +6208,77 @@ "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", "dev": true }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -5661,6 +6372,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -5731,6 +6479,56 @@ "node": ">=6" } }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, "node_modules/tinyglobby": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", @@ -5770,6 +6568,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6038,6 +6863,28 @@ } } }, + "node_modules/vite-node": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", @@ -6057,6 +6904,71 @@ } } }, + "node_modules/vitest": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.8", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", @@ -6168,6 +7080,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -6177,6 +7105,94 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", diff --git a/package.json b/package.json index 4148b723..4f16ce7d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,9 @@ "prepare": "husky", "cspell": "cspell --config cspell.json \"**/*.{ts,tsx,js,jsx,json,html}\"", "snippets:check": "node ./utils/checkSnippetFormatting.js", - "snippets:consolidate": "node ./utils/consolidateSnippets.js" + "snippets:consolidate": "node ./utils/consolidateSnippets.js", + "test": "vitest --coverage", + "test-ci": "vitest run" }, "dependencies": { "framer-motion": "^11.15.0", @@ -32,6 +34,7 @@ "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", "@vitejs/plugin-react-swc": "^3.5.0", + "@vitest/coverage-v8": "^2.1.8", "cspell": "^8.17.1", "eslint": "^9.11.1", "eslint-config-prettier": "^9.1.0", @@ -47,6 +50,7 @@ "typescript": "^5.5.3", "typescript-eslint": "^8.7.0", "vite": "^5.4.8", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^2.1.8" } } diff --git a/src/utils/slugify.test.ts b/src/utils/slugify.test.ts new file mode 100644 index 00000000..01aa9428 --- /dev/null +++ b/src/utils/slugify.test.ts @@ -0,0 +1,53 @@ +import { describe, it, expect } from "vitest"; + +import { slugify } from "./slugify"; + +describe(slugify.name, () => { + it("should convert a string to lowercase and replace spaces with dashes", () => { + expect(slugify("Hello World")).toBe("hello-world"); + }); + + it("should trim whitespace from the beginning and end of the string", () => { + expect(slugify(" Trim This ")).toBe("trim-this"); + }); + + it("should remove non-word characters", () => { + expect(slugify("Special!@# Characters$%^&*()")).toBe("special-characters"); + }); + + it("should replace underscores with dashes", () => { + expect(slugify("underscore_example")).toBe("underscore-example"); + }); + + it("should collapse multiple dashes into a single dash", () => { + expect(slugify("Multiple --- Dashes")).toBe("multiple-dashes"); + }); + + it("should remove trailing dashes", () => { + expect(slugify("Trailing Dash-")).toBe("trailing-dash"); + }); + + it("should handle empty strings correctly", () => { + expect(slugify("")).toBe(""); + }); + + it("should use a custom separator if provided", () => { + expect(slugify("Custom Separator Example", "_")).toBe( + "custom_separator_example" + ); + }); + + it("should work with numbers in the string", () => { + expect(slugify("123 Number Test")).toBe("123-number-test"); + }); + + it("should handle strings with only non-word characters", () => { + expect(slugify("!@#$%^&*()_+=")).toBe(""); + }); + + it("should handle strings with consecutive underscores and spaces", () => { + expect(slugify("__Consecutive ___ Spaces___")).toBe( + "-consecutive-spaces" + ); + }); +}); diff --git a/src/utils/slugify.ts b/src/utils/slugify.ts index 69080efc..7a1dbf14 100644 --- a/src/utils/slugify.ts +++ b/src/utils/slugify.ts @@ -1,12 +1,11 @@ -/* eslint-disable no-useless-escape */ -export const slugify = (string: string, separator = "-") => { +export function slugify(string: string, separator = "-") { return string .toString() // Cast to string (optional) .toLowerCase() // Convert the string to lowercase letters .trim() // Remove whitespace from both sides of a string (optional) .replace(/\s+/g, separator) // Replace spaces with {separator} - .replace(/[^\w\-]+/g, "") // Remove all non-word chars - .replace(/\_/g, separator) // Replace _ with {separator} - .replace(/\-\-+/g, separator) // Replace multiple - with single {separator} - .replace(/\-$/g, ""); // Remove trailing - -}; + .replace(/[^\w-]+/g, "") // Remove all non-word chars + .replace(/_/g, separator) // Replace _ with {separator} + .replace(/--+/g, separator) // Replace multiple - with single {separator} + .replace(/-$/g, ""); // Remove trailing - +} diff --git a/tests/setup.ts b/tests/setup.ts new file mode 100644 index 00000000..00d3225c --- /dev/null +++ b/tests/setup.ts @@ -0,0 +1,4 @@ +/** + * This file is automatically loaded before running any tests (entrypoint: vite.config.ts). + * Use it to configure functions that may need to run before or after tests for example. + */ diff --git a/vite.config.ts b/vite.config.ts index 653ca674..b2ffd5da 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,3 +1,4 @@ +/// import react from "@vitejs/plugin-react-swc"; import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; @@ -5,6 +6,12 @@ import tsconfigPaths from "vite-tsconfig-paths"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react(), tsconfigPaths()], + test: { + setupFiles: ["/tests/setup.ts"], + coverage: { + provider: "v8", + }, + }, build: { rollupOptions: { output: { From f5ea3ed87cafbd1d71f4cbf83b24e094f6d615eb Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 11:58:00 +0000 Subject: [PATCH 02/13] moving all tests within the tests directory at the root of the project --- {src/utils => tests}/slugify.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {src/utils => tests}/slugify.test.ts (97%) diff --git a/src/utils/slugify.test.ts b/tests/slugify.test.ts similarity index 97% rename from src/utils/slugify.test.ts rename to tests/slugify.test.ts index 01aa9428..3447b2d2 100644 --- a/src/utils/slugify.test.ts +++ b/tests/slugify.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from "vitest"; -import { slugify } from "./slugify"; +import { slugify } from "../src/utils/slugify"; describe(slugify.name, () => { it("should convert a string to lowercase and replace spaces with dashes", () => { From ef33bf2dd1bc0f729c4ef7bfc541e2036d095af9 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 16:48:28 +0000 Subject: [PATCH 03/13] installing tsx, converting root level utils/ scripts to .ts files, adding additional unit tests --- .github/workflows/check-snippets.yml | 2 +- .github/workflows/consolidate-snippets.yml | 2 +- cspell-dict.txt | 1 + eslint.config.js | 6 +- package-lock.json | 459 +++++++++++++++++++++ package.json | 6 +- public/consolidated/c.json | 8 +- public/consolidated/cpp.json | 20 +- public/consolidated/csharp.json | 32 +- public/consolidated/css.json | 52 +-- public/consolidated/haskell.json | 64 +-- public/consolidated/html.json | 8 +- public/consolidated/java.json | 4 +- public/consolidated/javascript.json | 264 ++++++------ public/consolidated/python.json | 228 +++++----- public/consolidated/rust.json | 16 +- public/consolidated/scss.json | 60 +-- public/consolidated/typescript.json | 4 +- src/types/index.ts | 10 + src/utils/objectUtils.ts | 6 + src/utils/raise.ts | 4 + src/utils/slugify.ts | 10 +- tests/objectUtils.test.ts | 49 +++ tests/raise.test.ts | 37 ++ tests/slugify.test.ts | 38 +- utils/checkSnippetFormatting.js | 6 - utils/checkSnippetFormatting.ts | 9 + utils/consolidateSnippets.js | 28 -- utils/consolidateSnippets.ts | 36 ++ utils/snippetParser.js | 114 ----- utils/snippetParser.ts | 134 ++++++ 31 files changed, 1180 insertions(+), 537 deletions(-) create mode 100644 src/utils/objectUtils.ts create mode 100644 src/utils/raise.ts create mode 100644 tests/objectUtils.test.ts create mode 100644 tests/raise.test.ts delete mode 100644 utils/checkSnippetFormatting.js create mode 100644 utils/checkSnippetFormatting.ts delete mode 100644 utils/consolidateSnippets.js create mode 100644 utils/consolidateSnippets.ts delete mode 100644 utils/snippetParser.js create mode 100644 utils/snippetParser.ts diff --git a/.github/workflows/check-snippets.yml b/.github/workflows/check-snippets.yml index f156b4aa..69824bba 100644 --- a/.github/workflows/check-snippets.yml +++ b/.github/workflows/check-snippets.yml @@ -25,7 +25,7 @@ jobs: - name: Check if snippets are formated correctly uses: int128/comment-action@v1 with: - run: node utils/checkSnippetFormatting.js # Run the script located in the utils/ folder + run: tsx utils/checkSnippetFormatting.ts # Run the script located in the utils/ folder post-on-failure: | ## :x: Snippet Format Error ${run.output} \ No newline at end of file diff --git a/.github/workflows/consolidate-snippets.yml b/.github/workflows/consolidate-snippets.yml index a252a721..8ac9047e 100644 --- a/.github/workflows/consolidate-snippets.yml +++ b/.github/workflows/consolidate-snippets.yml @@ -27,7 +27,7 @@ jobs: - name: Consolidate Snippets run: | - node utils/consolidateSnippets.js # Run the script located in the utils/ folder + tsx utils/consolidateSnippets.ts # Run the script located in the utils/ folder - name: Commit and push changes run: | diff --git a/cspell-dict.txt b/cspell-dict.txt index 4d39d3eb..8218957c 100644 --- a/cspell-dict.txt +++ b/cspell-dict.txt @@ -1,2 +1,3 @@ quicksnip +slugified slugifyed diff --git a/eslint.config.js b/eslint.config.js index 7203a9dd..a9614216 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,12 +1,12 @@ import { fixupPluginRules } from "@eslint/compat"; import { FlatCompat } from "@eslint/eslintrc"; import js from "@eslint/js"; -import globals from "globals"; +import prettier from "eslint-plugin-prettier/recommended"; import reactPlugin from "eslint-plugin-react"; import reactHooks from "eslint-plugin-react-hooks"; import reactRefresh from "eslint-plugin-react-refresh"; +import globals from "globals"; import tseslint from "typescript-eslint"; -import prettier from "eslint-plugin-prettier/recommended"; const project = "./tsconfig.app.json"; // eslint flat structure backwards compatibility @@ -32,7 +32,7 @@ export default tseslint.config( ...compat.extends("plugin:import/typescript"), reactPlugin.configs.flat.recommended, ], - files: ["**/*.{ts,tsx}"], + files: ["**/*.{js,ts,tsx}"], languageOptions: { ecmaVersion: 2020, globals: globals.browser, diff --git a/package-lock.json b/package-lock.json index a4a93f4b..42e8598d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.11.1", "@types/eslint-plugin-react-refresh": "^0.4.0", + "@types/node": "^22.10.5", "@types/react": "^18.3.10", "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", @@ -37,6 +38,7 @@ "globals": "^15.9.0", "husky": "^9.1.7", "prettier": "^3.4.2", + "tsx": "^4.19.2", "typescript": "^5.5.3", "typescript-eslint": "^8.7.0", "vite": "^5.4.8", @@ -910,6 +912,22 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", @@ -1857,6 +1875,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/node": { + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/@types/prop-types": { "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", @@ -6656,6 +6683,432 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6795,6 +7248,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 4f16ce7d..7543ae2d 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "preview": "vite preview", "prepare": "husky", "cspell": "cspell --config cspell.json \"**/*.{ts,tsx,js,jsx,json,html}\"", - "snippets:check": "node ./utils/checkSnippetFormatting.js", - "snippets:consolidate": "node ./utils/consolidateSnippets.js", + "snippets:check": "tsx ./utils/checkSnippetFormatting.ts", + "snippets:consolidate": "tsx ./utils/consolidateSnippets.ts", "test": "vitest --coverage", "test-ci": "vitest run" }, @@ -30,6 +30,7 @@ "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.11.1", "@types/eslint-plugin-react-refresh": "^0.4.0", + "@types/node": "^22.10.5", "@types/react": "^18.3.10", "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", @@ -47,6 +48,7 @@ "globals": "^15.9.0", "husky": "^9.1.7", "prettier": "^3.4.2", + "tsx": "^4.19.2", "typescript": "^5.5.3", "typescript-eslint": "^8.7.0", "vite": "^5.4.8", diff --git a/public/consolidated/c.json b/public/consolidated/c.json index a9a23234..aa8d1803 100644 --- a/public/consolidated/c.json +++ b/public/consolidated/c.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "0xHouss", + "code": "#include // Includes the input/output library\n\nint main() { // Defines the main function\n printf(\"Hello, World!\\n\") // Outputs Hello, World! and a newline\n\n return 0; // indicate the program executed successfully\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [], - "code": "#include // Includes the input/output library\n\nint main() { // Defines the main function\n printf(\"Hello, World!\\n\") // Outputs Hello, World! and a newline\n\n return 0; // indicate the program executed successfully\n}\n" + "contributors": [] } ] }, @@ -22,12 +22,12 @@ "title": "Factorial Function", "description": "Calculates the factorial of a number.", "author": "0xHouss", + "code": "int factorial(int x) {\n int y = 1;\n\n for (int i = 2; i <= x; i++)\n y *= i;\n\n return y;\n}\n\n// Usage:\nfactorial(4); // Returns: 24\n", "tags": [ "math", "factorial" ], - "contributors": [], - "code": "int factorial(int x) {\n int y = 1;\n\n for (int i = 2; i <= x; i++)\n y *= i;\n\n return y;\n}\n\n// Usage:\nfactorial(4); // Returns: 24\n" + "contributors": [] } ] } diff --git a/public/consolidated/cpp.json b/public/consolidated/cpp.json index e560e82d..7a0b9e36 100644 --- a/public/consolidated/cpp.json +++ b/public/consolidated/cpp.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", + "code": "#include // Includes the input/output stream library\n\nint main() { // Defines the main function\n std::cout << \"Hello, World!\" << std::endl; // Outputs Hello, World! and a newline\n return 0; // indicate the program executed successfully\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [], - "code": "#include // Includes the input/output stream library\n\nint main() { // Defines the main function\n std::cout << \"Hello, World!\" << std::endl; // Outputs Hello, World! and a newline\n return 0; // indicate the program executed successfully\n}\n" + "contributors": [] } ] }, @@ -22,13 +22,13 @@ "title": "Vector to Queue", "description": "Convert vector into queue quickly", "author": "mrityunjay2003", + "code": "#include\n#include\n#include\n\nstd::queue vectorToQueue(const std::vector& v) {\n return std::queue(std::deque(v.begin(), v.end()));\n}\n\nstd::vector vec = { 1, 2, 3, 4, 5 };\nvectorToQueue(&vec); // Returns: std::queue { 1, 2, 3, 4, 5 }\n", "tags": [ "data structures", "queue", "vector" ], - "contributors": [], - "code": "#include\n#include\n#include\n\nstd::queue vectorToQueue(const std::vector& v) {\n return std::queue(std::deque(v.begin(), v.end()));\n}\n\nstd::vector vec = { 1, 2, 3, 4, 5 };\nvectorToQueue(&vec); // Returns: std::queue { 1, 2, 3, 4, 5 }\n" + "contributors": [] } ] }, @@ -39,12 +39,12 @@ "title": "Check Prime Number", "description": "Check if an integer is a prime number", "author": "MihneaMoso", + "code": "bool is_prime(int n) {\n if (n < 2) return false;\n if (n == 2 || n == 3) return true;\n if (n % 2 == 0) return false;\n for (int i = 3; i * i <= n; i += 2) {\n if (n % i == 0) return false;\n }\n return true;\n}\n\n// Usage:\nis_prime(29); // Returns: true\n", "tags": [ "number", "prime" ], - "contributors": [], - "code": "bool is_prime(int n) {\n if (n < 2) return false;\n if (n == 2 || n == 3) return true;\n if (n % 2 == 0) return false;\n for (int i = 3; i * i <= n; i += 2) {\n if (n % i == 0) return false;\n }\n return true;\n}\n\n// Usage:\nis_prime(29); // Returns: true\n" + "contributors": [] } ] }, @@ -55,23 +55,23 @@ "title": "Reverse String", "description": "Reverses the characters in a string.", "author": "Vaibhav-kesarwani", + "code": "#include \n#include \n\nstd::string reverseString(const std::string& input) {\n std::string reversed = input;\n std::reverse(reversed.begin(), reversed.end());\n return reversed;\n}\n\nreverseString(\"quicksnip\"); // Returns: \"pinskciuq\"\n", "tags": [ "array", "reverse" ], - "contributors": [], - "code": "#include \n#include \n\nstd::string reverseString(const std::string& input) {\n std::string reversed = input;\n std::reverse(reversed.begin(), reversed.end());\n return reversed;\n}\n\nreverseString(\"quicksnip\"); // Returns: \"pinskciuq\"\n" + "contributors": [] }, { "title": "Split String", "description": "Splits a string by a delimiter", "author": "saminjay", + "code": "#include \n#include \n\nstd::vector split_string(std::string str, std::string delim) {\n std::vector splits;\n int i = 0, j;\n int inc = delim.length();\n while (j != std::string::npos) {\n j = str.find(delim, i);\n splits.push_back(str.substr(i, j - i));\n i = j + inc;\n }\n return splits;\n}\n\n// Usage:\nsplit_string(\"quick_-snip\", \"_-\"); // Returns: std::vector { \"quick\", \"snip\" }\n", "tags": [ "string", "split" ], - "contributors": [], - "code": "#include \n#include \n\nstd::vector split_string(std::string str, std::string delim) {\n std::vector splits;\n int i = 0, j;\n int inc = delim.length();\n while (j != std::string::npos) {\n j = str.find(delim, i);\n splits.push_back(str.substr(i, j - i));\n i = j + inc;\n }\n return splits;\n}\n\n// Usage:\nsplit_string(\"quick_-snip\", \"_-\"); // Returns: std::vector { \"quick\", \"snip\" }\n" + "contributors": [] } ] } diff --git a/public/consolidated/csharp.json b/public/consolidated/csharp.json index 63ff0ec1..5fe902e4 100644 --- a/public/consolidated/csharp.json +++ b/public/consolidated/csharp.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "chaitanya-jvnm", + "code": "public class Program {\n public static void Main(string[] args) {\n System.Console.WriteLine(\"Hello, World!\");\n }\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [], - "code": "public class Program {\n public static void Main(string[] args) {\n System.Console.WriteLine(\"Hello, World!\");\n }\n}\n" + "contributors": [] } ] }, @@ -22,23 +22,23 @@ "title": "Generate GUID", "description": "Generates a new GUID", "author": "chaitanya-jvnm", + "code": "public static string GenerateGuid() {\n return Guid.NewGuid().ToString();\n}\n\n// Usage:\nGenerateGuid(); // Returns: 1c4c38d8-64e4-431b-884a-c6eec2ab02cd (Uuid is random)\n", "tags": [ "guid", "generate" ], - "contributors": [], - "code": "public static string GenerateGuid() {\n return Guid.NewGuid().ToString();\n}\n\n// Usage:\nGenerateGuid(); // Returns: 1c4c38d8-64e4-431b-884a-c6eec2ab02cd (Uuid is random)\n" + "contributors": [] }, { "title": "Validate GUID", "description": "Checks if a string is a valid GUID.", "author": "chaitanya-jvnm", + "code": "public static bool IsGuid(string str) {\n return Guid.TryParse(str, out _);\n}\n\n// Usage:\nIsGuid(\"1c4c38d8-64e4-431b-884a-c6eec2ab02cd\"); // Returns: true\nIsGuid(\"quicksnip\"); // Returns: false\n", "tags": [ "guid", "validate" ], - "contributors": [], - "code": "public static bool IsGuid(string str) {\n return Guid.TryParse(str, out _);\n}\n\n// Usage:\nIsGuid(\"1c4c38d8-64e4-431b-884a-c6eec2ab02cd\"); // Returns: true\nIsGuid(\"quicksnip\"); // Returns: false\n" + "contributors": [] } ] }, @@ -49,23 +49,23 @@ "title": "Decode JWT", "description": "Decodes a JWT.", "author": "chaitanya-jvnm", + "code": "public static string DecodeJwt(string token) {\n return new JwtSecurityTokenHandler().ReadJwtToken(token).ToString();\n}\n\n// Usage:\nstring token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nDecodeJwt(token); // Returns: \"{\\\"alg\\\":\\\"HS256\\\",\\\"typ\\\":\\\"JWT\\\"}.{\\\"sub\\\":\\\"1234567890\\\",\\\"name\\\":\\\"John Doe\\\",\\\"iat\\\":1516239022}\"\n", "tags": [ "jwt", "decode" ], - "contributors": [], - "code": "public static string DecodeJwt(string token) {\n return new JwtSecurityTokenHandler().ReadJwtToken(token).ToString();\n}\n\n// Usage:\nstring token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nDecodeJwt(token); // Returns: \"{\\\"alg\\\":\\\"HS256\\\",\\\"typ\\\":\\\"JWT\\\"}.{\\\"sub\\\":\\\"1234567890\\\",\\\"name\\\":\\\"John Doe\\\",\\\"iat\\\":1516239022}\"\n" + "contributors": [] }, { "title": "Validate JWT", "description": "Validates a JWT.", "author": "chaitanya-jvnm", + "code": "public static bool ValidateJwt(string token, string secret) {\n var tokenHandler = new JwtSecurityTokenHandler();\n var validationParameters = new TokenValidationParameters {\n ValidateIssuerSigningKey = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),\n ValidateIssuer = false,\n ValidateAudience = false\n };\n try {\n tokenHandler.ValidateToken(token, validationParameters, out _);\n return true;\n }\n catch {\n return false\n }\n}\n\n// Usage:\nstring JWT = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nstring correctSecret = \"your-256-bit-secret\";\nstring wrongSecret = \"this-is-not-the-right-secret\";\n\nValidateJwt(JWT, correctSecret); // Returns: true\nValidateJwt(JWT, wrongSecret); // Returns: false\n", "tags": [ "jwt", "validate" ], - "contributors": [], - "code": "public static bool ValidateJwt(string token, string secret) {\n var tokenHandler = new JwtSecurityTokenHandler();\n var validationParameters = new TokenValidationParameters {\n ValidateIssuerSigningKey = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),\n ValidateIssuer = false,\n ValidateAudience = false\n };\n try {\n tokenHandler.ValidateToken(token, validationParameters, out _);\n return true;\n }\n catch {\n return false\n }\n}\n\n// Usage:\nstring JWT = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nstring correctSecret = \"your-256-bit-secret\";\nstring wrongSecret = \"this-is-not-the-right-secret\";\n\nValidateJwt(JWT, correctSecret); // Returns: true\nValidateJwt(JWT, wrongSecret); // Returns: false\n" + "contributors": [] } ] }, @@ -76,12 +76,12 @@ "title": "Swap items at index", "description": "Swaps two items at determined indexes", "author": "omegaleo", + "code": "public static IList Swap(this IList list, int indexA, int indexB)\n{\n (list[indexA], list[indexB]) = (list[indexB], list[indexA]);\n return list;\n}\n\nvar list = new List() {\"Test\", \"Test2\"};\n\nlist.Swap(0, 1); // Swaps \"Test\" and \"Test2\" in place\n", "tags": [ "list", "swapping" ], - "contributors": [], - "code": "public static IList Swap(this IList list, int indexA, int indexB)\n{\n (list[indexA], list[indexB]) = (list[indexB], list[indexA]);\n return list;\n}\n\nvar list = new List() {\"Test\", \"Test2\"};\n\nlist.Swap(0, 1); // Swaps \"Test\" and \"Test2\" in place\n" + "contributors": [] } ] }, @@ -92,23 +92,23 @@ "title": "Capitalize first letter", "description": "Makes the first letter of a string uppercase.", "author": "chaitanya-jvnm", + "code": "public static string Capitalize(this string str) {\n return str.Substring(0, 1).ToUpper() + str.Substring(1);\n}\n\n// Usage:\n\"quicksnip\".Capitalize(); // Returns: \"Quicksnip\"\n", "tags": [ "string", "capitalize" ], - "contributors": [], - "code": "public static string Capitalize(this string str) {\n return str.Substring(0, 1).ToUpper() + str.Substring(1);\n}\n\n// Usage:\n\"quicksnip\".Capitalize(); // Returns: \"Quicksnip\"\n" + "contributors": [] }, { "title": "Truncate String", "description": "Cut off a string once it reaches a determined amount of characters and add '...' to the end of the string", "author": "omegaleo", + "code": "public static string Truncate(this string value, int maxChars)\n{\n return value.Length <= maxChars ? value : value.Substring(0, maxChars) + \"...\";\n}\n\n// Usage:\n\"Quicksnip\".Truncate(5); // Returns: \"Quick...\"\n", "tags": [ "string", "truncate" ], - "contributors": [], - "code": "public static string Truncate(this string value, int maxChars)\n{\n return value.Length <= maxChars ? value : value.Substring(0, maxChars) + \"...\";\n}\n\n// Usage:\n\"Quicksnip\".Truncate(5); // Returns: \"Quick...\"\n" + "contributors": [] } ] } diff --git a/public/consolidated/css.json b/public/consolidated/css.json index b759c611..f6acdac0 100644 --- a/public/consolidated/css.json +++ b/public/consolidated/css.json @@ -6,38 +6,38 @@ "title": "3D Button Effect", "description": "Adds a 3D effect to a button when clicked.", "author": "dostonnabotov", + "code": ".button {\n background-color: #28a745;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);\n transition: transform 0.1s;\n}\n\n.button:active {\n transform: translateY(2px);\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n}\n", "tags": [ "button", "3D", "effect" ], - "contributors": [], - "code": ".button {\n background-color: #28a745;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);\n transition: transform 0.1s;\n}\n\n.button:active {\n transform: translateY(2px);\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n}\n" + "contributors": [] }, { "title": "Button Hover Effect", "description": "Creates a hover effect with a color transition.", "author": "dostonnabotov", + "code": ".button {\n background-color: #007bff;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n}\n\n.button:hover {\n background-color: #0056b3;\n}\n", "tags": [ "button", "hover", "transition" ], - "contributors": [], - "code": ".button {\n background-color: #007bff;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n}\n\n.button:hover {\n background-color: #0056b3;\n}\n" + "contributors": [] }, { "title": "MacOS Button", "description": "A macOS-like button style, with hover and shading effects.", "author": "e3nviction", + "code": ".button {\n font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,;\n background: #0a85ff;\n color: #fff;\n padding: 8px 12px;\n border: none;\n margin: 4px;\n border-radius: 10px;\n cursor: pointer;\n box-shadow: inset 0 1px 1px #fff2, 0px 2px 3px -2px rgba(0, 0, 0, 0.3) !important; /*This is really performance heavy*/\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-decoration: none;\n transition: all 150ms cubic-bezier(0.175, 0.885, 0.32, 1.275);\n}\n.button:hover {\n background: #0974ee;\n color: #fff\n}\n", "tags": [ "button", "macos", "hover", "transition" ], - "contributors": [], - "code": ".button {\n font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,;\n background: #0a85ff;\n color: #fff;\n padding: 8px 12px;\n border: none;\n margin: 4px;\n border-radius: 10px;\n cursor: pointer;\n box-shadow: inset 0 1px 1px #fff2, 0px 2px 3px -2px rgba(0, 0, 0, 0.3) !important; /*This is really performance heavy*/\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-decoration: none;\n transition: all 150ms cubic-bezier(0.175, 0.885, 0.32, 1.275);\n}\n.button:hover {\n background: #0974ee;\n color: #fff\n}\n" + "contributors": [] } ] }, @@ -48,37 +48,37 @@ "title": "Blur Background", "description": "Applies a blur effect to the background of an element.", "author": "dostonnabotov", + "code": ".blur-background {\n backdrop-filter: blur(10px);\n background: rgba(255, 255, 255, 0.5);\n}\n", "tags": [ "blur", "background", "effects" ], - "contributors": [], - "code": ".blur-background {\n backdrop-filter: blur(10px);\n background: rgba(255, 255, 255, 0.5);\n}\n" + "contributors": [] }, { "title": "Hover Glow Effect", "description": "Adds a glowing effect on hover.", "author": "dostonnabotov", + "code": ".glow {\n background-color: #f39c12;\n padding: 10px 20px;\n border-radius: 5px;\n transition: box-shadow 0.3s ease;\n}\n\n.glow:hover {\n box-shadow: 0 0 15px rgba(243, 156, 18, 0.8);\n}\n", "tags": [ "hover", "glow", "effects" ], - "contributors": [], - "code": ".glow {\n background-color: #f39c12;\n padding: 10px 20px;\n border-radius: 5px;\n transition: box-shadow 0.3s ease;\n}\n\n.glow:hover {\n box-shadow: 0 0 15px rgba(243, 156, 18, 0.8);\n}\n" + "contributors": [] }, { "title": "Hover to Reveal Color", "description": "A card with an image that transitions from grayscale to full color on hover.", "author": "Haider-Mukhtar", + "code": ".card {\n height: 300px;\n width: 200px;\n border-radius: 5px;\n overflow: hidden;\n}\n\n.card img{\n height: 100%;\n width: 100%;\n object-fit: cover;\n filter: grayscale(100%);\n transition: all 0.3s;\n transition-duration: 200ms;\n cursor: pointer;\n}\n\n.card:hover img {\n filter: grayscale(0%);\n scale: 1.05;\n}\n", "tags": [ "hover", "image", "effects" ], - "contributors": [], - "code": ".card {\n height: 300px;\n width: 200px;\n border-radius: 5px;\n overflow: hidden;\n}\n\n.card img{\n height: 100%;\n width: 100%;\n object-fit: cover;\n filter: grayscale(100%);\n transition: all 0.3s;\n transition-duration: 200ms;\n cursor: pointer;\n}\n\n.card:hover img {\n filter: grayscale(0%);\n scale: 1.05;\n}\n" + "contributors": [] } ] }, @@ -89,59 +89,59 @@ "title": "CSS Reset", "description": "Resets some default browser styles, ensuring consistency across browsers.", "author": "AmeerMoustafa", + "code": "* {\n margin: 0;\n padding: 0;\n box-sizing: border-box\n}\n", "tags": [ "reset", "browser", "layout" ], - "contributors": [], - "code": "* {\n margin: 0;\n padding: 0;\n box-sizing: border-box\n}\n" + "contributors": [] }, { "title": "Equal-Width Columns", "description": "Creates columns with equal widths using flexbox.", "author": "dostonnabotov", + "code": ".columns {\n display: flex;\n justify-content: space-between;\n}\n\n.column {\n flex: 1;\n margin: 0 10px;\n}\n", "tags": [ "flexbox", "columns", "layout" ], - "contributors": [], - "code": ".columns {\n display: flex;\n justify-content: space-between;\n}\n\n.column {\n flex: 1;\n margin: 0 10px;\n}\n" + "contributors": [] }, { "title": "Grid layout", "description": "Equal sized items in a responsive grid", "author": "xshubhamg", + "code": ".grid-container {\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n/* Explanation:\n- `auto-fit`: Automatically fits as many columns as possible within the container.\n- `minmax(250px, 1fr)`: Defines a minimum column size of 250px and a maximum size of 1fr (fraction of available space).\n*/\n}\n", "tags": [ "layout", "grid" ], - "contributors": [], - "code": ".grid-container {\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n/* Explanation:\n- `auto-fit`: Automatically fits as many columns as possible within the container.\n- `minmax(250px, 1fr)`: Defines a minimum column size of 250px and a maximum size of 1fr (fraction of available space).\n*/\n}\n" + "contributors": [] }, { "title": "Responsive Design", "description": "The different responsive breakpoints.", "author": "kruimol", + "code": "/* Phone */\n.element {\n margin: 0 10%\n}\n\n/* Tablet */\n@media (min-width: 640px) {\n .element {\n margin: 0 20%\n }\n}\n\n/* Desktop base */\n@media (min-width: 768px) {\n .element {\n margin: 0 30%\n }\n}\n\n/* Desktop large */\n@media (min-width: 1024px) {\n .element {\n margin: 0 40%\n }\n}\n\n/* Desktop extra large */\n@media (min-width: 1280px) {\n .element {\n margin: 0 60%\n }\n}\n\n/* Desktop bige */\n@media (min-width: 1536px) {\n .element {\n margin: 0 80%\n }\n}\n", "tags": [ "responsive", "media queries" ], - "contributors": [], - "code": "/* Phone */\n.element {\n margin: 0 10%\n}\n\n/* Tablet */\n@media (min-width: 640px) {\n .element {\n margin: 0 20%\n }\n}\n\n/* Desktop base */\n@media (min-width: 768px) {\n .element {\n margin: 0 30%\n }\n}\n\n/* Desktop large */\n@media (min-width: 1024px) {\n .element {\n margin: 0 40%\n }\n}\n\n/* Desktop extra large */\n@media (min-width: 1280px) {\n .element {\n margin: 0 60%\n }\n}\n\n/* Desktop bige */\n@media (min-width: 1536px) {\n .element {\n margin: 0 80%\n }\n}\n" + "contributors": [] }, { "title": "Sticky Footer", "description": "Ensures the footer always stays at the bottom of the page.", "author": "dostonnabotov", + "code": "body {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\nfooter {\n margin-top: auto;\n}\n", "tags": [ "layout", "footer", "sticky" ], - "contributors": [], - "code": "body {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\nfooter {\n margin-top: auto;\n}\n" + "contributors": [] } ] }, @@ -152,24 +152,24 @@ "title": "Letter Spacing", "description": "Adds space between letters for better readability.", "author": "dostonnabotov", + "code": "p {\n letter-spacing: 0.05em;\n}\n", "tags": [ "typography", "spacing" ], - "contributors": [], - "code": "p {\n letter-spacing: 0.05em;\n}\n" + "contributors": [] }, { "title": "Responsive Font Sizing", "description": "Adjusts font size based on viewport width.", "author": "dostonnabotov", + "code": "h1 {\n font-size: calc(1.5rem + 2vw);\n}\n", "tags": [ "font", "responsive", "typography" ], - "contributors": [], - "code": "h1 {\n font-size: calc(1.5rem + 2vw);\n}\n" + "contributors": [] } ] } diff --git a/public/consolidated/haskell.json b/public/consolidated/haskell.json index b4a97f3c..35f79386 100644 --- a/public/consolidated/haskell.json +++ b/public/consolidated/haskell.json @@ -6,37 +6,37 @@ "title": "Binary Search", "description": "Searches for an element in a sorted array using binary search.", "author": "ACR1209", + "code": "binarySearch :: Ord a => a -> [a] -> Maybe Int\nbinarySearch _ [] = Nothing\nbinarySearch target xs = go 0 (length xs - 1)\n where\n go low high\n | low > high = Nothing\n | midElem < target = go (mid + 1) high\n | midElem > target = go low (mid - 1)\n | otherwise = Just mid\n where\n mid = (low + high) `div` 2\n midElem = xs !! mid\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5]\n print $ binarySearch 3 array -- Output: Just 2\n print $ binarySearch 6 array -- Output: Nothing\n", "tags": [ "array", "binary-search", "search" ], - "contributors": [], - "code": "binarySearch :: Ord a => a -> [a] -> Maybe Int\nbinarySearch _ [] = Nothing\nbinarySearch target xs = go 0 (length xs - 1)\n where\n go low high\n | low > high = Nothing\n | midElem < target = go (mid + 1) high\n | midElem > target = go low (mid - 1)\n | otherwise = Just mid\n where\n mid = (low + high) `div` 2\n midElem = xs !! mid\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5]\n print $ binarySearch 3 array -- Output: Just 2\n print $ binarySearch 6 array -- Output: Nothing\n" + "contributors": [] }, { "title": "Chunk Array", "description": "Splits an array into chunks of a specified size.", "author": "ACR1209", + "code": "chunkArray :: Int -> [a] -> [[a]]\nchunkArray _ [] = []\nchunkArray n xs = take n xs : chunkArray n (drop n xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5, 6]\n print $ chunkArray 2 array -- Output: [[1, 2], [3, 4], [5, 6]]\n", "tags": [ "array", "chunk", "utility" ], - "contributors": [], - "code": "chunkArray :: Int -> [a] -> [[a]]\nchunkArray _ [] = []\nchunkArray n xs = take n xs : chunkArray n (drop n xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5, 6]\n print $ chunkArray 2 array -- Output: [[1, 2], [3, 4], [5, 6]]\n" + "contributors": [] }, { "title": "Matrix Transpose", "description": "Transposes a 2D matrix.", "author": "ACR1209", + "code": "transposeMatrix :: [[a]] -> [[a]]\ntransposeMatrix [] = []\ntransposeMatrix ([]:_) = []\ntransposeMatrix xs = map head xs : transposeMatrix (map tail xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n print $ transposeMatrix matrix -- Output: [[1,4,7],[2,5,8],[3,6,9]]\n", "tags": [ "array", "matrix", "transpose" ], - "contributors": [], - "code": "transposeMatrix :: [[a]] -> [[a]]\ntransposeMatrix [] = []\ntransposeMatrix ([]:_) = []\ntransposeMatrix xs = map head xs : transposeMatrix (map tail xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n print $ transposeMatrix matrix -- Output: [[1,4,7],[2,5,8],[3,6,9]]\n" + "contributors": [] } ] }, @@ -47,13 +47,13 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "ACR1209", + "code": "putStrLn \"Hello, World!\"\n", "tags": [ "printing", "hello-world", "utility" ], - "contributors": [], - "code": "putStrLn \"Hello, World!\"\n" + "contributors": [] } ] }, @@ -64,27 +64,27 @@ "title": "Find Files in Directory by Type", "description": "Finds all files in a directory with a specific extension.", "author": "ACR1209", + "code": "import System.Directory (listDirectory)\nimport System.FilePath (takeExtension)\n\nfindFilesByExtension :: FilePath -> String -> IO [FilePath]\nfindFilesByExtension dir ext = do\n files <- listDirectory dir\n return $ filter (\\f -> takeExtension f == ext) files\n\n-- Usage:\nmain :: IO ()\nmain = do\n let directory = \".\"\n let ext = \".txt\"\n files <- findFilesByExtension directory ext\n mapM_ putStrLn files -- Output: list of txt files on the current directory\n", "tags": [ "file", "search", "extension", "filesystem" ], - "contributors": [], - "code": "import System.Directory (listDirectory)\nimport System.FilePath (takeExtension)\n\nfindFilesByExtension :: FilePath -> String -> IO [FilePath]\nfindFilesByExtension dir ext = do\n files <- listDirectory dir\n return $ filter (\\f -> takeExtension f == ext) files\n\n-- Usage:\nmain :: IO ()\nmain = do\n let directory = \".\"\n let ext = \".txt\"\n files <- findFilesByExtension directory ext\n mapM_ putStrLn files -- Output: list of txt files on the current directory\n" + "contributors": [] }, { "title": "Read File in Chunks", "description": "Reads a file in chunks grouped by lines.", "author": "ACR1209", + "code": "import System.IO (openFile, IOMode(ReadMode), hGetContents)\nimport Data.List (unfoldr)\n\nreadFileInChunks :: FilePath -> Int -> IO [[String]]\nreadFileInChunks filePath chunkSize = do\n handle <- openFile filePath ReadMode\n contents <- hGetContents handle\n let linesList = lines contents\n return $ go linesList\n where\n go [] = []\n go xs = take chunkSize xs : go (drop chunkSize xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let file = \"example.txt\"\n let chunkSize = 3 -- Number of lines per chunk\n chunks <- readFileInChunks file chunkSize\n mapM_ (putStrLn . unlines) chunks\n\n", "tags": [ "file", "read", "chunks", "utility" ], - "contributors": [], - "code": "import System.IO (openFile, IOMode(ReadMode), hGetContents)\nimport Data.List (unfoldr)\n\nreadFileInChunks :: FilePath -> Int -> IO [[String]]\nreadFileInChunks filePath chunkSize = do\n handle <- openFile filePath ReadMode\n contents <- hGetContents handle\n let linesList = lines contents\n return $ go linesList\n where\n go [] = []\n go xs = take chunkSize xs : go (drop chunkSize xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let file = \"example.txt\"\n let chunkSize = 3 -- Number of lines per chunk\n chunks <- readFileInChunks file chunkSize\n mapM_ (putStrLn . unlines) chunks\n\n" + "contributors": [] } ] }, @@ -95,48 +95,48 @@ "title": "Either Monad for Error Handling", "description": "Using the Either monad to handle errors in a computation.", "author": "ACR1209", + "code": "safeDiv :: Int -> Int -> Either String Int\nsafeDiv _ 0 = Left \"Division by zero error\"\nsafeDiv x y = Right (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 0 -- This will trigger an error\n return b\n print result -- Output: Left \"Division by zero error\"\n", "tags": [ "monads", "either", "error handling" ], - "contributors": [], - "code": "safeDiv :: Int -> Int -> Either String Int\nsafeDiv _ 0 = Left \"Division by zero error\"\nsafeDiv x y = Right (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 0 -- This will trigger an error\n return b\n print result -- Output: Left \"Division by zero error\"\n" + "contributors": [] }, { "title": "Maybe Monad", "description": "Using the Maybe monad to handle computations that might fail.", "author": "ACR1209", + "code": "safeDiv :: Int -> Int -> Maybe Int\nsafeDiv _ 0 = Nothing\nsafeDiv x y = Just (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 2\n return b\n print result -- Output: Just 2\n", "tags": [ "monads", "maybe" ], - "contributors": [], - "code": "safeDiv :: Int -> Int -> Maybe Int\nsafeDiv _ 0 = Nothing\nsafeDiv x y = Just (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 2\n return b\n print result -- Output: Just 2\n" + "contributors": [] }, { "title": "State Monad", "description": "Managing mutable state using the State monad.", "author": "ACR1209", + "code": "import Control.Monad.State\n\nincrement :: State Int Int\nincrement = do\n count <- get\n put (count + 1)\n return count\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (res1, intermediateState) = runState increment 0\n print res1 -- Output: 0\n let (result, finalState) = runState increment intermediateState\n print result -- Output: 1\n print finalState -- Output: 2\n\n", "tags": [ "monads", "state", "state-management" ], - "contributors": [], - "code": "import Control.Monad.State\n\nincrement :: State Int Int\nincrement = do\n count <- get\n put (count + 1)\n return count\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (res1, intermediateState) = runState increment 0\n print res1 -- Output: 0\n let (result, finalState) = runState increment intermediateState\n print result -- Output: 1\n print finalState -- Output: 2\n\n" + "contributors": [] }, { "title": "Writer Monad", "description": "Using the Writer monad to accumulate logs or other outputs alongside a computation.", "author": "ACR1209", + "code": "import Control.Monad.Writer\n\naddAndLog :: Int -> Int -> Writer [String] Int\naddAndLog x y = do\n tell [\"Adding \" ++ show x ++ \" and \" ++ show y]\n return (x + y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (result, logs) = runWriter $ do\n res1 <- addAndLog 3 5\n addAndLog res1 1\n print result -- Output: 9\n print logs -- Output: [\"Adding 3 and 5\", \"Adding 8 and 1\"]\n", "tags": [ "monads", "writer", "logs" ], - "contributors": [], - "code": "import Control.Monad.Writer\n\naddAndLog :: Int -> Int -> Writer [String] Int\naddAndLog x y = do\n tell [\"Adding \" ++ show x ++ \" and \" ++ show y]\n return (x + y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (result, logs) = runWriter $ do\n res1 <- addAndLog 3 5\n addAndLog res1 1\n print result -- Output: 9\n print logs -- Output: [\"Adding 3 and 5\", \"Adding 8 and 1\"]\n" + "contributors": [] } ] }, @@ -147,6 +147,7 @@ "title": "CamelCase to snake_case", "description": "Converts a Camel Case string to Snake case.", "author": "ACR1209", + "code": "import Data.Char (isUpper, toLower)\n\ncamelToSnake :: String -> String\ncamelToSnake [] = []\ncamelToSnake (x:xs)\n | isUpper x = '_' : toLower x : camelToSnake xs\n | otherwise = x : camelToSnake xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let camelCase = \"camelCaseToSnakeCase\"\n print $ camelToSnake camelCase -- Output: \"camel_case_to_snake_case\"\n", "tags": [ "string", "convert", @@ -154,49 +155,49 @@ "snake-case", "utility" ], - "contributors": [], - "code": "import Data.Char (isUpper, toLower)\n\ncamelToSnake :: String -> String\ncamelToSnake [] = []\ncamelToSnake (x:xs)\n | isUpper x = '_' : toLower x : camelToSnake xs\n | otherwise = x : camelToSnake xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let camelCase = \"camelCaseToSnakeCase\"\n print $ camelToSnake camelCase -- Output: \"camel_case_to_snake_case\"\n" + "contributors": [] }, { "title": "Capitalize Words", "description": "Capitalizes the first letter of each word in a string.", "author": "ACR1209", + "code": "import Data.Char (toUpper)\n\ncapitalizeWords :: String -> String\ncapitalizeWords = unwords . map capitalize . words\n where\n capitalize [] = []\n capitalize (x:xs) = toUpper x : xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let sentence = \"haskell is awesome\"\n print $ capitalizeWords sentence -- Output: \"Haskell Is Awesome\"\n", "tags": [ "string", "capitalize", "words" ], - "contributors": [], - "code": "import Data.Char (toUpper)\n\ncapitalizeWords :: String -> String\ncapitalizeWords = unwords . map capitalize . words\n where\n capitalize [] = []\n capitalize (x:xs) = toUpper x : xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let sentence = \"haskell is awesome\"\n print $ capitalizeWords sentence -- Output: \"Haskell Is Awesome\"\n" + "contributors": [] }, { "title": "Count Word Occurrences in String", "description": "Counts the occurrences of each word in a given string.", "author": "ACR1209", + "code": "import Data.List (group, sort)\n\ncountWordOccurrences :: String -> [(String, Int)]\ncountWordOccurrences = map (\\(w:ws) -> (w, length (w:ws))) . group . sort . words\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"haskell is awesome and haskell is fun\"\n print $ countWordOccurrences text -- Output: [(\"and\",1),(\"awesome\",1),(\"fun\",1),(\"haskell\",2),(\"is\",2)]\n", "tags": [ "string", "occurrences", "word-count" ], - "contributors": [], - "code": "import Data.List (group, sort)\n\ncountWordOccurrences :: String -> [(String, Int)]\ncountWordOccurrences = map (\\(w:ws) -> (w, length (w:ws))) . group . sort . words\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"haskell is awesome and haskell is fun\"\n print $ countWordOccurrences text -- Output: [(\"and\",1),(\"awesome\",1),(\"fun\",1),(\"haskell\",2),(\"is\",2)]\n" + "contributors": [] }, { "title": "Remove Punctuation", "description": "Removes all punctuation from a given string.", "author": "ACR1209", + "code": "import Data.Char (isPunctuation)\n\nremovePunctuation :: String -> String\nremovePunctuation = filter (not . isPunctuation)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"Hello, Haskell! How's it going?\"\n print $ removePunctuation text -- Output: \"Hello Haskell Hows it going\"\n", "tags": [ "string", "punctuation", "remove" ], - "contributors": [], - "code": "import Data.Char (isPunctuation)\n\nremovePunctuation :: String -> String\nremovePunctuation = filter (not . isPunctuation)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"Hello, Haskell! How's it going?\"\n print $ removePunctuation text -- Output: \"Hello Haskell Hows it going\"\n" + "contributors": [] }, { "title": "Snake_Case to CamelCase", "description": "Converts a Snake Case string to Camel Case.", "author": "ACR1209", + "code": "import Data.Char (toUpper)\n\nsnakeToCamel :: String -> String\nsnakeToCamel [] = []\nsnakeToCamel ('_':x:xs) = toUpper x : snakeToCamel xs\nsnakeToCamel (x:xs) = x : snakeToCamel xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let snakeCase = \"snake_case_to_camel_case\"\n print $ snakeToCamel snakeCase -- Output: \"snakeCaseToCamelCase\"\n", "tags": [ "string", "convert", @@ -204,20 +205,19 @@ "camel-case", "utilty" ], - "contributors": [], - "code": "import Data.Char (toUpper)\n\nsnakeToCamel :: String -> String\nsnakeToCamel [] = []\nsnakeToCamel ('_':x:xs) = toUpper x : snakeToCamel xs\nsnakeToCamel (x:xs) = x : snakeToCamel xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let snakeCase = \"snake_case_to_camel_case\"\n print $ snakeToCamel snakeCase -- Output: \"snakeCaseToCamelCase\"\n" + "contributors": [] }, { "title": "Truncate String", "description": "Truncates a string to a specified length, optionally adding an ellipsis.", "author": "ACR1209", + "code": "truncateString :: Int -> String -> String\ntruncateString maxLength str\n | length str <= maxLength = str\n | otherwise = take (maxLength - 3) str ++ \"...\"\n\n-- Usage:\nmain :: IO ()\nmain = do\n let longString = \"Haskell is a powerful functional programming language.\"\n print $ truncateString 20 longString -- Output: \"Haskell is a powe...\"\n print $ truncateString 54 longString -- Output: \"Haskell is a powerful functional programming language.\"\n", "tags": [ "string", "truncate", "utility" ], - "contributors": [], - "code": "truncateString :: Int -> String -> String\ntruncateString maxLength str\n | length str <= maxLength = str\n | otherwise = take (maxLength - 3) str ++ \"...\"\n\n-- Usage:\nmain :: IO ()\nmain = do\n let longString = \"Haskell is a powerful functional programming language.\"\n print $ truncateString 20 longString -- Output: \"Haskell is a powe...\"\n print $ truncateString 54 longString -- Output: \"Haskell is a powerful functional programming language.\"\n" + "contributors": [] } ] } diff --git a/public/consolidated/html.json b/public/consolidated/html.json index f7635148..ba1201e2 100644 --- a/public/consolidated/html.json +++ b/public/consolidated/html.json @@ -6,6 +6,7 @@ "title": "Grid Layout with Navigation", "description": "Full-height grid layout with header navigation using nesting syntax.", "author": "GreenMan36", + "code": "\n\n \n \n \n \n
\n Header\n \n
\n
Main Content
\n
Footer
\n \n\n", "tags": [ "css", "layout", @@ -13,13 +14,13 @@ "grid", "full-height" ], - "contributors": [], - "code": "\n\n \n \n \n \n
\n Header\n \n
\n
Main Content
\n
Footer
\n \n\n" + "contributors": [] }, { "title": "Sticky Header-Footer Layout", "description": "Full-height layout with sticky header and footer, using modern viewport units and flexbox.", "author": "GreenMan36", + "code": "\n\n \n \n \n \n
header
\n
body/content
\n
footer
\n \n\n", "tags": [ "css", "layout", @@ -27,8 +28,7 @@ "flexbox", "viewport" ], - "contributors": [], - "code": "\n\n \n \n \n \n
header
\n
body/content
\n
footer
\n \n\n" + "contributors": [] } ] } diff --git a/public/consolidated/java.json b/public/consolidated/java.json index f00ab589..06aadb7d 100644 --- a/public/consolidated/java.json +++ b/public/consolidated/java.json @@ -6,13 +6,13 @@ "title": "Hello-World", "description": "Prints Hello world in the console", "author": "SarvariHarshitha", + "code": "// This is the main class of the Java program\npublic class Main {\n // The main method is the entry point of the program\n public static void main(String args[]) {\n // This statement prints \"Hello, World!\" to the console\n System.out.println(\"Hello, World!\");\n }\n}\n\n", "tags": [ "java", "console", "printing" ], - "contributors": [], - "code": "// This is the main class of the Java program\npublic class Main {\n // The main method is the entry point of the program\n public static void main(String args[]) {\n // This statement prints \"Hello, World!\" to the console\n System.out.println(\"Hello, World!\");\n }\n}\n\n" + "contributors": [] } ] } diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json index 4ac0819f..1a60d119 100644 --- a/public/consolidated/javascript.json +++ b/public/consolidated/javascript.json @@ -6,58 +6,58 @@ "title": "Partition Array", "description": "Splits an array into two arrays based on a callback function.", "author": "Swaraj-Singh-30", + "code": "const partition = (arr, callback) =>\n arr.reduce(\n ([pass, fail], elem) => (callback(elem) ? [[...pass, elem], fail] : [pass, [...fail, elem]]),\n [[], []]\n );\n\n// Usage:\nconst numbers = [1, 2, 3, 4, 5, 6];\nconst isEven = (n) => n % 2 === 0;\npartition(numbers, isEven); // Returns: [[2, 4, 6], [1, 3, 5]]\n", "tags": [ "array", "partition", "reduce" ], - "contributors": [], - "code": "const partition = (arr, callback) =>\n arr.reduce(\n ([pass, fail], elem) => (callback(elem) ? [[...pass, elem], fail] : [pass, [...fail, elem]]),\n [[], []]\n );\n\n// Usage:\nconst numbers = [1, 2, 3, 4, 5, 6];\nconst isEven = (n) => n % 2 === 0;\npartition(numbers, isEven); // Returns: [[2, 4, 6], [1, 3, 5]]\n" + "contributors": [] }, { "title": "Remove Duplicates", "description": "Removes duplicate values from an array.", "author": "dostonnabotov", + "code": "const removeDuplicates = (arr) => [...new Set(arr)];\n\n// Usage:\nconst numbers = [1, 2, 2, 3, 4, 4, 5];\nremoveDuplicates(numbers); // Returns: [1, 2, 3, 4, 5]\n", "tags": [ "array", "deduplicate" ], - "contributors": [], - "code": "const removeDuplicates = (arr) => [...new Set(arr)];\n\n// Usage:\nconst numbers = [1, 2, 2, 3, 4, 4, 5];\nremoveDuplicates(numbers); // Returns: [1, 2, 3, 4, 5]\n" + "contributors": [] }, { "title": "Remove Falsy Values", "description": "Removes falsy values from an array.", "author": "mubasshir", + "code": "const removeFalsy = (arr) => arr.filter(Boolean);\n\n// Usage:\nconst array = [0, 1, false, 2, \"\", 3, null];\nremoveFalsy(array); // Returns: [1, 2, 3]\n", "tags": [ "array", "falsy", "filter" ], - "contributors": [], - "code": "const removeFalsy = (arr) => arr.filter(Boolean);\n\n// Usage:\nconst array = [0, 1, false, 2, \"\", 3, null];\nremoveFalsy(array); // Returns: [1, 2, 3]\n" + "contributors": [] }, { "title": "Shuffle Array", "description": "Shuffles an Array.", "author": "loxt-nixo", + "code": "function shuffleArray(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n}\n\n// Usage:\nconst array = [1, 2, 3, 4, 5];\nshuffleArray(array); // Shuffles `array` in place\n", "tags": [ "array", "shuffle" ], - "contributors": [], - "code": "function shuffleArray(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n}\n\n// Usage:\nconst array = [1, 2, 3, 4, 5];\nshuffleArray(array); // Shuffles `array` in place\n" + "contributors": [] }, { "title": "Zip Arrays", "description": "Combines two arrays by pairing corresponding elements from each array.", "author": "Swaraj-Singh-30", + "code": "const zip = (arr1, arr2) => arr1.map((value, index) => [value, arr2[index]]);\n\n// Usage:\nconst arr1 = ['a', 'b', 'c'];\nconst arr2 = [1, 2, 3];\nconsole.log(zip(arr1, arr2)); // Output: [['a', 1], ['b', 2], ['c', 3]]\n", "tags": [ "array", "map" ], - "contributors": [], - "code": "const zip = (arr1, arr2) => arr1.map((value, index) => [value, arr2[index]]);\n\n// Usage:\nconst arr1 = ['a', 'b', 'c'];\nconst arr2 = [1, 2, 3];\nconsole.log(zip(arr1, arr2)); // Output: [['a', 1], ['b', 2], ['c', 3]]\n" + "contributors": [] } ] }, @@ -68,12 +68,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", + "code": "console.log(\"Hello, World!\"); // Prints Hello, World! to the console\n", "tags": [ "printing", "hello-world" ], - "contributors": [], - "code": "console.log(\"Hello, World!\"); // Prints Hello, World! to the console\n" + "contributors": [] } ] }, @@ -84,73 +84,74 @@ "title": "Check Leap Year", "description": "Determines if a given year is a leap year.", "author": "axorax", + "code": "const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n\n// Usage:\nisLeapYear(2024); // Returns: true\nisLeapYear(2023); // Returns: false\n", "tags": [ "date", "leap-year" ], - "contributors": [], - "code": "const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n\n// Usage:\nisLeapYear(2024); // Returns: true\nisLeapYear(2023); // Returns: false\n" + "contributors": [] }, { "title": "Convert to Unix Timestamp", "description": "Converts a date to a Unix timestamp in seconds.", "author": "Yugveer06", + "code": "function convertToUnixSeconds(input) {\n if (typeof input === 'string') {\n if (!input.trim()) {\n throw new Error('Date string cannot be empty or whitespace');\n }\n } else if (!input) {\n throw new Error('Input is required');\n }\n\n let date;\n\n if (typeof input === 'string') {\n date = new Date(input);\n } else if (input instanceof Date) {\n date = input;\n } else {\n throw new Error('Input must be a valid date string or Date object');\n }\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid date provided');\n }\n\n return Math.floor(date.getTime() / 1000);\n}\n\n// Usage:\nconvertToUnixSeconds('2025-01-01T12:00:00Z'); // Returns: 1735732800\nconvertToUnixSeconds(new Date('2025-01-01T12:00:00Z')); // Returns: 1735732800\nconvertToUnixSeconds(new Date()); // Returns: Current Unix timestamp in seconds\n", "tags": [ "date", "unix", "timestamp" ], - "contributors": [], - "code": "function convertToUnixSeconds(input) {\n if (typeof input === 'string') {\n if (!input.trim()) {\n throw new Error('Date string cannot be empty or whitespace');\n }\n } else if (!input) {\n throw new Error('Input is required');\n }\n\n let date;\n\n if (typeof input === 'string') {\n date = new Date(input);\n } else if (input instanceof Date) {\n date = input;\n } else {\n throw new Error('Input must be a valid date string or Date object');\n }\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid date provided');\n }\n\n return Math.floor(date.getTime() / 1000);\n}\n\n// Usage:\nconvertToUnixSeconds('2025-01-01T12:00:00Z'); // Returns: 1735732800\nconvertToUnixSeconds(new Date('2025-01-01T12:00:00Z')); // Returns: 1735732800\nconvertToUnixSeconds(new Date()); // Returns: Current Unix timestamp in seconds\n" + "contributors": [] }, { "title": "Format Date", "description": "Formats a date in 'YYYY-MM-DD' format.", "author": "dostonnabotov", + "code": "const formatDate = (date) => date.toISOString().split('T')[0];\n\n// Usage:\nformatDate(new Date(2024, 11, 10)); // Returns: '2024-12-10'\n", "tags": [ "date", "format" ], - "contributors": [], - "code": "const formatDate = (date) => date.toISOString().split('T')[0];\n\n// Usage:\nformatDate(new Date(2024, 11, 10)); // Returns: '2024-12-10'\n" + "contributors": [] }, { "title": "Get Day of the Year", "description": "Calculates the day of the year (1-365 or 1-366 for leap years) for a given date.", "author": "axorax", + "code": "const getDayOfYear = (date) => {\n const startOfYear = new Date(date.getFullYear(), 0, 0);\n const diff = date - startOfYear + (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000;\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\ngetDayOfYear(new Date('2024-12-31')) // Returns: 366 (Leap year)\n", "tags": [ "date", "day-of-year" ], - "contributors": [], - "code": "const getDayOfYear = (date) => {\n const startOfYear = new Date(date.getFullYear(), 0, 0);\n const diff = date - startOfYear + (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000;\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\ngetDayOfYear(new Date('2024-12-31')) // Returns: 366 (Leap year)\n" + "contributors": [] }, { "title": "Get Days in Month", "description": "Calculates the number of days in a specific month of a given year.", "author": "axorax", + "code": "const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();\n\n// Usage:\ngetDaysInMonth(2024, 1); // Returns: 29 (February in a leap year)\ngetDaysInMonth(2023, 1); // Returns: 28\n", "tags": [ "date", "days-in-month" ], - "contributors": [], - "code": "const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();\n\n// Usage:\ngetDaysInMonth(2024, 1); // Returns: 29 (February in a leap year)\ngetDaysInMonth(2023, 1); // Returns: 28\n" + "contributors": [] }, { "title": "Get Time Difference", "description": "Calculates the time difference in days between two dates.", "author": "dostonnabotov", + "code": "const getTimeDifference = (date1, date2) => {\n const diff = Math.abs(date2 - date1);\n return Math.ceil(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\nconst date1 = new Date('2024-01-01');\nconst date2 = new Date('2024-12-31');\ngetTimeDifference(date1, date2); // Returns: 365\n", "tags": [ "date", "time-difference" ], - "contributors": [], - "code": "const getTimeDifference = (date1, date2) => {\n const diff = Math.abs(date2 - date1);\n return Math.ceil(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\nconst date1 = new Date('2024-01-01');\nconst date2 = new Date('2024-12-31');\ngetTimeDifference(date1, date2); // Returns: 365\n" + "contributors": [] }, { "title": "Relative Time Formatter", "description": "Displays how long ago a date occurred or how far in the future a date is.", "author": "Yugveer06", + "code": "const getRelativeTime = (date) => {\n const now = Date.now();\n const diff = date.getTime() - now;\n const seconds = Math.abs(Math.floor(diff / 1000));\n const minutes = Math.abs(Math.floor(seconds / 60));\n const hours = Math.abs(Math.floor(minutes / 60));\n const days = Math.abs(Math.floor(hours / 24));\n const years = Math.abs(Math.floor(days / 365));\n\n if (Math.abs(diff) < 1000) return 'just now';\n\n const isFuture = diff > 0;\n\n if (years > 0) return `${isFuture ? 'in ' : ''}${years} ${years === 1 ? 'year' : 'years'}${isFuture ? '' : ' ago'}`;\n if (days > 0) return `${isFuture ? 'in ' : ''}${days} ${days === 1 ? 'day' : 'days'}${isFuture ? '' : ' ago'}`;\n if (hours > 0) return `${isFuture ? 'in ' : ''}${hours} ${hours === 1 ? 'hour' : 'hours'}${isFuture ? '' : ' ago'}`;\n if (minutes > 0) return `${isFuture ? 'in ' : ''}${minutes} ${minutes === 1 ? 'minute' : 'minutes'}${isFuture ? '' : ' ago'}`;\n\n return `${isFuture ? 'in ' : ''}${seconds} ${seconds === 1 ? 'second' : 'seconds'}${isFuture ? '' : ' ago'}`;\n}\n\n// Usage:\nconst pastDate = new Date('2021-12-29 13:00:00');\nconst futureDate = new Date('2099-12-29 13:00:00');\ngetRelativeTime(pastDate); // x years ago\ngetRelativeTime(new Date()); // just now\ngetRelativeTime(futureDate); // in x years\n", "tags": [ "date", "time", @@ -158,19 +159,18 @@ "future", "past" ], - "contributors": [], - "code": "const getRelativeTime = (date) => {\n const now = Date.now();\n const diff = date.getTime() - now;\n const seconds = Math.abs(Math.floor(diff / 1000));\n const minutes = Math.abs(Math.floor(seconds / 60));\n const hours = Math.abs(Math.floor(minutes / 60));\n const days = Math.abs(Math.floor(hours / 24));\n const years = Math.abs(Math.floor(days / 365));\n\n if (Math.abs(diff) < 1000) return 'just now';\n\n const isFuture = diff > 0;\n\n if (years > 0) return `${isFuture ? 'in ' : ''}${years} ${years === 1 ? 'year' : 'years'}${isFuture ? '' : ' ago'}`;\n if (days > 0) return `${isFuture ? 'in ' : ''}${days} ${days === 1 ? 'day' : 'days'}${isFuture ? '' : ' ago'}`;\n if (hours > 0) return `${isFuture ? 'in ' : ''}${hours} ${hours === 1 ? 'hour' : 'hours'}${isFuture ? '' : ' ago'}`;\n if (minutes > 0) return `${isFuture ? 'in ' : ''}${minutes} ${minutes === 1 ? 'minute' : 'minutes'}${isFuture ? '' : ' ago'}`;\n\n return `${isFuture ? 'in ' : ''}${seconds} ${seconds === 1 ? 'second' : 'seconds'}${isFuture ? '' : ' ago'}`;\n}\n\n// Usage:\nconst pastDate = new Date('2021-12-29 13:00:00');\nconst futureDate = new Date('2099-12-29 13:00:00');\ngetRelativeTime(pastDate); // x years ago\ngetRelativeTime(new Date()); // just now\ngetRelativeTime(futureDate); // in x years\n" + "contributors": [] }, { "title": "Start of the Day", "description": "Returns the start of the day (midnight) for a given date.", "author": "axorax", + "code": "const startOfDay = (date) => new Date(date.setHours(0, 0, 0, 0));\n\n// Usage:\nconst today = new Date();\nstartOfDay(today); // Returns: Date object for midnight\n", "tags": [ "date", "start-of-day" ], - "contributors": [], - "code": "const startOfDay = (date) => new Date(date.setHours(0, 0, 0, 0));\n\n// Usage:\nconst today = new Date();\nstartOfDay(today); // Returns: Date object for midnight\n" + "contributors": [] } ] }, @@ -181,23 +181,23 @@ "title": "Change Element Style", "description": "Changes the inline style of an element.", "author": "axorax", + "code": "const changeElementStyle = (element, styleObj) => {\n Object.entries(styleObj).forEach(([property, value]) => {\n element.style[property] = value;\n });\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nchangeElementStyle(element, { color: 'red', backgroundColor: 'yellow' });\n", "tags": [ "dom", "style" ], - "contributors": [], - "code": "const changeElementStyle = (element, styleObj) => {\n Object.entries(styleObj).forEach(([property, value]) => {\n element.style[property] = value;\n });\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nchangeElementStyle(element, { color: 'red', backgroundColor: 'yellow' });\n" + "contributors": [] }, { "title": "Remove Element", "description": "Removes a specified element from the DOM.", "author": "axorax", + "code": "const removeElement = (element) => {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nremoveElement(element);\n", "tags": [ "dom", "remove" ], - "contributors": [], - "code": "const removeElement = (element) => {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nremoveElement(element);\n" + "contributors": [] } ] }, @@ -208,96 +208,97 @@ "title": "Compose Functions", "description": "Composes multiple functions into a single function, where the output of one function becomes the input of the next.", "author": "axorax", + "code": "const compose = (...funcs) => (initialValue) => {\n return funcs.reduce((acc, func) => func(acc), initialValue);\n};\n\n// Usage:\nconst add2 = (x) => x + 2;\nconst multiply3 = (x) => x * 3;\nconst composed = compose(multiply3, add2);\ncomposed(5); // Returns: 17 ((5 * 3) + 2)\n", "tags": [ "function", "compose" ], - "contributors": [], - "code": "const compose = (...funcs) => (initialValue) => {\n return funcs.reduce((acc, func) => func(acc), initialValue);\n};\n\n// Usage:\nconst add2 = (x) => x + 2;\nconst multiply3 = (x) => x * 3;\nconst composed = compose(multiply3, add2);\ncomposed(5); // Returns: 17 ((5 * 3) + 2)\n" + "contributors": [] }, { "title": "Curry Function", "description": "Transforms a function into its curried form.", "author": "axorax", + "code": "const curry = (func) => {\n const curried = (...args) => {\n if (args.length >= func.length) {\n return func(...args);\n }\n return (...nextArgs) => curried(...args, ...nextArgs);\n };\n return curried;\n};\n\n// Usage:\nconst add = (a, b, c) => a + b + c;\nconst curriedAdd = curry(add);\ncurriedAdd(1)(2)(3); // Returns: 6\ncurriedAdd(1, 2)(3); // Returns: 6\n", "tags": [ "curry", "function" ], - "contributors": [], - "code": "const curry = (func) => {\n const curried = (...args) => {\n if (args.length >= func.length) {\n return func(...args);\n }\n return (...nextArgs) => curried(...args, ...nextArgs);\n };\n return curried;\n};\n\n// Usage:\nconst add = (a, b, c) => a + b + c;\nconst curriedAdd = curry(add);\ncurriedAdd(1)(2)(3); // Returns: 6\ncurriedAdd(1, 2)(3); // Returns: 6\n" + "contributors": [] }, { "title": "Debounce Function", "description": "Delays a function execution until after a specified time.", "author": "dostonnabotov", + "code": "const debounce = (func, delay) => {\n let timeout;\n\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), delay);\n };\n};\n\n// Usage:\nwindow.addEventListener(\n 'resize',\n debounce(() => console.log('Resized!'), 500), // Will only output after resizing has stopped for 500ms\n);\n", "tags": [ "debounce", "performance" ], - "contributors": [], - "code": "const debounce = (func, delay) => {\n let timeout;\n\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), delay);\n };\n};\n\n// Usage:\nwindow.addEventListener(\n 'resize',\n debounce(() => console.log('Resized!'), 500), // Will only output after resizing has stopped for 500ms\n);\n" + "contributors": [] }, { "title": "Get Contrast Color", "description": "Returns either black or white text color based on the brightness of the provided hex color.", "author": "yaya12085", + "code": "const getContrastColor = (hexColor) => {\n // Expand short hex color to full format\n if (hexColor.length === 4) {\n hexColor = `#${hexColor[1]}${hexColor[1]}${hexColor[2]}${hexColor[2]}${hexColor[3]}${hexColor[3]}`;\n }\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness >= 128 ? \"#000000\" : \"#FFFFFF\";\n};\n\n// Usage:\ngetContrastColor('#fff'); // Returns: #000000 (black)\ngetContrastColor('#123456'); // Returns: #FFFFFF (white)\ngetContrastColor('#ff6347'); // Returns: #000000 (black)\ngetContrastColor('#f4f'); // Returns: #000000 (black)\n", "tags": [ "color", "hex", "contrast", "brightness" ], - "contributors": [], - "code": "const getContrastColor = (hexColor) => {\n // Expand short hex color to full format\n if (hexColor.length === 4) {\n hexColor = `#${hexColor[1]}${hexColor[1]}${hexColor[2]}${hexColor[2]}${hexColor[3]}${hexColor[3]}`;\n }\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness >= 128 ? \"#000000\" : \"#FFFFFF\";\n};\n\n// Usage:\ngetContrastColor('#fff'); // Returns: #000000 (black)\ngetContrastColor('#123456'); // Returns: #FFFFFF (white)\ngetContrastColor('#ff6347'); // Returns: #000000 (black)\ngetContrastColor('#f4f'); // Returns: #000000 (black)\n" + "contributors": [] }, { "title": "Memoize Function", "description": "Caches the result of a function based on its arguments to improve performance.", "author": "axorax", + "code": "const memoize = (func) => {\n const cache = new Map();\n return (...args) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n};\n\n// Usage:\nconst factorial = memoize((n) => (n <= 1 ? 1 : n * factorial(n - 1)));\nfactorial(5); // Returns: 120\nfactorial(5); // Returns: 120 (retrieved from cache)\n", "tags": [ "memoization", "optimization" ], - "contributors": [], - "code": "const memoize = (func) => {\n const cache = new Map();\n return (...args) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n};\n\n// Usage:\nconst factorial = memoize((n) => (n <= 1 ? 1 : n * factorial(n - 1)));\nfactorial(5); // Returns: 120\nfactorial(5); // Returns: 120 (retrieved from cache)\n" + "contributors": [] }, { "title": "Once Function", "description": "Ensures a function is only called once.", "author": "axorax", + "code": "const once = (func) => {\n let called = false;\n return (...args) => {\n if (!called) {\n called = true;\n return func(...args);\n }\n };\n};\n\n// Usage:\nconst initialize = once(() => console.log('Initialized!'));\ninitialize(); // Output: Initialized!\ninitialize(); // No output\n", "tags": [ "function", "once" ], - "contributors": [], - "code": "const once = (func) => {\n let called = false;\n return (...args) => {\n if (!called) {\n called = true;\n return func(...args);\n }\n };\n};\n\n// Usage:\nconst initialize = once(() => console.log('Initialized!'));\ninitialize(); // Output: Initialized!\ninitialize(); // No output\n" + "contributors": [] }, { "title": "Rate Limit Function", "description": "Limits how often a function can be executed within a given time window.", "author": "axorax", + "code": "const rateLimit = (func, limit, timeWindow) => {\n let queue = [];\n setInterval(() => {\n if (queue.length) {\n const next = queue.shift();\n func(...next.args);\n }\n }, timeWindow);\n return (...args) => {\n if (queue.length < limit) {\n queue.push({ args });\n }\n };\n};\n\n// Usage:\nconst fetchData = () => console.log('Fetching data...');\nconst rateLimitedFetch = rateLimit(fetchData, 2, 1000);\nsetInterval(() => rateLimitedFetch(), 200); // Limits fetchData calls to twice a seconds\n", "tags": [ "function", "rate-limiting" ], - "contributors": [], - "code": "const rateLimit = (func, limit, timeWindow) => {\n let queue = [];\n setInterval(() => {\n if (queue.length) {\n const next = queue.shift();\n func(...next.args);\n }\n }, timeWindow);\n return (...args) => {\n if (queue.length < limit) {\n queue.push({ args });\n }\n };\n};\n\n// Usage:\nconst fetchData = () => console.log('Fetching data...');\nconst rateLimitedFetch = rateLimit(fetchData, 2, 1000);\nsetInterval(() => rateLimitedFetch(), 200); // Limits fetchData calls to twice a seconds\n" + "contributors": [] }, { "title": "Repeat Function Invocation", "description": "Invokes a function a specified number of times.", "author": "dostonnabotov", + "code": "const times = (func, n) => {\n Array.from(Array(n)).forEach(() => {\n func();\n });\n};\n\n// Usage:\nconst randomFunction = () => console.log('Function called!');\ntimes(randomFunction, 3); // Logs 'Function called!' three times\n", "tags": [ "function", "repeat" ], - "contributors": [], - "code": "const times = (func, n) => {\n Array.from(Array(n)).forEach(() => {\n func();\n });\n};\n\n// Usage:\nconst randomFunction = () => console.log('Function called!');\ntimes(randomFunction, 3); // Logs 'Function called!' three times\n" + "contributors": [] }, { "title": "Sleep Function", "description": "Waits for a specified amount of milliseconds before resolving.", "author": "0xHouss", + "code": "const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// Usage:\nconsole.log('Hello');\nawait sleep(2000); // Waits for 2 seconds\nconsole.log('World!');\n", "tags": [ "javascript", "sleep", @@ -305,8 +306,7 @@ "utility", "promises" ], - "contributors": [], - "code": "const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// Usage:\nconsole.log('Hello');\nawait sleep(2000); // Waits for 2 seconds\nconsole.log('World!');\n" + "contributors": [] } ] }, @@ -317,34 +317,34 @@ "title": "Add Item to localStorage", "description": "Stores a value in localStorage under the given key.", "author": "dostonnabotov", + "code": "const addToLocalStorage = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\n\n// Usage:\naddToLocalStorage('user', { name: 'John', age: 30 });\n", "tags": [ "localStorage", "storage" ], - "contributors": [], - "code": "const addToLocalStorage = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\n\n// Usage:\naddToLocalStorage('user', { name: 'John', age: 30 });\n" + "contributors": [] }, { "title": "Check if Item Exists in localStorage", "description": "Checks if a specific item exists in localStorage.", "author": "axorax", + "code": "const isItemInLocalStorage = (key) => {\n return localStorage.getItem(key) !== null;\n};\n\n// Usage:\nconsole.log(isItemInLocalStorage('user')); // Output: true or false\n", "tags": [ "localStorage", "storage" ], - "contributors": [], - "code": "const isItemInLocalStorage = (key) => {\n return localStorage.getItem(key) !== null;\n};\n\n// Usage:\nconsole.log(isItemInLocalStorage('user')); // Output: true or false\n" + "contributors": [] }, { "title": "Retrieve Item from localStorage", "description": "Retrieves a value from localStorage by key and parses it.", "author": "dostonnabotov", + "code": "const getFromLocalStorage = (key) => {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : null;\n};\n\n// Usage:\ngetFromLocalStorage('user'); // Returns: { name: 'John', age: 30 }\n", "tags": [ "localStorage", "storage" ], - "contributors": [], - "code": "const getFromLocalStorage = (key) => {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : null;\n};\n\n// Usage:\ngetFromLocalStorage('user'); // Returns: { name: 'John', age: 30 }\n" + "contributors": [] } ] }, @@ -355,67 +355,67 @@ "title": "Convert Number to Currency", "description": "Converts a number to a currency format with a specific locale.", "author": "axorax", + "code": "const convertToCurrency = (num, locale = 'en-US', currency = 'USD') => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency\n }).format(num);\n};\n\n// Usage:\nconvertToCurrency(1234567.89); // Returns: '$1,234,567.89'\nconvertToCurrency(987654.32, 'de-DE', 'EUR'); // Returns: '987.654,32 €'\n", "tags": [ "number", "currency" ], - "contributors": [], - "code": "const convertToCurrency = (num, locale = 'en-US', currency = 'USD') => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency\n }).format(num);\n};\n\n// Usage:\nconvertToCurrency(1234567.89); // Returns: '$1,234,567.89'\nconvertToCurrency(987654.32, 'de-DE', 'EUR'); // Returns: '987.654,32 €'\n" + "contributors": [] }, { "title": "Convert Number to Roman Numerals", "description": "Converts a number to Roman numeral representation.", "author": "axorax", + "code": "const numberToRoman = (num) => {\n const romanNumerals = {\n 1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L',\n 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'\n };\n let result = '';\n Object.keys(romanNumerals).reverse().forEach(value => {\n while (num >= value) {\n result += romanNumerals[value];\n num -= value;\n }\n });\n return result;\n};\n\n// Usage:\nnumberToRoman(1994); // Returns: 'MCMXCIV'\nnumberToRoman(58); // Returns: 'LVIII'\n", "tags": [ "number", "roman" ], - "contributors": [], - "code": "const numberToRoman = (num) => {\n const romanNumerals = {\n 1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L',\n 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'\n };\n let result = '';\n Object.keys(romanNumerals).reverse().forEach(value => {\n while (num >= value) {\n result += romanNumerals[value];\n num -= value;\n }\n });\n return result;\n};\n\n// Usage:\nnumberToRoman(1994); // Returns: 'MCMXCIV'\nnumberToRoman(58); // Returns: 'LVIII'\n" + "contributors": [] }, { "title": "Convert to Scientific Notation", "description": "Converts a number to scientific notation.", "author": "axorax", + "code": "const toScientificNotation = (num) => {\n if (isNaN(num)) {\n throw new Error('Input must be a number');\n }\n if (num === 0) {\n return '0e+0';\n }\n const exponent = Math.floor(Math.log10(Math.abs(num)));\n const mantissa = num / Math.pow(10, exponent);\n return `${mantissa.toFixed(2)}e${exponent >= 0 ? '+' : ''}${exponent}`;\n};\n\n// Usage:\ntoScientificNotation(12345); // Returns: '1.23e+4'\ntoScientificNotation(0.0005678); // Returns: '5.68e-4'\ntoScientificNotation(1000); // Returns: '1.00e+3'\ntoScientificNotation(0); // Returns: '0e+0'\ntoScientificNotation(-54321); // Returns: '-5.43e+4'\n", "tags": [ "number", "scientific" ], - "contributors": [], - "code": "const toScientificNotation = (num) => {\n if (isNaN(num)) {\n throw new Error('Input must be a number');\n }\n if (num === 0) {\n return '0e+0';\n }\n const exponent = Math.floor(Math.log10(Math.abs(num)));\n const mantissa = num / Math.pow(10, exponent);\n return `${mantissa.toFixed(2)}e${exponent >= 0 ? '+' : ''}${exponent}`;\n};\n\n// Usage:\ntoScientificNotation(12345); // Returns: '1.23e+4'\ntoScientificNotation(0.0005678); // Returns: '5.68e-4'\ntoScientificNotation(1000); // Returns: '1.00e+3'\ntoScientificNotation(0); // Returns: '0e+0'\ntoScientificNotation(-54321); // Returns: '-5.43e+4'\n" + "contributors": [] }, { "title": "Format Number with Commas", "description": "Formats a number with commas for better readability (e.g., 1000 -> 1,000).", "author": "axorax", + "code": "const formatNumberWithCommas = (num) => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// Usage:\nformatNumberWithCommas(1000); // Returns: '1,000'\nformatNumberWithCommas(1234567); // Returns: '1,234,567'\nformatNumberWithCommas(987654321); // Returns: '987,654,321'\n", "tags": [ "number", "format" ], - "contributors": [], - "code": "const formatNumberWithCommas = (num) => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// Usage:\nformatNumberWithCommas(1000); // Returns: '1,000'\nformatNumberWithCommas(1234567); // Returns: '1,234,567'\nformatNumberWithCommas(987654321); // Returns: '987,654,321'\n" + "contributors": [] }, { "title": "Number Formatter", "description": "Formats a number with suffixes (K, M, B, etc.).", "author": "realvishalrana", + "code": "const nFormatter = (num) => {\n if (!num) return;\n num = parseFloat(num.toString().replace(/[^0-9.]/g, ''));\n const suffixes = ['', 'K', 'M', 'B', 'T', 'P', 'E'];\n let index = 0;\n while (num >= 1000 && index < suffixes.length - 1) {\n num /= 1000;\n index++;\n }\n return num.toFixed(2).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + suffixes[index];\n};\n\n// Usage:\nnFormatter(1234567); // Returns: '1.23M'\n", "tags": [ "number", "format" ], - "contributors": [], - "code": "const nFormatter = (num) => {\n if (!num) return;\n num = parseFloat(num.toString().replace(/[^0-9.]/g, ''));\n const suffixes = ['', 'K', 'M', 'B', 'T', 'P', 'E'];\n let index = 0;\n while (num >= 1000 && index < suffixes.length - 1) {\n num /= 1000;\n index++;\n }\n return num.toFixed(2).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + suffixes[index];\n};\n\n// Usage:\nnFormatter(1234567); // Returns: '1.23M'\n" + "contributors": [] }, { "title": "Number to Words Converter", "description": "Converts a number to its word representation in English.", "author": "axorax", + "code": "const numberToWords = (num) => {\n const below20 = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n const above1000 = ['Hundred', 'Thousand', 'Million', 'Billion'];\n if (num < 20) return below20[num];\n let words = '';\n for (let i = 0; num > 0; i++) {\n if (i > 0 && num % 1000 !== 0) words = above1000[i] + ' ' + words;\n if (num % 100 >= 20) {\n words = tens[Math.floor(num / 10)] + ' ' + words;\n num %= 10;\n }\n if (num < 20) words = below20[num] + ' ' + words;\n num = Math.floor(num / 100);\n }\n return words.trim();\n};\n\n// Usage:\nnumberToWords(123); // Returns: 'One Hundred Twenty Three'\nnumberToWords(2045); // Returns: 'Two Thousand Forty Five'\n", "tags": [ "number", "words" ], - "contributors": [], - "code": "const numberToWords = (num) => {\n const below20 = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n const above1000 = ['Hundred', 'Thousand', 'Million', 'Billion'];\n if (num < 20) return below20[num];\n let words = '';\n for (let i = 0; num > 0; i++) {\n if (i > 0 && num % 1000 !== 0) words = above1000[i] + ' ' + words;\n if (num % 100 >= 20) {\n words = tens[Math.floor(num / 10)] + ' ' + words;\n num %= 10;\n }\n if (num < 20) words = below20[num] + ' ' + words;\n num = Math.floor(num / 100);\n }\n return words.trim();\n};\n\n// Usage:\nnumberToWords(123); // Returns: 'One Hundred Twenty Three'\nnumberToWords(2045); // Returns: 'Two Thousand Forty Five'\n" + "contributors": [] } ] }, @@ -426,150 +426,150 @@ "title": "Check if Object is Empty", "description": "Checks whether an object has no own enumerable properties.", "author": "axorax", + "code": "function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// Usage:\nisEmptyObject({}); // Returns: true\nisEmptyObject({ a: 1 }); // Returns: false\n", "tags": [ "object", "check", "empty" ], - "contributors": [], - "code": "function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// Usage:\nisEmptyObject({}); // Returns: true\nisEmptyObject({ a: 1 }); // Returns: false\n" + "contributors": [] }, { "title": "Compare Two Objects Shallowly", "description": "Compares two objects shallowly and returns whether they are equal.", "author": "axorax", + "code": "function shallowEqual(obj1, obj2) {\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n return keys1.every(key => obj1[key] === obj2[key]);\n}\n\n// Usage:\nconst obj1 = { a: 1, b: 2 };\nconst obj2 = { a: 1, b: 2 };\nconst obj3 = { a: 1, b: 3 };\nshallowEqual(obj1, obj2); // Returns: true\nshallowEqual(obj1, obj3); // Returns: false\n", "tags": [ "object", "compare", "shallow" ], - "contributors": [], - "code": "function shallowEqual(obj1, obj2) {\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n return keys1.every(key => obj1[key] === obj2[key]);\n}\n\n// Usage:\nconst obj1 = { a: 1, b: 2 };\nconst obj2 = { a: 1, b: 2 };\nconst obj3 = { a: 1, b: 3 };\nshallowEqual(obj1, obj2); // Returns: true\nshallowEqual(obj1, obj3); // Returns: false\n" + "contributors": [] }, { "title": "Convert Object to Query String", "description": "Converts an object to a query string for use in URLs.", "author": "axorax", + "code": "function toQueryString(obj) {\n return Object.entries(obj)\n .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))\n .join('&');\n}\n\n// Usage:\nconst params = { search: 'test', page: 1 };\ntoQueryString(params); // Returns: 'search=test&page=1'\n", "tags": [ "object", "query string", "url" ], - "contributors": [], - "code": "function toQueryString(obj) {\n return Object.entries(obj)\n .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))\n .join('&');\n}\n\n// Usage:\nconst params = { search: 'test', page: 1 };\ntoQueryString(params); // Returns: 'search=test&page=1'\n" + "contributors": [] }, { "title": "Count Properties in Object", "description": "Counts the number of own properties in an object.", "author": "axorax", + "code": "function countProperties(obj) {\n return Object.keys(obj).length;\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ncountProperties(obj); // Returns: 3\n", "tags": [ "object", "count", "properties" ], - "contributors": [], - "code": "function countProperties(obj) {\n return Object.keys(obj).length;\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ncountProperties(obj); // Returns: 3\n" + "contributors": [] }, { "title": "Filter Object", "description": "Filter out entries in an object where the value is falsy, including empty strings, empty objects, null, and undefined.", "author": "realvishalrana", + "code": "export const filterObject = (object = {}) =>\n Object.fromEntries(\n Object.entries(object)\n .filter(([key, value]) => value !== null && value !== undefined && value !== '' && (typeof value !== 'object' || Object.keys(value).length > 0))\n );\n\n// Usage:\nconst obj1 = { a: 1, b: null, c: undefined, d: 4, e: '', f: {} };\nfilterObject(obj1); // Returns: { a: 1, d: 4 }\n\nconst obj2 = { x: 0, y: false, z: 'Hello', w: [] };\nfilterObject(obj2); // Returns: { z: 'Hello' }\n\nconst obj3 = { name: 'John', age: null, address: { city: 'New York' }, phone: '' };\nfilterObject(obj3); // Returns: { name: 'John', address: { city: 'New York' } }\n\nconst obj4 = { a: 0, b: '', c: false, d: {}, e: 'Valid' };\nfilterObject(obj4); // Returns: { e: 'Valid' }\n", "tags": [ "object", "filter" ], - "contributors": [], - "code": "export const filterObject = (object = {}) =>\n Object.fromEntries(\n Object.entries(object)\n .filter(([key, value]) => value !== null && value !== undefined && value !== '' && (typeof value !== 'object' || Object.keys(value).length > 0))\n );\n\n// Usage:\nconst obj1 = { a: 1, b: null, c: undefined, d: 4, e: '', f: {} };\nfilterObject(obj1); // Returns: { a: 1, d: 4 }\n\nconst obj2 = { x: 0, y: false, z: 'Hello', w: [] };\nfilterObject(obj2); // Returns: { z: 'Hello' }\n\nconst obj3 = { name: 'John', age: null, address: { city: 'New York' }, phone: '' };\nfilterObject(obj3); // Returns: { name: 'John', address: { city: 'New York' } }\n\nconst obj4 = { a: 0, b: '', c: false, d: {}, e: 'Valid' };\nfilterObject(obj4); // Returns: { e: 'Valid' }\n" + "contributors": [] }, { "title": "Flatten Nested Object", "description": "Flattens a nested object into a single-level object with dot notation for keys.", "author": "axorax", + "code": "function flattenObject(obj, prefix = '') {\n return Object.keys(obj).reduce((acc, key) => {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n Object.assign(acc, flattenObject(obj[key], fullPath));\n } else {\n acc[fullPath] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// Usage:\nconst nestedObj = { a: { b: { c: 1 }, d: 2 }, e: 3 };\nflattenObject(nestedObj); // Returns: { 'a.b.c': 1, 'a.d': 2, e: 3 }\n", "tags": [ "object", "flatten" ], - "contributors": [], - "code": "function flattenObject(obj, prefix = '') {\n return Object.keys(obj).reduce((acc, key) => {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n Object.assign(acc, flattenObject(obj[key], fullPath));\n } else {\n acc[fullPath] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// Usage:\nconst nestedObj = { a: { b: { c: 1 }, d: 2 }, e: 3 };\nflattenObject(nestedObj); // Returns: { 'a.b.c': 1, 'a.d': 2, e: 3 }\n" + "contributors": [] }, { "title": "Freeze Object", "description": "Freezes an object to make it immutable.", "author": "axorax", + "code": "function freezeObject(obj) {\n return Object.freeze(obj);\n}\n\n// Usage:\nconst obj = { a: 1, b: 2 };\nconst frozenObj = freezeObject(obj);\nfrozenObj.a = 42; // This will fail silently in strict mode.\nfrozenObj.a; // Returns: 1\n", "tags": [ "object", "freeze", "immutable" ], - "contributors": [], - "code": "function freezeObject(obj) {\n return Object.freeze(obj);\n}\n\n// Usage:\nconst obj = { a: 1, b: 2 };\nconst frozenObj = freezeObject(obj);\nfrozenObj.a = 42; // This will fail silently in strict mode.\nfrozenObj.a; // Returns: 1\n" + "contributors": [] }, { "title": "Get Nested Value", "description": "Retrieves the value at a given path in a nested object.", "author": "realvishalrana", + "code": "const getNestedValue = (obj, path) => {\n const keys = path.split('.');\n return keys.reduce((currentObject, key) => {\n return currentObject && typeof currentObject === 'object' ? currentObject[key] : undefined;\n }, obj);\n};\n\n// Usage:\nconst obj = { a: { b: { c: 42 } } };\ngetNestedValue(obj, 'a.b.c'); // Returns: 42\n", "tags": [ "object", "nested" ], - "contributors": [], - "code": "const getNestedValue = (obj, path) => {\n const keys = path.split('.');\n return keys.reduce((currentObject, key) => {\n return currentObject && typeof currentObject === 'object' ? currentObject[key] : undefined;\n }, obj);\n};\n\n// Usage:\nconst obj = { a: { b: { c: 42 } } };\ngetNestedValue(obj, 'a.b.c'); // Returns: 42\n" + "contributors": [] }, { "title": "Invert Object Keys and Values", "description": "Creates a new object by swapping keys and values of the given object.", "author": "axorax", + "code": "function invertObject(obj) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [value, key])\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ninvertObject(obj); // Returns: { '1': 'a', '2': 'b', '3': 'c' }\n", "tags": [ "object", "invert" ], - "contributors": [], - "code": "function invertObject(obj) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [value, key])\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ninvertObject(obj); // Returns: { '1': 'a', '2': 'b', '3': 'c' }\n" + "contributors": [] }, { "title": "Merge Objects Deeply", "description": "Deeply merges two or more objects, including nested properties.", "author": "axorax", + "code": "function deepMerge(...objects) {\n return objects.reduce((acc, obj) => {\n Object.keys(obj).forEach(key => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n acc[key] = deepMerge(acc[key] || {}, obj[key]);\n } else {\n acc[key] = obj[key];\n }\n });\n return acc;\n }, {});\n}\n\n// Usage:\nconst obj1 = { a: 1, b: { c: 2 } };\nconst obj2 = { b: { d: 3 }, e: 4 };\ndeepMerge(obj1, obj2); // Returns: { a: 1, b: { c: 2, d: 3 }, e: 4 }\n", "tags": [ "object", "merge", "deep" ], - "contributors": [], - "code": "function deepMerge(...objects) {\n return objects.reduce((acc, obj) => {\n Object.keys(obj).forEach(key => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n acc[key] = deepMerge(acc[key] || {}, obj[key]);\n } else {\n acc[key] = obj[key];\n }\n });\n return acc;\n }, {});\n}\n\n// Usage:\nconst obj1 = { a: 1, b: { c: 2 } };\nconst obj2 = { b: { d: 3 }, e: 4 };\ndeepMerge(obj1, obj2); // Returns: { a: 1, b: { c: 2, d: 3 }, e: 4 }\n" + "contributors": [] }, { "title": "Omit Keys from Object", "description": "Creates a new object with specific keys omitted.", "author": "axorax", + "code": "function omitKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => !keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\nomitKeys(obj, ['b', 'c']); // Returns: { a: 1 }\n", "tags": [ "object", "omit" ], - "contributors": [], - "code": "function omitKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => !keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\nomitKeys(obj, ['b', 'c']); // Returns: { a: 1 }\n" + "contributors": [] }, { "title": "Pick Keys from Object", "description": "Creates a new object with only the specified keys.", "author": "axorax", + "code": "function pickKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\npickKeys(obj, ['a', 'c']); // Returns: { a: 1, c: 3 }\n", "tags": [ "object", "pick" ], - "contributors": [], - "code": "function pickKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\npickKeys(obj, ['a', 'c']); // Returns: { a: 1, c: 3 }\n" + "contributors": [] }, { "title": "Unique By Key", "description": "Filters an array of objects to only include unique objects by a specified key.", "author": "realvishalrana", + "code": "const uniqueByKey = (key, arr) =>\n arr.filter((obj, index, self) => index === self.findIndex((t) => t?.[key] === obj?.[key]));\n\n// Usage:\nconst arr = [\n { id: 1, name: 'John' },\n { id: 2, name: 'Jane' },\n { id: 1, name: 'John' }\n];\nuniqueByKey('id', arr); // Returns: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\n", "tags": [ "array", "unique" ], - "contributors": [], - "code": "const uniqueByKey = (key, arr) =>\n arr.filter((obj, index, self) => index === self.findIndex((t) => t?.[key] === obj?.[key]));\n\n// Usage:\nconst arr = [\n { id: 1, name: 'John' },\n { id: 2, name: 'Jane' },\n { id: 1, name: 'John' }\n];\nuniqueByKey('id', arr); // Returns: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\n" + "contributors": [] } ] }, @@ -580,226 +580,226 @@ "title": "Capitalize String", "description": "Capitalizes the first letter of a string.", "author": "dostonnabotov", + "code": "function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// Usage:\ncapitalize('hello'); // Returns: 'Hello'\n", "tags": [ "string", "capitalize" ], - "contributors": [], - "code": "function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// Usage:\ncapitalize('hello'); // Returns: 'Hello'\n" + "contributors": [] }, { "title": "Check if String is a Palindrome", "description": "Checks whether a given string is a palindrome.", "author": "axorax", + "code": "function isPalindrome(str) {\n const cleanStr = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n return cleanStr === cleanStr.split('').reverse().join('');\n}\n\n// Example usage:\nisPalindrome('A man, a plan, a canal, Panama'); // Returns: true\n", "tags": [ "check", "palindrome", "string" ], - "contributors": [], - "code": "function isPalindrome(str) {\n const cleanStr = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n return cleanStr === cleanStr.split('').reverse().join('');\n}\n\n// Example usage:\nisPalindrome('A man, a plan, a canal, Panama'); // Returns: true\n" + "contributors": [] }, { "title": "Convert String to Camel Case", "description": "Converts a given string into camelCase.", "author": "aumirza", + "code": "function toCamelCase(str) {\n return str.replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoCamelCase('hello world test'); // Returns: 'helloWorldTest'\n", "tags": [ "string", "case", "camelCase" ], - "contributors": [], - "code": "function toCamelCase(str) {\n return str.replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoCamelCase('hello world test'); // Returns: 'helloWorldTest'\n" + "contributors": [] }, { "title": "Convert String to Param Case", "description": "Converts a given string into param-case.", "author": "aumirza", + "code": "function toParamCase(str) {\n return str.toLowerCase().replace(/\\s+/g, '-');\n}\n\n// Usage:\ntoParamCase('Hello World Test'); // Returns: 'hello-world-test'\n", "tags": [ "string", "case", "paramCase" ], - "contributors": [], - "code": "function toParamCase(str) {\n return str.toLowerCase().replace(/\\s+/g, '-');\n}\n\n// Usage:\ntoParamCase('Hello World Test'); // Returns: 'hello-world-test'\n" + "contributors": [] }, { "title": "Convert String to Pascal Case", "description": "Converts a given string into Pascal Case.", "author": "aumirza", + "code": "function toPascalCase(str) {\n return str.replace(/\\b\\w/g, (s) => s.toUpperCase()).replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoPascalCase('hello world test'); // Returns: 'HelloWorldTest'\n", "tags": [ "string", "case", "pascalCase" ], - "contributors": [], - "code": "function toPascalCase(str) {\n return str.replace(/\\b\\w/g, (s) => s.toUpperCase()).replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoPascalCase('hello world test'); // Returns: 'HelloWorldTest'\n" + "contributors": [] }, { "title": "Convert String to Snake Case", "description": "Converts a given string into snake_case.", "author": "axorax", + "code": "function toSnakeCase(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/\\s+/g, '_')\n .toLowerCase();\n}\n\n// Usage:\ntoSnakeCase('Hello World Test'); // Returns: 'hello_world_test'\n", "tags": [ "string", "case", "snake_case" ], - "contributors": [], - "code": "function toSnakeCase(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/\\s+/g, '_')\n .toLowerCase();\n}\n\n// Usage:\ntoSnakeCase('Hello World Test'); // Returns: 'hello_world_test'\n" + "contributors": [] }, { "title": "Convert String to Title Case", "description": "Converts a given string into Title Case.", "author": "aumirza", + "code": "function toTitleCase(str) {\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// Usage:\ntoTitleCase('hello world test'); // Returns: 'Hello World Test'\n", "tags": [ "string", "case", "titleCase" ], - "contributors": [], - "code": "function toTitleCase(str) {\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// Usage:\ntoTitleCase('hello world test'); // Returns: 'Hello World Test'\n" + "contributors": [] }, { "title": "Convert Tabs to Spaces", "description": "Converts all tab characters in a string to spaces.", "author": "axorax", + "code": "function tabsToSpaces(str, spacesPerTab = 4) {\n return str.replace(/\\t/g, ' '.repeat(spacesPerTab));\n}\n\n// Usage:\ntabsToSpaces('Hello\\tWorld', 2); // Returns: 'Hello World'\n", "tags": [ "string", "tabs", "spaces" ], - "contributors": [], - "code": "function tabsToSpaces(str, spacesPerTab = 4) {\n return str.replace(/\\t/g, ' '.repeat(spacesPerTab));\n}\n\n// Usage:\ntabsToSpaces('Hello\\tWorld', 2); // Returns: 'Hello World'\n" + "contributors": [] }, { "title": "Count Words in a String", "description": "Counts the number of words in a string.", "author": "axorax", + "code": "function countWords(str) {\n return str.trim().split(/\\s+/).length;\n}\n\n// Usage:\ncountWords('Hello world! This is a test.'); // Returns: 6\n", "tags": [ "string", "manipulation", "word count", "count" ], - "contributors": [], - "code": "function countWords(str) {\n return str.trim().split(/\\s+/).length;\n}\n\n// Usage:\ncountWords('Hello world! This is a test.'); // Returns: 6\n" + "contributors": [] }, { "title": "Data with Prefix", "description": "Adds a prefix and postfix to data, with a fallback value.", "author": "realvishalrana", + "code": "const dataWithPrefix = (data, fallback = '-', prefix = '', postfix = '') => {\n return data ? `${prefix}${data}${postfix}` : fallback;\n};\n\n// Usage:\ndataWithPrefix('123', '-', '(', ')'); // Returns: '(123)'\ndataWithPrefix('', '-', '(', ')'); // Returns: '-'\ndataWithPrefix('Hello', 'N/A', 'Mr. ', ''); // Returns: 'Mr. Hello'\ndataWithPrefix(null, 'N/A', 'Mr. ', ''); // Returns: 'N/A'\n", "tags": [ "data", "prefix", "postfix", "format" ], - "contributors": [], - "code": "const dataWithPrefix = (data, fallback = '-', prefix = '', postfix = '') => {\n return data ? `${prefix}${data}${postfix}` : fallback;\n};\n\n// Usage:\ndataWithPrefix('123', '-', '(', ')'); // Returns: '(123)'\ndataWithPrefix('', '-', '(', ')'); // Returns: '-'\ndataWithPrefix('Hello', 'N/A', 'Mr. ', ''); // Returns: 'Mr. Hello'\ndataWithPrefix(null, 'N/A', 'Mr. ', ''); // Returns: 'N/A'\n" + "contributors": [] }, { "title": "Extract Initials from Name", "description": "Extracts and returns the initials from a full name.", "author": "axorax", + "code": "function getInitials(name) {\n return name.split(' ').map(part => part.charAt(0).toUpperCase()).join('');\n}\n\n// Usage:\ngetInitials('John Doe'); // Returns: 'JD'\n", "tags": [ "string", "initials", "name" ], - "contributors": [], - "code": "function getInitials(name) {\n return name.split(' ').map(part => part.charAt(0).toUpperCase()).join('');\n}\n\n// Usage:\ngetInitials('John Doe'); // Returns: 'JD'\n" + "contributors": [] }, { "title": "Mask Sensitive Information", "description": "Masks parts of a sensitive string, like a credit card or email address.", "author": "axorax", + "code": "function maskSensitiveInfo(str, visibleCount = 4, maskChar = '*') {\n return str.slice(0, visibleCount) + maskChar.repeat(Math.max(0, str.length - visibleCount));\n}\n\n// Usage:\nmaskSensitiveInfo('123456789', 4); // Returns: '1234*****'\nmaskSensitiveInfo('example@mail.com', 2, '#'); // Returns: 'ex#############'\n", "tags": [ "string", "mask", "sensitive" ], - "contributors": [], - "code": "function maskSensitiveInfo(str, visibleCount = 4, maskChar = '*') {\n return str.slice(0, visibleCount) + maskChar.repeat(Math.max(0, str.length - visibleCount));\n}\n\n// Usage:\nmaskSensitiveInfo('123456789', 4); // Returns: '1234*****'\nmaskSensitiveInfo('example@mail.com', 2, '#'); // Returns: 'ex#############'\n" + "contributors": [] }, { "title": "Pad String on Both Sides", "description": "Pads a string on both sides with a specified character until it reaches the desired length.", "author": "axorax", + "code": "function padString(str, length, char = ' ') {\n const totalPad = length - str.length;\n const padStart = Math.floor(totalPad / 2);\n const padEnd = totalPad - padStart;\n return char.repeat(padStart) + str + char.repeat(padEnd);\n}\n\n// Usage:\npadString('hello', 10, '*'); // Returns: '**hello***'\n", "tags": [ "string", "pad", "manipulation" ], - "contributors": [], - "code": "function padString(str, length, char = ' ') {\n const totalPad = length - str.length;\n const padStart = Math.floor(totalPad / 2);\n const padEnd = totalPad - padStart;\n return char.repeat(padStart) + str + char.repeat(padEnd);\n}\n\n// Usage:\npadString('hello', 10, '*'); // Returns: '**hello***'\n" + "contributors": [] }, { "title": "Random string", "description": "Generates a random string of characters of a certain length", "author": "kruimol", + "code": "function makeid(length, characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {\n return Array.from({ length }, () => characters.charAt(Math.floor(Math.random() * characters.length))).join('');\n}\n\nmakeid(3); // Returns: gDs (Random)\nmakeid(5, \"1234\" /* (optional) */); // Returns: \"35453\" (Random)\n", "tags": [ "function", "random" ], - "contributors": [], - "code": "function makeid(length, characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {\n return Array.from({ length }, () => characters.charAt(Math.floor(Math.random() * characters.length))).join('');\n}\n\nmakeid(3); // Returns: gDs (Random)\nmakeid(5, \"1234\" /* (optional) */); // Returns: \"35453\" (Random)\n" + "contributors": [] }, { "title": "Remove All Whitespace", "description": "Removes all whitespace from a string.", "author": "axorax", + "code": "function removeWhitespace(str) {\n return str.replace(/\\s+/g, '');\n}\n\n// Usage:\nremoveWhitespace('Hello world!'); // Returns: 'Helloworld!'\n", "tags": [ "string", "whitespace" ], - "contributors": [], - "code": "function removeWhitespace(str) {\n return str.replace(/\\s+/g, '');\n}\n\n// Usage:\nremoveWhitespace('Hello world!'); // Returns: 'Helloworld!'\n" + "contributors": [] }, { "title": "Remove Vowels from a String", "description": "Removes all vowels from a given string.", "author": "axorax", + "code": "function removeVowels(str) {\n return str.replace(/[aeiouAEIOU]/g, '');\n}\n\n// Usage:\nremoveVowels('Hello World'); // Returns: 'Hll Wrld'\n", "tags": [ "string", "remove", "vowels" ], - "contributors": [], - "code": "function removeVowels(str) {\n return str.replace(/[aeiouAEIOU]/g, '');\n}\n\n// Usage:\nremoveVowels('Hello World'); // Returns: 'Hll Wrld'\n" + "contributors": [] }, { "title": "Reverse String", "description": "Reverses the characters in a string.", "author": "dostonnabotov", + "code": "const reverseString = (str) => str.split('').reverse().join('');\n\n// Usage:\nreverseString('hello'); // Returns: 'olleh'\n", "tags": [ "string", "reverse" ], - "contributors": [], - "code": "const reverseString = (str) => str.split('').reverse().join('');\n\n// Usage:\nreverseString('hello'); // Returns: 'olleh'\n" + "contributors": [] }, { "title": "Slugify String", "description": "Converts a string into a URL-friendly slug format.", "author": "dostonnabotov", + "code": "const slugify = (string, separator = \"-\") => {\n return string\n .toString() // Cast to string (optional)\n .toLowerCase() // Convert the string to lowercase letters\n .trim() // Remove whitespace from both sides of a string (optional)\n .replace(/\\s+/g, separator) // Replace spaces with {separator}\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\n .replace(/\\_/g, separator) // Replace _ with {separator}\n .replace(/\\-\\-+/g, separator) // Replace multiple - with single {separator}\n .replace(/\\-$/g, \"\"); // Remove trailing -\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\nslugify(title); // Returns: 'hello-world-this-is-a-test'\nslugify(title, \"_\"); // Returns: 'hello_world_this_is_a_test'\n", "tags": [ "string", "slug" ], - "contributors": [], - "code": "const slugify = (string, separator = \"-\") => {\n return string\n .toString() // Cast to string (optional)\n .toLowerCase() // Convert the string to lowercase letters\n .trim() // Remove whitespace from both sides of a string (optional)\n .replace(/\\s+/g, separator) // Replace spaces with {separator}\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\n .replace(/\\_/g, separator) // Replace _ with {separator}\n .replace(/\\-\\-+/g, separator) // Replace multiple - with single {separator}\n .replace(/\\-$/g, \"\"); // Remove trailing -\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\nslugify(title); // Returns: 'hello-world-this-is-a-test'\nslugify(title, \"_\"); // Returns: 'hello_world_this_is_a_test'\n" + "contributors": [] }, { "title": "Truncate Text", "description": "Truncates the text to a maximum length and appends '...' if the text exceeds the maximum length.", "author": "realvishalrana", + "code": "const truncateText = (text = '', maxLength = 50) => {\n return `${text.slice(0, maxLength)}${text.length >= maxLength ? '...' : ''}`;\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\ntruncateText(title); // Returns: 'Hello, World! This is a Test.'\ntruncateText(title, 10); // Returns: 'Hello, Wor...'\n", "tags": [ "string", "truncate", "text" ], - "contributors": [], - "code": "const truncateText = (text = '', maxLength = 50) => {\n return `${text.slice(0, maxLength)}${text.length >= maxLength ? '...' : ''}`;\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\ntruncateText(title); // Returns: 'Hello, World! This is a Test.'\ntruncateText(title, 10); // Returns: 'Hello, Wor...'\n" + "contributors": [] } ] } diff --git a/public/consolidated/python.json b/public/consolidated/python.json index 953272b8..86b32ceb 100644 --- a/public/consolidated/python.json +++ b/public/consolidated/python.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", + "code": "print(\"Hello, World!\") # Prints Hello, World! to the terminal.\n", "tags": [ "printing", "hello-world" ], - "contributors": [], - "code": "print(\"Hello, World!\") # Prints Hello, World! to the terminal.\n" + "contributors": [] } ] }, @@ -22,79 +22,79 @@ "title": "Calculate Date Difference in Milliseconds", "description": "Calculates the difference between two dates in milliseconds.", "author": "e3nviction", + "code": "from datetime import datetime\n\ndef date_difference_in_millis(date1, date2):\n delta = date2 - date1\n return delta.total_seconds() * 1000\n\n# Usage:\nd1 = datetime(2023, 1, 1, 12, 0, 0)\nd2 = datetime(2023, 1, 1, 12, 1, 0)\ndate_difference_in_millis(d1, d2) # Returns: 60000\n", "tags": [ "datetime", "difference" ], - "contributors": [], - "code": "from datetime import datetime\n\ndef date_difference_in_millis(date1, date2):\n delta = date2 - date1\n return delta.total_seconds() * 1000\n\n# Usage:\nd1 = datetime(2023, 1, 1, 12, 0, 0)\nd2 = datetime(2023, 1, 1, 12, 1, 0)\ndate_difference_in_millis(d1, d2) # Returns: 60000\n" + "contributors": [] }, { "title": "Check if Date is a Weekend", "description": "Checks whether a given date falls on a weekend.", "author": "axorax", + "code": "from datetime import datetime\n\ndef is_weekend(date):\n try:\n return date.weekday() >= 5 # Saturday = 5, Sunday = 6\n except AttributeError:\n raise TypeError(\"Input must be a datetime object\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nis_weekend(date) # Returns: True (Sunday)\n", "tags": [ "datetime", "weekend" ], - "contributors": [], - "code": "from datetime import datetime\n\ndef is_weekend(date):\n try:\n return date.weekday() >= 5 # Saturday = 5, Sunday = 6\n except AttributeError:\n raise TypeError(\"Input must be a datetime object\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nis_weekend(date) # Returns: True (Sunday)\n" + "contributors": [] }, { "title": "Day of the Week String", "description": "Gets the string of the day of the week for a given date.", "author": "axorax", + "code": "from datetime import datetime\n\ndef get_day_of_week(date):\n days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n try:\n return days[date.weekday()]\n except IndexError:\n raise ValueError(\"Invalid date\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nget_day_of_week(date) # Returns: 'Sunday'\n", "tags": [ "datetime", "weekday" ], - "contributors": [], - "code": "from datetime import datetime\n\ndef get_day_of_week(date):\n days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n try:\n return days[date.weekday()]\n except IndexError:\n raise ValueError(\"Invalid date\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nget_day_of_week(date) # Returns: 'Sunday'\n" + "contributors": [] }, { "title": "Generate Date Range List", "description": "Generates a list of dates between two given dates.", "author": "axorax", + "code": "from datetime import datetime, timedelta\n\ndef generate_date_range(start_date, end_date):\n if start_date > end_date:\n raise ValueError(\"start_date must be before end_date\")\n\n current_date = start_date\n date_list = []\n while current_date <= end_date:\n date_list.append(current_date)\n current_date += timedelta(days=1)\n\n return date_list\n\n# Usage:\nstart = datetime(2023, 1, 1)\nend = datetime(2023, 1, 5)\ndates = generate_date_range(start, end)\nfor d in dates:\n print(d.strftime('%Y-%m-%d'))\n# Outputs: '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'\n", "tags": [ "datetime", "range" ], - "contributors": [], - "code": "from datetime import datetime, timedelta\n\ndef generate_date_range(start_date, end_date):\n if start_date > end_date:\n raise ValueError(\"start_date must be before end_date\")\n\n current_date = start_date\n date_list = []\n while current_date <= end_date:\n date_list.append(current_date)\n current_date += timedelta(days=1)\n\n return date_list\n\n# Usage:\nstart = datetime(2023, 1, 1)\nend = datetime(2023, 1, 5)\ndates = generate_date_range(start, end)\nfor d in dates:\n print(d.strftime('%Y-%m-%d'))\n# Outputs: '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'\n" + "contributors": [] }, { "title": "Get Current Date and Time as String", "description": "Fetches the current date and time as a formatted string.", "author": "e3nviction", + "code": "from datetime import datetime\n\ndef get_current_datetime_string():\n return datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n\n# Usage:\nget_current_datetime_string() # Returns: '2023-01-01 12:00:00'\n", "tags": [ "datetime", "current", "string" ], - "contributors": [], - "code": "from datetime import datetime\n\ndef get_current_datetime_string():\n return datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n\n# Usage:\nget_current_datetime_string() # Returns: '2023-01-01 12:00:00'\n" + "contributors": [] }, { "title": "Get Number of Days in a Month", "description": "Determines the number of days in a specific month and year.", "author": "axorax", + "code": "from calendar import monthrange\nfrom datetime import datetime\n\ndef get_days_in_month(year, month):\n try:\n return monthrange(year, month)[1]\n except ValueError as e:\n raise ValueError(f\"Invalid month or year: {e}\")\n\n# Usage:\nget_days_in_month(2023, 2) # Returns: 28 (for non-leap year February)\n", "tags": [ "datetime", "calendar" ], - "contributors": [], - "code": "from calendar import monthrange\nfrom datetime import datetime\n\ndef get_days_in_month(year, month):\n try:\n return monthrange(year, month)[1]\n except ValueError as e:\n raise ValueError(f\"Invalid month or year: {e}\")\n\n# Usage:\nget_days_in_month(2023, 2) # Returns: 28 (for non-leap year February)\n" + "contributors": [] }, { "title": "Measure Execution Time", "description": "Measures the execution time of a code block.", "author": "dostonnabotov", + "code": "import time\n\ndef measure_time(func, *args):\n start = time.time()\n result = func(*args)\n end = time.time()\n print(f'Execution time: {end - start:.6f} seconds')\n return result\n\n# Usage:\ndef slow_function():\n time.sleep(2)\n\nmeasure_time(slow_function) # Outputs an execution time of ~2s\n", "tags": [ "time", "execution" ], - "contributors": [], - "code": "import time\n\ndef measure_time(func, *args):\n start = time.time()\n result = func(*args)\n end = time.time()\n print(f'Execution time: {end - start:.6f} seconds')\n return result\n\n# Usage:\ndef slow_function():\n time.sleep(2)\n\nmeasure_time(slow_function) # Outputs an execution time of ~2s\n" + "contributors": [] } ] }, @@ -105,25 +105,25 @@ "title": "Create Custom Exception Type", "description": "Create a Custom Exception Type that can be called with raise.", "author": "mrcool7387", + "code": "class ExceptionName(BaseException):\n def __init__(message: str):\n super().__init__(message)\n\n# Usage\na: int = 1\n\nif a > 0:\n raise ExceptionName('Error Message')\n", "tags": [ "python", "error-creation", "organisation", "utility" ], - "contributors": [], - "code": "class ExceptionName(BaseException):\n def __init__(message: str):\n super().__init__(message)\n\n# Usage\na: int = 1\n\nif a > 0:\n raise ExceptionName('Error Message')\n" + "contributors": [] }, { "title": "Retry Function Execution on Exception", "description": "Retries a function execution a specified number of times if it raises an exception.", "author": "axorax", + "code": "import time\n\ndef retry(func, retries=3, delay=1):\n for attempt in range(retries):\n try:\n return func()\n except Exception as e:\n print(f\"Attempt {attempt + 1} failed: {e}\")\n time.sleep(delay)\n raise Exception(\"All retry attempts failed\")\n\n# Usage:\ndef unstable_function():\n raise ValueError(\"Simulated failure\")\n\n# Retry 3 times with 2 seconds delay:\ntry:\n retry(unstable_function, retries=3, delay=2)\nexcept Exception as e:\n print(e) # Output: All retry attempts failed\n", "tags": [ "error-handling", "retry" ], - "contributors": [], - "code": "import time\n\ndef retry(func, retries=3, delay=1):\n for attempt in range(retries):\n try:\n return func()\n except Exception as e:\n print(f\"Attempt {attempt + 1} failed: {e}\")\n time.sleep(delay)\n raise Exception(\"All retry attempts failed\")\n\n# Usage:\ndef unstable_function():\n raise ValueError(\"Simulated failure\")\n\n# Retry 3 times with 2 seconds delay:\ntry:\n retry(unstable_function, retries=3, delay=2)\nexcept Exception as e:\n print(e) # Output: All retry attempts failed\n" + "contributors": [] } ] }, @@ -134,48 +134,48 @@ "title": "Find Files", "description": "Finds all files of the specified type within a given directory.", "author": "Jackeastern", + "code": "import os\n\ndef find_files(directory, file_type):\n file_type = file_type.lower() # Convert file_type to lowercase\n found_files = []\n\n for root, _, files in os.walk(directory):\n for file in files:\n file_ext = os.path.splitext(file)[1].lower()\n if file_ext == file_type:\n full_path = os.path.join(root, file)\n found_files.append(full_path)\n\n return found_files\n\n# Example Usage:\nfind_files('/path/to/your/directory', '.pdf') # Returns all .pdf in directory\n", "tags": [ "os", "filesystem", "file_search" ], - "contributors": [], - "code": "import os\n\ndef find_files(directory, file_type):\n file_type = file_type.lower() # Convert file_type to lowercase\n found_files = []\n\n for root, _, files in os.walk(directory):\n for file in files:\n file_ext = os.path.splitext(file)[1].lower()\n if file_ext == file_type:\n full_path = os.path.join(root, file)\n found_files.append(full_path)\n\n return found_files\n\n# Example Usage:\nfind_files('/path/to/your/directory', '.pdf') # Returns all .pdf in directory\n" + "contributors": [] }, { "title": "Get File Extension", "description": "Gets the extension of a file.", "author": "axorax", + "code": "import os\n\ndef get_file_extension(filepath):\n return os.path.splitext(filepath)[1]\n\n# Usage:\nget_file_extension('example.txt') # Returns: '.txt'\n", "tags": [ "file", "extension" ], - "contributors": [], - "code": "import os\n\ndef get_file_extension(filepath):\n return os.path.splitext(filepath)[1]\n\n# Usage:\nget_file_extension('example.txt') # Returns: '.txt'\n" + "contributors": [] }, { "title": "List Files in Directory", "description": "Lists all files in a specified directory.", "author": "axorax", + "code": "import os\n\ndef list_files(directory):\n return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]\n\n# Usage:\nlist_files('/path/to/directory') # Returns: List of file in the directory\n", "tags": [ "file", "list", "directory" ], - "contributors": [], - "code": "import os\n\ndef list_files(directory):\n return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]\n\n# Usage:\nlist_files('/path/to/directory') # Returns: List of file in the directory\n" + "contributors": [] }, { "title": "Read File in Chunks", "description": "Reads a file in chunks of a specified size.", "author": "axorax", + "code": "def read_file_in_chunks(filepath, chunk_size):\n with open(filepath, 'r') as file:\n while chunk := file.read(chunk_size):\n yield chunk\n\n# Usage:\nfor chunk in read_file_in_chunks('example.txt', 1024):\n print(chunk) # Outputs: Chucks of 1024 bytes\n", "tags": [ "file", "read", "chunks" ], - "contributors": [], - "code": "def read_file_in_chunks(filepath, chunk_size):\n with open(filepath, 'r') as file:\n while chunk := file.read(chunk_size):\n yield chunk\n\n# Usage:\nfor chunk in read_file_in_chunks('example.txt', 1024):\n print(chunk) # Outputs: Chucks of 1024 bytes\n" + "contributors": [] } ] }, @@ -186,73 +186,73 @@ "title": "Filter JSON Data", "description": "Filters a JSON object based on a condition and returns the filtered data.", "author": "axorax", + "code": "import json\n\ndef filter_json_data(filepath, condition):\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Filter data based on the provided condition\n filtered_data = [item for item in data if condition(item)]\n\n return filtered_data\n\n# Usage:\ncondition = lambda x: x['age'] > 25\nfilter_json_data('data.json', condition) # Returns: `data.json` filtered with `condition`\n", "tags": [ "json", "filter", "data" ], - "contributors": [], - "code": "import json\n\ndef filter_json_data(filepath, condition):\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Filter data based on the provided condition\n filtered_data = [item for item in data if condition(item)]\n\n return filtered_data\n\n# Usage:\ncondition = lambda x: x['age'] > 25\nfilter_json_data('data.json', condition) # Returns: `data.json` filtered with `condition`\n" + "contributors": [] }, { "title": "Flatten Nested JSON", "description": "Flattens a nested JSON object into a flat dictionary.", "author": "axorax", + "code": "def flatten_json(nested_json, prefix=''):\n flat_dict = {}\n for key, value in nested_json.items():\n if isinstance(value, dict):\n flat_dict.update(flatten_json(value, prefix + key + '.'))\n else:\n flat_dict[prefix + key] = value\n return flat_dict\n\n# Usage:\nnested_json = {'name': 'John', 'address': {'city': 'New York', 'zip': '10001'}}\nflatten_json(nested_json) # Returns: {'name': 'John', 'address.city': 'New York', 'address.zip': '10001'}\n", "tags": [ "json", "flatten", "nested" ], - "contributors": [], - "code": "def flatten_json(nested_json, prefix=''):\n flat_dict = {}\n for key, value in nested_json.items():\n if isinstance(value, dict):\n flat_dict.update(flatten_json(value, prefix + key + '.'))\n else:\n flat_dict[prefix + key] = value\n return flat_dict\n\n# Usage:\nnested_json = {'name': 'John', 'address': {'city': 'New York', 'zip': '10001'}}\nflatten_json(nested_json) # Returns: {'name': 'John', 'address.city': 'New York', 'address.zip': '10001'}\n" + "contributors": [] }, { "title": "Merge Multiple JSON Files", "description": "Merges multiple JSON files into one and writes the merged data into a new file.", "author": "axorax", + "code": "import json\n\ndef merge_json_files(filepaths, output_filepath):\n merged_data = []\n\n # Read each JSON file and merge their data\n for filepath in filepaths:\n with open(filepath, 'r') as file:\n data = json.load(file)\n merged_data.extend(data)\n\n # Write the merged data into a new file\n with open(output_filepath, 'w') as file:\n json.dump(merged_data, file, indent=4)\n\n# Usage:\nfiles_to_merge = ['file1.json', 'file2.json']\nmerge_json_files(files_to_merge, 'merged.json')\n", "tags": [ "json", "merge", "file" ], - "contributors": [], - "code": "import json\n\ndef merge_json_files(filepaths, output_filepath):\n merged_data = []\n\n # Read each JSON file and merge their data\n for filepath in filepaths:\n with open(filepath, 'r') as file:\n data = json.load(file)\n merged_data.extend(data)\n\n # Write the merged data into a new file\n with open(output_filepath, 'w') as file:\n json.dump(merged_data, file, indent=4)\n\n# Usage:\nfiles_to_merge = ['file1.json', 'file2.json']\nmerge_json_files(files_to_merge, 'merged.json')\n" + "contributors": [] }, { "title": "Read JSON File", "description": "Reads a JSON file and parses its content.", "author": "e3nviction", + "code": "import json\n\ndef read_json(filepath):\n with open(filepath, 'r') as file:\n return json.load(file)\n\n# Usage:\nread_json('data.json') # Returns: Content of file as dict\n", "tags": [ "json", "file", "read" ], - "contributors": [], - "code": "import json\n\ndef read_json(filepath):\n with open(filepath, 'r') as file:\n return json.load(file)\n\n# Usage:\nread_json('data.json') # Returns: Content of file as dict\n" + "contributors": [] }, { "title": "Update JSON File", "description": "Updates an existing JSON file with new data or modifies the existing values.", "author": "axorax", + "code": "import json\n\ndef update_json(filepath, new_data):\n # Read the existing JSON data\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Update the data with the new content\n data.update(new_data)\n\n # Write the updated data back to the JSON file\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\nnew_data = {'age': 31}\nupdate_json('data.json', new_data) # Updates `age` in `data.json` without modifying other keys\n", "tags": [ "json", "update", "file" ], - "contributors": [], - "code": "import json\n\ndef update_json(filepath, new_data):\n # Read the existing JSON data\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Update the data with the new content\n data.update(new_data)\n\n # Write the updated data back to the JSON file\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\nnew_data = {'age': 31}\nupdate_json('data.json', new_data) # Updates `age` in `data.json` without modifying other keys\n" + "contributors": [] }, { "title": "Write JSON File", "description": "Writes a dictionary to a JSON file.", "author": "e3nviction", + "code": "import json\n\ndef write_json(filepath, data):\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\ndata = {'name': 'John', 'age': 30}\nwrite_json('data.json', data)\n", "tags": [ "json", "file", "write" ], - "contributors": [], - "code": "import json\n\ndef write_json(filepath, data):\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\ndata = {'name': 'John', 'age': 30}\nwrite_json('data.json', data)\n" + "contributors": [] } ] }, @@ -263,81 +263,81 @@ "title": "Find Duplicates in a List", "description": "Identifies duplicate elements in a list.", "author": "axorax", + "code": "def find_duplicates(lst):\n seen = set()\n duplicates = set()\n for item in lst:\n if item in seen:\n duplicates.add(item)\n else:\n seen.add(item)\n return list(duplicates)\n\n# Usage:\ndata = [1, 2, 3, 2, 4, 5, 1]\nfind_duplicates(data) # Returns: [1, 2]\n", "tags": [ "list", "duplicates" ], - "contributors": [], - "code": "def find_duplicates(lst):\n seen = set()\n duplicates = set()\n for item in lst:\n if item in seen:\n duplicates.add(item)\n else:\n seen.add(item)\n return list(duplicates)\n\n# Usage:\ndata = [1, 2, 3, 2, 4, 5, 1]\nfind_duplicates(data) # Returns: [1, 2]\n" + "contributors": [] }, { "title": "Find Intersection of Two Lists", "description": "Finds the common elements between two lists.", "author": "axorax", + "code": "def list_intersection(lst1, lst2):\n return [item for item in lst1 if item in lst2]\n\n# Usage:\nlist_a = [1, 2, 3, 4]\nlist_b = [3, 4, 5, 6]\nlist_intersection(list_a, list_b) # Returns: [3, 4]\n", "tags": [ "list", "intersection" ], - "contributors": [], - "code": "def list_intersection(lst1, lst2):\n return [item for item in lst1 if item in lst2]\n\n# Usage:\nlist_a = [1, 2, 3, 4]\nlist_b = [3, 4, 5, 6]\nlist_intersection(list_a, list_b) # Returns: [3, 4]\n" + "contributors": [] }, { "title": "Find Maximum Difference in List", "description": "Finds the maximum difference between any two elements in a list.", "author": "axorax", + "code": "def max_difference(lst):\n if not lst or len(lst) < 2:\n return 0\n return max(lst) - min(lst)\n\n# Usage:\ndata = [10, 3, 5, 20, 7]\nmax_difference(data) # Returns: 17\n", "tags": [ "list", "difference" ], - "contributors": [], - "code": "def max_difference(lst):\n if not lst or len(lst) < 2:\n return 0\n return max(lst) - min(lst)\n\n# Usage:\ndata = [10, 3, 5, 20, 7]\nmax_difference(data) # Returns: 17\n" + "contributors": [] }, { "title": "Flatten Nested List", "description": "Flattens a multi-dimensional list into a single list.", "author": "dostonnabotov", + "code": "def flatten_list(lst):\n return [item for sublist in lst for item in sublist]\n\n# Usage:\nnested_list = [[1, 2], [3, 4], [5]]\nflatten_list(nested_list) # Returns: [1, 2, 3, 4, 5]\n", "tags": [ "list", "flatten" ], - "contributors": [], - "code": "def flatten_list(lst):\n return [item for sublist in lst for item in sublist]\n\n# Usage:\nnested_list = [[1, 2], [3, 4], [5]]\nflatten_list(nested_list) # Returns: [1, 2, 3, 4, 5]\n" + "contributors": [] }, { "title": "Flatten Unevenly Nested Lists", "description": "Converts unevenly nested lists of any depth into a single flat list.", "author": "agilarasu", + "code": "def flatten(nested_list):\n for item in nested_list:\n if isinstance(item, list):\n yield from flatten(item)\n else:\n yield item\n\n# Usage:\nnested_list = [1, [2, [3, 4]], 5]\nlist(flatten(nested_list)) # Returns: [1, 2, 3, 4, 5]\n", "tags": [ "list", "flattening", "nested-lists", "depth" ], - "contributors": [], - "code": "def flatten(nested_list):\n for item in nested_list:\n if isinstance(item, list):\n yield from flatten(item)\n else:\n yield item\n\n# Usage:\nnested_list = [1, [2, [3, 4]], 5]\nlist(flatten(nested_list)) # Returns: [1, 2, 3, 4, 5]\n" + "contributors": [] }, { "title": "Partition List", "description": "Partitions a list into sublists of a given size.", "author": "axorax", + "code": "def partition_list(lst, size):\n for i in range(0, len(lst), size):\n yield lst[i:i + size]\n\n# Usage:\ndata = [1, 2, 3, 4, 5, 6, 7]\nlist(partition_list(data, 3)) # Returns: [[1, 2, 3], [4, 5, 6], [7]]\n", "tags": [ "list", "partition" ], - "contributors": [], - "code": "def partition_list(lst, size):\n for i in range(0, len(lst), size):\n yield lst[i:i + size]\n\n# Usage:\ndata = [1, 2, 3, 4, 5, 6, 7]\nlist(partition_list(data, 3)) # Returns: [[1, 2, 3], [4, 5, 6], [7]]\n" + "contributors": [] }, { "title": "Remove Duplicates", "description": "Removes duplicate elements from a list while maintaining order.", "author": "dostonnabotov", + "code": "def remove_duplicates(lst):\n return list(dict.fromkeys(lst))\n\n# Usage:\nremove_duplicates([1, 2, 2, 3, 4, 4, 5]) # Returns: [1, 2, 3, 4, 5]\n", "tags": [ "list", "duplicates", "filter" ], - "contributors": [], - "code": "def remove_duplicates(lst):\n return list(dict.fromkeys(lst))\n\n# Usage:\nremove_duplicates([1, 2, 2, 3, 4, 4, 5]) # Returns: [1, 2, 3, 4, 5]\n" + "contributors": [] } ] }, @@ -348,67 +348,68 @@ "title": "Calculate Compound Interest", "description": "Calculates compound interest for a given principal amount, rate, and time period.", "author": "axorax", + "code": "def compound_interest(principal, rate, time, n=1):\n return principal * (1 + rate / n) ** (n * time)\n\n# Usage:\ncompound_interest(1000, 0.05, 5) # Returns: 1276.2815625000003\ncompound_interest(1000, 0.05, 5, 12) # Returns: 1283.68\n", "tags": [ "python", "math", "compound interest", "finance" ], - "contributors": [], - "code": "def compound_interest(principal, rate, time, n=1):\n return principal * (1 + rate / n) ** (n * time)\n\n# Usage:\ncompound_interest(1000, 0.05, 5) # Returns: 1276.2815625000003\ncompound_interest(1000, 0.05, 5, 12) # Returns: 1283.68\n" + "contributors": [] }, { "title": "Check Perfect Square", "description": "Checks if a number is a perfect square.", "author": "axorax", + "code": "def is_perfect_square(n):\n if n < 0:\n return False\n root = int(n**0.5)\n return root * root == n\n\n# Usage:\nis_perfect_square(16) # Returns: True\nis_perfect_square(20) # Returns: False\n", "tags": [ "math", "perfect square", "check" ], - "contributors": [], - "code": "def is_perfect_square(n):\n if n < 0:\n return False\n root = int(n**0.5)\n return root * root == n\n\n# Usage:\nis_perfect_square(16) # Returns: True\nis_perfect_square(20) # Returns: False\n" + "contributors": [] }, { "title": "Check Prime Number", "description": "Checks if a number is a prime number.", "author": "dostonnabotov", + "code": "def is_prime(n):\n if n <= 1:\n return False\n for i in range(2, int(n**0.5) + 1):\n if n % i == 0:\n return False\n return True\n\n# Usage:\nis_prime(17) # Returns: True\n", "tags": [ "math", "prime", "check" ], - "contributors": [], - "code": "def is_prime(n):\n if n <= 1:\n return False\n for i in range(2, int(n**0.5) + 1):\n if n % i == 0:\n return False\n return True\n\n# Usage:\nis_prime(17) # Returns: True\n" + "contributors": [] }, { "title": "Convert Binary to Decimal", "description": "Converts a binary string to its decimal equivalent.", "author": "axorax", + "code": "def binary_to_decimal(binary_str):\n return int(binary_str, 2)\n\n# Usage:\nbinary_to_decimal('1010') # Returns: 10\nbinary_to_decimal('1101') # Returns: 13\n", "tags": [ "math", "binary", "decimal", "conversion" ], - "contributors": [], - "code": "def binary_to_decimal(binary_str):\n return int(binary_str, 2)\n\n# Usage:\nbinary_to_decimal('1010') # Returns: 10\nbinary_to_decimal('1101') # Returns: 13\n" + "contributors": [] }, { "title": "Convert Bytes to Human-Readable Format", "description": "Converts a size in bytes to a human-readable format.", "author": "axorax", + "code": "def bytes_to_human_readable(num):\n for unit in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']:\n if num < 1024:\n return f\"{num:.2f} {unit}\"\n num /= 1024\n\n# Usage:\nbytes_to_human_readable(123456789) # Returns: '117.74 MB'\n", "tags": [ "bytes", "format" ], - "contributors": [], - "code": "def bytes_to_human_readable(num):\n for unit in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']:\n if num < 1024:\n return f\"{num:.2f} {unit}\"\n num /= 1024\n\n# Usage:\nbytes_to_human_readable(123456789) # Returns: '117.74 MB'\n" + "contributors": [] }, { "title": "Find LCM (Least Common Multiple)", "description": "Calculates the least common multiple (LCM) of two numbers.", "author": "axorax", + "code": "def lcm(a, b):\n return abs(a * b) // gcd(a, b)\n\n# Usage:\nlcm(12, 15) # Returns: 60\nlcm(7, 5) # Returns: 35\n", "tags": [ "python", "math", @@ -416,21 +417,20 @@ "gcd", "utility" ], - "contributors": [], - "code": "def lcm(a, b):\n return abs(a * b) // gcd(a, b)\n\n# Usage:\nlcm(12, 15) # Returns: 60\nlcm(7, 5) # Returns: 35\n" + "contributors": [] }, { "title": "Solve Quadratic Equation", "description": "Solves a quadratic equation ax^2 + bx + c = 0 and returns the roots.", "author": "axorax", + "code": "import cmath\n\ndef solve_quadratic(a, b, c):\n discriminant = cmath.sqrt(b**2 - 4 * a * c)\n root1 = (-b + discriminant) / (2 * a)\n root2 = (-b - discriminant) / (2 * a)\n return root1, root2\n\n# Usage:\nsolve_quadratic(1, -3, 2) # Returns: ((2+0j), (1+0j))\nsolve_quadratic(1, 2, 5) # Returns: ((-1+2j), (-1-2j))\n", "tags": [ "math", "quadratic", "equation", "solver" ], - "contributors": [], - "code": "import cmath\n\ndef solve_quadratic(a, b, c):\n discriminant = cmath.sqrt(b**2 - 4 * a * c)\n root1 = (-b + discriminant) / (2 * a)\n root2 = (-b - discriminant) / (2 * a)\n return root1, root2\n\n# Usage:\nsolve_quadratic(1, -3, 2) # Returns: ((2+0j), (1+0j))\nsolve_quadratic(1, 2, 5) # Returns: ((-1+2j), (-1-2j))\n" + "contributors": [] } ] }, @@ -441,46 +441,46 @@ "title": "Create SQLite Database Table", "description": "Creates a table in an SQLite database with a dynamic schema.", "author": "e3nviction", + "code": "import sqlite3\n\ndef create_table(db_name, table_name, schema):\n conn = sqlite3.connect(db_name)\n cursor = conn.cursor()\n schema_string = ', '.join([f'{col} {dtype}' for col, dtype in schema.items()])\n cursor.execute(f'''\n CREATE TABLE IF NOT EXISTS {table_name} (\n {schema_string}\n )''')\n conn.commit()\n conn.close()\n\n# Usage:\ndb_name = 'example.db'\ntable_name = 'users'\nschema = {\n 'id': 'INTEGER PRIMARY KEY',\n 'name': 'TEXT',\n 'age': 'INTEGER',\n 'email': 'TEXT'\n}\ncreate_table(db_name, table_name, schema)\n", "tags": [ "sqlite", "database", "table" ], - "contributors": [], - "code": "import sqlite3\n\ndef create_table(db_name, table_name, schema):\n conn = sqlite3.connect(db_name)\n cursor = conn.cursor()\n schema_string = ', '.join([f'{col} {dtype}' for col, dtype in schema.items()])\n cursor.execute(f'''\n CREATE TABLE IF NOT EXISTS {table_name} (\n {schema_string}\n )''')\n conn.commit()\n conn.close()\n\n# Usage:\ndb_name = 'example.db'\ntable_name = 'users'\nschema = {\n 'id': 'INTEGER PRIMARY KEY',\n 'name': 'TEXT',\n 'age': 'INTEGER',\n 'email': 'TEXT'\n}\ncreate_table(db_name, table_name, schema)\n" + "contributors": [] }, { "title": "Insert Data into Sqlite Table", "description": "Inserts a row into a specified SQLite table using a dictionary of fields and values.", "author": "e3nviction", + "code": "import sqlite3\n\ndef insert_into_table(db_path, table_name, data):\n with sqlite3.connect(db_path) as conn:\n columns = ', '.join(data.keys())\n placeholders = ', '.join(['?'] * len(data))\n sql = f\"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})\"\n conn.execute(sql, tuple(data.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ndata = {\n 'name': 'John Doe',\n 'email': 'john@example.com',\n 'age': 30\n}\ninsert_into_table(db_path, table_name, data)\n", "tags": [ "sqlite", "database" ], - "contributors": [], - "code": "import sqlite3\n\ndef insert_into_table(db_path, table_name, data):\n with sqlite3.connect(db_path) as conn:\n columns = ', '.join(data.keys())\n placeholders = ', '.join(['?'] * len(data))\n sql = f\"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})\"\n conn.execute(sql, tuple(data.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ndata = {\n 'name': 'John Doe',\n 'email': 'john@example.com',\n 'age': 30\n}\ninsert_into_table(db_path, table_name, data)\n" + "contributors": [] }, { "title": "Query Data from Sqlite Table", "description": "Fetches data from a specified SQLite table, with options for selecting specific columns and applying a WHERE clause.", "author": "pl44t", + "code": "import sqlite3\n\ndef query_table(db_path, table_name, columns='*', where_clause=None):\n with sqlite3.connect(db_path) as conn:\n cursor = conn.cursor()\n sql = f\"SELECT {columns} FROM {table_name}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n cursor.execute(sql)\n return cursor.fetchall()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ncolumns = 'id, name, email'\nwhere_clause = 'age > 25'\nresult = query_table(db_path, table_name, columns, where_clause)\nfor row in result:\n print(row)\n\n", "tags": [ "sqlite", "database" ], - "contributors": [], - "code": "import sqlite3\n\ndef query_table(db_path, table_name, columns='*', where_clause=None):\n with sqlite3.connect(db_path) as conn:\n cursor = conn.cursor()\n sql = f\"SELECT {columns} FROM {table_name}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n cursor.execute(sql)\n return cursor.fetchall()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ncolumns = 'id, name, email'\nwhere_clause = 'age > 25'\nresult = query_table(db_path, table_name, columns, where_clause)\nfor row in result:\n print(row)\n\n" + "contributors": [] }, { "title": "Update Records in Sqlite Table", "description": "Updates records in a specified SQLite table, allowing dynamic column updates and an optional WHERE clause.", "author": "pl44t", + "code": "import sqlite3\n\ndef update_table(db_path, table_name, updates, where_clause=None):\n with sqlite3.connect(db_path) as conn:\n set_clause = ', '.join([f\"{col} = ?\" for col in updates.keys()])\n sql = f\"UPDATE {table_name} SET {set_clause}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n conn.execute(sql, tuple(updates.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\nupdates = {'name': 'Jane Doe', 'age': 28}\nwhere_clause = \"id = 1\"\nupdate_table(db_path, table_name, updates, where_clause)\n\n", "tags": [ "sqlite", "database" ], - "contributors": [], - "code": "import sqlite3\n\ndef update_table(db_path, table_name, updates, where_clause=None):\n with sqlite3.connect(db_path) as conn:\n set_clause = ', '.join([f\"{col} = ?\" for col in updates.keys()])\n sql = f\"UPDATE {table_name} SET {set_clause}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n conn.execute(sql, tuple(updates.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\nupdates = {'name': 'Jane Doe', 'age': 28}\nwhere_clause = \"id = 1\"\nupdate_table(db_path, table_name, updates, where_clause)\n\n" + "contributors": [] } ] }, @@ -491,222 +491,222 @@ "title": "Capitalize Words", "description": "Capitalizes the first letter of each word in a string.", "author": "axorax", + "code": "def capitalize_words(s):\n return ' '.join(word.capitalize() for word in s.split())\n\n# Usage:\ncapitalize_words('hello world') # Returns: 'Hello World'\n", "tags": [ "string", "capitalize" ], - "contributors": [], - "code": "def capitalize_words(s):\n return ' '.join(word.capitalize() for word in s.split())\n\n# Usage:\ncapitalize_words('hello world') # Returns: 'Hello World'\n" + "contributors": [] }, { "title": "Check Anagram", "description": "Checks if two strings are anagrams of each other.", "author": "SteliosGee", + "code": "def is_anagram(s1, s2):\n return sorted(s1) == sorted(s2)\n\n# Usage:\nis_anagram('listen', 'silent') # Returns: True\n", "tags": [ "string", "anagram", "check" ], - "contributors": [], - "code": "def is_anagram(s1, s2):\n return sorted(s1) == sorted(s2)\n\n# Usage:\nis_anagram('listen', 'silent') # Returns: True\n" + "contributors": [] }, { "title": "Check Palindrome", "description": "Checks if a string is a palindrome.", "author": "dostonnabotov", + "code": "def is_palindrome(s):\n s = s.lower().replace(' ', '')\n return s == s[::-1]\n\n# Usage:\nis_palindrome('A man a plan a canal Panama') # Returns: True\n", "tags": [ "string", "palindrome" ], - "contributors": [], - "code": "def is_palindrome(s):\n s = s.lower().replace(' ', '')\n return s == s[::-1]\n\n# Usage:\nis_palindrome('A man a plan a canal Panama') # Returns: True\n" + "contributors": [] }, { "title": "Convert Snake Case to Camel Case", "description": "Converts a snake_case string to camelCase.", "author": "axorax", + "code": "def snake_to_camel(s):\n parts = s.split('_')\n return parts[0] + ''.join(word.capitalize() for word in parts[1:])\n\n# Usage:\nsnake_to_camel('hello_world') # Returns: 'helloWorld'\n", "tags": [ "string", "snake-case", "camel-case", "convert" ], - "contributors": [], - "code": "def snake_to_camel(s):\n parts = s.split('_')\n return parts[0] + ''.join(word.capitalize() for word in parts[1:])\n\n# Usage:\nsnake_to_camel('hello_world') # Returns: 'helloWorld'\n" + "contributors": [] }, { "title": "Convert String to ASCII", "description": "Converts a string into its ASCII representation.", "author": "axorax", + "code": "def string_to_ascii(s):\n return [ord(char) for char in s]\n\n# Usage:\nstring_to_ascii('hello') # Returns: [104, 101, 108, 108, 111]\n", "tags": [ "string", "ascii", "convert" ], - "contributors": [], - "code": "def string_to_ascii(s):\n return [ord(char) for char in s]\n\n# Usage:\nstring_to_ascii('hello') # Returns: [104, 101, 108, 108, 111]\n" + "contributors": [] }, { "title": "Count Character Frequency", "description": "Counts the frequency of each character in a string.", "author": "axorax", + "code": "from collections import Counter\n\ndef char_frequency(s):\n return dict(Counter(s))\n\n# Usage:\nchar_frequency('hello') # Returns: {'h': 1, 'e': 1, 'l': 2, 'o': 1}\n", "tags": [ "string", "character-frequency" ], - "contributors": [], - "code": "from collections import Counter\n\ndef char_frequency(s):\n return dict(Counter(s))\n\n# Usage:\nchar_frequency('hello') # Returns: {'h': 1, 'e': 1, 'l': 2, 'o': 1}\n" + "contributors": [] }, { "title": "Count Vowels", "description": "Counts the number of vowels in a string.", "author": "SteliosGee", + "code": "def count_vowels(s):\n vowels = 'aeiou'\n return len([char for char in s.lower() if char in vowels])\n\n# Usage:\ncount_vowels('hello') # Returns: 2\n", "tags": [ "string", "vowels", "count" ], - "contributors": [], - "code": "def count_vowels(s):\n vowels = 'aeiou'\n return len([char for char in s.lower() if char in vowels])\n\n# Usage:\ncount_vowels('hello') # Returns: 2\n" + "contributors": [] }, { "title": "Count Words", "description": "Counts the number of words in a string.", "author": "axorax", + "code": "def count_words(s):\n return len(s.split())\n\n# Usage:\ncount_words('The quick brown fox') # Returns: 4\n", "tags": [ "string", "word-count" ], - "contributors": [], - "code": "def count_words(s):\n return len(s.split())\n\n# Usage:\ncount_words('The quick brown fox') # Returns: 4\n" + "contributors": [] }, { "title": "Find All Substrings", "description": "Finds all substrings of a given string.", "author": "axorax", + "code": "def find_substrings(s):\n substrings = []\n for i in range(len(s)):\n for j in range(i + 1, len(s) + 1):\n substrings.append(s[i:j])\n return substrings\n\n# Usage:\nfind_substrings('abc') # Returns: ['a', 'ab', 'abc', 'b', 'bc', 'c']\n", "tags": [ "string", "substring", "find" ], - "contributors": [], - "code": "def find_substrings(s):\n substrings = []\n for i in range(len(s)):\n for j in range(i + 1, len(s) + 1):\n substrings.append(s[i:j])\n return substrings\n\n# Usage:\nfind_substrings('abc') # Returns: ['a', 'ab', 'abc', 'b', 'bc', 'c']\n" + "contributors": [] }, { "title": "Find Longest Word", "description": "Finds the longest word in a string.", "author": "axorax", + "code": "def find_longest_word(s):\n words = s.split()\n return max(words, key=len) if words else ''\n\n# Usage:\nfind_longest_word('The quick brown fox') # Returns: 'quick'\n", "tags": [ "string", "longest-word" ], - "contributors": [], - "code": "def find_longest_word(s):\n words = s.split()\n return max(words, key=len) if words else ''\n\n# Usage:\nfind_longest_word('The quick brown fox') # Returns: 'quick'\n" + "contributors": [] }, { "title": "Find Unique Characters", "description": "Finds all unique characters in a string.", "author": "axorax", + "code": "def find_unique_chars(s):\n return ''.join(sorted(set(s)))\n\n# Usage:\nfind_unique_chars('banana') # Results: 'abn'\n", "tags": [ "string", "unique", "characters" ], - "contributors": [], - "code": "def find_unique_chars(s):\n return ''.join(sorted(set(s)))\n\n# Usage:\nfind_unique_chars('banana') # Results: 'abn'\n" + "contributors": [] }, { "title": "Generate Random String", "description": "Generates a random alphanumeric string.", "author": "dostonnabotov", + "code": "import random\nimport string\n\ndef random_string(length):\n letters_and_digits = string.ascii_letters + string.digits\n return ''.join(random.choice(letters_and_digits) for _ in range(length))\n\n# Usage:\nrandom_string(10) # Results: Random 10-character string\n", "tags": [ "random", "string" ], - "contributors": [], - "code": "import random\nimport string\n\ndef random_string(length):\n letters_and_digits = string.ascii_letters + string.digits\n return ''.join(random.choice(letters_and_digits) for _ in range(length))\n\n# Usage:\nrandom_string(10) # Results: Random 10-character string\n" + "contributors": [] }, { "title": "Remove Duplicate Characters", "description": "Removes duplicate characters from a string while maintaining the order.", "author": "axorax", + "code": "def remove_duplicate_chars(s):\n seen = set()\n return ''.join(char for char in s if not (char in seen or seen.add(char)))\n\n# Usage:\nremove_duplicate_chars('programming') # Returns: 'progamin'\n", "tags": [ "string", "duplicates", "remove" ], - "contributors": [], - "code": "def remove_duplicate_chars(s):\n seen = set()\n return ''.join(char for char in s if not (char in seen or seen.add(char)))\n\n# Usage:\nremove_duplicate_chars('programming') # Returns: 'progamin'\n" + "contributors": [] }, { "title": "Remove Punctuation", "description": "Removes punctuation from a string.", "author": "SteliosGee", + "code": "import string\n\ndef remove_punctuation(s):\n return s.translate(str.maketrans('', '', string.punctuation))\n\n# Usage:\nremove_punctuation('Hello, World!') # Returns: 'Hello World'\n", "tags": [ "string", "punctuation", "remove" ], - "contributors": [], - "code": "import string\n\ndef remove_punctuation(s):\n return s.translate(str.maketrans('', '', string.punctuation))\n\n# Usage:\nremove_punctuation('Hello, World!') # Returns: 'Hello World'\n" + "contributors": [] }, { "title": "Remove Specific Characters", "description": "Removes specific characters from a string.", "author": "axorax", + "code": "def remove_chars(s, chars):\n return ''.join(c for c in s if c not in chars)\n\n# Usage:\nremove_chars('hello world', 'eo') # Returns: 'hll wrld'\n", "tags": [ "string", "remove", "characters" ], - "contributors": [], - "code": "def remove_chars(s, chars):\n return ''.join(c for c in s if c not in chars)\n\n# Usage:\nremove_chars('hello world', 'eo') # Returns: 'hll wrld'\n" + "contributors": [] }, { "title": "Remove Whitespace", "description": "Removes all whitespace from a string.", "author": "axorax", + "code": "def remove_whitespace(s):\n return ''.join(s.split())\n\n# Usage:\nremove_whitespace('hello world') # Returns: 'helloworld'\n", "tags": [ "string", "whitespace", "remove" ], - "contributors": [], - "code": "def remove_whitespace(s):\n return ''.join(s.split())\n\n# Usage:\nremove_whitespace('hello world') # Returns: 'helloworld'\n" + "contributors": [] }, { "title": "Reverse String", "description": "Reverses the characters in a string.", "author": "dostonnabotov", + "code": "def reverse_string(s):\n return s[::-1]\n\n# Usage:\nreverse_string('hello') # Returns: 'olleh'\n", "tags": [ "string", "reverse" ], - "contributors": [], - "code": "def reverse_string(s):\n return s[::-1]\n\n# Usage:\nreverse_string('hello') # Returns: 'olleh'\n" + "contributors": [] }, { "title": "Split Camel Case", "description": "Splits a camel case string into separate words.", "author": "axorax", + "code": "import re\n\ndef split_camel_case(s):\n return ' '.join(re.findall(r'[A-Z][a-z]*|[a-z]+', s))\n\n# Usage:\nsplit_camel_case('camelCaseString') # Returns: 'camel Case String'\n", "tags": [ "string", "camel-case", "split" ], - "contributors": [], - "code": "import re\n\ndef split_camel_case(s):\n return ' '.join(re.findall(r'[A-Z][a-z]*|[a-z]+', s))\n\n# Usage:\nsplit_camel_case('camelCaseString') # Returns: 'camel Case String'\n" + "contributors": [] }, { "title": "Truncate String", "description": "Truncates a string to a specified length and adds an ellipsis.", "author": "axorax", + "code": "def truncate_string(s, length):\n return s[:length] + '...' if len(s) > length else s\n\n# Usage:\ntruncate_string('This is a long string', 10) # Returns: 'This is a ...'\n", "tags": [ "string", "truncate" ], - "contributors": [], - "code": "def truncate_string(s, length):\n return s[:length] + '...' if len(s) > length else s\n\n# Usage:\ntruncate_string('This is a long string', 10) # Returns: 'This is a ...'\n" + "contributors": [] } ] } diff --git a/public/consolidated/rust.json b/public/consolidated/rust.json index 4a150d77..d8eb2297 100644 --- a/public/consolidated/rust.json +++ b/public/consolidated/rust.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", + "code": "fn main() { // Defines the main running function\n println!(\"Hello, World!\"); // Prints Hello, World! to the terminal.\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [], - "code": "fn main() { // Defines the main running function\n println!(\"Hello, World!\"); // Prints Hello, World! to the terminal.\n}\n" + "contributors": [] } ] }, @@ -22,23 +22,23 @@ "title": "Find Files", "description": "Finds all files of the specified extension within a given directory.", "author": "Mathys-Gasnier", + "code": "fn find_files(directory: &str, file_type: &str) -> std::io::Result> {\n let mut result = vec![];\n\n for entry in std::fs::read_dir(directory)? {\n let dir = entry?;\n let path = dir.path();\n if dir.file_type().is_ok_and(|t| !t.is_file()) &&\n path.extension().is_some_and(|ext| ext != file_type) {\n continue;\n }\n result.push(path)\n }\n\n Ok(result)\n}\n\n// Usage:\nfind_files(\"/path/to/your/directory\", \".pdf\"); // Returns: if Ok(), a vector of path to `.pdf` files in the directory\n", "tags": [ "file", "search" ], - "contributors": [], - "code": "fn find_files(directory: &str, file_type: &str) -> std::io::Result> {\n let mut result = vec![];\n\n for entry in std::fs::read_dir(directory)? {\n let dir = entry?;\n let path = dir.path();\n if dir.file_type().is_ok_and(|t| !t.is_file()) &&\n path.extension().is_some_and(|ext| ext != file_type) {\n continue;\n }\n result.push(path)\n }\n\n Ok(result)\n}\n\n// Usage:\nfind_files(\"/path/to/your/directory\", \".pdf\"); // Returns: if Ok(), a vector of path to `.pdf` files in the directory\n" + "contributors": [] }, { "title": "Read File Lines", "description": "Reads all lines from a file and returns them as a vector of strings.", "author": "Mathys-Gasnier", + "code": "fn read_lines(file_name: &str) -> std::io::Result>\n Ok(\n std::fs::read_to_string(file_name)?\n .lines()\n .map(String::from)\n .collect()\n )\n}\n\n// Usage:\nread_lines(\"path/to/file.txt\"); // Returns: If Ok(), a Vec of the lines of the file\n", "tags": [ "file", "read" ], - "contributors": [], - "code": "fn read_lines(file_name: &str) -> std::io::Result>\n Ok(\n std::fs::read_to_string(file_name)?\n .lines()\n .map(String::from)\n .collect()\n )\n}\n\n// Usage:\nread_lines(\"path/to/file.txt\"); // Returns: If Ok(), a Vec of the lines of the file\n" + "contributors": [] } ] }, @@ -49,12 +49,12 @@ "title": "Capitalize String", "description": "Makes the first letter of a string uppercase.", "author": "Mathys-Gasnier", + "code": "fn capitalized(str: &str) -> String {\n let mut chars = str.chars();\n match chars.next() {\n None => String::new(),\n Some(f) => f.to_uppercase().chain(chars).collect(),\n }\n}\n\n// Usage:\ncapitalized(\"lower_case\"); // Returns: Lower_case\n", "tags": [ "string", "capitalize" ], - "contributors": [], - "code": "fn capitalized(str: &str) -> String {\n let mut chars = str.chars();\n match chars.next() {\n None => String::new(),\n Some(f) => f.to_uppercase().chain(chars).collect(),\n }\n}\n\n// Usage:\ncapitalized(\"lower_case\"); // Returns: Lower_case\n" + "contributors": [] } ] } diff --git a/public/consolidated/scss.json b/public/consolidated/scss.json index dd8414b1..1b7e05c6 100644 --- a/public/consolidated/scss.json +++ b/public/consolidated/scss.json @@ -6,25 +6,25 @@ "title": "Fade In Animation", "description": "Animates the fade-in effect.", "author": "dostonnabotov", + "code": "@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@mixin fade-in($duration: 1s, $easing: ease-in-out) {\n animation: fade-in $duration $easing;\n}\n", "tags": [ "animation", "fade", "css" ], - "contributors": [], - "code": "@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@mixin fade-in($duration: 1s, $easing: ease-in-out) {\n animation: fade-in $duration $easing;\n}\n" + "contributors": [] }, { "title": "Slide In From Left", "description": "Animates content sliding in from the left.", "author": "dostonnabotov", + "code": "@keyframes slide-in-left {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@mixin slide-in-left($duration: 0.5s, $easing: ease-out) {\n animation: slide-in-left $duration $easing;\n}\n", "tags": [ "animation", "slide", "css" ], - "contributors": [], - "code": "@keyframes slide-in-left {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@mixin slide-in-left($duration: 0.5s, $easing: ease-out) {\n animation: slide-in-left $duration $easing;\n}\n" + "contributors": [] } ] }, @@ -35,25 +35,25 @@ "title": "Border Radius Helper", "description": "Applies a customizable border-radius.", "author": "dostonnabotov", + "code": "@mixin border-radius($radius: 4px) {\n border-radius: $radius;\n}\n", "tags": [ "border", "radius", "css" ], - "contributors": [], - "code": "@mixin border-radius($radius: 4px) {\n border-radius: $radius;\n}\n" + "contributors": [] }, { "title": "Box Shadow Helper", "description": "Generates a box shadow with customizable values.", "author": "dostonnabotov", + "code": "@mixin box-shadow($x: 0px, $y: 4px, $blur: 10px, $spread: 0px, $color: rgba(0, 0, 0, 0.1)) {\n box-shadow: $x $y $blur $spread $color;\n}\n", "tags": [ "box-shadow", "css", "effects" ], - "contributors": [], - "code": "@mixin box-shadow($x: 0px, $y: 4px, $blur: 10px, $spread: 0px, $color: rgba(0, 0, 0, 0.1)) {\n box-shadow: $x $y $blur $spread $color;\n}\n" + "contributors": [] } ] }, @@ -64,13 +64,13 @@ "title": "Primary Button", "description": "Generates a styled primary button.", "author": "dostonnabotov", + "code": "@mixin primary-button($bg: #007bff, $color: #fff) {\n background-color: $bg;\n color: $color;\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n\n &:hover {\n background-color: darken($bg, 10%);\n }\n}\n", "tags": [ "button", "primary", "css" ], - "contributors": [], - "code": "@mixin primary-button($bg: #007bff, $color: #fff) {\n background-color: $bg;\n color: $color;\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n\n &:hover {\n background-color: darken($bg, 10%);\n }\n}\n" + "contributors": [] } ] }, @@ -81,18 +81,19 @@ "title": "Aspect Ratio", "description": "Ensures that elements maintain a specific aspect ratio.", "author": "dostonnabotov", + "code": "@mixin aspect-ratio($width, $height) {\n position: relative;\n width: 100%;\n padding-top: ($height / $width) * 100%;\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n", "tags": [ "aspect-ratio", "layout", "css" ], - "contributors": [], - "code": "@mixin aspect-ratio($width, $height) {\n position: relative;\n width: 100%;\n padding-top: ($height / $width) * 100%;\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n" + "contributors": [] }, { "title": "Dark Theme", "description": "SCSS mixin to change styles for dark themes.", "author": "gihanrangana", + "code": "@mixin isDark($type: 'module') {\n $root: &;\n\n @if $type == 'module' {\n :global {\n @at-root body[theme='dark'] #{$root} {\n @content;\n }\n }\n } @else {\n &[theme='dark'] {\n @content;\n }\n }\n}\n\n// Usage:\n.container{\n\tbackground: #f0f0f0;\n\t@include isDark {\n\t\tbackground: #222;\n\t}\n}\n", "tags": [ "css", "mixin", @@ -100,32 +101,31 @@ "dark-theme", "layout" ], - "contributors": [], - "code": "@mixin isDark($type: 'module') {\n $root: &;\n\n @if $type == 'module' {\n :global {\n @at-root body[theme='dark'] #{$root} {\n @content;\n }\n }\n } @else {\n &[theme='dark'] {\n @content;\n }\n }\n}\n\n// Usage:\n.container{\n\tbackground: #f0f0f0;\n\t@include isDark {\n\t\tbackground: #222;\n\t}\n}\n" + "contributors": [] }, { "title": "Flex Center", "description": "A mixin to center content using flexbox.", "author": "dostonnabotov", + "code": "@mixin flex-center {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n", "tags": [ "flex", "center", "css" ], - "contributors": [], - "code": "@mixin flex-center {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n" + "contributors": [] }, { "title": "Grid Container", "description": "Creates a responsive grid container with customizable column counts.", "author": "dostonnabotov", + "code": "@mixin grid-container($columns: 12, $gap: 1rem) {\n display: grid;\n grid-template-columns: repeat($columns, 1fr);\n gap: $gap;\n}\n", "tags": [ "grid", "layout", "css" ], - "contributors": [], - "code": "@mixin grid-container($columns: 12, $gap: 1rem) {\n display: grid;\n grid-template-columns: repeat($columns, 1fr);\n gap: $gap;\n}\n" + "contributors": [] } ] }, @@ -136,50 +136,50 @@ "title": "Font Import Helper", "description": "Simplifies importing custom fonts in Sass.", "author": "dostonnabotov", + "code": "@mixin import-font($family, $weight: 400, $style: normal) {\n @font-face {\n font-family: #{$family};\n font-weight: #{$weight};\n font-style: #{$style};\n src: url('/fonts/#{$family}-#{$weight}.woff2') format('woff2'),\n url('/fonts/#{$family}-#{$weight}.woff') format('woff');\n }\n}\n", "tags": [ "mixin", "fonts", "css" ], - "contributors": [], - "code": "@mixin import-font($family, $weight: 400, $style: normal) {\n @font-face {\n font-family: #{$family};\n font-weight: #{$weight};\n font-style: #{$style};\n src: url('/fonts/#{$family}-#{$weight}.woff2') format('woff2'),\n url('/fonts/#{$family}-#{$weight}.woff') format('woff');\n }\n}\n" + "contributors": [] }, { "title": "Line Clamp Mixin", "description": "A Sass mixin to clamp text to a specific number of lines.", "author": "dostonnabotov", + "code": "@mixin line-clamp($number) {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: $number;\n overflow: hidden;\n}\n", "tags": [ "mixin", "typography", "css" ], - "contributors": [], - "code": "@mixin line-clamp($number) {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: $number;\n overflow: hidden;\n}\n" + "contributors": [] }, { "title": "Text Gradient", "description": "Adds a gradient color effect to text.", "author": "dostonnabotov", + "code": "@mixin text-gradient($from, $to) {\n background: linear-gradient(to right, $from, $to);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n", "tags": [ "mixin", "gradient", "text", "css" ], - "contributors": [], - "code": "@mixin text-gradient($from, $to) {\n background: linear-gradient(to right, $from, $to);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n" + "contributors": [] }, { "title": "Text Overflow Ellipsis", "description": "Ensures long text is truncated with an ellipsis.", "author": "dostonnabotov", + "code": "@mixin text-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n", "tags": [ "mixin", "text", "css" ], - "contributors": [], - "code": "@mixin text-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n" + "contributors": [] } ] }, @@ -190,25 +190,25 @@ "title": "Clearfix", "description": "Provides a clearfix utility for floating elements.", "author": "dostonnabotov", + "code": "@mixin clearfix {\n &::after {\n content: '';\n display: block;\n clear: both;\n }\n}\n", "tags": [ "clearfix", "utility", "css" ], - "contributors": [], - "code": "@mixin clearfix {\n &::after {\n content: '';\n display: block;\n clear: both;\n }\n}\n" + "contributors": [] }, { "title": "Responsive Breakpoints", "description": "Generates media queries for responsive design.", "author": "dostonnabotov", + "code": "@mixin breakpoint($breakpoint) {\n @if $breakpoint == sm {\n @media (max-width: 576px) { @content; }\n } @else if $breakpoint == md {\n @media (max-width: 768px) { @content; }\n } @else if $breakpoint == lg {\n @media (max-width: 992px) { @content; }\n } @else if $breakpoint == xl {\n @media (max-width: 1200px) { @content; }\n }\n}\n", "tags": [ "responsive", "media-queries", "css" ], - "contributors": [], - "code": "@mixin breakpoint($breakpoint) {\n @if $breakpoint == sm {\n @media (max-width: 576px) { @content; }\n } @else if $breakpoint == md {\n @media (max-width: 768px) { @content; }\n } @else if $breakpoint == lg {\n @media (max-width: 992px) { @content; }\n } @else if $breakpoint == xl {\n @media (max-width: 1200px) { @content; }\n }\n}\n" + "contributors": [] } ] } diff --git a/public/consolidated/typescript.json b/public/consolidated/typescript.json index 98a0680b..3a11ec37 100644 --- a/public/consolidated/typescript.json +++ b/public/consolidated/typescript.json @@ -6,13 +6,13 @@ "title": "Exclusive Types", "description": "Allows to have a type which conforms to either/or.", "author": "px-d", + "code": "type Exclusive = T | U extends Record\n ?\n | ({ [P in Exclude]?: never } & U)\n | ({ [P in Exclude]?: never } & T)\n : T | U;\n\n\n// Usage:\ntype A = { name: string; email?: string; provider?: string };\ntype B = { name: string; phone?: string; country?: string };\n\ntype EitherOr = Exclusive;\n\nconst w: EitherOr = { name: \"John\", email: \"j@d.c\" }; // ✅\nconst x: EitherOr = { name: \"John\", phone: \"+123 456\" }; // ✅\nconst y: EitherOr = { name: \"John\", email: \"\", phone: \"\" }; // ⛔️\nconst z: EitherOr = { name: \"John\", phne: \"\", provider: \"\" }; // ⛔️\n", "tags": [ "typescript", "helper-types", "typedefinition" ], - "contributors": [], - "code": "type Exclusive = T | U extends Record\n ?\n | ({ [P in Exclude]?: never } & U)\n | ({ [P in Exclude]?: never } & T)\n : T | U;\n\n\n// Usage:\ntype A = { name: string; email?: string; provider?: string };\ntype B = { name: string; phone?: string; country?: string };\n\ntype EitherOr = Exclusive;\n\nconst w: EitherOr = { name: \"John\", email: \"j@d.c\" }; // ✅\nconst x: EitherOr = { name: \"John\", phone: \"+123 456\" }; // ✅\nconst y: EitherOr = { name: \"John\", email: \"\", phone: \"\" }; // ⛔️\nconst z: EitherOr = { name: \"John\", phne: \"\", provider: \"\" }; // ⛔️\n" + "contributors": [] } ] } diff --git a/src/types/index.ts b/src/types/index.ts index b4eac550..51c9c90b 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -11,9 +11,19 @@ export type CategoryType = { export type SnippetType = { title: string; description: string; + author: string; code: string; tags: string[]; + contributors: string[]; +}; + +export type RawSnippetType = { + title: string; + description: string; author: string; + code: string; + tags: string; + contributors?: string; }; export type AppState = { diff --git a/src/utils/objectUtils.ts b/src/utils/objectUtils.ts new file mode 100644 index 00000000..7526468e --- /dev/null +++ b/src/utils/objectUtils.ts @@ -0,0 +1,6 @@ +export function isCorrectType(obj: unknown, keys: (keyof T)[]): obj is T { + if (typeof obj !== "object" || obj === null) { + return false; + } + return keys.every((key) => key in obj); +} diff --git a/src/utils/raise.ts b/src/utils/raise.ts new file mode 100644 index 00000000..04952326 --- /dev/null +++ b/src/utils/raise.ts @@ -0,0 +1,4 @@ +export function raise(issue: string, snippet: string = ""): null { + console.error(`${issue}${snippet ? ` in '${snippet}'` : ""}`); + return null; +} diff --git a/src/utils/slugify.ts b/src/utils/slugify.ts index 7a1dbf14..7817f7bf 100644 --- a/src/utils/slugify.ts +++ b/src/utils/slugify.ts @@ -1,4 +1,4 @@ -export function slugify(string: string, separator = "-") { +export function slugify(string: string, separator: string = "-") { return string .toString() // Cast to string (optional) .toLowerCase() // Convert the string to lowercase letters @@ -9,3 +9,11 @@ export function slugify(string: string, separator = "-") { .replace(/--+/g, separator) // Replace multiple - with single {separator} .replace(/-$/g, ""); // Remove trailing - } + +export function reverseSlugify(s: string, separator: string = "-") { + return s + .split(separator) + .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)) + .join(" ") + .trim(); +} diff --git a/tests/objectUtils.test.ts b/tests/objectUtils.test.ts new file mode 100644 index 00000000..c368a8c4 --- /dev/null +++ b/tests/objectUtils.test.ts @@ -0,0 +1,49 @@ +import { describe, it, expect } from "vitest"; + +import { isCorrectType } from "../src/utils/objectUtils"; + +describe(isCorrectType.name, () => { + type TestType = { + key1: string; + key2: number; + key3: boolean; + }; + + const keys: (keyof TestType)[] = ["key1", "key2", "key3"]; + + it("should return true if all keys are present in the object", () => { + const obj = { key1: "value", key2: 42, key3: true }; + expect(isCorrectType(obj, keys)).toBe(true); + }); + + it("should return false if any key is missing from the object", () => { + const obj = { key1: "value", key2: 42 }; + expect(isCorrectType(obj, keys)).toBe(false); + }); + + it("should return false if the object is null", () => { + const obj = null; + expect(isCorrectType(obj, keys)).toBe(false); + }); + + it("should return false if the object is not an object type", () => { + expect(isCorrectType("string", keys)).toBe(false); + expect(isCorrectType(42, keys)).toBe(false); + expect(isCorrectType(true, keys)).toBe(false); + }); + + it("should return true if the object has additional keys but includes all required keys", () => { + const obj = { key1: "value", key2: 42, key3: true, extraKey: "extra" }; + expect(isCorrectType(obj, keys)).toBe(true); + }); + + it("should return false if the keys array is empty and the object is not null", () => { + const obj = { key1: "value", key2: 42 }; + expect(isCorrectType(obj, [])).toBe(true); + }); + + it("should return true for an empty keys array, regardless of the object", () => { + const obj = {}; + expect(isCorrectType(obj, [])).toBe(true); + }); +}); diff --git a/tests/raise.test.ts b/tests/raise.test.ts new file mode 100644 index 00000000..9d802829 --- /dev/null +++ b/tests/raise.test.ts @@ -0,0 +1,37 @@ +import { describe, beforeEach, afterEach, it, expect, vitest } from "vitest"; + +import { raise } from "../src/utils/raise"; + +describe(raise.name, () => { + beforeEach(() => { + vitest.spyOn(console, "error").mockImplementation(() => {}); // Mock console.error + }); + + afterEach(() => { + vitest.restoreAllMocks(); // Restore console.error to its original state + }); + + it("should log the issue to the console and return null", () => { + const issue = "An error occurred"; + const result = raise(issue); + expect(console.error).toHaveBeenCalledWith(issue); + expect(result).toBeNull(); + }); + + it("should include the snippet in the log message if provided", () => { + const issue = "An error occurred"; + const snippet = "mySnippet"; + const result = raise(issue, snippet); + expect(console.error).toHaveBeenCalledWith( + `An error occurred in 'mySnippet'` + ); + expect(result).toBeNull(); + }); + + it('should not include "in" if the snippet is not provided', () => { + const issue = "An error occurred"; + const result = raise(issue, ""); + expect(console.error).toHaveBeenCalledWith("An error occurred"); + expect(result).toBeNull(); + }); +}); diff --git a/tests/slugify.test.ts b/tests/slugify.test.ts index 3447b2d2..46f24d45 100644 --- a/tests/slugify.test.ts +++ b/tests/slugify.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from "vitest"; -import { slugify } from "../src/utils/slugify"; +import { reverseSlugify, slugify } from "../src/utils/slugify"; describe(slugify.name, () => { it("should convert a string to lowercase and replace spaces with dashes", () => { @@ -51,3 +51,39 @@ describe(slugify.name, () => { ); }); }); + +describe(reverseSlugify.name, () => { + it("should convert a slugified string back to a human-readable string", () => { + expect(reverseSlugify("hello-world")).toBe("Hello World"); + }); + + it("should handle strings with custom separators", () => { + expect(reverseSlugify("custom_separator_example", "_")).toBe( + "Custom Separator Example" + ); + }); + + it("should handle strings with multiple consecutive separators", () => { + expect(reverseSlugify("multiple---dashes")).toBe("Multiple Dashes"); + }); + + it("should handle empty strings correctly", () => { + expect(reverseSlugify("")).toBe(""); + }); + + it("should handle strings with a single word", () => { + expect(reverseSlugify("single")).toBe("Single"); + }); + + it("should handle strings with trailing separators", () => { + expect(reverseSlugify("trailing-dash-")).toBe("Trailing Dash"); + }); + + it("should handle strings with numbers and separators", () => { + expect(reverseSlugify("123-number-test")).toBe("123 Number Test"); + }); + + it("should handle strings with only separators", () => { + expect(reverseSlugify("---", "-")).toBe(""); + }); +}); diff --git a/utils/checkSnippetFormatting.js b/utils/checkSnippetFormatting.js deleted file mode 100644 index 3aff9536..00000000 --- a/utils/checkSnippetFormatting.js +++ /dev/null @@ -1,6 +0,0 @@ -import { exit } from 'process'; -import { parseAllSnippets } from './snippetParser.js'; - -const [ errored ] = parseAllSnippets(); - -if(errored) exit(1); diff --git a/utils/checkSnippetFormatting.ts b/utils/checkSnippetFormatting.ts new file mode 100644 index 00000000..28b808c5 --- /dev/null +++ b/utils/checkSnippetFormatting.ts @@ -0,0 +1,9 @@ +import { exit } from "process"; + +import { parseAllSnippets } from "./snippetParser.ts"; + +const [errored] = parseAllSnippets(); + +if (errored) { + exit(1); +} diff --git a/utils/consolidateSnippets.js b/utils/consolidateSnippets.js deleted file mode 100644 index 6a7673a1..00000000 --- a/utils/consolidateSnippets.js +++ /dev/null @@ -1,28 +0,0 @@ -import { exit } from 'process'; -import { parseAllSnippets, reverseSlugify } from './snippetParser.js'; -import { join } from 'path'; -import { copyFileSync, writeFileSync } from 'fs'; - -const dataPath = 'public/consolidated/'; -const indexPath = join(dataPath, '_index.json'); -const iconPath = 'public/icons/'; -const snippetsPath = 'snippets/'; - -const [ errored, snippets ] = parseAllSnippets(); - -if(errored) exit(1); - -const index = []; -for(const [language, categories] of Object.entries(snippets)) { - const languageIconPath = join(snippetsPath, language, 'icon.svg'); - - copyFileSync(languageIconPath, join(iconPath, `${language}.svg`)); - - index.push({ lang: reverseSlugify(language).toUpperCase(), icon: `/icons/${language}.svg` }); - - const languageFilePath = join(dataPath, `${language}.json`); - - writeFileSync(languageFilePath, JSON.stringify(categories, null, 4)); -} - -writeFileSync(indexPath, JSON.stringify(index, null, 4)); \ No newline at end of file diff --git a/utils/consolidateSnippets.ts b/utils/consolidateSnippets.ts new file mode 100644 index 00000000..8e16c254 --- /dev/null +++ b/utils/consolidateSnippets.ts @@ -0,0 +1,36 @@ +import { copyFileSync, writeFileSync } from "fs"; +import { join } from "path"; +import { exit } from "process"; + +import { parseAllSnippets } from "./snippetParser.ts"; +import { LanguageType } from "../src/types"; +import { reverseSlugify } from "../src/utils/slugify"; + +const dataPath = "public/consolidated/"; +const indexPath = join(dataPath, "_index.json"); +const iconPath = "public/icons/"; +const snippetsPath = "snippets/"; + +const [errored, snippets] = parseAllSnippets(); + +if (errored) { + exit(1); +} + +const languages: LanguageType[] = []; +for (const [language, categories] of Object.entries(snippets)) { + const languageIconPath = join(snippetsPath, language, "icon.svg"); + + copyFileSync(languageIconPath, join(iconPath, `${language}.svg`)); + + languages.push({ + lang: reverseSlugify(language).toUpperCase(), + icon: `/icons/${language}.svg`, + }); + + const languageFilePath = join(dataPath, `${language}.json`); + + writeFileSync(languageFilePath, JSON.stringify(categories, null, 4)); +} + +writeFileSync(indexPath, JSON.stringify(languages, null, 4)); diff --git a/utils/snippetParser.js b/utils/snippetParser.js deleted file mode 100644 index 0989ab5e..00000000 --- a/utils/snippetParser.js +++ /dev/null @@ -1,114 +0,0 @@ -import { existsSync, readdirSync, readFileSync } from 'fs'; -import { join } from 'path'; - -export function reverseSlugify(string, separator = "-") { - return string - .split(separator) - .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)) - .join(' ') - .trim(); -} -export function slugify(string, separator = "-") { - return string - .toString() // Cast to string (optional) - .toLowerCase() // Convert the string to lowercase letters - .trim() // Remove whitespace from both sides of a string (optional) - .replace(/\s+/g, separator) // Replace spaces with {separator} - .replace(/[^\w\-]+/g, "") // Remove all non-word chars - .replace(/\_/g, separator) // Replace _ with {separator} - .replace(/\-\-+/g, separator) // Replace multiple - with single {separator} - .replace(/\-$/g, ""); // Remove trailing - -} - -let errored = false; -function raise(issue, snippet = '') { - console.error(`${issue}${snippet ? ` in '${snippet}'` : ''}`); - errored = true; - return null; -} - -const crlfRegex = /\r\n/gm; -const propertyRegex = /^\s+([a-zA-Z]+):\s*(.+)/; -const headerEndCodeStartRegex = /^\s*---\s*```.*\n/; -const codeRegex = /^(.+)```/s -function parseSnippet(snippetPath, name, text) { - if(crlfRegex.exec(text) !== null) return raise('Found CRLF line endings instead of LF line endings', snippetPath); - let cursor = 0; - - const fromCursor = () => text.substring(cursor); - - if(!fromCursor().trim().startsWith('---')) return raise('Missing header start delimiter \'---\'', snippetPath); - cursor += 3; - - const properties = {}; - let match; - while((match = propertyRegex.exec(fromCursor())) !== null) { - cursor += match[0].length; - properties[match[1].toLowerCase()] = match[2]; - } - - if(!('title' in properties)) return raise(`Missing 'title' property`, snippetPath); - if(!('description' in properties)) return raise(`Missing 'description' property`, snippetPath); - if(!('author' in properties)) return raise(`Missing 'author' property`, snippetPath); - if(!('tags' in properties)) return raise(`Missing 'tags' property`, snippetPath); - - if(slugify(properties.title) !== name) return raise(`slugifyed 'title' property doesn't match snippet file name`, snippetPath); - - match = headerEndCodeStartRegex.exec(fromCursor()); - if(match === null) return raise('Missing header end \'---\' or code start \'```\'', snippetPath); - cursor += match[0].length; - - match = codeRegex.exec(fromCursor()); - if(match === null) return raise('Missing code block end \'```\'', snippetPath); - const code = match[1]; - - return { - title: properties.title, - description: properties.description, - author: properties.author, - tags: properties.tags.split(',').map((tag) => tag.trim()).filter((tag) => tag), - contributors: 'contributors' in properties ? properties.contributors.split(',').map((contributor) => contributor.trim()).filter((contributor) => contributor) : [], - code: code, - } -} - -const snippetPath = "snippets/"; -export function parseAllSnippets() { - const snippets = {}; - - for(const language of readdirSync(snippetPath)) { - const languagePath = join(snippetPath, language); - - const languageIconPath = join(languagePath, 'icon.svg'); - - if(!existsSync(languageIconPath)) { - raise(`icon for '${language}' is missing`); - continue; - } - - const categories = []; - for(const category of readdirSync(languagePath)) { - if(category === 'icon.svg') continue; - const categoryPath = join(languagePath, category); - - const categorySnippets = []; - for(const snippet of readdirSync(categoryPath)) { - const snippetPath = join(categoryPath, snippet); - const snippetContent = readFileSync(snippetPath).toString(); - const snippetFileName = snippet.slice(0, -3); - - const snippetData = parseSnippet(snippetPath, snippetFileName, snippetContent); - if(!snippetData) continue; - categorySnippets.push(snippetData); - } - categories.push({ - categoryName: reverseSlugify(category), - snippets: categorySnippets, - }); - } - - snippets[language] = categories; - } - - return [ errored, snippets ]; -} diff --git a/utils/snippetParser.ts b/utils/snippetParser.ts new file mode 100644 index 00000000..09482b47 --- /dev/null +++ b/utils/snippetParser.ts @@ -0,0 +1,134 @@ +import { existsSync, readdirSync, readFileSync } from "fs"; +import { join } from "path"; + +import { CategoryType, RawSnippetType, SnippetType } from "../src/types"; +import { isCorrectType } from "../src/utils/objectUtils"; +import { raise } from "../src/utils/raise"; +import { reverseSlugify, slugify } from "../src/utils/slugify"; + +let errored = false; + +const crlfRegex = /\r\n/gm; +const propertyRegex = /^\s+([a-zA-Z]+):\s*(.+)/; +const headerEndCodeStartRegex = /^\s*---\s*```.*\n/; +const codeRegex = /^(.+)```/s; +function parseSnippet(snippetPath, name, text) { + if (crlfRegex.exec(text) !== null) { + errored = true; + return raise( + "Found CRLF line endings instead of LF line endings", + snippetPath + ); + } + let cursor = 0; + + const fromCursor = () => text.substring(cursor); + + if (!fromCursor().trim().startsWith("---")) { + errored = true; + return raise("Missing header start delimiter '---'", snippetPath); + } + cursor += 3; + + const properties = {}; + + let match; + while ((match = propertyRegex.exec(fromCursor())) !== null) { + cursor += match[0].length; + properties[match[1].toLowerCase()] = match[2]; + } + + if ( + !isCorrectType(properties, [ + "title", + "description", + "author", + "tags", + ]) + ) { + errored = true; + return raise("Invalid properties", snippetPath); + } + + if (slugify(properties.title) !== name) { + errored = true; + return raise( + `slugifyed 'title' property doesn't match snippet file name`, + snippetPath + ); + } + + match = headerEndCodeStartRegex.exec(fromCursor()); + if (match === null) { + errored = true; + return raise("Missing header end '---' or code start '```'", snippetPath); + } + cursor += match[0].length; + + match = codeRegex.exec(fromCursor()); + if (match === null) { + errored = true; + return raise("Missing code block end '```'", snippetPath); + } + const code: string = match[1]; + + return { + title: properties.title, + description: properties.description, + author: properties.author, + code, + tags: properties.tags + .split(",") + .map((tag) => tag.trim()) + .filter((tag) => tag), + contributors: (properties.contributors ?? "") + .split(",") + .map((contributor) => contributor.trim()) + .filter((contributor) => contributor), + }; +} + +const snippetPath = "snippets/"; +export function parseAllSnippets() { + const snippets = {}; + + for (const language of readdirSync(snippetPath)) { + const languagePath = join(snippetPath, language); + const languageIconPath = join(languagePath, "icon.svg"); + + if (!existsSync(languageIconPath)) { + errored = true; + raise(`icon for '${language}' is missing`); + continue; + } + + const categories: CategoryType[] = []; + for (const category of readdirSync(languagePath)) { + if (category === "icon.svg") continue; + const categoryPath = join(languagePath, category); + + const categorySnippets: SnippetType[] = []; + for (const snippet of readdirSync(categoryPath)) { + const snippetPath = join(categoryPath, snippet); + const snippetContent = readFileSync(snippetPath).toString(); + const snippetFileName = snippet.slice(0, -3); + + const snippetData = parseSnippet( + snippetPath, + snippetFileName, + snippetContent + ); + if (!snippetData) continue; + categorySnippets.push(snippetData); + } + categories.push({ + categoryName: reverseSlugify(category), + snippets: categorySnippets, + }); + } + + snippets[language] = categories; + } + + return [errored, snippets]; +} From 607d314f3a9c40e9326845a07d897cc69f0810c8 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 18:36:36 +0000 Subject: [PATCH 04/13] update pre-commit checks and workflow scrips --- .github/workflows/check-snippets.yml | 2 +- .github/workflows/consolidate-snippets.yml | 2 +- .husky/pre-commit | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-snippets.yml b/.github/workflows/check-snippets.yml index 69824bba..1efb01f2 100644 --- a/.github/workflows/check-snippets.yml +++ b/.github/workflows/check-snippets.yml @@ -28,4 +28,4 @@ jobs: run: tsx utils/checkSnippetFormatting.ts # Run the script located in the utils/ folder post-on-failure: | ## :x: Snippet Format Error - ${run.output} \ No newline at end of file + ${run.output} diff --git a/.github/workflows/consolidate-snippets.yml b/.github/workflows/consolidate-snippets.yml index 8ac9047e..e873beda 100644 --- a/.github/workflows/consolidate-snippets.yml +++ b/.github/workflows/consolidate-snippets.yml @@ -23,7 +23,7 @@ jobs: - name: Install dependencies run: | - npm install + npm ci - name: Consolidate Snippets run: | diff --git a/.husky/pre-commit b/.husky/pre-commit index aaa9ed1a..3b9f6bcf 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,3 +1,4 @@ +npm run snippets:check npm run cspell npm run lint npm run test-ci From 7d1d241ede5cb0c831dbaab13d9b3380e7848886 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 18:45:39 +0000 Subject: [PATCH 05/13] move code prop to undo consolidation changes --- public/consolidated/c.json | 8 +- public/consolidated/cpp.json | 20 +- public/consolidated/csharp.json | 32 ++-- public/consolidated/css.json | 52 ++--- public/consolidated/haskell.json | 64 +++---- public/consolidated/html.json | 8 +- public/consolidated/java.json | 4 +- public/consolidated/javascript.json | 282 ++++++++++++++-------------- public/consolidated/python.json | 228 +++++++++++----------- public/consolidated/rust.json | 16 +- public/consolidated/scss.json | 60 +++--- public/consolidated/typescript.json | 4 +- utils/snippetParser.ts | 2 +- 13 files changed, 387 insertions(+), 393 deletions(-) diff --git a/public/consolidated/c.json b/public/consolidated/c.json index aa8d1803..a9a23234 100644 --- a/public/consolidated/c.json +++ b/public/consolidated/c.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "0xHouss", - "code": "#include // Includes the input/output library\n\nint main() { // Defines the main function\n printf(\"Hello, World!\\n\") // Outputs Hello, World! and a newline\n\n return 0; // indicate the program executed successfully\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [] + "contributors": [], + "code": "#include // Includes the input/output library\n\nint main() { // Defines the main function\n printf(\"Hello, World!\\n\") // Outputs Hello, World! and a newline\n\n return 0; // indicate the program executed successfully\n}\n" } ] }, @@ -22,12 +22,12 @@ "title": "Factorial Function", "description": "Calculates the factorial of a number.", "author": "0xHouss", - "code": "int factorial(int x) {\n int y = 1;\n\n for (int i = 2; i <= x; i++)\n y *= i;\n\n return y;\n}\n\n// Usage:\nfactorial(4); // Returns: 24\n", "tags": [ "math", "factorial" ], - "contributors": [] + "contributors": [], + "code": "int factorial(int x) {\n int y = 1;\n\n for (int i = 2; i <= x; i++)\n y *= i;\n\n return y;\n}\n\n// Usage:\nfactorial(4); // Returns: 24\n" } ] } diff --git a/public/consolidated/cpp.json b/public/consolidated/cpp.json index 7a0b9e36..e560e82d 100644 --- a/public/consolidated/cpp.json +++ b/public/consolidated/cpp.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", - "code": "#include // Includes the input/output stream library\n\nint main() { // Defines the main function\n std::cout << \"Hello, World!\" << std::endl; // Outputs Hello, World! and a newline\n return 0; // indicate the program executed successfully\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [] + "contributors": [], + "code": "#include // Includes the input/output stream library\n\nint main() { // Defines the main function\n std::cout << \"Hello, World!\" << std::endl; // Outputs Hello, World! and a newline\n return 0; // indicate the program executed successfully\n}\n" } ] }, @@ -22,13 +22,13 @@ "title": "Vector to Queue", "description": "Convert vector into queue quickly", "author": "mrityunjay2003", - "code": "#include\n#include\n#include\n\nstd::queue vectorToQueue(const std::vector& v) {\n return std::queue(std::deque(v.begin(), v.end()));\n}\n\nstd::vector vec = { 1, 2, 3, 4, 5 };\nvectorToQueue(&vec); // Returns: std::queue { 1, 2, 3, 4, 5 }\n", "tags": [ "data structures", "queue", "vector" ], - "contributors": [] + "contributors": [], + "code": "#include\n#include\n#include\n\nstd::queue vectorToQueue(const std::vector& v) {\n return std::queue(std::deque(v.begin(), v.end()));\n}\n\nstd::vector vec = { 1, 2, 3, 4, 5 };\nvectorToQueue(&vec); // Returns: std::queue { 1, 2, 3, 4, 5 }\n" } ] }, @@ -39,12 +39,12 @@ "title": "Check Prime Number", "description": "Check if an integer is a prime number", "author": "MihneaMoso", - "code": "bool is_prime(int n) {\n if (n < 2) return false;\n if (n == 2 || n == 3) return true;\n if (n % 2 == 0) return false;\n for (int i = 3; i * i <= n; i += 2) {\n if (n % i == 0) return false;\n }\n return true;\n}\n\n// Usage:\nis_prime(29); // Returns: true\n", "tags": [ "number", "prime" ], - "contributors": [] + "contributors": [], + "code": "bool is_prime(int n) {\n if (n < 2) return false;\n if (n == 2 || n == 3) return true;\n if (n % 2 == 0) return false;\n for (int i = 3; i * i <= n; i += 2) {\n if (n % i == 0) return false;\n }\n return true;\n}\n\n// Usage:\nis_prime(29); // Returns: true\n" } ] }, @@ -55,23 +55,23 @@ "title": "Reverse String", "description": "Reverses the characters in a string.", "author": "Vaibhav-kesarwani", - "code": "#include \n#include \n\nstd::string reverseString(const std::string& input) {\n std::string reversed = input;\n std::reverse(reversed.begin(), reversed.end());\n return reversed;\n}\n\nreverseString(\"quicksnip\"); // Returns: \"pinskciuq\"\n", "tags": [ "array", "reverse" ], - "contributors": [] + "contributors": [], + "code": "#include \n#include \n\nstd::string reverseString(const std::string& input) {\n std::string reversed = input;\n std::reverse(reversed.begin(), reversed.end());\n return reversed;\n}\n\nreverseString(\"quicksnip\"); // Returns: \"pinskciuq\"\n" }, { "title": "Split String", "description": "Splits a string by a delimiter", "author": "saminjay", - "code": "#include \n#include \n\nstd::vector split_string(std::string str, std::string delim) {\n std::vector splits;\n int i = 0, j;\n int inc = delim.length();\n while (j != std::string::npos) {\n j = str.find(delim, i);\n splits.push_back(str.substr(i, j - i));\n i = j + inc;\n }\n return splits;\n}\n\n// Usage:\nsplit_string(\"quick_-snip\", \"_-\"); // Returns: std::vector { \"quick\", \"snip\" }\n", "tags": [ "string", "split" ], - "contributors": [] + "contributors": [], + "code": "#include \n#include \n\nstd::vector split_string(std::string str, std::string delim) {\n std::vector splits;\n int i = 0, j;\n int inc = delim.length();\n while (j != std::string::npos) {\n j = str.find(delim, i);\n splits.push_back(str.substr(i, j - i));\n i = j + inc;\n }\n return splits;\n}\n\n// Usage:\nsplit_string(\"quick_-snip\", \"_-\"); // Returns: std::vector { \"quick\", \"snip\" }\n" } ] } diff --git a/public/consolidated/csharp.json b/public/consolidated/csharp.json index 5fe902e4..63ff0ec1 100644 --- a/public/consolidated/csharp.json +++ b/public/consolidated/csharp.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "chaitanya-jvnm", - "code": "public class Program {\n public static void Main(string[] args) {\n System.Console.WriteLine(\"Hello, World!\");\n }\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [] + "contributors": [], + "code": "public class Program {\n public static void Main(string[] args) {\n System.Console.WriteLine(\"Hello, World!\");\n }\n}\n" } ] }, @@ -22,23 +22,23 @@ "title": "Generate GUID", "description": "Generates a new GUID", "author": "chaitanya-jvnm", - "code": "public static string GenerateGuid() {\n return Guid.NewGuid().ToString();\n}\n\n// Usage:\nGenerateGuid(); // Returns: 1c4c38d8-64e4-431b-884a-c6eec2ab02cd (Uuid is random)\n", "tags": [ "guid", "generate" ], - "contributors": [] + "contributors": [], + "code": "public static string GenerateGuid() {\n return Guid.NewGuid().ToString();\n}\n\n// Usage:\nGenerateGuid(); // Returns: 1c4c38d8-64e4-431b-884a-c6eec2ab02cd (Uuid is random)\n" }, { "title": "Validate GUID", "description": "Checks if a string is a valid GUID.", "author": "chaitanya-jvnm", - "code": "public static bool IsGuid(string str) {\n return Guid.TryParse(str, out _);\n}\n\n// Usage:\nIsGuid(\"1c4c38d8-64e4-431b-884a-c6eec2ab02cd\"); // Returns: true\nIsGuid(\"quicksnip\"); // Returns: false\n", "tags": [ "guid", "validate" ], - "contributors": [] + "contributors": [], + "code": "public static bool IsGuid(string str) {\n return Guid.TryParse(str, out _);\n}\n\n// Usage:\nIsGuid(\"1c4c38d8-64e4-431b-884a-c6eec2ab02cd\"); // Returns: true\nIsGuid(\"quicksnip\"); // Returns: false\n" } ] }, @@ -49,23 +49,23 @@ "title": "Decode JWT", "description": "Decodes a JWT.", "author": "chaitanya-jvnm", - "code": "public static string DecodeJwt(string token) {\n return new JwtSecurityTokenHandler().ReadJwtToken(token).ToString();\n}\n\n// Usage:\nstring token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nDecodeJwt(token); // Returns: \"{\\\"alg\\\":\\\"HS256\\\",\\\"typ\\\":\\\"JWT\\\"}.{\\\"sub\\\":\\\"1234567890\\\",\\\"name\\\":\\\"John Doe\\\",\\\"iat\\\":1516239022}\"\n", "tags": [ "jwt", "decode" ], - "contributors": [] + "contributors": [], + "code": "public static string DecodeJwt(string token) {\n return new JwtSecurityTokenHandler().ReadJwtToken(token).ToString();\n}\n\n// Usage:\nstring token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nDecodeJwt(token); // Returns: \"{\\\"alg\\\":\\\"HS256\\\",\\\"typ\\\":\\\"JWT\\\"}.{\\\"sub\\\":\\\"1234567890\\\",\\\"name\\\":\\\"John Doe\\\",\\\"iat\\\":1516239022}\"\n" }, { "title": "Validate JWT", "description": "Validates a JWT.", "author": "chaitanya-jvnm", - "code": "public static bool ValidateJwt(string token, string secret) {\n var tokenHandler = new JwtSecurityTokenHandler();\n var validationParameters = new TokenValidationParameters {\n ValidateIssuerSigningKey = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),\n ValidateIssuer = false,\n ValidateAudience = false\n };\n try {\n tokenHandler.ValidateToken(token, validationParameters, out _);\n return true;\n }\n catch {\n return false\n }\n}\n\n// Usage:\nstring JWT = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nstring correctSecret = \"your-256-bit-secret\";\nstring wrongSecret = \"this-is-not-the-right-secret\";\n\nValidateJwt(JWT, correctSecret); // Returns: true\nValidateJwt(JWT, wrongSecret); // Returns: false\n", "tags": [ "jwt", "validate" ], - "contributors": [] + "contributors": [], + "code": "public static bool ValidateJwt(string token, string secret) {\n var tokenHandler = new JwtSecurityTokenHandler();\n var validationParameters = new TokenValidationParameters {\n ValidateIssuerSigningKey = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),\n ValidateIssuer = false,\n ValidateAudience = false\n };\n try {\n tokenHandler.ValidateToken(token, validationParameters, out _);\n return true;\n }\n catch {\n return false\n }\n}\n\n// Usage:\nstring JWT = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\nstring correctSecret = \"your-256-bit-secret\";\nstring wrongSecret = \"this-is-not-the-right-secret\";\n\nValidateJwt(JWT, correctSecret); // Returns: true\nValidateJwt(JWT, wrongSecret); // Returns: false\n" } ] }, @@ -76,12 +76,12 @@ "title": "Swap items at index", "description": "Swaps two items at determined indexes", "author": "omegaleo", - "code": "public static IList Swap(this IList list, int indexA, int indexB)\n{\n (list[indexA], list[indexB]) = (list[indexB], list[indexA]);\n return list;\n}\n\nvar list = new List() {\"Test\", \"Test2\"};\n\nlist.Swap(0, 1); // Swaps \"Test\" and \"Test2\" in place\n", "tags": [ "list", "swapping" ], - "contributors": [] + "contributors": [], + "code": "public static IList Swap(this IList list, int indexA, int indexB)\n{\n (list[indexA], list[indexB]) = (list[indexB], list[indexA]);\n return list;\n}\n\nvar list = new List() {\"Test\", \"Test2\"};\n\nlist.Swap(0, 1); // Swaps \"Test\" and \"Test2\" in place\n" } ] }, @@ -92,23 +92,23 @@ "title": "Capitalize first letter", "description": "Makes the first letter of a string uppercase.", "author": "chaitanya-jvnm", - "code": "public static string Capitalize(this string str) {\n return str.Substring(0, 1).ToUpper() + str.Substring(1);\n}\n\n// Usage:\n\"quicksnip\".Capitalize(); // Returns: \"Quicksnip\"\n", "tags": [ "string", "capitalize" ], - "contributors": [] + "contributors": [], + "code": "public static string Capitalize(this string str) {\n return str.Substring(0, 1).ToUpper() + str.Substring(1);\n}\n\n// Usage:\n\"quicksnip\".Capitalize(); // Returns: \"Quicksnip\"\n" }, { "title": "Truncate String", "description": "Cut off a string once it reaches a determined amount of characters and add '...' to the end of the string", "author": "omegaleo", - "code": "public static string Truncate(this string value, int maxChars)\n{\n return value.Length <= maxChars ? value : value.Substring(0, maxChars) + \"...\";\n}\n\n// Usage:\n\"Quicksnip\".Truncate(5); // Returns: \"Quick...\"\n", "tags": [ "string", "truncate" ], - "contributors": [] + "contributors": [], + "code": "public static string Truncate(this string value, int maxChars)\n{\n return value.Length <= maxChars ? value : value.Substring(0, maxChars) + \"...\";\n}\n\n// Usage:\n\"Quicksnip\".Truncate(5); // Returns: \"Quick...\"\n" } ] } diff --git a/public/consolidated/css.json b/public/consolidated/css.json index f6acdac0..b759c611 100644 --- a/public/consolidated/css.json +++ b/public/consolidated/css.json @@ -6,38 +6,38 @@ "title": "3D Button Effect", "description": "Adds a 3D effect to a button when clicked.", "author": "dostonnabotov", - "code": ".button {\n background-color: #28a745;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);\n transition: transform 0.1s;\n}\n\n.button:active {\n transform: translateY(2px);\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n}\n", "tags": [ "button", "3D", "effect" ], - "contributors": [] + "contributors": [], + "code": ".button {\n background-color: #28a745;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);\n transition: transform 0.1s;\n}\n\n.button:active {\n transform: translateY(2px);\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n}\n" }, { "title": "Button Hover Effect", "description": "Creates a hover effect with a color transition.", "author": "dostonnabotov", - "code": ".button {\n background-color: #007bff;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n}\n\n.button:hover {\n background-color: #0056b3;\n}\n", "tags": [ "button", "hover", "transition" ], - "contributors": [] + "contributors": [], + "code": ".button {\n background-color: #007bff;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n}\n\n.button:hover {\n background-color: #0056b3;\n}\n" }, { "title": "MacOS Button", "description": "A macOS-like button style, with hover and shading effects.", "author": "e3nviction", - "code": ".button {\n font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,;\n background: #0a85ff;\n color: #fff;\n padding: 8px 12px;\n border: none;\n margin: 4px;\n border-radius: 10px;\n cursor: pointer;\n box-shadow: inset 0 1px 1px #fff2, 0px 2px 3px -2px rgba(0, 0, 0, 0.3) !important; /*This is really performance heavy*/\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-decoration: none;\n transition: all 150ms cubic-bezier(0.175, 0.885, 0.32, 1.275);\n}\n.button:hover {\n background: #0974ee;\n color: #fff\n}\n", "tags": [ "button", "macos", "hover", "transition" ], - "contributors": [] + "contributors": [], + "code": ".button {\n font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,;\n background: #0a85ff;\n color: #fff;\n padding: 8px 12px;\n border: none;\n margin: 4px;\n border-radius: 10px;\n cursor: pointer;\n box-shadow: inset 0 1px 1px #fff2, 0px 2px 3px -2px rgba(0, 0, 0, 0.3) !important; /*This is really performance heavy*/\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-decoration: none;\n transition: all 150ms cubic-bezier(0.175, 0.885, 0.32, 1.275);\n}\n.button:hover {\n background: #0974ee;\n color: #fff\n}\n" } ] }, @@ -48,37 +48,37 @@ "title": "Blur Background", "description": "Applies a blur effect to the background of an element.", "author": "dostonnabotov", - "code": ".blur-background {\n backdrop-filter: blur(10px);\n background: rgba(255, 255, 255, 0.5);\n}\n", "tags": [ "blur", "background", "effects" ], - "contributors": [] + "contributors": [], + "code": ".blur-background {\n backdrop-filter: blur(10px);\n background: rgba(255, 255, 255, 0.5);\n}\n" }, { "title": "Hover Glow Effect", "description": "Adds a glowing effect on hover.", "author": "dostonnabotov", - "code": ".glow {\n background-color: #f39c12;\n padding: 10px 20px;\n border-radius: 5px;\n transition: box-shadow 0.3s ease;\n}\n\n.glow:hover {\n box-shadow: 0 0 15px rgba(243, 156, 18, 0.8);\n}\n", "tags": [ "hover", "glow", "effects" ], - "contributors": [] + "contributors": [], + "code": ".glow {\n background-color: #f39c12;\n padding: 10px 20px;\n border-radius: 5px;\n transition: box-shadow 0.3s ease;\n}\n\n.glow:hover {\n box-shadow: 0 0 15px rgba(243, 156, 18, 0.8);\n}\n" }, { "title": "Hover to Reveal Color", "description": "A card with an image that transitions from grayscale to full color on hover.", "author": "Haider-Mukhtar", - "code": ".card {\n height: 300px;\n width: 200px;\n border-radius: 5px;\n overflow: hidden;\n}\n\n.card img{\n height: 100%;\n width: 100%;\n object-fit: cover;\n filter: grayscale(100%);\n transition: all 0.3s;\n transition-duration: 200ms;\n cursor: pointer;\n}\n\n.card:hover img {\n filter: grayscale(0%);\n scale: 1.05;\n}\n", "tags": [ "hover", "image", "effects" ], - "contributors": [] + "contributors": [], + "code": ".card {\n height: 300px;\n width: 200px;\n border-radius: 5px;\n overflow: hidden;\n}\n\n.card img{\n height: 100%;\n width: 100%;\n object-fit: cover;\n filter: grayscale(100%);\n transition: all 0.3s;\n transition-duration: 200ms;\n cursor: pointer;\n}\n\n.card:hover img {\n filter: grayscale(0%);\n scale: 1.05;\n}\n" } ] }, @@ -89,59 +89,59 @@ "title": "CSS Reset", "description": "Resets some default browser styles, ensuring consistency across browsers.", "author": "AmeerMoustafa", - "code": "* {\n margin: 0;\n padding: 0;\n box-sizing: border-box\n}\n", "tags": [ "reset", "browser", "layout" ], - "contributors": [] + "contributors": [], + "code": "* {\n margin: 0;\n padding: 0;\n box-sizing: border-box\n}\n" }, { "title": "Equal-Width Columns", "description": "Creates columns with equal widths using flexbox.", "author": "dostonnabotov", - "code": ".columns {\n display: flex;\n justify-content: space-between;\n}\n\n.column {\n flex: 1;\n margin: 0 10px;\n}\n", "tags": [ "flexbox", "columns", "layout" ], - "contributors": [] + "contributors": [], + "code": ".columns {\n display: flex;\n justify-content: space-between;\n}\n\n.column {\n flex: 1;\n margin: 0 10px;\n}\n" }, { "title": "Grid layout", "description": "Equal sized items in a responsive grid", "author": "xshubhamg", - "code": ".grid-container {\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n/* Explanation:\n- `auto-fit`: Automatically fits as many columns as possible within the container.\n- `minmax(250px, 1fr)`: Defines a minimum column size of 250px and a maximum size of 1fr (fraction of available space).\n*/\n}\n", "tags": [ "layout", "grid" ], - "contributors": [] + "contributors": [], + "code": ".grid-container {\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n/* Explanation:\n- `auto-fit`: Automatically fits as many columns as possible within the container.\n- `minmax(250px, 1fr)`: Defines a minimum column size of 250px and a maximum size of 1fr (fraction of available space).\n*/\n}\n" }, { "title": "Responsive Design", "description": "The different responsive breakpoints.", "author": "kruimol", - "code": "/* Phone */\n.element {\n margin: 0 10%\n}\n\n/* Tablet */\n@media (min-width: 640px) {\n .element {\n margin: 0 20%\n }\n}\n\n/* Desktop base */\n@media (min-width: 768px) {\n .element {\n margin: 0 30%\n }\n}\n\n/* Desktop large */\n@media (min-width: 1024px) {\n .element {\n margin: 0 40%\n }\n}\n\n/* Desktop extra large */\n@media (min-width: 1280px) {\n .element {\n margin: 0 60%\n }\n}\n\n/* Desktop bige */\n@media (min-width: 1536px) {\n .element {\n margin: 0 80%\n }\n}\n", "tags": [ "responsive", "media queries" ], - "contributors": [] + "contributors": [], + "code": "/* Phone */\n.element {\n margin: 0 10%\n}\n\n/* Tablet */\n@media (min-width: 640px) {\n .element {\n margin: 0 20%\n }\n}\n\n/* Desktop base */\n@media (min-width: 768px) {\n .element {\n margin: 0 30%\n }\n}\n\n/* Desktop large */\n@media (min-width: 1024px) {\n .element {\n margin: 0 40%\n }\n}\n\n/* Desktop extra large */\n@media (min-width: 1280px) {\n .element {\n margin: 0 60%\n }\n}\n\n/* Desktop bige */\n@media (min-width: 1536px) {\n .element {\n margin: 0 80%\n }\n}\n" }, { "title": "Sticky Footer", "description": "Ensures the footer always stays at the bottom of the page.", "author": "dostonnabotov", - "code": "body {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\nfooter {\n margin-top: auto;\n}\n", "tags": [ "layout", "footer", "sticky" ], - "contributors": [] + "contributors": [], + "code": "body {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\nfooter {\n margin-top: auto;\n}\n" } ] }, @@ -152,24 +152,24 @@ "title": "Letter Spacing", "description": "Adds space between letters for better readability.", "author": "dostonnabotov", - "code": "p {\n letter-spacing: 0.05em;\n}\n", "tags": [ "typography", "spacing" ], - "contributors": [] + "contributors": [], + "code": "p {\n letter-spacing: 0.05em;\n}\n" }, { "title": "Responsive Font Sizing", "description": "Adjusts font size based on viewport width.", "author": "dostonnabotov", - "code": "h1 {\n font-size: calc(1.5rem + 2vw);\n}\n", "tags": [ "font", "responsive", "typography" ], - "contributors": [] + "contributors": [], + "code": "h1 {\n font-size: calc(1.5rem + 2vw);\n}\n" } ] } diff --git a/public/consolidated/haskell.json b/public/consolidated/haskell.json index 35f79386..b4a97f3c 100644 --- a/public/consolidated/haskell.json +++ b/public/consolidated/haskell.json @@ -6,37 +6,37 @@ "title": "Binary Search", "description": "Searches for an element in a sorted array using binary search.", "author": "ACR1209", - "code": "binarySearch :: Ord a => a -> [a] -> Maybe Int\nbinarySearch _ [] = Nothing\nbinarySearch target xs = go 0 (length xs - 1)\n where\n go low high\n | low > high = Nothing\n | midElem < target = go (mid + 1) high\n | midElem > target = go low (mid - 1)\n | otherwise = Just mid\n where\n mid = (low + high) `div` 2\n midElem = xs !! mid\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5]\n print $ binarySearch 3 array -- Output: Just 2\n print $ binarySearch 6 array -- Output: Nothing\n", "tags": [ "array", "binary-search", "search" ], - "contributors": [] + "contributors": [], + "code": "binarySearch :: Ord a => a -> [a] -> Maybe Int\nbinarySearch _ [] = Nothing\nbinarySearch target xs = go 0 (length xs - 1)\n where\n go low high\n | low > high = Nothing\n | midElem < target = go (mid + 1) high\n | midElem > target = go low (mid - 1)\n | otherwise = Just mid\n where\n mid = (low + high) `div` 2\n midElem = xs !! mid\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5]\n print $ binarySearch 3 array -- Output: Just 2\n print $ binarySearch 6 array -- Output: Nothing\n" }, { "title": "Chunk Array", "description": "Splits an array into chunks of a specified size.", "author": "ACR1209", - "code": "chunkArray :: Int -> [a] -> [[a]]\nchunkArray _ [] = []\nchunkArray n xs = take n xs : chunkArray n (drop n xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5, 6]\n print $ chunkArray 2 array -- Output: [[1, 2], [3, 4], [5, 6]]\n", "tags": [ "array", "chunk", "utility" ], - "contributors": [] + "contributors": [], + "code": "chunkArray :: Int -> [a] -> [[a]]\nchunkArray _ [] = []\nchunkArray n xs = take n xs : chunkArray n (drop n xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let array = [1, 2, 3, 4, 5, 6]\n print $ chunkArray 2 array -- Output: [[1, 2], [3, 4], [5, 6]]\n" }, { "title": "Matrix Transpose", "description": "Transposes a 2D matrix.", "author": "ACR1209", - "code": "transposeMatrix :: [[a]] -> [[a]]\ntransposeMatrix [] = []\ntransposeMatrix ([]:_) = []\ntransposeMatrix xs = map head xs : transposeMatrix (map tail xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n print $ transposeMatrix matrix -- Output: [[1,4,7],[2,5,8],[3,6,9]]\n", "tags": [ "array", "matrix", "transpose" ], - "contributors": [] + "contributors": [], + "code": "transposeMatrix :: [[a]] -> [[a]]\ntransposeMatrix [] = []\ntransposeMatrix ([]:_) = []\ntransposeMatrix xs = map head xs : transposeMatrix (map tail xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n print $ transposeMatrix matrix -- Output: [[1,4,7],[2,5,8],[3,6,9]]\n" } ] }, @@ -47,13 +47,13 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "ACR1209", - "code": "putStrLn \"Hello, World!\"\n", "tags": [ "printing", "hello-world", "utility" ], - "contributors": [] + "contributors": [], + "code": "putStrLn \"Hello, World!\"\n" } ] }, @@ -64,27 +64,27 @@ "title": "Find Files in Directory by Type", "description": "Finds all files in a directory with a specific extension.", "author": "ACR1209", - "code": "import System.Directory (listDirectory)\nimport System.FilePath (takeExtension)\n\nfindFilesByExtension :: FilePath -> String -> IO [FilePath]\nfindFilesByExtension dir ext = do\n files <- listDirectory dir\n return $ filter (\\f -> takeExtension f == ext) files\n\n-- Usage:\nmain :: IO ()\nmain = do\n let directory = \".\"\n let ext = \".txt\"\n files <- findFilesByExtension directory ext\n mapM_ putStrLn files -- Output: list of txt files on the current directory\n", "tags": [ "file", "search", "extension", "filesystem" ], - "contributors": [] + "contributors": [], + "code": "import System.Directory (listDirectory)\nimport System.FilePath (takeExtension)\n\nfindFilesByExtension :: FilePath -> String -> IO [FilePath]\nfindFilesByExtension dir ext = do\n files <- listDirectory dir\n return $ filter (\\f -> takeExtension f == ext) files\n\n-- Usage:\nmain :: IO ()\nmain = do\n let directory = \".\"\n let ext = \".txt\"\n files <- findFilesByExtension directory ext\n mapM_ putStrLn files -- Output: list of txt files on the current directory\n" }, { "title": "Read File in Chunks", "description": "Reads a file in chunks grouped by lines.", "author": "ACR1209", - "code": "import System.IO (openFile, IOMode(ReadMode), hGetContents)\nimport Data.List (unfoldr)\n\nreadFileInChunks :: FilePath -> Int -> IO [[String]]\nreadFileInChunks filePath chunkSize = do\n handle <- openFile filePath ReadMode\n contents <- hGetContents handle\n let linesList = lines contents\n return $ go linesList\n where\n go [] = []\n go xs = take chunkSize xs : go (drop chunkSize xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let file = \"example.txt\"\n let chunkSize = 3 -- Number of lines per chunk\n chunks <- readFileInChunks file chunkSize\n mapM_ (putStrLn . unlines) chunks\n\n", "tags": [ "file", "read", "chunks", "utility" ], - "contributors": [] + "contributors": [], + "code": "import System.IO (openFile, IOMode(ReadMode), hGetContents)\nimport Data.List (unfoldr)\n\nreadFileInChunks :: FilePath -> Int -> IO [[String]]\nreadFileInChunks filePath chunkSize = do\n handle <- openFile filePath ReadMode\n contents <- hGetContents handle\n let linesList = lines contents\n return $ go linesList\n where\n go [] = []\n go xs = take chunkSize xs : go (drop chunkSize xs)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let file = \"example.txt\"\n let chunkSize = 3 -- Number of lines per chunk\n chunks <- readFileInChunks file chunkSize\n mapM_ (putStrLn . unlines) chunks\n\n" } ] }, @@ -95,48 +95,48 @@ "title": "Either Monad for Error Handling", "description": "Using the Either monad to handle errors in a computation.", "author": "ACR1209", - "code": "safeDiv :: Int -> Int -> Either String Int\nsafeDiv _ 0 = Left \"Division by zero error\"\nsafeDiv x y = Right (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 0 -- This will trigger an error\n return b\n print result -- Output: Left \"Division by zero error\"\n", "tags": [ "monads", "either", "error handling" ], - "contributors": [] + "contributors": [], + "code": "safeDiv :: Int -> Int -> Either String Int\nsafeDiv _ 0 = Left \"Division by zero error\"\nsafeDiv x y = Right (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 0 -- This will trigger an error\n return b\n print result -- Output: Left \"Division by zero error\"\n" }, { "title": "Maybe Monad", "description": "Using the Maybe monad to handle computations that might fail.", "author": "ACR1209", - "code": "safeDiv :: Int -> Int -> Maybe Int\nsafeDiv _ 0 = Nothing\nsafeDiv x y = Just (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 2\n return b\n print result -- Output: Just 2\n", "tags": [ "monads", "maybe" ], - "contributors": [] + "contributors": [], + "code": "safeDiv :: Int -> Int -> Maybe Int\nsafeDiv _ 0 = Nothing\nsafeDiv x y = Just (x `div` y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let result = do\n a <- safeDiv 10 2\n b <- safeDiv a 2\n return b\n print result -- Output: Just 2\n" }, { "title": "State Monad", "description": "Managing mutable state using the State monad.", "author": "ACR1209", - "code": "import Control.Monad.State\n\nincrement :: State Int Int\nincrement = do\n count <- get\n put (count + 1)\n return count\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (res1, intermediateState) = runState increment 0\n print res1 -- Output: 0\n let (result, finalState) = runState increment intermediateState\n print result -- Output: 1\n print finalState -- Output: 2\n\n", "tags": [ "monads", "state", "state-management" ], - "contributors": [] + "contributors": [], + "code": "import Control.Monad.State\n\nincrement :: State Int Int\nincrement = do\n count <- get\n put (count + 1)\n return count\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (res1, intermediateState) = runState increment 0\n print res1 -- Output: 0\n let (result, finalState) = runState increment intermediateState\n print result -- Output: 1\n print finalState -- Output: 2\n\n" }, { "title": "Writer Monad", "description": "Using the Writer monad to accumulate logs or other outputs alongside a computation.", "author": "ACR1209", - "code": "import Control.Monad.Writer\n\naddAndLog :: Int -> Int -> Writer [String] Int\naddAndLog x y = do\n tell [\"Adding \" ++ show x ++ \" and \" ++ show y]\n return (x + y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (result, logs) = runWriter $ do\n res1 <- addAndLog 3 5\n addAndLog res1 1\n print result -- Output: 9\n print logs -- Output: [\"Adding 3 and 5\", \"Adding 8 and 1\"]\n", "tags": [ "monads", "writer", "logs" ], - "contributors": [] + "contributors": [], + "code": "import Control.Monad.Writer\n\naddAndLog :: Int -> Int -> Writer [String] Int\naddAndLog x y = do\n tell [\"Adding \" ++ show x ++ \" and \" ++ show y]\n return (x + y)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let (result, logs) = runWriter $ do\n res1 <- addAndLog 3 5\n addAndLog res1 1\n print result -- Output: 9\n print logs -- Output: [\"Adding 3 and 5\", \"Adding 8 and 1\"]\n" } ] }, @@ -147,7 +147,6 @@ "title": "CamelCase to snake_case", "description": "Converts a Camel Case string to Snake case.", "author": "ACR1209", - "code": "import Data.Char (isUpper, toLower)\n\ncamelToSnake :: String -> String\ncamelToSnake [] = []\ncamelToSnake (x:xs)\n | isUpper x = '_' : toLower x : camelToSnake xs\n | otherwise = x : camelToSnake xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let camelCase = \"camelCaseToSnakeCase\"\n print $ camelToSnake camelCase -- Output: \"camel_case_to_snake_case\"\n", "tags": [ "string", "convert", @@ -155,49 +154,49 @@ "snake-case", "utility" ], - "contributors": [] + "contributors": [], + "code": "import Data.Char (isUpper, toLower)\n\ncamelToSnake :: String -> String\ncamelToSnake [] = []\ncamelToSnake (x:xs)\n | isUpper x = '_' : toLower x : camelToSnake xs\n | otherwise = x : camelToSnake xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let camelCase = \"camelCaseToSnakeCase\"\n print $ camelToSnake camelCase -- Output: \"camel_case_to_snake_case\"\n" }, { "title": "Capitalize Words", "description": "Capitalizes the first letter of each word in a string.", "author": "ACR1209", - "code": "import Data.Char (toUpper)\n\ncapitalizeWords :: String -> String\ncapitalizeWords = unwords . map capitalize . words\n where\n capitalize [] = []\n capitalize (x:xs) = toUpper x : xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let sentence = \"haskell is awesome\"\n print $ capitalizeWords sentence -- Output: \"Haskell Is Awesome\"\n", "tags": [ "string", "capitalize", "words" ], - "contributors": [] + "contributors": [], + "code": "import Data.Char (toUpper)\n\ncapitalizeWords :: String -> String\ncapitalizeWords = unwords . map capitalize . words\n where\n capitalize [] = []\n capitalize (x:xs) = toUpper x : xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let sentence = \"haskell is awesome\"\n print $ capitalizeWords sentence -- Output: \"Haskell Is Awesome\"\n" }, { "title": "Count Word Occurrences in String", "description": "Counts the occurrences of each word in a given string.", "author": "ACR1209", - "code": "import Data.List (group, sort)\n\ncountWordOccurrences :: String -> [(String, Int)]\ncountWordOccurrences = map (\\(w:ws) -> (w, length (w:ws))) . group . sort . words\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"haskell is awesome and haskell is fun\"\n print $ countWordOccurrences text -- Output: [(\"and\",1),(\"awesome\",1),(\"fun\",1),(\"haskell\",2),(\"is\",2)]\n", "tags": [ "string", "occurrences", "word-count" ], - "contributors": [] + "contributors": [], + "code": "import Data.List (group, sort)\n\ncountWordOccurrences :: String -> [(String, Int)]\ncountWordOccurrences = map (\\(w:ws) -> (w, length (w:ws))) . group . sort . words\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"haskell is awesome and haskell is fun\"\n print $ countWordOccurrences text -- Output: [(\"and\",1),(\"awesome\",1),(\"fun\",1),(\"haskell\",2),(\"is\",2)]\n" }, { "title": "Remove Punctuation", "description": "Removes all punctuation from a given string.", "author": "ACR1209", - "code": "import Data.Char (isPunctuation)\n\nremovePunctuation :: String -> String\nremovePunctuation = filter (not . isPunctuation)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"Hello, Haskell! How's it going?\"\n print $ removePunctuation text -- Output: \"Hello Haskell Hows it going\"\n", "tags": [ "string", "punctuation", "remove" ], - "contributors": [] + "contributors": [], + "code": "import Data.Char (isPunctuation)\n\nremovePunctuation :: String -> String\nremovePunctuation = filter (not . isPunctuation)\n\n-- Usage:\nmain :: IO ()\nmain = do\n let text = \"Hello, Haskell! How's it going?\"\n print $ removePunctuation text -- Output: \"Hello Haskell Hows it going\"\n" }, { "title": "Snake_Case to CamelCase", "description": "Converts a Snake Case string to Camel Case.", "author": "ACR1209", - "code": "import Data.Char (toUpper)\n\nsnakeToCamel :: String -> String\nsnakeToCamel [] = []\nsnakeToCamel ('_':x:xs) = toUpper x : snakeToCamel xs\nsnakeToCamel (x:xs) = x : snakeToCamel xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let snakeCase = \"snake_case_to_camel_case\"\n print $ snakeToCamel snakeCase -- Output: \"snakeCaseToCamelCase\"\n", "tags": [ "string", "convert", @@ -205,19 +204,20 @@ "camel-case", "utilty" ], - "contributors": [] + "contributors": [], + "code": "import Data.Char (toUpper)\n\nsnakeToCamel :: String -> String\nsnakeToCamel [] = []\nsnakeToCamel ('_':x:xs) = toUpper x : snakeToCamel xs\nsnakeToCamel (x:xs) = x : snakeToCamel xs\n\n-- Usage:\nmain :: IO ()\nmain = do\n let snakeCase = \"snake_case_to_camel_case\"\n print $ snakeToCamel snakeCase -- Output: \"snakeCaseToCamelCase\"\n" }, { "title": "Truncate String", "description": "Truncates a string to a specified length, optionally adding an ellipsis.", "author": "ACR1209", - "code": "truncateString :: Int -> String -> String\ntruncateString maxLength str\n | length str <= maxLength = str\n | otherwise = take (maxLength - 3) str ++ \"...\"\n\n-- Usage:\nmain :: IO ()\nmain = do\n let longString = \"Haskell is a powerful functional programming language.\"\n print $ truncateString 20 longString -- Output: \"Haskell is a powe...\"\n print $ truncateString 54 longString -- Output: \"Haskell is a powerful functional programming language.\"\n", "tags": [ "string", "truncate", "utility" ], - "contributors": [] + "contributors": [], + "code": "truncateString :: Int -> String -> String\ntruncateString maxLength str\n | length str <= maxLength = str\n | otherwise = take (maxLength - 3) str ++ \"...\"\n\n-- Usage:\nmain :: IO ()\nmain = do\n let longString = \"Haskell is a powerful functional programming language.\"\n print $ truncateString 20 longString -- Output: \"Haskell is a powe...\"\n print $ truncateString 54 longString -- Output: \"Haskell is a powerful functional programming language.\"\n" } ] } diff --git a/public/consolidated/html.json b/public/consolidated/html.json index ba1201e2..f7635148 100644 --- a/public/consolidated/html.json +++ b/public/consolidated/html.json @@ -6,7 +6,6 @@ "title": "Grid Layout with Navigation", "description": "Full-height grid layout with header navigation using nesting syntax.", "author": "GreenMan36", - "code": "\n\n \n \n \n \n
\n Header\n \n
\n
Main Content
\n
Footer
\n \n\n", "tags": [ "css", "layout", @@ -14,13 +13,13 @@ "grid", "full-height" ], - "contributors": [] + "contributors": [], + "code": "\n\n \n \n \n \n
\n Header\n \n
\n
Main Content
\n
Footer
\n \n\n" }, { "title": "Sticky Header-Footer Layout", "description": "Full-height layout with sticky header and footer, using modern viewport units and flexbox.", "author": "GreenMan36", - "code": "\n\n \n \n \n \n
header
\n
body/content
\n
footer
\n \n\n", "tags": [ "css", "layout", @@ -28,7 +27,8 @@ "flexbox", "viewport" ], - "contributors": [] + "contributors": [], + "code": "\n\n \n \n \n \n
header
\n
body/content
\n
footer
\n \n\n" } ] } diff --git a/public/consolidated/java.json b/public/consolidated/java.json index 06aadb7d..f00ab589 100644 --- a/public/consolidated/java.json +++ b/public/consolidated/java.json @@ -6,13 +6,13 @@ "title": "Hello-World", "description": "Prints Hello world in the console", "author": "SarvariHarshitha", - "code": "// This is the main class of the Java program\npublic class Main {\n // The main method is the entry point of the program\n public static void main(String args[]) {\n // This statement prints \"Hello, World!\" to the console\n System.out.println(\"Hello, World!\");\n }\n}\n\n", "tags": [ "java", "console", "printing" ], - "contributors": [] + "contributors": [], + "code": "// This is the main class of the Java program\npublic class Main {\n // The main method is the entry point of the program\n public static void main(String args[]) {\n // This statement prints \"Hello, World!\" to the console\n System.out.println(\"Hello, World!\");\n }\n}\n\n" } ] } diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json index 38244992..c7b78ff8 100644 --- a/public/consolidated/javascript.json +++ b/public/consolidated/javascript.json @@ -6,58 +6,58 @@ "title": "Partition Array", "description": "Splits an array into two arrays based on a callback function.", "author": "Swaraj-Singh-30", - "code": "const partition = (arr, callback) =>\n arr.reduce(\n ([pass, fail], elem) => (callback(elem) ? [[...pass, elem], fail] : [pass, [...fail, elem]]),\n [[], []]\n );\n\n// Usage:\nconst numbers = [1, 2, 3, 4, 5, 6];\nconst isEven = (n) => n % 2 === 0;\npartition(numbers, isEven); // Returns: [[2, 4, 6], [1, 3, 5]]\n", "tags": [ "array", "partition", "reduce" ], - "contributors": [] + "contributors": [], + "code": "const partition = (arr, callback) =>\n arr.reduce(\n ([pass, fail], elem) => (callback(elem) ? [[...pass, elem], fail] : [pass, [...fail, elem]]),\n [[], []]\n );\n\n// Usage:\nconst numbers = [1, 2, 3, 4, 5, 6];\nconst isEven = (n) => n % 2 === 0;\npartition(numbers, isEven); // Returns: [[2, 4, 6], [1, 3, 5]]\n" }, { "title": "Remove Duplicates", "description": "Removes duplicate values from an array.", "author": "dostonnabotov", - "code": "const removeDuplicates = (arr) => [...new Set(arr)];\n\n// Usage:\nconst numbers = [1, 2, 2, 3, 4, 4, 5];\nremoveDuplicates(numbers); // Returns: [1, 2, 3, 4, 5]\n", "tags": [ "array", "deduplicate" ], - "contributors": [] + "contributors": [], + "code": "const removeDuplicates = (arr) => [...new Set(arr)];\n\n// Usage:\nconst numbers = [1, 2, 2, 3, 4, 4, 5];\nremoveDuplicates(numbers); // Returns: [1, 2, 3, 4, 5]\n" }, { "title": "Remove Falsy Values", "description": "Removes falsy values from an array.", "author": "mubasshir", - "code": "const removeFalsy = (arr) => arr.filter(Boolean);\n\n// Usage:\nconst array = [0, 1, false, 2, \"\", 3, null];\nremoveFalsy(array); // Returns: [1, 2, 3]\n", "tags": [ "array", "falsy", "filter" ], - "contributors": [] + "contributors": [], + "code": "const removeFalsy = (arr) => arr.filter(Boolean);\n\n// Usage:\nconst array = [0, 1, false, 2, \"\", 3, null];\nremoveFalsy(array); // Returns: [1, 2, 3]\n" }, { "title": "Shuffle Array", "description": "Shuffles an Array.", "author": "loxt-nixo", - "code": "function shuffleArray(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n}\n\n// Usage:\nconst array = [1, 2, 3, 4, 5];\nshuffleArray(array); // Shuffles `array` in place\n", "tags": [ "array", "shuffle" ], - "contributors": [] + "contributors": [], + "code": "function shuffleArray(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n}\n\n// Usage:\nconst array = [1, 2, 3, 4, 5];\nshuffleArray(array); // Shuffles `array` in place\n" }, { "title": "Zip Arrays", "description": "Combines two arrays by pairing corresponding elements from each array.", "author": "Swaraj-Singh-30", - "code": "const zip = (arr1, arr2) => arr1.map((value, index) => [value, arr2[index]]);\n\n// Usage:\nconst arr1 = ['a', 'b', 'c'];\nconst arr2 = [1, 2, 3];\nconsole.log(zip(arr1, arr2)); // Output: [['a', 1], ['b', 2], ['c', 3]]\n", "tags": [ "array", "map" ], - "contributors": [] + "contributors": [], + "code": "const zip = (arr1, arr2) => arr1.map((value, index) => [value, arr2[index]]);\n\n// Usage:\nconst arr1 = ['a', 'b', 'c'];\nconst arr2 = [1, 2, 3];\nconsole.log(zip(arr1, arr2)); // Output: [['a', 1], ['b', 2], ['c', 3]]\n" } ] }, @@ -68,12 +68,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", - "code": "console.log(\"Hello, World!\"); // Prints Hello, World! to the console\n", "tags": [ "printing", "hello-world" ], - "contributors": [] + "contributors": [], + "code": "console.log(\"Hello, World!\"); // Prints Hello, World! to the console\n" } ] }, @@ -85,10 +85,8 @@ "description": "Converts RGB color values to hexadecimal color code.", "author": "jjcantu", "tags": [ - "javascript", "color", - "conversion", - "utility" + "conversion" ], "contributors": [], "code": "function rgbToHex(r, g, b) {\n const toHex = (n) => {\n const hex = n.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n \n return '#' + toHex(r) + toHex(g) + toHex(b);\n}\n\n// Usage:\nconsole.log(rgbToHex(255, 128, 0)); // Output: \"#ff8000\"\nconsole.log(rgbToHex(0, 255, 0)); // Output: \"#00ff00\"\n" @@ -102,74 +100,73 @@ "title": "Check Leap Year", "description": "Determines if a given year is a leap year.", "author": "axorax", - "code": "const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n\n// Usage:\nisLeapYear(2024); // Returns: true\nisLeapYear(2023); // Returns: false\n", "tags": [ "date", "leap-year" ], - "contributors": [] + "contributors": [], + "code": "const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n\n// Usage:\nisLeapYear(2024); // Returns: true\nisLeapYear(2023); // Returns: false\n" }, { "title": "Convert to Unix Timestamp", "description": "Converts a date to a Unix timestamp in seconds.", "author": "Yugveer06", - "code": "function convertToUnixSeconds(input) {\n if (typeof input === 'string') {\n if (!input.trim()) {\n throw new Error('Date string cannot be empty or whitespace');\n }\n } else if (!input) {\n throw new Error('Input is required');\n }\n\n let date;\n\n if (typeof input === 'string') {\n date = new Date(input);\n } else if (input instanceof Date) {\n date = input;\n } else {\n throw new Error('Input must be a valid date string or Date object');\n }\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid date provided');\n }\n\n return Math.floor(date.getTime() / 1000);\n}\n\n// Usage:\nconvertToUnixSeconds('2025-01-01T12:00:00Z'); // Returns: 1735732800\nconvertToUnixSeconds(new Date('2025-01-01T12:00:00Z')); // Returns: 1735732800\nconvertToUnixSeconds(new Date()); // Returns: Current Unix timestamp in seconds\n", "tags": [ "date", "unix", "timestamp" ], - "contributors": [] + "contributors": [], + "code": "function convertToUnixSeconds(input) {\n if (typeof input === 'string') {\n if (!input.trim()) {\n throw new Error('Date string cannot be empty or whitespace');\n }\n } else if (!input) {\n throw new Error('Input is required');\n }\n\n let date;\n\n if (typeof input === 'string') {\n date = new Date(input);\n } else if (input instanceof Date) {\n date = input;\n } else {\n throw new Error('Input must be a valid date string or Date object');\n }\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid date provided');\n }\n\n return Math.floor(date.getTime() / 1000);\n}\n\n// Usage:\nconvertToUnixSeconds('2025-01-01T12:00:00Z'); // Returns: 1735732800\nconvertToUnixSeconds(new Date('2025-01-01T12:00:00Z')); // Returns: 1735732800\nconvertToUnixSeconds(new Date()); // Returns: Current Unix timestamp in seconds\n" }, { "title": "Format Date", "description": "Formats a date in 'YYYY-MM-DD' format.", "author": "dostonnabotov", - "code": "const formatDate = (date) => date.toISOString().split('T')[0];\n\n// Usage:\nformatDate(new Date(2024, 11, 10)); // Returns: '2024-12-10'\n", "tags": [ "date", "format" ], - "contributors": [] + "contributors": [], + "code": "const formatDate = (date) => date.toISOString().split('T')[0];\n\n// Usage:\nformatDate(new Date(2024, 11, 10)); // Returns: '2024-12-10'\n" }, { "title": "Get Day of the Year", "description": "Calculates the day of the year (1-365 or 1-366 for leap years) for a given date.", "author": "axorax", - "code": "const getDayOfYear = (date) => {\n const startOfYear = new Date(date.getFullYear(), 0, 0);\n const diff = date - startOfYear + (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000;\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\ngetDayOfYear(new Date('2024-12-31')) // Returns: 366 (Leap year)\n", "tags": [ "date", "day-of-year" ], - "contributors": [] + "contributors": [], + "code": "const getDayOfYear = (date) => {\n const startOfYear = new Date(date.getFullYear(), 0, 0);\n const diff = date - startOfYear + (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000;\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\ngetDayOfYear(new Date('2024-12-31')) // Returns: 366 (Leap year)\n" }, { "title": "Get Days in Month", "description": "Calculates the number of days in a specific month of a given year.", "author": "axorax", - "code": "const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();\n\n// Usage:\ngetDaysInMonth(2024, 1); // Returns: 29 (February in a leap year)\ngetDaysInMonth(2023, 1); // Returns: 28\n", "tags": [ "date", "days-in-month" ], - "contributors": [] + "contributors": [], + "code": "const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();\n\n// Usage:\ngetDaysInMonth(2024, 1); // Returns: 29 (February in a leap year)\ngetDaysInMonth(2023, 1); // Returns: 28\n" }, { "title": "Get Time Difference", "description": "Calculates the time difference in days between two dates.", "author": "dostonnabotov", - "code": "const getTimeDifference = (date1, date2) => {\n const diff = Math.abs(date2 - date1);\n return Math.ceil(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\nconst date1 = new Date('2024-01-01');\nconst date2 = new Date('2024-12-31');\ngetTimeDifference(date1, date2); // Returns: 365\n", "tags": [ "date", "time-difference" ], - "contributors": [] + "contributors": [], + "code": "const getTimeDifference = (date1, date2) => {\n const diff = Math.abs(date2 - date1);\n return Math.ceil(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\nconst date1 = new Date('2024-01-01');\nconst date2 = new Date('2024-12-31');\ngetTimeDifference(date1, date2); // Returns: 365\n" }, { "title": "Relative Time Formatter", "description": "Displays how long ago a date occurred or how far in the future a date is.", "author": "Yugveer06", - "code": "const getRelativeTime = (date) => {\n const now = Date.now();\n const diff = date.getTime() - now;\n const seconds = Math.abs(Math.floor(diff / 1000));\n const minutes = Math.abs(Math.floor(seconds / 60));\n const hours = Math.abs(Math.floor(minutes / 60));\n const days = Math.abs(Math.floor(hours / 24));\n const years = Math.abs(Math.floor(days / 365));\n\n if (Math.abs(diff) < 1000) return 'just now';\n\n const isFuture = diff > 0;\n\n if (years > 0) return `${isFuture ? 'in ' : ''}${years} ${years === 1 ? 'year' : 'years'}${isFuture ? '' : ' ago'}`;\n if (days > 0) return `${isFuture ? 'in ' : ''}${days} ${days === 1 ? 'day' : 'days'}${isFuture ? '' : ' ago'}`;\n if (hours > 0) return `${isFuture ? 'in ' : ''}${hours} ${hours === 1 ? 'hour' : 'hours'}${isFuture ? '' : ' ago'}`;\n if (minutes > 0) return `${isFuture ? 'in ' : ''}${minutes} ${minutes === 1 ? 'minute' : 'minutes'}${isFuture ? '' : ' ago'}`;\n\n return `${isFuture ? 'in ' : ''}${seconds} ${seconds === 1 ? 'second' : 'seconds'}${isFuture ? '' : ' ago'}`;\n}\n\n// Usage:\nconst pastDate = new Date('2021-12-29 13:00:00');\nconst futureDate = new Date('2099-12-29 13:00:00');\ngetRelativeTime(pastDate); // x years ago\ngetRelativeTime(new Date()); // just now\ngetRelativeTime(futureDate); // in x years\n", "tags": [ "date", "time", @@ -177,18 +174,19 @@ "future", "past" ], - "contributors": [] + "contributors": [], + "code": "const getRelativeTime = (date) => {\n const now = Date.now();\n const diff = date.getTime() - now;\n const seconds = Math.abs(Math.floor(diff / 1000));\n const minutes = Math.abs(Math.floor(seconds / 60));\n const hours = Math.abs(Math.floor(minutes / 60));\n const days = Math.abs(Math.floor(hours / 24));\n const years = Math.abs(Math.floor(days / 365));\n\n if (Math.abs(diff) < 1000) return 'just now';\n\n const isFuture = diff > 0;\n\n if (years > 0) return `${isFuture ? 'in ' : ''}${years} ${years === 1 ? 'year' : 'years'}${isFuture ? '' : ' ago'}`;\n if (days > 0) return `${isFuture ? 'in ' : ''}${days} ${days === 1 ? 'day' : 'days'}${isFuture ? '' : ' ago'}`;\n if (hours > 0) return `${isFuture ? 'in ' : ''}${hours} ${hours === 1 ? 'hour' : 'hours'}${isFuture ? '' : ' ago'}`;\n if (minutes > 0) return `${isFuture ? 'in ' : ''}${minutes} ${minutes === 1 ? 'minute' : 'minutes'}${isFuture ? '' : ' ago'}`;\n\n return `${isFuture ? 'in ' : ''}${seconds} ${seconds === 1 ? 'second' : 'seconds'}${isFuture ? '' : ' ago'}`;\n}\n\n// Usage:\nconst pastDate = new Date('2021-12-29 13:00:00');\nconst futureDate = new Date('2099-12-29 13:00:00');\ngetRelativeTime(pastDate); // x years ago\ngetRelativeTime(new Date()); // just now\ngetRelativeTime(futureDate); // in x years\n" }, { "title": "Start of the Day", "description": "Returns the start of the day (midnight) for a given date.", "author": "axorax", - "code": "const startOfDay = (date) => new Date(date.setHours(0, 0, 0, 0));\n\n// Usage:\nconst today = new Date();\nstartOfDay(today); // Returns: Date object for midnight\n", "tags": [ "date", "start-of-day" ], - "contributors": [] + "contributors": [], + "code": "const startOfDay = (date) => new Date(date.setHours(0, 0, 0, 0));\n\n// Usage:\nconst today = new Date();\nstartOfDay(today); // Returns: Date object for midnight\n" } ] }, @@ -199,23 +197,23 @@ "title": "Change Element Style", "description": "Changes the inline style of an element.", "author": "axorax", - "code": "const changeElementStyle = (element, styleObj) => {\n Object.entries(styleObj).forEach(([property, value]) => {\n element.style[property] = value;\n });\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nchangeElementStyle(element, { color: 'red', backgroundColor: 'yellow' });\n", "tags": [ "dom", "style" ], - "contributors": [] + "contributors": [], + "code": "const changeElementStyle = (element, styleObj) => {\n Object.entries(styleObj).forEach(([property, value]) => {\n element.style[property] = value;\n });\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nchangeElementStyle(element, { color: 'red', backgroundColor: 'yellow' });\n" }, { "title": "Remove Element", "description": "Removes a specified element from the DOM.", "author": "axorax", - "code": "const removeElement = (element) => {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nremoveElement(element);\n", "tags": [ "dom", "remove" ], - "contributors": [] + "contributors": [], + "code": "const removeElement = (element) => {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nremoveElement(element);\n" } ] }, @@ -226,97 +224,96 @@ "title": "Compose Functions", "description": "Composes multiple functions into a single function, where the output of one function becomes the input of the next.", "author": "axorax", - "code": "const compose = (...funcs) => (initialValue) => {\n return funcs.reduce((acc, func) => func(acc), initialValue);\n};\n\n// Usage:\nconst add2 = (x) => x + 2;\nconst multiply3 = (x) => x * 3;\nconst composed = compose(multiply3, add2);\ncomposed(5); // Returns: 17 ((5 * 3) + 2)\n", "tags": [ "function", "compose" ], - "contributors": [] + "contributors": [], + "code": "const compose = (...funcs) => (initialValue) => {\n return funcs.reduce((acc, func) => func(acc), initialValue);\n};\n\n// Usage:\nconst add2 = (x) => x + 2;\nconst multiply3 = (x) => x * 3;\nconst composed = compose(multiply3, add2);\ncomposed(5); // Returns: 17 ((5 * 3) + 2)\n" }, { "title": "Curry Function", "description": "Transforms a function into its curried form.", "author": "axorax", - "code": "const curry = (func) => {\n const curried = (...args) => {\n if (args.length >= func.length) {\n return func(...args);\n }\n return (...nextArgs) => curried(...args, ...nextArgs);\n };\n return curried;\n};\n\n// Usage:\nconst add = (a, b, c) => a + b + c;\nconst curriedAdd = curry(add);\ncurriedAdd(1)(2)(3); // Returns: 6\ncurriedAdd(1, 2)(3); // Returns: 6\n", "tags": [ "curry", "function" ], - "contributors": [] + "contributors": [], + "code": "const curry = (func) => {\n const curried = (...args) => {\n if (args.length >= func.length) {\n return func(...args);\n }\n return (...nextArgs) => curried(...args, ...nextArgs);\n };\n return curried;\n};\n\n// Usage:\nconst add = (a, b, c) => a + b + c;\nconst curriedAdd = curry(add);\ncurriedAdd(1)(2)(3); // Returns: 6\ncurriedAdd(1, 2)(3); // Returns: 6\n" }, { "title": "Debounce Function", "description": "Delays a function execution until after a specified time.", "author": "dostonnabotov", - "code": "const debounce = (func, delay) => {\n let timeout;\n\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), delay);\n };\n};\n\n// Usage:\nwindow.addEventListener(\n 'resize',\n debounce(() => console.log('Resized!'), 500), // Will only output after resizing has stopped for 500ms\n);\n", "tags": [ "debounce", "performance" ], - "contributors": [] + "contributors": [], + "code": "const debounce = (func, delay) => {\n let timeout;\n\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), delay);\n };\n};\n\n// Usage:\nwindow.addEventListener(\n 'resize',\n debounce(() => console.log('Resized!'), 500), // Will only output after resizing has stopped for 500ms\n);\n" }, { "title": "Get Contrast Color", "description": "Returns either black or white text color based on the brightness of the provided hex color.", "author": "yaya12085", - "code": "const getContrastColor = (hexColor) => {\n // Expand short hex color to full format\n if (hexColor.length === 4) {\n hexColor = `#${hexColor[1]}${hexColor[1]}${hexColor[2]}${hexColor[2]}${hexColor[3]}${hexColor[3]}`;\n }\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness >= 128 ? \"#000000\" : \"#FFFFFF\";\n};\n\n// Usage:\ngetContrastColor('#fff'); // Returns: #000000 (black)\ngetContrastColor('#123456'); // Returns: #FFFFFF (white)\ngetContrastColor('#ff6347'); // Returns: #000000 (black)\ngetContrastColor('#f4f'); // Returns: #000000 (black)\n", "tags": [ "color", "hex", "contrast", "brightness" ], - "contributors": [] + "contributors": [], + "code": "const getContrastColor = (hexColor) => {\n // Expand short hex color to full format\n if (hexColor.length === 4) {\n hexColor = `#${hexColor[1]}${hexColor[1]}${hexColor[2]}${hexColor[2]}${hexColor[3]}${hexColor[3]}`;\n }\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness >= 128 ? \"#000000\" : \"#FFFFFF\";\n};\n\n// Usage:\ngetContrastColor('#fff'); // Returns: #000000 (black)\ngetContrastColor('#123456'); // Returns: #FFFFFF (white)\ngetContrastColor('#ff6347'); // Returns: #000000 (black)\ngetContrastColor('#f4f'); // Returns: #000000 (black)\n" }, { "title": "Memoize Function", "description": "Caches the result of a function based on its arguments to improve performance.", "author": "axorax", - "code": "const memoize = (func) => {\n const cache = new Map();\n return (...args) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n};\n\n// Usage:\nconst factorial = memoize((n) => (n <= 1 ? 1 : n * factorial(n - 1)));\nfactorial(5); // Returns: 120\nfactorial(5); // Returns: 120 (retrieved from cache)\n", "tags": [ "memoization", "optimization" ], - "contributors": [] + "contributors": [], + "code": "const memoize = (func) => {\n const cache = new Map();\n return (...args) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n};\n\n// Usage:\nconst factorial = memoize((n) => (n <= 1 ? 1 : n * factorial(n - 1)));\nfactorial(5); // Returns: 120\nfactorial(5); // Returns: 120 (retrieved from cache)\n" }, { "title": "Once Function", "description": "Ensures a function is only called once.", "author": "axorax", - "code": "const once = (func) => {\n let called = false;\n return (...args) => {\n if (!called) {\n called = true;\n return func(...args);\n }\n };\n};\n\n// Usage:\nconst initialize = once(() => console.log('Initialized!'));\ninitialize(); // Output: Initialized!\ninitialize(); // No output\n", "tags": [ "function", "once" ], - "contributors": [] + "contributors": [], + "code": "const once = (func) => {\n let called = false;\n return (...args) => {\n if (!called) {\n called = true;\n return func(...args);\n }\n };\n};\n\n// Usage:\nconst initialize = once(() => console.log('Initialized!'));\ninitialize(); // Output: Initialized!\ninitialize(); // No output\n" }, { "title": "Rate Limit Function", "description": "Limits how often a function can be executed within a given time window.", "author": "axorax", - "code": "const rateLimit = (func, limit, timeWindow) => {\n let queue = [];\n setInterval(() => {\n if (queue.length) {\n const next = queue.shift();\n func(...next.args);\n }\n }, timeWindow);\n return (...args) => {\n if (queue.length < limit) {\n queue.push({ args });\n }\n };\n};\n\n// Usage:\nconst fetchData = () => console.log('Fetching data...');\nconst rateLimitedFetch = rateLimit(fetchData, 2, 1000);\nsetInterval(() => rateLimitedFetch(), 200); // Limits fetchData calls to twice a seconds\n", "tags": [ "function", "rate-limiting" ], - "contributors": [] + "contributors": [], + "code": "const rateLimit = (func, limit, timeWindow) => {\n let queue = [];\n setInterval(() => {\n if (queue.length) {\n const next = queue.shift();\n func(...next.args);\n }\n }, timeWindow);\n return (...args) => {\n if (queue.length < limit) {\n queue.push({ args });\n }\n };\n};\n\n// Usage:\nconst fetchData = () => console.log('Fetching data...');\nconst rateLimitedFetch = rateLimit(fetchData, 2, 1000);\nsetInterval(() => rateLimitedFetch(), 200); // Limits fetchData calls to twice a seconds\n" }, { "title": "Repeat Function Invocation", "description": "Invokes a function a specified number of times.", "author": "dostonnabotov", - "code": "const times = (func, n) => {\n Array.from(Array(n)).forEach(() => {\n func();\n });\n};\n\n// Usage:\nconst randomFunction = () => console.log('Function called!');\ntimes(randomFunction, 3); // Logs 'Function called!' three times\n", "tags": [ "function", "repeat" ], - "contributors": [] + "contributors": [], + "code": "const times = (func, n) => {\n Array.from(Array(n)).forEach(() => {\n func();\n });\n};\n\n// Usage:\nconst randomFunction = () => console.log('Function called!');\ntimes(randomFunction, 3); // Logs 'Function called!' three times\n" }, { "title": "Sleep Function", "description": "Waits for a specified amount of milliseconds before resolving.", "author": "0xHouss", - "code": "const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// Usage:\nconsole.log('Hello');\nawait sleep(2000); // Waits for 2 seconds\nconsole.log('World!');\n", "tags": [ "javascript", "sleep", @@ -324,7 +321,8 @@ "utility", "promises" ], - "contributors": [] + "contributors": [], + "code": "const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// Usage:\nconsole.log('Hello');\nawait sleep(2000); // Waits for 2 seconds\nconsole.log('World!');\n" } ] }, @@ -335,34 +333,34 @@ "title": "Add Item to localStorage", "description": "Stores a value in localStorage under the given key.", "author": "dostonnabotov", - "code": "const addToLocalStorage = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\n\n// Usage:\naddToLocalStorage('user', { name: 'John', age: 30 });\n", "tags": [ "localStorage", "storage" ], - "contributors": [] + "contributors": [], + "code": "const addToLocalStorage = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\n\n// Usage:\naddToLocalStorage('user', { name: 'John', age: 30 });\n" }, { "title": "Check if Item Exists in localStorage", "description": "Checks if a specific item exists in localStorage.", "author": "axorax", - "code": "const isItemInLocalStorage = (key) => {\n return localStorage.getItem(key) !== null;\n};\n\n// Usage:\nconsole.log(isItemInLocalStorage('user')); // Output: true or false\n", "tags": [ "localStorage", "storage" ], - "contributors": [] + "contributors": [], + "code": "const isItemInLocalStorage = (key) => {\n return localStorage.getItem(key) !== null;\n};\n\n// Usage:\nconsole.log(isItemInLocalStorage('user')); // Output: true or false\n" }, { "title": "Retrieve Item from localStorage", "description": "Retrieves a value from localStorage by key and parses it.", "author": "dostonnabotov", - "code": "const getFromLocalStorage = (key) => {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : null;\n};\n\n// Usage:\ngetFromLocalStorage('user'); // Returns: { name: 'John', age: 30 }\n", "tags": [ "localStorage", "storage" ], - "contributors": [] + "contributors": [], + "code": "const getFromLocalStorage = (key) => {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : null;\n};\n\n// Usage:\ngetFromLocalStorage('user'); // Returns: { name: 'John', age: 30 }\n" } ] }, @@ -373,44 +371,42 @@ "title": "Convert Number to Currency", "description": "Converts a number to a currency format with a specific locale.", "author": "axorax", - "code": "const convertToCurrency = (num, locale = 'en-US', currency = 'USD') => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency\n }).format(num);\n};\n\n// Usage:\nconvertToCurrency(1234567.89); // Returns: '$1,234,567.89'\nconvertToCurrency(987654.32, 'de-DE', 'EUR'); // Returns: '987.654,32 €'\n", "tags": [ "number", "currency" ], - "contributors": [] + "contributors": [], + "code": "const convertToCurrency = (num, locale = 'en-US', currency = 'USD') => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency\n }).format(num);\n};\n\n// Usage:\nconvertToCurrency(1234567.89); // Returns: '$1,234,567.89'\nconvertToCurrency(987654.32, 'de-DE', 'EUR'); // Returns: '987.654,32 €'\n" }, { "title": "Convert Number to Roman Numerals", "description": "Converts a number to Roman numeral representation.", "author": "axorax", - "code": "const numberToRoman = (num) => {\n const romanNumerals = {\n 1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L',\n 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'\n };\n let result = '';\n Object.keys(romanNumerals).reverse().forEach(value => {\n while (num >= value) {\n result += romanNumerals[value];\n num -= value;\n }\n });\n return result;\n};\n\n// Usage:\nnumberToRoman(1994); // Returns: 'MCMXCIV'\nnumberToRoman(58); // Returns: 'LVIII'\n", "tags": [ "number", "roman" ], - "contributors": [] + "contributors": [], + "code": "const numberToRoman = (num) => {\n const romanNumerals = {\n 1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L',\n 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'\n };\n let result = '';\n Object.keys(romanNumerals).reverse().forEach(value => {\n while (num >= value) {\n result += romanNumerals[value];\n num -= value;\n }\n });\n return result;\n};\n\n// Usage:\nnumberToRoman(1994); // Returns: 'MCMXCIV'\nnumberToRoman(58); // Returns: 'LVIII'\n" }, { "title": "Convert to Scientific Notation", "description": "Converts a number to scientific notation.", "author": "axorax", - "code": "const toScientificNotation = (num) => {\n if (isNaN(num)) {\n throw new Error('Input must be a number');\n }\n if (num === 0) {\n return '0e+0';\n }\n const exponent = Math.floor(Math.log10(Math.abs(num)));\n const mantissa = num / Math.pow(10, exponent);\n return `${mantissa.toFixed(2)}e${exponent >= 0 ? '+' : ''}${exponent}`;\n};\n\n// Usage:\ntoScientificNotation(12345); // Returns: '1.23e+4'\ntoScientificNotation(0.0005678); // Returns: '5.68e-4'\ntoScientificNotation(1000); // Returns: '1.00e+3'\ntoScientificNotation(0); // Returns: '0e+0'\ntoScientificNotation(-54321); // Returns: '-5.43e+4'\n", "tags": [ "number", "scientific" ], - "contributors": [] + "contributors": [], + "code": "const toScientificNotation = (num) => {\n if (isNaN(num)) {\n throw new Error('Input must be a number');\n }\n if (num === 0) {\n return '0e+0';\n }\n const exponent = Math.floor(Math.log10(Math.abs(num)));\n const mantissa = num / Math.pow(10, exponent);\n return `${mantissa.toFixed(2)}e${exponent >= 0 ? '+' : ''}${exponent}`;\n};\n\n// Usage:\ntoScientificNotation(12345); // Returns: '1.23e+4'\ntoScientificNotation(0.0005678); // Returns: '5.68e-4'\ntoScientificNotation(1000); // Returns: '1.00e+3'\ntoScientificNotation(0); // Returns: '0e+0'\ntoScientificNotation(-54321); // Returns: '-5.43e+4'\n" }, { "title": "Format File Size", "description": "Converts bytes into human-readable file size format.", "author": "jjcantu", "tags": [ - "javascript", "format", - "size", - "utility" + "size" ], "contributors": [], "code": "function formatFileSize(bytes) {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n// Usage:\nconsole.log(formatFileSize(1234)); // Output: \"1.21 KB\"\nconsole.log(formatFileSize(1234567)); // Output: \"1.18 MB\"\n" @@ -419,34 +415,34 @@ "title": "Format Number with Commas", "description": "Formats a number with commas for better readability (e.g., 1000 -> 1,000).", "author": "axorax", - "code": "const formatNumberWithCommas = (num) => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// Usage:\nformatNumberWithCommas(1000); // Returns: '1,000'\nformatNumberWithCommas(1234567); // Returns: '1,234,567'\nformatNumberWithCommas(987654321); // Returns: '987,654,321'\n", "tags": [ "number", "format" ], - "contributors": [] + "contributors": [], + "code": "const formatNumberWithCommas = (num) => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// Usage:\nformatNumberWithCommas(1000); // Returns: '1,000'\nformatNumberWithCommas(1234567); // Returns: '1,234,567'\nformatNumberWithCommas(987654321); // Returns: '987,654,321'\n" }, { "title": "Number Formatter", "description": "Formats a number with suffixes (K, M, B, etc.).", "author": "realvishalrana", - "code": "const nFormatter = (num) => {\n if (!num) return;\n num = parseFloat(num.toString().replace(/[^0-9.]/g, ''));\n const suffixes = ['', 'K', 'M', 'B', 'T', 'P', 'E'];\n let index = 0;\n while (num >= 1000 && index < suffixes.length - 1) {\n num /= 1000;\n index++;\n }\n return num.toFixed(2).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + suffixes[index];\n};\n\n// Usage:\nnFormatter(1234567); // Returns: '1.23M'\n", "tags": [ "number", "format" ], - "contributors": [] + "contributors": [], + "code": "const nFormatter = (num) => {\n if (!num) return;\n num = parseFloat(num.toString().replace(/[^0-9.]/g, ''));\n const suffixes = ['', 'K', 'M', 'B', 'T', 'P', 'E'];\n let index = 0;\n while (num >= 1000 && index < suffixes.length - 1) {\n num /= 1000;\n index++;\n }\n return num.toFixed(2).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + suffixes[index];\n};\n\n// Usage:\nnFormatter(1234567); // Returns: '1.23M'\n" }, { "title": "Number to Words Converter", "description": "Converts a number to its word representation in English.", "author": "axorax", - "code": "const numberToWords = (num) => {\n const below20 = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n const above1000 = ['Hundred', 'Thousand', 'Million', 'Billion'];\n if (num < 20) return below20[num];\n let words = '';\n for (let i = 0; num > 0; i++) {\n if (i > 0 && num % 1000 !== 0) words = above1000[i] + ' ' + words;\n if (num % 100 >= 20) {\n words = tens[Math.floor(num / 10)] + ' ' + words;\n num %= 10;\n }\n if (num < 20) words = below20[num] + ' ' + words;\n num = Math.floor(num / 100);\n }\n return words.trim();\n};\n\n// Usage:\nnumberToWords(123); // Returns: 'One Hundred Twenty Three'\nnumberToWords(2045); // Returns: 'Two Thousand Forty Five'\n", "tags": [ "number", "words" ], - "contributors": [] + "contributors": [], + "code": "const numberToWords = (num) => {\n const below20 = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n const above1000 = ['Hundred', 'Thousand', 'Million', 'Billion'];\n if (num < 20) return below20[num];\n let words = '';\n for (let i = 0; num > 0; i++) {\n if (i > 0 && num % 1000 !== 0) words = above1000[i] + ' ' + words;\n if (num % 100 >= 20) {\n words = tens[Math.floor(num / 10)] + ' ' + words;\n num %= 10;\n }\n if (num < 20) words = below20[num] + ' ' + words;\n num = Math.floor(num / 100);\n }\n return words.trim();\n};\n\n// Usage:\nnumberToWords(123); // Returns: 'One Hundred Twenty Three'\nnumberToWords(2045); // Returns: 'Two Thousand Forty Five'\n" } ] }, @@ -457,163 +453,161 @@ "title": "Check if Object is Empty", "description": "Checks whether an object has no own enumerable properties.", "author": "axorax", - "code": "function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// Usage:\nisEmptyObject({}); // Returns: true\nisEmptyObject({ a: 1 }); // Returns: false\n", "tags": [ "object", "check", "empty" ], - "contributors": [] + "contributors": [], + "code": "function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// Usage:\nisEmptyObject({}); // Returns: true\nisEmptyObject({ a: 1 }); // Returns: false\n" }, { "title": "Compare Two Objects Shallowly", "description": "Compares two objects shallowly and returns whether they are equal.", "author": "axorax", - "code": "function shallowEqual(obj1, obj2) {\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n return keys1.every(key => obj1[key] === obj2[key]);\n}\n\n// Usage:\nconst obj1 = { a: 1, b: 2 };\nconst obj2 = { a: 1, b: 2 };\nconst obj3 = { a: 1, b: 3 };\nshallowEqual(obj1, obj2); // Returns: true\nshallowEqual(obj1, obj3); // Returns: false\n", "tags": [ "object", "compare", "shallow" ], - "contributors": [] + "contributors": [], + "code": "function shallowEqual(obj1, obj2) {\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n return keys1.every(key => obj1[key] === obj2[key]);\n}\n\n// Usage:\nconst obj1 = { a: 1, b: 2 };\nconst obj2 = { a: 1, b: 2 };\nconst obj3 = { a: 1, b: 3 };\nshallowEqual(obj1, obj2); // Returns: true\nshallowEqual(obj1, obj3); // Returns: false\n" }, { "title": "Convert Object to Query String", "description": "Converts an object to a query string for use in URLs.", "author": "axorax", - "code": "function toQueryString(obj) {\n return Object.entries(obj)\n .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))\n .join('&');\n}\n\n// Usage:\nconst params = { search: 'test', page: 1 };\ntoQueryString(params); // Returns: 'search=test&page=1'\n", "tags": [ "object", "query string", "url" ], - "contributors": [] + "contributors": [], + "code": "function toQueryString(obj) {\n return Object.entries(obj)\n .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))\n .join('&');\n}\n\n// Usage:\nconst params = { search: 'test', page: 1 };\ntoQueryString(params); // Returns: 'search=test&page=1'\n" }, { "title": "Count Properties in Object", "description": "Counts the number of own properties in an object.", "author": "axorax", - "code": "function countProperties(obj) {\n return Object.keys(obj).length;\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ncountProperties(obj); // Returns: 3\n", "tags": [ "object", "count", "properties" ], - "contributors": [] + "contributors": [], + "code": "function countProperties(obj) {\n return Object.keys(obj).length;\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ncountProperties(obj); // Returns: 3\n" }, { "title": "Deep Clone Object", "description": "Creates a deep copy of an object or array without reference.", "author": "jjcantu", "tags": [ - "javascript", "object", - "clone", - "utility" + "clone" ], "contributors": [], - "code": "function deepClone(obj) {\n if (obj === null || typeof obj !== 'object') return obj;\n \n const clone = Array.isArray(obj) ? [] : {};\n \n for (let key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clone[key] = deepClone(obj[key]);\n }\n }\n \n return clone;\n}\n\n// Usage:\nconst original = { a: 1, b: { c: 2 }, d: [1, 2, 3] };\nconst cloned = deepClone(original);\nconsole.log(cloned); // Output: { a: 1, b: { c: 2 }, d: [1, 2, 3] }\n" + "code": "function deepClone(obj) {\n if (obj === null || typeof obj !== 'object') return obj;\n \n const clone = Array.isArray(obj) ? [] : {};\n \n for (let key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clone[key] = deepClone(obj[key]);\n }\n }\n \n return clone;\n}\n\n// Usage:\nconst original = { a: 1, b: { c: 2 }, d: [1, 2, 3] };\nconst cloned = deepClone(original);\nconsole.log(cloned); // Output: 'original' but cloned\n" }, { "title": "Filter Object", "description": "Filter out entries in an object where the value is falsy, including empty strings, empty objects, null, and undefined.", "author": "realvishalrana", - "code": "export const filterObject = (object = {}) =>\n Object.fromEntries(\n Object.entries(object)\n .filter(([key, value]) => value !== null && value !== undefined && value !== '' && (typeof value !== 'object' || Object.keys(value).length > 0))\n );\n\n// Usage:\nconst obj1 = { a: 1, b: null, c: undefined, d: 4, e: '', f: {} };\nfilterObject(obj1); // Returns: { a: 1, d: 4 }\n\nconst obj2 = { x: 0, y: false, z: 'Hello', w: [] };\nfilterObject(obj2); // Returns: { z: 'Hello' }\n\nconst obj3 = { name: 'John', age: null, address: { city: 'New York' }, phone: '' };\nfilterObject(obj3); // Returns: { name: 'John', address: { city: 'New York' } }\n\nconst obj4 = { a: 0, b: '', c: false, d: {}, e: 'Valid' };\nfilterObject(obj4); // Returns: { e: 'Valid' }\n", "tags": [ "object", "filter" ], - "contributors": [] + "contributors": [], + "code": "export const filterObject = (object = {}) =>\n Object.fromEntries(\n Object.entries(object)\n .filter(([key, value]) => value !== null && value !== undefined && value !== '' && (typeof value !== 'object' || Object.keys(value).length > 0))\n );\n\n// Usage:\nconst obj1 = { a: 1, b: null, c: undefined, d: 4, e: '', f: {} };\nfilterObject(obj1); // Returns: { a: 1, d: 4 }\n\nconst obj2 = { x: 0, y: false, z: 'Hello', w: [] };\nfilterObject(obj2); // Returns: { z: 'Hello' }\n\nconst obj3 = { name: 'John', age: null, address: { city: 'New York' }, phone: '' };\nfilterObject(obj3); // Returns: { name: 'John', address: { city: 'New York' } }\n\nconst obj4 = { a: 0, b: '', c: false, d: {}, e: 'Valid' };\nfilterObject(obj4); // Returns: { e: 'Valid' }\n" }, { "title": "Flatten Nested Object", "description": "Flattens a nested object into a single-level object with dot notation for keys.", "author": "axorax", - "code": "function flattenObject(obj, prefix = '') {\n return Object.keys(obj).reduce((acc, key) => {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n Object.assign(acc, flattenObject(obj[key], fullPath));\n } else {\n acc[fullPath] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// Usage:\nconst nestedObj = { a: { b: { c: 1 }, d: 2 }, e: 3 };\nflattenObject(nestedObj); // Returns: { 'a.b.c': 1, 'a.d': 2, e: 3 }\n", "tags": [ "object", "flatten" ], - "contributors": [] + "contributors": [], + "code": "function flattenObject(obj, prefix = '') {\n return Object.keys(obj).reduce((acc, key) => {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n Object.assign(acc, flattenObject(obj[key], fullPath));\n } else {\n acc[fullPath] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// Usage:\nconst nestedObj = { a: { b: { c: 1 }, d: 2 }, e: 3 };\nflattenObject(nestedObj); // Returns: { 'a.b.c': 1, 'a.d': 2, e: 3 }\n" }, { "title": "Freeze Object", "description": "Freezes an object to make it immutable.", "author": "axorax", - "code": "function freezeObject(obj) {\n return Object.freeze(obj);\n}\n\n// Usage:\nconst obj = { a: 1, b: 2 };\nconst frozenObj = freezeObject(obj);\nfrozenObj.a = 42; // This will fail silently in strict mode.\nfrozenObj.a; // Returns: 1\n", "tags": [ "object", "freeze", "immutable" ], - "contributors": [] + "contributors": [], + "code": "function freezeObject(obj) {\n return Object.freeze(obj);\n}\n\n// Usage:\nconst obj = { a: 1, b: 2 };\nconst frozenObj = freezeObject(obj);\nfrozenObj.a = 42; // This will fail silently in strict mode.\nfrozenObj.a; // Returns: 1\n" }, { "title": "Get Nested Value", "description": "Retrieves the value at a given path in a nested object.", "author": "realvishalrana", - "code": "const getNestedValue = (obj, path) => {\n const keys = path.split('.');\n return keys.reduce((currentObject, key) => {\n return currentObject && typeof currentObject === 'object' ? currentObject[key] : undefined;\n }, obj);\n};\n\n// Usage:\nconst obj = { a: { b: { c: 42 } } };\ngetNestedValue(obj, 'a.b.c'); // Returns: 42\n", "tags": [ "object", "nested" ], - "contributors": [] + "contributors": [], + "code": "const getNestedValue = (obj, path) => {\n const keys = path.split('.');\n return keys.reduce((currentObject, key) => {\n return currentObject && typeof currentObject === 'object' ? currentObject[key] : undefined;\n }, obj);\n};\n\n// Usage:\nconst obj = { a: { b: { c: 42 } } };\ngetNestedValue(obj, 'a.b.c'); // Returns: 42\n" }, { "title": "Invert Object Keys and Values", "description": "Creates a new object by swapping keys and values of the given object.", "author": "axorax", - "code": "function invertObject(obj) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [value, key])\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ninvertObject(obj); // Returns: { '1': 'a', '2': 'b', '3': 'c' }\n", "tags": [ "object", "invert" ], - "contributors": [] + "contributors": [], + "code": "function invertObject(obj) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [value, key])\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ninvertObject(obj); // Returns: { '1': 'a', '2': 'b', '3': 'c' }\n" }, { "title": "Merge Objects Deeply", "description": "Deeply merges two or more objects, including nested properties.", "author": "axorax", - "code": "function deepMerge(...objects) {\n return objects.reduce((acc, obj) => {\n Object.keys(obj).forEach(key => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n acc[key] = deepMerge(acc[key] || {}, obj[key]);\n } else {\n acc[key] = obj[key];\n }\n });\n return acc;\n }, {});\n}\n\n// Usage:\nconst obj1 = { a: 1, b: { c: 2 } };\nconst obj2 = { b: { d: 3 }, e: 4 };\ndeepMerge(obj1, obj2); // Returns: { a: 1, b: { c: 2, d: 3 }, e: 4 }\n", "tags": [ "object", "merge", "deep" ], - "contributors": [] + "contributors": [], + "code": "function deepMerge(...objects) {\n return objects.reduce((acc, obj) => {\n Object.keys(obj).forEach(key => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n acc[key] = deepMerge(acc[key] || {}, obj[key]);\n } else {\n acc[key] = obj[key];\n }\n });\n return acc;\n }, {});\n}\n\n// Usage:\nconst obj1 = { a: 1, b: { c: 2 } };\nconst obj2 = { b: { d: 3 }, e: 4 };\ndeepMerge(obj1, obj2); // Returns: { a: 1, b: { c: 2, d: 3 }, e: 4 }\n" }, { "title": "Omit Keys from Object", "description": "Creates a new object with specific keys omitted.", "author": "axorax", - "code": "function omitKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => !keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\nomitKeys(obj, ['b', 'c']); // Returns: { a: 1 }\n", "tags": [ "object", "omit" ], - "contributors": [] + "contributors": [], + "code": "function omitKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => !keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\nomitKeys(obj, ['b', 'c']); // Returns: { a: 1 }\n" }, { "title": "Pick Keys from Object", "description": "Creates a new object with only the specified keys.", "author": "axorax", - "code": "function pickKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\npickKeys(obj, ['a', 'c']); // Returns: { a: 1, c: 3 }\n", "tags": [ "object", "pick" ], - "contributors": [] + "contributors": [], + "code": "function pickKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\npickKeys(obj, ['a', 'c']); // Returns: { a: 1, c: 3 }\n" }, { "title": "Unique By Key", "description": "Filters an array of objects to only include unique objects by a specified key.", "author": "realvishalrana", - "code": "const uniqueByKey = (key, arr) =>\n arr.filter((obj, index, self) => index === self.findIndex((t) => t?.[key] === obj?.[key]));\n\n// Usage:\nconst arr = [\n { id: 1, name: 'John' },\n { id: 2, name: 'Jane' },\n { id: 1, name: 'John' }\n];\nuniqueByKey('id', arr); // Returns: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\n", "tags": [ "array", "unique" ], - "contributors": [] + "contributors": [], + "code": "const uniqueByKey = (key, arr) =>\n arr.filter((obj, index, self) => index === self.findIndex((t) => t?.[key] === obj?.[key]));\n\n// Usage:\nconst arr = [\n { id: 1, name: 'John' },\n { id: 2, name: 'Jane' },\n { id: 1, name: 'John' }\n];\nuniqueByKey('id', arr); // Returns: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\n" } ] }, @@ -624,143 +618,143 @@ "title": "Capitalize String", "description": "Capitalizes the first letter of a string.", "author": "dostonnabotov", - "code": "function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// Usage:\ncapitalize('hello'); // Returns: 'Hello'\n", "tags": [ "string", "capitalize" ], - "contributors": [] + "contributors": [], + "code": "function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// Usage:\ncapitalize('hello'); // Returns: 'Hello'\n" }, { "title": "Check if String is a Palindrome", "description": "Checks whether a given string is a palindrome.", "author": "axorax", - "code": "function isPalindrome(str) {\n const cleanStr = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n return cleanStr === cleanStr.split('').reverse().join('');\n}\n\n// Example usage:\nisPalindrome('A man, a plan, a canal, Panama'); // Returns: true\n", "tags": [ "check", "palindrome", "string" ], - "contributors": [] + "contributors": [], + "code": "function isPalindrome(str) {\n const cleanStr = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n return cleanStr === cleanStr.split('').reverse().join('');\n}\n\n// Example usage:\nisPalindrome('A man, a plan, a canal, Panama'); // Returns: true\n" }, { "title": "Convert String to Camel Case", "description": "Converts a given string into camelCase.", "author": "aumirza", - "code": "function toCamelCase(str) {\n return str.replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoCamelCase('hello world test'); // Returns: 'helloWorldTest'\n", "tags": [ "string", "case", "camelCase" ], - "contributors": [] + "contributors": [], + "code": "function toCamelCase(str) {\n return str.replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoCamelCase('hello world test'); // Returns: 'helloWorldTest'\n" }, { "title": "Convert String to Param Case", "description": "Converts a given string into param-case.", "author": "aumirza", - "code": "function toParamCase(str) {\n return str.toLowerCase().replace(/\\s+/g, '-');\n}\n\n// Usage:\ntoParamCase('Hello World Test'); // Returns: 'hello-world-test'\n", "tags": [ "string", "case", "paramCase" ], - "contributors": [] + "contributors": [], + "code": "function toParamCase(str) {\n return str.toLowerCase().replace(/\\s+/g, '-');\n}\n\n// Usage:\ntoParamCase('Hello World Test'); // Returns: 'hello-world-test'\n" }, { "title": "Convert String to Pascal Case", "description": "Converts a given string into Pascal Case.", "author": "aumirza", - "code": "function toPascalCase(str) {\n return str.replace(/\\b\\w/g, (s) => s.toUpperCase()).replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoPascalCase('hello world test'); // Returns: 'HelloWorldTest'\n", "tags": [ "string", "case", "pascalCase" ], - "contributors": [] + "contributors": [], + "code": "function toPascalCase(str) {\n return str.replace(/\\b\\w/g, (s) => s.toUpperCase()).replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoPascalCase('hello world test'); // Returns: 'HelloWorldTest'\n" }, { "title": "Convert String to Snake Case", "description": "Converts a given string into snake_case.", "author": "axorax", - "code": "function toSnakeCase(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/\\s+/g, '_')\n .toLowerCase();\n}\n\n// Usage:\ntoSnakeCase('Hello World Test'); // Returns: 'hello_world_test'\n", "tags": [ "string", "case", "snake_case" ], - "contributors": [] + "contributors": [], + "code": "function toSnakeCase(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/\\s+/g, '_')\n .toLowerCase();\n}\n\n// Usage:\ntoSnakeCase('Hello World Test'); // Returns: 'hello_world_test'\n" }, { "title": "Convert String to Title Case", "description": "Converts a given string into Title Case.", "author": "aumirza", - "code": "function toTitleCase(str) {\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// Usage:\ntoTitleCase('hello world test'); // Returns: 'Hello World Test'\n", "tags": [ "string", "case", "titleCase" ], - "contributors": [] + "contributors": [], + "code": "function toTitleCase(str) {\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// Usage:\ntoTitleCase('hello world test'); // Returns: 'Hello World Test'\n" }, { "title": "Convert Tabs to Spaces", "description": "Converts all tab characters in a string to spaces.", "author": "axorax", - "code": "function tabsToSpaces(str, spacesPerTab = 4) {\n return str.replace(/\\t/g, ' '.repeat(spacesPerTab));\n}\n\n// Usage:\ntabsToSpaces('Hello\\tWorld', 2); // Returns: 'Hello World'\n", "tags": [ "string", "tabs", "spaces" ], - "contributors": [] + "contributors": [], + "code": "function tabsToSpaces(str, spacesPerTab = 4) {\n return str.replace(/\\t/g, ' '.repeat(spacesPerTab));\n}\n\n// Usage:\ntabsToSpaces('Hello\\tWorld', 2); // Returns: 'Hello World'\n" }, { "title": "Count Words in a String", "description": "Counts the number of words in a string.", "author": "axorax", - "code": "function countWords(str) {\n return str.trim().split(/\\s+/).length;\n}\n\n// Usage:\ncountWords('Hello world! This is a test.'); // Returns: 6\n", "tags": [ "string", "manipulation", "word count", "count" ], - "contributors": [] + "contributors": [], + "code": "function countWords(str) {\n return str.trim().split(/\\s+/).length;\n}\n\n// Usage:\ncountWords('Hello world! This is a test.'); // Returns: 6\n" }, { "title": "Data with Prefix", "description": "Adds a prefix and postfix to data, with a fallback value.", "author": "realvishalrana", - "code": "const dataWithPrefix = (data, fallback = '-', prefix = '', postfix = '') => {\n return data ? `${prefix}${data}${postfix}` : fallback;\n};\n\n// Usage:\ndataWithPrefix('123', '-', '(', ')'); // Returns: '(123)'\ndataWithPrefix('', '-', '(', ')'); // Returns: '-'\ndataWithPrefix('Hello', 'N/A', 'Mr. ', ''); // Returns: 'Mr. Hello'\ndataWithPrefix(null, 'N/A', 'Mr. ', ''); // Returns: 'N/A'\n", "tags": [ "data", "prefix", "postfix", "format" ], - "contributors": [] + "contributors": [], + "code": "const dataWithPrefix = (data, fallback = '-', prefix = '', postfix = '') => {\n return data ? `${prefix}${data}${postfix}` : fallback;\n};\n\n// Usage:\ndataWithPrefix('123', '-', '(', ')'); // Returns: '(123)'\ndataWithPrefix('', '-', '(', ')'); // Returns: '-'\ndataWithPrefix('Hello', 'N/A', 'Mr. ', ''); // Returns: 'Mr. Hello'\ndataWithPrefix(null, 'N/A', 'Mr. ', ''); // Returns: 'N/A'\n" }, { "title": "Extract Initials from Name", "description": "Extracts and returns the initials from a full name.", "author": "axorax", - "code": "function getInitials(name) {\n return name.split(' ').map(part => part.charAt(0).toUpperCase()).join('');\n}\n\n// Usage:\ngetInitials('John Doe'); // Returns: 'JD'\n", "tags": [ "string", "initials", "name" ], - "contributors": [] + "contributors": [], + "code": "function getInitials(name) {\n return name.split(' ').map(part => part.charAt(0).toUpperCase()).join('');\n}\n\n// Usage:\ngetInitials('John Doe'); // Returns: 'JD'\n" }, { "title": "Generate UUID", "description": "Generates a UUID (v4) string.", "author": "jjcantu", "tags": [ - "javascript", "uuid", - "utility" + "generate", + "string" ], "contributors": [], "code": "function generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\n// Usage:\nconsole.log(generateUUID()); // Output: \"a1b2c3d4-e5f6-4g7h-8i9j-k0l1m2n3o4p5\"\n" @@ -769,93 +763,93 @@ "title": "Mask Sensitive Information", "description": "Masks parts of a sensitive string, like a credit card or email address.", "author": "axorax", - "code": "function maskSensitiveInfo(str, visibleCount = 4, maskChar = '*') {\n return str.slice(0, visibleCount) + maskChar.repeat(Math.max(0, str.length - visibleCount));\n}\n\n// Usage:\nmaskSensitiveInfo('123456789', 4); // Returns: '1234*****'\nmaskSensitiveInfo('example@mail.com', 2, '#'); // Returns: 'ex#############'\n", "tags": [ "string", "mask", "sensitive" ], - "contributors": [] + "contributors": [], + "code": "function maskSensitiveInfo(str, visibleCount = 4, maskChar = '*') {\n return str.slice(0, visibleCount) + maskChar.repeat(Math.max(0, str.length - visibleCount));\n}\n\n// Usage:\nmaskSensitiveInfo('123456789', 4); // Returns: '1234*****'\nmaskSensitiveInfo('example@mail.com', 2, '#'); // Returns: 'ex#############'\n" }, { "title": "Pad String on Both Sides", "description": "Pads a string on both sides with a specified character until it reaches the desired length.", "author": "axorax", - "code": "function padString(str, length, char = ' ') {\n const totalPad = length - str.length;\n const padStart = Math.floor(totalPad / 2);\n const padEnd = totalPad - padStart;\n return char.repeat(padStart) + str + char.repeat(padEnd);\n}\n\n// Usage:\npadString('hello', 10, '*'); // Returns: '**hello***'\n", "tags": [ "string", "pad", "manipulation" ], - "contributors": [] + "contributors": [], + "code": "function padString(str, length, char = ' ') {\n const totalPad = length - str.length;\n const padStart = Math.floor(totalPad / 2);\n const padEnd = totalPad - padStart;\n return char.repeat(padStart) + str + char.repeat(padEnd);\n}\n\n// Usage:\npadString('hello', 10, '*'); // Returns: '**hello***'\n" }, { "title": "Random string", "description": "Generates a random string of characters of a certain length", "author": "kruimol", - "code": "function makeid(length, characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {\n return Array.from({ length }, () => characters.charAt(Math.floor(Math.random() * characters.length))).join('');\n}\n\nmakeid(3); // Returns: gDs (Random)\nmakeid(5, \"1234\" /* (optional) */); // Returns: \"35453\" (Random)\n", "tags": [ "function", "random" ], - "contributors": [] + "contributors": [], + "code": "function makeid(length, characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {\n return Array.from({ length }, () => characters.charAt(Math.floor(Math.random() * characters.length))).join('');\n}\n\nmakeid(3); // Returns: gDs (Random)\nmakeid(5, \"1234\" /* (optional) */); // Returns: \"35453\" (Random)\n" }, { "title": "Remove All Whitespace", "description": "Removes all whitespace from a string.", "author": "axorax", - "code": "function removeWhitespace(str) {\n return str.replace(/\\s+/g, '');\n}\n\n// Usage:\nremoveWhitespace('Hello world!'); // Returns: 'Helloworld!'\n", "tags": [ "string", "whitespace" ], - "contributors": [] + "contributors": [], + "code": "function removeWhitespace(str) {\n return str.replace(/\\s+/g, '');\n}\n\n// Usage:\nremoveWhitespace('Hello world!'); // Returns: 'Helloworld!'\n" }, { "title": "Remove Vowels from a String", "description": "Removes all vowels from a given string.", "author": "axorax", - "code": "function removeVowels(str) {\n return str.replace(/[aeiouAEIOU]/g, '');\n}\n\n// Usage:\nremoveVowels('Hello World'); // Returns: 'Hll Wrld'\n", "tags": [ "string", "remove", "vowels" ], - "contributors": [] + "contributors": [], + "code": "function removeVowels(str) {\n return str.replace(/[aeiouAEIOU]/g, '');\n}\n\n// Usage:\nremoveVowels('Hello World'); // Returns: 'Hll Wrld'\n" }, { "title": "Reverse String", "description": "Reverses the characters in a string.", "author": "dostonnabotov", - "code": "const reverseString = (str) => str.split('').reverse().join('');\n\n// Usage:\nreverseString('hello'); // Returns: 'olleh'\n", "tags": [ "string", "reverse" ], - "contributors": [] + "contributors": [], + "code": "const reverseString = (str) => str.split('').reverse().join('');\n\n// Usage:\nreverseString('hello'); // Returns: 'olleh'\n" }, { "title": "Slugify String", "description": "Converts a string into a URL-friendly slug format.", "author": "dostonnabotov", - "code": "const slugify = (string, separator = \"-\") => {\n return string\n .toString() // Cast to string (optional)\n .toLowerCase() // Convert the string to lowercase letters\n .trim() // Remove whitespace from both sides of a string (optional)\n .replace(/\\s+/g, separator) // Replace spaces with {separator}\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\n .replace(/\\_/g, separator) // Replace _ with {separator}\n .replace(/\\-\\-+/g, separator) // Replace multiple - with single {separator}\n .replace(/\\-$/g, \"\"); // Remove trailing -\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\nslugify(title); // Returns: 'hello-world-this-is-a-test'\nslugify(title, \"_\"); // Returns: 'hello_world_this_is_a_test'\n", "tags": [ "string", "slug" ], - "contributors": [] + "contributors": [], + "code": "const slugify = (string, separator = \"-\") => {\n return string\n .toString() // Cast to string (optional)\n .toLowerCase() // Convert the string to lowercase letters\n .trim() // Remove whitespace from both sides of a string (optional)\n .replace(/\\s+/g, separator) // Replace spaces with {separator}\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\n .replace(/\\_/g, separator) // Replace _ with {separator}\n .replace(/\\-\\-+/g, separator) // Replace multiple - with single {separator}\n .replace(/\\-$/g, \"\"); // Remove trailing -\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\nslugify(title); // Returns: 'hello-world-this-is-a-test'\nslugify(title, \"_\"); // Returns: 'hello_world_this_is_a_test'\n" }, { "title": "Truncate Text", "description": "Truncates the text to a maximum length and appends '...' if the text exceeds the maximum length.", "author": "realvishalrana", - "code": "const truncateText = (text = '', maxLength = 50) => {\n return `${text.slice(0, maxLength)}${text.length >= maxLength ? '...' : ''}`;\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\ntruncateText(title); // Returns: 'Hello, World! This is a Test.'\ntruncateText(title, 10); // Returns: 'Hello, Wor...'\n", "tags": [ "string", "truncate", "text" ], - "contributors": [] + "contributors": [], + "code": "const truncateText = (text = '', maxLength = 50) => {\n return `${text.slice(0, maxLength)}${text.length >= maxLength ? '...' : ''}`;\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\ntruncateText(title); // Returns: 'Hello, World! This is a Test.'\ntruncateText(title, 10); // Returns: 'Hello, Wor...'\n" } ] } diff --git a/public/consolidated/python.json b/public/consolidated/python.json index 86b32ceb..953272b8 100644 --- a/public/consolidated/python.json +++ b/public/consolidated/python.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", - "code": "print(\"Hello, World!\") # Prints Hello, World! to the terminal.\n", "tags": [ "printing", "hello-world" ], - "contributors": [] + "contributors": [], + "code": "print(\"Hello, World!\") # Prints Hello, World! to the terminal.\n" } ] }, @@ -22,79 +22,79 @@ "title": "Calculate Date Difference in Milliseconds", "description": "Calculates the difference between two dates in milliseconds.", "author": "e3nviction", - "code": "from datetime import datetime\n\ndef date_difference_in_millis(date1, date2):\n delta = date2 - date1\n return delta.total_seconds() * 1000\n\n# Usage:\nd1 = datetime(2023, 1, 1, 12, 0, 0)\nd2 = datetime(2023, 1, 1, 12, 1, 0)\ndate_difference_in_millis(d1, d2) # Returns: 60000\n", "tags": [ "datetime", "difference" ], - "contributors": [] + "contributors": [], + "code": "from datetime import datetime\n\ndef date_difference_in_millis(date1, date2):\n delta = date2 - date1\n return delta.total_seconds() * 1000\n\n# Usage:\nd1 = datetime(2023, 1, 1, 12, 0, 0)\nd2 = datetime(2023, 1, 1, 12, 1, 0)\ndate_difference_in_millis(d1, d2) # Returns: 60000\n" }, { "title": "Check if Date is a Weekend", "description": "Checks whether a given date falls on a weekend.", "author": "axorax", - "code": "from datetime import datetime\n\ndef is_weekend(date):\n try:\n return date.weekday() >= 5 # Saturday = 5, Sunday = 6\n except AttributeError:\n raise TypeError(\"Input must be a datetime object\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nis_weekend(date) # Returns: True (Sunday)\n", "tags": [ "datetime", "weekend" ], - "contributors": [] + "contributors": [], + "code": "from datetime import datetime\n\ndef is_weekend(date):\n try:\n return date.weekday() >= 5 # Saturday = 5, Sunday = 6\n except AttributeError:\n raise TypeError(\"Input must be a datetime object\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nis_weekend(date) # Returns: True (Sunday)\n" }, { "title": "Day of the Week String", "description": "Gets the string of the day of the week for a given date.", "author": "axorax", - "code": "from datetime import datetime\n\ndef get_day_of_week(date):\n days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n try:\n return days[date.weekday()]\n except IndexError:\n raise ValueError(\"Invalid date\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nget_day_of_week(date) # Returns: 'Sunday'\n", "tags": [ "datetime", "weekday" ], - "contributors": [] + "contributors": [], + "code": "from datetime import datetime\n\ndef get_day_of_week(date):\n days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n try:\n return days[date.weekday()]\n except IndexError:\n raise ValueError(\"Invalid date\")\n\n# Usage:\ndate = datetime(2023, 1, 1)\nget_day_of_week(date) # Returns: 'Sunday'\n" }, { "title": "Generate Date Range List", "description": "Generates a list of dates between two given dates.", "author": "axorax", - "code": "from datetime import datetime, timedelta\n\ndef generate_date_range(start_date, end_date):\n if start_date > end_date:\n raise ValueError(\"start_date must be before end_date\")\n\n current_date = start_date\n date_list = []\n while current_date <= end_date:\n date_list.append(current_date)\n current_date += timedelta(days=1)\n\n return date_list\n\n# Usage:\nstart = datetime(2023, 1, 1)\nend = datetime(2023, 1, 5)\ndates = generate_date_range(start, end)\nfor d in dates:\n print(d.strftime('%Y-%m-%d'))\n# Outputs: '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'\n", "tags": [ "datetime", "range" ], - "contributors": [] + "contributors": [], + "code": "from datetime import datetime, timedelta\n\ndef generate_date_range(start_date, end_date):\n if start_date > end_date:\n raise ValueError(\"start_date must be before end_date\")\n\n current_date = start_date\n date_list = []\n while current_date <= end_date:\n date_list.append(current_date)\n current_date += timedelta(days=1)\n\n return date_list\n\n# Usage:\nstart = datetime(2023, 1, 1)\nend = datetime(2023, 1, 5)\ndates = generate_date_range(start, end)\nfor d in dates:\n print(d.strftime('%Y-%m-%d'))\n# Outputs: '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'\n" }, { "title": "Get Current Date and Time as String", "description": "Fetches the current date and time as a formatted string.", "author": "e3nviction", - "code": "from datetime import datetime\n\ndef get_current_datetime_string():\n return datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n\n# Usage:\nget_current_datetime_string() # Returns: '2023-01-01 12:00:00'\n", "tags": [ "datetime", "current", "string" ], - "contributors": [] + "contributors": [], + "code": "from datetime import datetime\n\ndef get_current_datetime_string():\n return datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n\n# Usage:\nget_current_datetime_string() # Returns: '2023-01-01 12:00:00'\n" }, { "title": "Get Number of Days in a Month", "description": "Determines the number of days in a specific month and year.", "author": "axorax", - "code": "from calendar import monthrange\nfrom datetime import datetime\n\ndef get_days_in_month(year, month):\n try:\n return monthrange(year, month)[1]\n except ValueError as e:\n raise ValueError(f\"Invalid month or year: {e}\")\n\n# Usage:\nget_days_in_month(2023, 2) # Returns: 28 (for non-leap year February)\n", "tags": [ "datetime", "calendar" ], - "contributors": [] + "contributors": [], + "code": "from calendar import monthrange\nfrom datetime import datetime\n\ndef get_days_in_month(year, month):\n try:\n return monthrange(year, month)[1]\n except ValueError as e:\n raise ValueError(f\"Invalid month or year: {e}\")\n\n# Usage:\nget_days_in_month(2023, 2) # Returns: 28 (for non-leap year February)\n" }, { "title": "Measure Execution Time", "description": "Measures the execution time of a code block.", "author": "dostonnabotov", - "code": "import time\n\ndef measure_time(func, *args):\n start = time.time()\n result = func(*args)\n end = time.time()\n print(f'Execution time: {end - start:.6f} seconds')\n return result\n\n# Usage:\ndef slow_function():\n time.sleep(2)\n\nmeasure_time(slow_function) # Outputs an execution time of ~2s\n", "tags": [ "time", "execution" ], - "contributors": [] + "contributors": [], + "code": "import time\n\ndef measure_time(func, *args):\n start = time.time()\n result = func(*args)\n end = time.time()\n print(f'Execution time: {end - start:.6f} seconds')\n return result\n\n# Usage:\ndef slow_function():\n time.sleep(2)\n\nmeasure_time(slow_function) # Outputs an execution time of ~2s\n" } ] }, @@ -105,25 +105,25 @@ "title": "Create Custom Exception Type", "description": "Create a Custom Exception Type that can be called with raise.", "author": "mrcool7387", - "code": "class ExceptionName(BaseException):\n def __init__(message: str):\n super().__init__(message)\n\n# Usage\na: int = 1\n\nif a > 0:\n raise ExceptionName('Error Message')\n", "tags": [ "python", "error-creation", "organisation", "utility" ], - "contributors": [] + "contributors": [], + "code": "class ExceptionName(BaseException):\n def __init__(message: str):\n super().__init__(message)\n\n# Usage\na: int = 1\n\nif a > 0:\n raise ExceptionName('Error Message')\n" }, { "title": "Retry Function Execution on Exception", "description": "Retries a function execution a specified number of times if it raises an exception.", "author": "axorax", - "code": "import time\n\ndef retry(func, retries=3, delay=1):\n for attempt in range(retries):\n try:\n return func()\n except Exception as e:\n print(f\"Attempt {attempt + 1} failed: {e}\")\n time.sleep(delay)\n raise Exception(\"All retry attempts failed\")\n\n# Usage:\ndef unstable_function():\n raise ValueError(\"Simulated failure\")\n\n# Retry 3 times with 2 seconds delay:\ntry:\n retry(unstable_function, retries=3, delay=2)\nexcept Exception as e:\n print(e) # Output: All retry attempts failed\n", "tags": [ "error-handling", "retry" ], - "contributors": [] + "contributors": [], + "code": "import time\n\ndef retry(func, retries=3, delay=1):\n for attempt in range(retries):\n try:\n return func()\n except Exception as e:\n print(f\"Attempt {attempt + 1} failed: {e}\")\n time.sleep(delay)\n raise Exception(\"All retry attempts failed\")\n\n# Usage:\ndef unstable_function():\n raise ValueError(\"Simulated failure\")\n\n# Retry 3 times with 2 seconds delay:\ntry:\n retry(unstable_function, retries=3, delay=2)\nexcept Exception as e:\n print(e) # Output: All retry attempts failed\n" } ] }, @@ -134,48 +134,48 @@ "title": "Find Files", "description": "Finds all files of the specified type within a given directory.", "author": "Jackeastern", - "code": "import os\n\ndef find_files(directory, file_type):\n file_type = file_type.lower() # Convert file_type to lowercase\n found_files = []\n\n for root, _, files in os.walk(directory):\n for file in files:\n file_ext = os.path.splitext(file)[1].lower()\n if file_ext == file_type:\n full_path = os.path.join(root, file)\n found_files.append(full_path)\n\n return found_files\n\n# Example Usage:\nfind_files('/path/to/your/directory', '.pdf') # Returns all .pdf in directory\n", "tags": [ "os", "filesystem", "file_search" ], - "contributors": [] + "contributors": [], + "code": "import os\n\ndef find_files(directory, file_type):\n file_type = file_type.lower() # Convert file_type to lowercase\n found_files = []\n\n for root, _, files in os.walk(directory):\n for file in files:\n file_ext = os.path.splitext(file)[1].lower()\n if file_ext == file_type:\n full_path = os.path.join(root, file)\n found_files.append(full_path)\n\n return found_files\n\n# Example Usage:\nfind_files('/path/to/your/directory', '.pdf') # Returns all .pdf in directory\n" }, { "title": "Get File Extension", "description": "Gets the extension of a file.", "author": "axorax", - "code": "import os\n\ndef get_file_extension(filepath):\n return os.path.splitext(filepath)[1]\n\n# Usage:\nget_file_extension('example.txt') # Returns: '.txt'\n", "tags": [ "file", "extension" ], - "contributors": [] + "contributors": [], + "code": "import os\n\ndef get_file_extension(filepath):\n return os.path.splitext(filepath)[1]\n\n# Usage:\nget_file_extension('example.txt') # Returns: '.txt'\n" }, { "title": "List Files in Directory", "description": "Lists all files in a specified directory.", "author": "axorax", - "code": "import os\n\ndef list_files(directory):\n return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]\n\n# Usage:\nlist_files('/path/to/directory') # Returns: List of file in the directory\n", "tags": [ "file", "list", "directory" ], - "contributors": [] + "contributors": [], + "code": "import os\n\ndef list_files(directory):\n return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]\n\n# Usage:\nlist_files('/path/to/directory') # Returns: List of file in the directory\n" }, { "title": "Read File in Chunks", "description": "Reads a file in chunks of a specified size.", "author": "axorax", - "code": "def read_file_in_chunks(filepath, chunk_size):\n with open(filepath, 'r') as file:\n while chunk := file.read(chunk_size):\n yield chunk\n\n# Usage:\nfor chunk in read_file_in_chunks('example.txt', 1024):\n print(chunk) # Outputs: Chucks of 1024 bytes\n", "tags": [ "file", "read", "chunks" ], - "contributors": [] + "contributors": [], + "code": "def read_file_in_chunks(filepath, chunk_size):\n with open(filepath, 'r') as file:\n while chunk := file.read(chunk_size):\n yield chunk\n\n# Usage:\nfor chunk in read_file_in_chunks('example.txt', 1024):\n print(chunk) # Outputs: Chucks of 1024 bytes\n" } ] }, @@ -186,73 +186,73 @@ "title": "Filter JSON Data", "description": "Filters a JSON object based on a condition and returns the filtered data.", "author": "axorax", - "code": "import json\n\ndef filter_json_data(filepath, condition):\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Filter data based on the provided condition\n filtered_data = [item for item in data if condition(item)]\n\n return filtered_data\n\n# Usage:\ncondition = lambda x: x['age'] > 25\nfilter_json_data('data.json', condition) # Returns: `data.json` filtered with `condition`\n", "tags": [ "json", "filter", "data" ], - "contributors": [] + "contributors": [], + "code": "import json\n\ndef filter_json_data(filepath, condition):\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Filter data based on the provided condition\n filtered_data = [item for item in data if condition(item)]\n\n return filtered_data\n\n# Usage:\ncondition = lambda x: x['age'] > 25\nfilter_json_data('data.json', condition) # Returns: `data.json` filtered with `condition`\n" }, { "title": "Flatten Nested JSON", "description": "Flattens a nested JSON object into a flat dictionary.", "author": "axorax", - "code": "def flatten_json(nested_json, prefix=''):\n flat_dict = {}\n for key, value in nested_json.items():\n if isinstance(value, dict):\n flat_dict.update(flatten_json(value, prefix + key + '.'))\n else:\n flat_dict[prefix + key] = value\n return flat_dict\n\n# Usage:\nnested_json = {'name': 'John', 'address': {'city': 'New York', 'zip': '10001'}}\nflatten_json(nested_json) # Returns: {'name': 'John', 'address.city': 'New York', 'address.zip': '10001'}\n", "tags": [ "json", "flatten", "nested" ], - "contributors": [] + "contributors": [], + "code": "def flatten_json(nested_json, prefix=''):\n flat_dict = {}\n for key, value in nested_json.items():\n if isinstance(value, dict):\n flat_dict.update(flatten_json(value, prefix + key + '.'))\n else:\n flat_dict[prefix + key] = value\n return flat_dict\n\n# Usage:\nnested_json = {'name': 'John', 'address': {'city': 'New York', 'zip': '10001'}}\nflatten_json(nested_json) # Returns: {'name': 'John', 'address.city': 'New York', 'address.zip': '10001'}\n" }, { "title": "Merge Multiple JSON Files", "description": "Merges multiple JSON files into one and writes the merged data into a new file.", "author": "axorax", - "code": "import json\n\ndef merge_json_files(filepaths, output_filepath):\n merged_data = []\n\n # Read each JSON file and merge their data\n for filepath in filepaths:\n with open(filepath, 'r') as file:\n data = json.load(file)\n merged_data.extend(data)\n\n # Write the merged data into a new file\n with open(output_filepath, 'w') as file:\n json.dump(merged_data, file, indent=4)\n\n# Usage:\nfiles_to_merge = ['file1.json', 'file2.json']\nmerge_json_files(files_to_merge, 'merged.json')\n", "tags": [ "json", "merge", "file" ], - "contributors": [] + "contributors": [], + "code": "import json\n\ndef merge_json_files(filepaths, output_filepath):\n merged_data = []\n\n # Read each JSON file and merge their data\n for filepath in filepaths:\n with open(filepath, 'r') as file:\n data = json.load(file)\n merged_data.extend(data)\n\n # Write the merged data into a new file\n with open(output_filepath, 'w') as file:\n json.dump(merged_data, file, indent=4)\n\n# Usage:\nfiles_to_merge = ['file1.json', 'file2.json']\nmerge_json_files(files_to_merge, 'merged.json')\n" }, { "title": "Read JSON File", "description": "Reads a JSON file and parses its content.", "author": "e3nviction", - "code": "import json\n\ndef read_json(filepath):\n with open(filepath, 'r') as file:\n return json.load(file)\n\n# Usage:\nread_json('data.json') # Returns: Content of file as dict\n", "tags": [ "json", "file", "read" ], - "contributors": [] + "contributors": [], + "code": "import json\n\ndef read_json(filepath):\n with open(filepath, 'r') as file:\n return json.load(file)\n\n# Usage:\nread_json('data.json') # Returns: Content of file as dict\n" }, { "title": "Update JSON File", "description": "Updates an existing JSON file with new data or modifies the existing values.", "author": "axorax", - "code": "import json\n\ndef update_json(filepath, new_data):\n # Read the existing JSON data\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Update the data with the new content\n data.update(new_data)\n\n # Write the updated data back to the JSON file\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\nnew_data = {'age': 31}\nupdate_json('data.json', new_data) # Updates `age` in `data.json` without modifying other keys\n", "tags": [ "json", "update", "file" ], - "contributors": [] + "contributors": [], + "code": "import json\n\ndef update_json(filepath, new_data):\n # Read the existing JSON data\n with open(filepath, 'r') as file:\n data = json.load(file)\n\n # Update the data with the new content\n data.update(new_data)\n\n # Write the updated data back to the JSON file\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\nnew_data = {'age': 31}\nupdate_json('data.json', new_data) # Updates `age` in `data.json` without modifying other keys\n" }, { "title": "Write JSON File", "description": "Writes a dictionary to a JSON file.", "author": "e3nviction", - "code": "import json\n\ndef write_json(filepath, data):\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\ndata = {'name': 'John', 'age': 30}\nwrite_json('data.json', data)\n", "tags": [ "json", "file", "write" ], - "contributors": [] + "contributors": [], + "code": "import json\n\ndef write_json(filepath, data):\n with open(filepath, 'w') as file:\n json.dump(data, file, indent=4)\n\n# Usage:\ndata = {'name': 'John', 'age': 30}\nwrite_json('data.json', data)\n" } ] }, @@ -263,81 +263,81 @@ "title": "Find Duplicates in a List", "description": "Identifies duplicate elements in a list.", "author": "axorax", - "code": "def find_duplicates(lst):\n seen = set()\n duplicates = set()\n for item in lst:\n if item in seen:\n duplicates.add(item)\n else:\n seen.add(item)\n return list(duplicates)\n\n# Usage:\ndata = [1, 2, 3, 2, 4, 5, 1]\nfind_duplicates(data) # Returns: [1, 2]\n", "tags": [ "list", "duplicates" ], - "contributors": [] + "contributors": [], + "code": "def find_duplicates(lst):\n seen = set()\n duplicates = set()\n for item in lst:\n if item in seen:\n duplicates.add(item)\n else:\n seen.add(item)\n return list(duplicates)\n\n# Usage:\ndata = [1, 2, 3, 2, 4, 5, 1]\nfind_duplicates(data) # Returns: [1, 2]\n" }, { "title": "Find Intersection of Two Lists", "description": "Finds the common elements between two lists.", "author": "axorax", - "code": "def list_intersection(lst1, lst2):\n return [item for item in lst1 if item in lst2]\n\n# Usage:\nlist_a = [1, 2, 3, 4]\nlist_b = [3, 4, 5, 6]\nlist_intersection(list_a, list_b) # Returns: [3, 4]\n", "tags": [ "list", "intersection" ], - "contributors": [] + "contributors": [], + "code": "def list_intersection(lst1, lst2):\n return [item for item in lst1 if item in lst2]\n\n# Usage:\nlist_a = [1, 2, 3, 4]\nlist_b = [3, 4, 5, 6]\nlist_intersection(list_a, list_b) # Returns: [3, 4]\n" }, { "title": "Find Maximum Difference in List", "description": "Finds the maximum difference between any two elements in a list.", "author": "axorax", - "code": "def max_difference(lst):\n if not lst or len(lst) < 2:\n return 0\n return max(lst) - min(lst)\n\n# Usage:\ndata = [10, 3, 5, 20, 7]\nmax_difference(data) # Returns: 17\n", "tags": [ "list", "difference" ], - "contributors": [] + "contributors": [], + "code": "def max_difference(lst):\n if not lst or len(lst) < 2:\n return 0\n return max(lst) - min(lst)\n\n# Usage:\ndata = [10, 3, 5, 20, 7]\nmax_difference(data) # Returns: 17\n" }, { "title": "Flatten Nested List", "description": "Flattens a multi-dimensional list into a single list.", "author": "dostonnabotov", - "code": "def flatten_list(lst):\n return [item for sublist in lst for item in sublist]\n\n# Usage:\nnested_list = [[1, 2], [3, 4], [5]]\nflatten_list(nested_list) # Returns: [1, 2, 3, 4, 5]\n", "tags": [ "list", "flatten" ], - "contributors": [] + "contributors": [], + "code": "def flatten_list(lst):\n return [item for sublist in lst for item in sublist]\n\n# Usage:\nnested_list = [[1, 2], [3, 4], [5]]\nflatten_list(nested_list) # Returns: [1, 2, 3, 4, 5]\n" }, { "title": "Flatten Unevenly Nested Lists", "description": "Converts unevenly nested lists of any depth into a single flat list.", "author": "agilarasu", - "code": "def flatten(nested_list):\n for item in nested_list:\n if isinstance(item, list):\n yield from flatten(item)\n else:\n yield item\n\n# Usage:\nnested_list = [1, [2, [3, 4]], 5]\nlist(flatten(nested_list)) # Returns: [1, 2, 3, 4, 5]\n", "tags": [ "list", "flattening", "nested-lists", "depth" ], - "contributors": [] + "contributors": [], + "code": "def flatten(nested_list):\n for item in nested_list:\n if isinstance(item, list):\n yield from flatten(item)\n else:\n yield item\n\n# Usage:\nnested_list = [1, [2, [3, 4]], 5]\nlist(flatten(nested_list)) # Returns: [1, 2, 3, 4, 5]\n" }, { "title": "Partition List", "description": "Partitions a list into sublists of a given size.", "author": "axorax", - "code": "def partition_list(lst, size):\n for i in range(0, len(lst), size):\n yield lst[i:i + size]\n\n# Usage:\ndata = [1, 2, 3, 4, 5, 6, 7]\nlist(partition_list(data, 3)) # Returns: [[1, 2, 3], [4, 5, 6], [7]]\n", "tags": [ "list", "partition" ], - "contributors": [] + "contributors": [], + "code": "def partition_list(lst, size):\n for i in range(0, len(lst), size):\n yield lst[i:i + size]\n\n# Usage:\ndata = [1, 2, 3, 4, 5, 6, 7]\nlist(partition_list(data, 3)) # Returns: [[1, 2, 3], [4, 5, 6], [7]]\n" }, { "title": "Remove Duplicates", "description": "Removes duplicate elements from a list while maintaining order.", "author": "dostonnabotov", - "code": "def remove_duplicates(lst):\n return list(dict.fromkeys(lst))\n\n# Usage:\nremove_duplicates([1, 2, 2, 3, 4, 4, 5]) # Returns: [1, 2, 3, 4, 5]\n", "tags": [ "list", "duplicates", "filter" ], - "contributors": [] + "contributors": [], + "code": "def remove_duplicates(lst):\n return list(dict.fromkeys(lst))\n\n# Usage:\nremove_duplicates([1, 2, 2, 3, 4, 4, 5]) # Returns: [1, 2, 3, 4, 5]\n" } ] }, @@ -348,68 +348,67 @@ "title": "Calculate Compound Interest", "description": "Calculates compound interest for a given principal amount, rate, and time period.", "author": "axorax", - "code": "def compound_interest(principal, rate, time, n=1):\n return principal * (1 + rate / n) ** (n * time)\n\n# Usage:\ncompound_interest(1000, 0.05, 5) # Returns: 1276.2815625000003\ncompound_interest(1000, 0.05, 5, 12) # Returns: 1283.68\n", "tags": [ "python", "math", "compound interest", "finance" ], - "contributors": [] + "contributors": [], + "code": "def compound_interest(principal, rate, time, n=1):\n return principal * (1 + rate / n) ** (n * time)\n\n# Usage:\ncompound_interest(1000, 0.05, 5) # Returns: 1276.2815625000003\ncompound_interest(1000, 0.05, 5, 12) # Returns: 1283.68\n" }, { "title": "Check Perfect Square", "description": "Checks if a number is a perfect square.", "author": "axorax", - "code": "def is_perfect_square(n):\n if n < 0:\n return False\n root = int(n**0.5)\n return root * root == n\n\n# Usage:\nis_perfect_square(16) # Returns: True\nis_perfect_square(20) # Returns: False\n", "tags": [ "math", "perfect square", "check" ], - "contributors": [] + "contributors": [], + "code": "def is_perfect_square(n):\n if n < 0:\n return False\n root = int(n**0.5)\n return root * root == n\n\n# Usage:\nis_perfect_square(16) # Returns: True\nis_perfect_square(20) # Returns: False\n" }, { "title": "Check Prime Number", "description": "Checks if a number is a prime number.", "author": "dostonnabotov", - "code": "def is_prime(n):\n if n <= 1:\n return False\n for i in range(2, int(n**0.5) + 1):\n if n % i == 0:\n return False\n return True\n\n# Usage:\nis_prime(17) # Returns: True\n", "tags": [ "math", "prime", "check" ], - "contributors": [] + "contributors": [], + "code": "def is_prime(n):\n if n <= 1:\n return False\n for i in range(2, int(n**0.5) + 1):\n if n % i == 0:\n return False\n return True\n\n# Usage:\nis_prime(17) # Returns: True\n" }, { "title": "Convert Binary to Decimal", "description": "Converts a binary string to its decimal equivalent.", "author": "axorax", - "code": "def binary_to_decimal(binary_str):\n return int(binary_str, 2)\n\n# Usage:\nbinary_to_decimal('1010') # Returns: 10\nbinary_to_decimal('1101') # Returns: 13\n", "tags": [ "math", "binary", "decimal", "conversion" ], - "contributors": [] + "contributors": [], + "code": "def binary_to_decimal(binary_str):\n return int(binary_str, 2)\n\n# Usage:\nbinary_to_decimal('1010') # Returns: 10\nbinary_to_decimal('1101') # Returns: 13\n" }, { "title": "Convert Bytes to Human-Readable Format", "description": "Converts a size in bytes to a human-readable format.", "author": "axorax", - "code": "def bytes_to_human_readable(num):\n for unit in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']:\n if num < 1024:\n return f\"{num:.2f} {unit}\"\n num /= 1024\n\n# Usage:\nbytes_to_human_readable(123456789) # Returns: '117.74 MB'\n", "tags": [ "bytes", "format" ], - "contributors": [] + "contributors": [], + "code": "def bytes_to_human_readable(num):\n for unit in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']:\n if num < 1024:\n return f\"{num:.2f} {unit}\"\n num /= 1024\n\n# Usage:\nbytes_to_human_readable(123456789) # Returns: '117.74 MB'\n" }, { "title": "Find LCM (Least Common Multiple)", "description": "Calculates the least common multiple (LCM) of two numbers.", "author": "axorax", - "code": "def lcm(a, b):\n return abs(a * b) // gcd(a, b)\n\n# Usage:\nlcm(12, 15) # Returns: 60\nlcm(7, 5) # Returns: 35\n", "tags": [ "python", "math", @@ -417,20 +416,21 @@ "gcd", "utility" ], - "contributors": [] + "contributors": [], + "code": "def lcm(a, b):\n return abs(a * b) // gcd(a, b)\n\n# Usage:\nlcm(12, 15) # Returns: 60\nlcm(7, 5) # Returns: 35\n" }, { "title": "Solve Quadratic Equation", "description": "Solves a quadratic equation ax^2 + bx + c = 0 and returns the roots.", "author": "axorax", - "code": "import cmath\n\ndef solve_quadratic(a, b, c):\n discriminant = cmath.sqrt(b**2 - 4 * a * c)\n root1 = (-b + discriminant) / (2 * a)\n root2 = (-b - discriminant) / (2 * a)\n return root1, root2\n\n# Usage:\nsolve_quadratic(1, -3, 2) # Returns: ((2+0j), (1+0j))\nsolve_quadratic(1, 2, 5) # Returns: ((-1+2j), (-1-2j))\n", "tags": [ "math", "quadratic", "equation", "solver" ], - "contributors": [] + "contributors": [], + "code": "import cmath\n\ndef solve_quadratic(a, b, c):\n discriminant = cmath.sqrt(b**2 - 4 * a * c)\n root1 = (-b + discriminant) / (2 * a)\n root2 = (-b - discriminant) / (2 * a)\n return root1, root2\n\n# Usage:\nsolve_quadratic(1, -3, 2) # Returns: ((2+0j), (1+0j))\nsolve_quadratic(1, 2, 5) # Returns: ((-1+2j), (-1-2j))\n" } ] }, @@ -441,46 +441,46 @@ "title": "Create SQLite Database Table", "description": "Creates a table in an SQLite database with a dynamic schema.", "author": "e3nviction", - "code": "import sqlite3\n\ndef create_table(db_name, table_name, schema):\n conn = sqlite3.connect(db_name)\n cursor = conn.cursor()\n schema_string = ', '.join([f'{col} {dtype}' for col, dtype in schema.items()])\n cursor.execute(f'''\n CREATE TABLE IF NOT EXISTS {table_name} (\n {schema_string}\n )''')\n conn.commit()\n conn.close()\n\n# Usage:\ndb_name = 'example.db'\ntable_name = 'users'\nschema = {\n 'id': 'INTEGER PRIMARY KEY',\n 'name': 'TEXT',\n 'age': 'INTEGER',\n 'email': 'TEXT'\n}\ncreate_table(db_name, table_name, schema)\n", "tags": [ "sqlite", "database", "table" ], - "contributors": [] + "contributors": [], + "code": "import sqlite3\n\ndef create_table(db_name, table_name, schema):\n conn = sqlite3.connect(db_name)\n cursor = conn.cursor()\n schema_string = ', '.join([f'{col} {dtype}' for col, dtype in schema.items()])\n cursor.execute(f'''\n CREATE TABLE IF NOT EXISTS {table_name} (\n {schema_string}\n )''')\n conn.commit()\n conn.close()\n\n# Usage:\ndb_name = 'example.db'\ntable_name = 'users'\nschema = {\n 'id': 'INTEGER PRIMARY KEY',\n 'name': 'TEXT',\n 'age': 'INTEGER',\n 'email': 'TEXT'\n}\ncreate_table(db_name, table_name, schema)\n" }, { "title": "Insert Data into Sqlite Table", "description": "Inserts a row into a specified SQLite table using a dictionary of fields and values.", "author": "e3nviction", - "code": "import sqlite3\n\ndef insert_into_table(db_path, table_name, data):\n with sqlite3.connect(db_path) as conn:\n columns = ', '.join(data.keys())\n placeholders = ', '.join(['?'] * len(data))\n sql = f\"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})\"\n conn.execute(sql, tuple(data.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ndata = {\n 'name': 'John Doe',\n 'email': 'john@example.com',\n 'age': 30\n}\ninsert_into_table(db_path, table_name, data)\n", "tags": [ "sqlite", "database" ], - "contributors": [] + "contributors": [], + "code": "import sqlite3\n\ndef insert_into_table(db_path, table_name, data):\n with sqlite3.connect(db_path) as conn:\n columns = ', '.join(data.keys())\n placeholders = ', '.join(['?'] * len(data))\n sql = f\"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})\"\n conn.execute(sql, tuple(data.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ndata = {\n 'name': 'John Doe',\n 'email': 'john@example.com',\n 'age': 30\n}\ninsert_into_table(db_path, table_name, data)\n" }, { "title": "Query Data from Sqlite Table", "description": "Fetches data from a specified SQLite table, with options for selecting specific columns and applying a WHERE clause.", "author": "pl44t", - "code": "import sqlite3\n\ndef query_table(db_path, table_name, columns='*', where_clause=None):\n with sqlite3.connect(db_path) as conn:\n cursor = conn.cursor()\n sql = f\"SELECT {columns} FROM {table_name}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n cursor.execute(sql)\n return cursor.fetchall()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ncolumns = 'id, name, email'\nwhere_clause = 'age > 25'\nresult = query_table(db_path, table_name, columns, where_clause)\nfor row in result:\n print(row)\n\n", "tags": [ "sqlite", "database" ], - "contributors": [] + "contributors": [], + "code": "import sqlite3\n\ndef query_table(db_path, table_name, columns='*', where_clause=None):\n with sqlite3.connect(db_path) as conn:\n cursor = conn.cursor()\n sql = f\"SELECT {columns} FROM {table_name}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n cursor.execute(sql)\n return cursor.fetchall()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\ncolumns = 'id, name, email'\nwhere_clause = 'age > 25'\nresult = query_table(db_path, table_name, columns, where_clause)\nfor row in result:\n print(row)\n\n" }, { "title": "Update Records in Sqlite Table", "description": "Updates records in a specified SQLite table, allowing dynamic column updates and an optional WHERE clause.", "author": "pl44t", - "code": "import sqlite3\n\ndef update_table(db_path, table_name, updates, where_clause=None):\n with sqlite3.connect(db_path) as conn:\n set_clause = ', '.join([f\"{col} = ?\" for col in updates.keys()])\n sql = f\"UPDATE {table_name} SET {set_clause}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n conn.execute(sql, tuple(updates.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\nupdates = {'name': 'Jane Doe', 'age': 28}\nwhere_clause = \"id = 1\"\nupdate_table(db_path, table_name, updates, where_clause)\n\n", "tags": [ "sqlite", "database" ], - "contributors": [] + "contributors": [], + "code": "import sqlite3\n\ndef update_table(db_path, table_name, updates, where_clause=None):\n with sqlite3.connect(db_path) as conn:\n set_clause = ', '.join([f\"{col} = ?\" for col in updates.keys()])\n sql = f\"UPDATE {table_name} SET {set_clause}\"\n if where_clause:\n sql += f\" WHERE {where_clause}\"\n conn.execute(sql, tuple(updates.values()))\n conn.commit()\n\n# Usage:\ndb_path = 'example.db'\ntable_name = 'users'\nupdates = {'name': 'Jane Doe', 'age': 28}\nwhere_clause = \"id = 1\"\nupdate_table(db_path, table_name, updates, where_clause)\n\n" } ] }, @@ -491,222 +491,222 @@ "title": "Capitalize Words", "description": "Capitalizes the first letter of each word in a string.", "author": "axorax", - "code": "def capitalize_words(s):\n return ' '.join(word.capitalize() for word in s.split())\n\n# Usage:\ncapitalize_words('hello world') # Returns: 'Hello World'\n", "tags": [ "string", "capitalize" ], - "contributors": [] + "contributors": [], + "code": "def capitalize_words(s):\n return ' '.join(word.capitalize() for word in s.split())\n\n# Usage:\ncapitalize_words('hello world') # Returns: 'Hello World'\n" }, { "title": "Check Anagram", "description": "Checks if two strings are anagrams of each other.", "author": "SteliosGee", - "code": "def is_anagram(s1, s2):\n return sorted(s1) == sorted(s2)\n\n# Usage:\nis_anagram('listen', 'silent') # Returns: True\n", "tags": [ "string", "anagram", "check" ], - "contributors": [] + "contributors": [], + "code": "def is_anagram(s1, s2):\n return sorted(s1) == sorted(s2)\n\n# Usage:\nis_anagram('listen', 'silent') # Returns: True\n" }, { "title": "Check Palindrome", "description": "Checks if a string is a palindrome.", "author": "dostonnabotov", - "code": "def is_palindrome(s):\n s = s.lower().replace(' ', '')\n return s == s[::-1]\n\n# Usage:\nis_palindrome('A man a plan a canal Panama') # Returns: True\n", "tags": [ "string", "palindrome" ], - "contributors": [] + "contributors": [], + "code": "def is_palindrome(s):\n s = s.lower().replace(' ', '')\n return s == s[::-1]\n\n# Usage:\nis_palindrome('A man a plan a canal Panama') # Returns: True\n" }, { "title": "Convert Snake Case to Camel Case", "description": "Converts a snake_case string to camelCase.", "author": "axorax", - "code": "def snake_to_camel(s):\n parts = s.split('_')\n return parts[0] + ''.join(word.capitalize() for word in parts[1:])\n\n# Usage:\nsnake_to_camel('hello_world') # Returns: 'helloWorld'\n", "tags": [ "string", "snake-case", "camel-case", "convert" ], - "contributors": [] + "contributors": [], + "code": "def snake_to_camel(s):\n parts = s.split('_')\n return parts[0] + ''.join(word.capitalize() for word in parts[1:])\n\n# Usage:\nsnake_to_camel('hello_world') # Returns: 'helloWorld'\n" }, { "title": "Convert String to ASCII", "description": "Converts a string into its ASCII representation.", "author": "axorax", - "code": "def string_to_ascii(s):\n return [ord(char) for char in s]\n\n# Usage:\nstring_to_ascii('hello') # Returns: [104, 101, 108, 108, 111]\n", "tags": [ "string", "ascii", "convert" ], - "contributors": [] + "contributors": [], + "code": "def string_to_ascii(s):\n return [ord(char) for char in s]\n\n# Usage:\nstring_to_ascii('hello') # Returns: [104, 101, 108, 108, 111]\n" }, { "title": "Count Character Frequency", "description": "Counts the frequency of each character in a string.", "author": "axorax", - "code": "from collections import Counter\n\ndef char_frequency(s):\n return dict(Counter(s))\n\n# Usage:\nchar_frequency('hello') # Returns: {'h': 1, 'e': 1, 'l': 2, 'o': 1}\n", "tags": [ "string", "character-frequency" ], - "contributors": [] + "contributors": [], + "code": "from collections import Counter\n\ndef char_frequency(s):\n return dict(Counter(s))\n\n# Usage:\nchar_frequency('hello') # Returns: {'h': 1, 'e': 1, 'l': 2, 'o': 1}\n" }, { "title": "Count Vowels", "description": "Counts the number of vowels in a string.", "author": "SteliosGee", - "code": "def count_vowels(s):\n vowels = 'aeiou'\n return len([char for char in s.lower() if char in vowels])\n\n# Usage:\ncount_vowels('hello') # Returns: 2\n", "tags": [ "string", "vowels", "count" ], - "contributors": [] + "contributors": [], + "code": "def count_vowels(s):\n vowels = 'aeiou'\n return len([char for char in s.lower() if char in vowels])\n\n# Usage:\ncount_vowels('hello') # Returns: 2\n" }, { "title": "Count Words", "description": "Counts the number of words in a string.", "author": "axorax", - "code": "def count_words(s):\n return len(s.split())\n\n# Usage:\ncount_words('The quick brown fox') # Returns: 4\n", "tags": [ "string", "word-count" ], - "contributors": [] + "contributors": [], + "code": "def count_words(s):\n return len(s.split())\n\n# Usage:\ncount_words('The quick brown fox') # Returns: 4\n" }, { "title": "Find All Substrings", "description": "Finds all substrings of a given string.", "author": "axorax", - "code": "def find_substrings(s):\n substrings = []\n for i in range(len(s)):\n for j in range(i + 1, len(s) + 1):\n substrings.append(s[i:j])\n return substrings\n\n# Usage:\nfind_substrings('abc') # Returns: ['a', 'ab', 'abc', 'b', 'bc', 'c']\n", "tags": [ "string", "substring", "find" ], - "contributors": [] + "contributors": [], + "code": "def find_substrings(s):\n substrings = []\n for i in range(len(s)):\n for j in range(i + 1, len(s) + 1):\n substrings.append(s[i:j])\n return substrings\n\n# Usage:\nfind_substrings('abc') # Returns: ['a', 'ab', 'abc', 'b', 'bc', 'c']\n" }, { "title": "Find Longest Word", "description": "Finds the longest word in a string.", "author": "axorax", - "code": "def find_longest_word(s):\n words = s.split()\n return max(words, key=len) if words else ''\n\n# Usage:\nfind_longest_word('The quick brown fox') # Returns: 'quick'\n", "tags": [ "string", "longest-word" ], - "contributors": [] + "contributors": [], + "code": "def find_longest_word(s):\n words = s.split()\n return max(words, key=len) if words else ''\n\n# Usage:\nfind_longest_word('The quick brown fox') # Returns: 'quick'\n" }, { "title": "Find Unique Characters", "description": "Finds all unique characters in a string.", "author": "axorax", - "code": "def find_unique_chars(s):\n return ''.join(sorted(set(s)))\n\n# Usage:\nfind_unique_chars('banana') # Results: 'abn'\n", "tags": [ "string", "unique", "characters" ], - "contributors": [] + "contributors": [], + "code": "def find_unique_chars(s):\n return ''.join(sorted(set(s)))\n\n# Usage:\nfind_unique_chars('banana') # Results: 'abn'\n" }, { "title": "Generate Random String", "description": "Generates a random alphanumeric string.", "author": "dostonnabotov", - "code": "import random\nimport string\n\ndef random_string(length):\n letters_and_digits = string.ascii_letters + string.digits\n return ''.join(random.choice(letters_and_digits) for _ in range(length))\n\n# Usage:\nrandom_string(10) # Results: Random 10-character string\n", "tags": [ "random", "string" ], - "contributors": [] + "contributors": [], + "code": "import random\nimport string\n\ndef random_string(length):\n letters_and_digits = string.ascii_letters + string.digits\n return ''.join(random.choice(letters_and_digits) for _ in range(length))\n\n# Usage:\nrandom_string(10) # Results: Random 10-character string\n" }, { "title": "Remove Duplicate Characters", "description": "Removes duplicate characters from a string while maintaining the order.", "author": "axorax", - "code": "def remove_duplicate_chars(s):\n seen = set()\n return ''.join(char for char in s if not (char in seen or seen.add(char)))\n\n# Usage:\nremove_duplicate_chars('programming') # Returns: 'progamin'\n", "tags": [ "string", "duplicates", "remove" ], - "contributors": [] + "contributors": [], + "code": "def remove_duplicate_chars(s):\n seen = set()\n return ''.join(char for char in s if not (char in seen or seen.add(char)))\n\n# Usage:\nremove_duplicate_chars('programming') # Returns: 'progamin'\n" }, { "title": "Remove Punctuation", "description": "Removes punctuation from a string.", "author": "SteliosGee", - "code": "import string\n\ndef remove_punctuation(s):\n return s.translate(str.maketrans('', '', string.punctuation))\n\n# Usage:\nremove_punctuation('Hello, World!') # Returns: 'Hello World'\n", "tags": [ "string", "punctuation", "remove" ], - "contributors": [] + "contributors": [], + "code": "import string\n\ndef remove_punctuation(s):\n return s.translate(str.maketrans('', '', string.punctuation))\n\n# Usage:\nremove_punctuation('Hello, World!') # Returns: 'Hello World'\n" }, { "title": "Remove Specific Characters", "description": "Removes specific characters from a string.", "author": "axorax", - "code": "def remove_chars(s, chars):\n return ''.join(c for c in s if c not in chars)\n\n# Usage:\nremove_chars('hello world', 'eo') # Returns: 'hll wrld'\n", "tags": [ "string", "remove", "characters" ], - "contributors": [] + "contributors": [], + "code": "def remove_chars(s, chars):\n return ''.join(c for c in s if c not in chars)\n\n# Usage:\nremove_chars('hello world', 'eo') # Returns: 'hll wrld'\n" }, { "title": "Remove Whitespace", "description": "Removes all whitespace from a string.", "author": "axorax", - "code": "def remove_whitespace(s):\n return ''.join(s.split())\n\n# Usage:\nremove_whitespace('hello world') # Returns: 'helloworld'\n", "tags": [ "string", "whitespace", "remove" ], - "contributors": [] + "contributors": [], + "code": "def remove_whitespace(s):\n return ''.join(s.split())\n\n# Usage:\nremove_whitespace('hello world') # Returns: 'helloworld'\n" }, { "title": "Reverse String", "description": "Reverses the characters in a string.", "author": "dostonnabotov", - "code": "def reverse_string(s):\n return s[::-1]\n\n# Usage:\nreverse_string('hello') # Returns: 'olleh'\n", "tags": [ "string", "reverse" ], - "contributors": [] + "contributors": [], + "code": "def reverse_string(s):\n return s[::-1]\n\n# Usage:\nreverse_string('hello') # Returns: 'olleh'\n" }, { "title": "Split Camel Case", "description": "Splits a camel case string into separate words.", "author": "axorax", - "code": "import re\n\ndef split_camel_case(s):\n return ' '.join(re.findall(r'[A-Z][a-z]*|[a-z]+', s))\n\n# Usage:\nsplit_camel_case('camelCaseString') # Returns: 'camel Case String'\n", "tags": [ "string", "camel-case", "split" ], - "contributors": [] + "contributors": [], + "code": "import re\n\ndef split_camel_case(s):\n return ' '.join(re.findall(r'[A-Z][a-z]*|[a-z]+', s))\n\n# Usage:\nsplit_camel_case('camelCaseString') # Returns: 'camel Case String'\n" }, { "title": "Truncate String", "description": "Truncates a string to a specified length and adds an ellipsis.", "author": "axorax", - "code": "def truncate_string(s, length):\n return s[:length] + '...' if len(s) > length else s\n\n# Usage:\ntruncate_string('This is a long string', 10) # Returns: 'This is a ...'\n", "tags": [ "string", "truncate" ], - "contributors": [] + "contributors": [], + "code": "def truncate_string(s, length):\n return s[:length] + '...' if len(s) > length else s\n\n# Usage:\ntruncate_string('This is a long string', 10) # Returns: 'This is a ...'\n" } ] } diff --git a/public/consolidated/rust.json b/public/consolidated/rust.json index d8eb2297..4a150d77 100644 --- a/public/consolidated/rust.json +++ b/public/consolidated/rust.json @@ -6,12 +6,12 @@ "title": "Hello, World!", "description": "Prints Hello, World! to the terminal.", "author": "James-Beans", - "code": "fn main() { // Defines the main running function\n println!(\"Hello, World!\"); // Prints Hello, World! to the terminal.\n}\n", "tags": [ "printing", "hello-world" ], - "contributors": [] + "contributors": [], + "code": "fn main() { // Defines the main running function\n println!(\"Hello, World!\"); // Prints Hello, World! to the terminal.\n}\n" } ] }, @@ -22,23 +22,23 @@ "title": "Find Files", "description": "Finds all files of the specified extension within a given directory.", "author": "Mathys-Gasnier", - "code": "fn find_files(directory: &str, file_type: &str) -> std::io::Result> {\n let mut result = vec![];\n\n for entry in std::fs::read_dir(directory)? {\n let dir = entry?;\n let path = dir.path();\n if dir.file_type().is_ok_and(|t| !t.is_file()) &&\n path.extension().is_some_and(|ext| ext != file_type) {\n continue;\n }\n result.push(path)\n }\n\n Ok(result)\n}\n\n// Usage:\nfind_files(\"/path/to/your/directory\", \".pdf\"); // Returns: if Ok(), a vector of path to `.pdf` files in the directory\n", "tags": [ "file", "search" ], - "contributors": [] + "contributors": [], + "code": "fn find_files(directory: &str, file_type: &str) -> std::io::Result> {\n let mut result = vec![];\n\n for entry in std::fs::read_dir(directory)? {\n let dir = entry?;\n let path = dir.path();\n if dir.file_type().is_ok_and(|t| !t.is_file()) &&\n path.extension().is_some_and(|ext| ext != file_type) {\n continue;\n }\n result.push(path)\n }\n\n Ok(result)\n}\n\n// Usage:\nfind_files(\"/path/to/your/directory\", \".pdf\"); // Returns: if Ok(), a vector of path to `.pdf` files in the directory\n" }, { "title": "Read File Lines", "description": "Reads all lines from a file and returns them as a vector of strings.", "author": "Mathys-Gasnier", - "code": "fn read_lines(file_name: &str) -> std::io::Result>\n Ok(\n std::fs::read_to_string(file_name)?\n .lines()\n .map(String::from)\n .collect()\n )\n}\n\n// Usage:\nread_lines(\"path/to/file.txt\"); // Returns: If Ok(), a Vec of the lines of the file\n", "tags": [ "file", "read" ], - "contributors": [] + "contributors": [], + "code": "fn read_lines(file_name: &str) -> std::io::Result>\n Ok(\n std::fs::read_to_string(file_name)?\n .lines()\n .map(String::from)\n .collect()\n )\n}\n\n// Usage:\nread_lines(\"path/to/file.txt\"); // Returns: If Ok(), a Vec of the lines of the file\n" } ] }, @@ -49,12 +49,12 @@ "title": "Capitalize String", "description": "Makes the first letter of a string uppercase.", "author": "Mathys-Gasnier", - "code": "fn capitalized(str: &str) -> String {\n let mut chars = str.chars();\n match chars.next() {\n None => String::new(),\n Some(f) => f.to_uppercase().chain(chars).collect(),\n }\n}\n\n// Usage:\ncapitalized(\"lower_case\"); // Returns: Lower_case\n", "tags": [ "string", "capitalize" ], - "contributors": [] + "contributors": [], + "code": "fn capitalized(str: &str) -> String {\n let mut chars = str.chars();\n match chars.next() {\n None => String::new(),\n Some(f) => f.to_uppercase().chain(chars).collect(),\n }\n}\n\n// Usage:\ncapitalized(\"lower_case\"); // Returns: Lower_case\n" } ] } diff --git a/public/consolidated/scss.json b/public/consolidated/scss.json index 1b7e05c6..dd8414b1 100644 --- a/public/consolidated/scss.json +++ b/public/consolidated/scss.json @@ -6,25 +6,25 @@ "title": "Fade In Animation", "description": "Animates the fade-in effect.", "author": "dostonnabotov", - "code": "@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@mixin fade-in($duration: 1s, $easing: ease-in-out) {\n animation: fade-in $duration $easing;\n}\n", "tags": [ "animation", "fade", "css" ], - "contributors": [] + "contributors": [], + "code": "@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@mixin fade-in($duration: 1s, $easing: ease-in-out) {\n animation: fade-in $duration $easing;\n}\n" }, { "title": "Slide In From Left", "description": "Animates content sliding in from the left.", "author": "dostonnabotov", - "code": "@keyframes slide-in-left {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@mixin slide-in-left($duration: 0.5s, $easing: ease-out) {\n animation: slide-in-left $duration $easing;\n}\n", "tags": [ "animation", "slide", "css" ], - "contributors": [] + "contributors": [], + "code": "@keyframes slide-in-left {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@mixin slide-in-left($duration: 0.5s, $easing: ease-out) {\n animation: slide-in-left $duration $easing;\n}\n" } ] }, @@ -35,25 +35,25 @@ "title": "Border Radius Helper", "description": "Applies a customizable border-radius.", "author": "dostonnabotov", - "code": "@mixin border-radius($radius: 4px) {\n border-radius: $radius;\n}\n", "tags": [ "border", "radius", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin border-radius($radius: 4px) {\n border-radius: $radius;\n}\n" }, { "title": "Box Shadow Helper", "description": "Generates a box shadow with customizable values.", "author": "dostonnabotov", - "code": "@mixin box-shadow($x: 0px, $y: 4px, $blur: 10px, $spread: 0px, $color: rgba(0, 0, 0, 0.1)) {\n box-shadow: $x $y $blur $spread $color;\n}\n", "tags": [ "box-shadow", "css", "effects" ], - "contributors": [] + "contributors": [], + "code": "@mixin box-shadow($x: 0px, $y: 4px, $blur: 10px, $spread: 0px, $color: rgba(0, 0, 0, 0.1)) {\n box-shadow: $x $y $blur $spread $color;\n}\n" } ] }, @@ -64,13 +64,13 @@ "title": "Primary Button", "description": "Generates a styled primary button.", "author": "dostonnabotov", - "code": "@mixin primary-button($bg: #007bff, $color: #fff) {\n background-color: $bg;\n color: $color;\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n\n &:hover {\n background-color: darken($bg, 10%);\n }\n}\n", "tags": [ "button", "primary", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin primary-button($bg: #007bff, $color: #fff) {\n background-color: $bg;\n color: $color;\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n\n &:hover {\n background-color: darken($bg, 10%);\n }\n}\n" } ] }, @@ -81,19 +81,18 @@ "title": "Aspect Ratio", "description": "Ensures that elements maintain a specific aspect ratio.", "author": "dostonnabotov", - "code": "@mixin aspect-ratio($width, $height) {\n position: relative;\n width: 100%;\n padding-top: ($height / $width) * 100%;\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n", "tags": [ "aspect-ratio", "layout", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin aspect-ratio($width, $height) {\n position: relative;\n width: 100%;\n padding-top: ($height / $width) * 100%;\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n" }, { "title": "Dark Theme", "description": "SCSS mixin to change styles for dark themes.", "author": "gihanrangana", - "code": "@mixin isDark($type: 'module') {\n $root: &;\n\n @if $type == 'module' {\n :global {\n @at-root body[theme='dark'] #{$root} {\n @content;\n }\n }\n } @else {\n &[theme='dark'] {\n @content;\n }\n }\n}\n\n// Usage:\n.container{\n\tbackground: #f0f0f0;\n\t@include isDark {\n\t\tbackground: #222;\n\t}\n}\n", "tags": [ "css", "mixin", @@ -101,31 +100,32 @@ "dark-theme", "layout" ], - "contributors": [] + "contributors": [], + "code": "@mixin isDark($type: 'module') {\n $root: &;\n\n @if $type == 'module' {\n :global {\n @at-root body[theme='dark'] #{$root} {\n @content;\n }\n }\n } @else {\n &[theme='dark'] {\n @content;\n }\n }\n}\n\n// Usage:\n.container{\n\tbackground: #f0f0f0;\n\t@include isDark {\n\t\tbackground: #222;\n\t}\n}\n" }, { "title": "Flex Center", "description": "A mixin to center content using flexbox.", "author": "dostonnabotov", - "code": "@mixin flex-center {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n", "tags": [ "flex", "center", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin flex-center {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n" }, { "title": "Grid Container", "description": "Creates a responsive grid container with customizable column counts.", "author": "dostonnabotov", - "code": "@mixin grid-container($columns: 12, $gap: 1rem) {\n display: grid;\n grid-template-columns: repeat($columns, 1fr);\n gap: $gap;\n}\n", "tags": [ "grid", "layout", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin grid-container($columns: 12, $gap: 1rem) {\n display: grid;\n grid-template-columns: repeat($columns, 1fr);\n gap: $gap;\n}\n" } ] }, @@ -136,50 +136,50 @@ "title": "Font Import Helper", "description": "Simplifies importing custom fonts in Sass.", "author": "dostonnabotov", - "code": "@mixin import-font($family, $weight: 400, $style: normal) {\n @font-face {\n font-family: #{$family};\n font-weight: #{$weight};\n font-style: #{$style};\n src: url('/fonts/#{$family}-#{$weight}.woff2') format('woff2'),\n url('/fonts/#{$family}-#{$weight}.woff') format('woff');\n }\n}\n", "tags": [ "mixin", "fonts", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin import-font($family, $weight: 400, $style: normal) {\n @font-face {\n font-family: #{$family};\n font-weight: #{$weight};\n font-style: #{$style};\n src: url('/fonts/#{$family}-#{$weight}.woff2') format('woff2'),\n url('/fonts/#{$family}-#{$weight}.woff') format('woff');\n }\n}\n" }, { "title": "Line Clamp Mixin", "description": "A Sass mixin to clamp text to a specific number of lines.", "author": "dostonnabotov", - "code": "@mixin line-clamp($number) {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: $number;\n overflow: hidden;\n}\n", "tags": [ "mixin", "typography", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin line-clamp($number) {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: $number;\n overflow: hidden;\n}\n" }, { "title": "Text Gradient", "description": "Adds a gradient color effect to text.", "author": "dostonnabotov", - "code": "@mixin text-gradient($from, $to) {\n background: linear-gradient(to right, $from, $to);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n", "tags": [ "mixin", "gradient", "text", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin text-gradient($from, $to) {\n background: linear-gradient(to right, $from, $to);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n" }, { "title": "Text Overflow Ellipsis", "description": "Ensures long text is truncated with an ellipsis.", "author": "dostonnabotov", - "code": "@mixin text-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n", "tags": [ "mixin", "text", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin text-ellipsis {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n" } ] }, @@ -190,25 +190,25 @@ "title": "Clearfix", "description": "Provides a clearfix utility for floating elements.", "author": "dostonnabotov", - "code": "@mixin clearfix {\n &::after {\n content: '';\n display: block;\n clear: both;\n }\n}\n", "tags": [ "clearfix", "utility", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin clearfix {\n &::after {\n content: '';\n display: block;\n clear: both;\n }\n}\n" }, { "title": "Responsive Breakpoints", "description": "Generates media queries for responsive design.", "author": "dostonnabotov", - "code": "@mixin breakpoint($breakpoint) {\n @if $breakpoint == sm {\n @media (max-width: 576px) { @content; }\n } @else if $breakpoint == md {\n @media (max-width: 768px) { @content; }\n } @else if $breakpoint == lg {\n @media (max-width: 992px) { @content; }\n } @else if $breakpoint == xl {\n @media (max-width: 1200px) { @content; }\n }\n}\n", "tags": [ "responsive", "media-queries", "css" ], - "contributors": [] + "contributors": [], + "code": "@mixin breakpoint($breakpoint) {\n @if $breakpoint == sm {\n @media (max-width: 576px) { @content; }\n } @else if $breakpoint == md {\n @media (max-width: 768px) { @content; }\n } @else if $breakpoint == lg {\n @media (max-width: 992px) { @content; }\n } @else if $breakpoint == xl {\n @media (max-width: 1200px) { @content; }\n }\n}\n" } ] } diff --git a/public/consolidated/typescript.json b/public/consolidated/typescript.json index 3a11ec37..98a0680b 100644 --- a/public/consolidated/typescript.json +++ b/public/consolidated/typescript.json @@ -6,13 +6,13 @@ "title": "Exclusive Types", "description": "Allows to have a type which conforms to either/or.", "author": "px-d", - "code": "type Exclusive = T | U extends Record\n ?\n | ({ [P in Exclude]?: never } & U)\n | ({ [P in Exclude]?: never } & T)\n : T | U;\n\n\n// Usage:\ntype A = { name: string; email?: string; provider?: string };\ntype B = { name: string; phone?: string; country?: string };\n\ntype EitherOr = Exclusive;\n\nconst w: EitherOr = { name: \"John\", email: \"j@d.c\" }; // ✅\nconst x: EitherOr = { name: \"John\", phone: \"+123 456\" }; // ✅\nconst y: EitherOr = { name: \"John\", email: \"\", phone: \"\" }; // ⛔️\nconst z: EitherOr = { name: \"John\", phne: \"\", provider: \"\" }; // ⛔️\n", "tags": [ "typescript", "helper-types", "typedefinition" ], - "contributors": [] + "contributors": [], + "code": "type Exclusive = T | U extends Record\n ?\n | ({ [P in Exclude]?: never } & U)\n | ({ [P in Exclude]?: never } & T)\n : T | U;\n\n\n// Usage:\ntype A = { name: string; email?: string; provider?: string };\ntype B = { name: string; phone?: string; country?: string };\n\ntype EitherOr = Exclusive;\n\nconst w: EitherOr = { name: \"John\", email: \"j@d.c\" }; // ✅\nconst x: EitherOr = { name: \"John\", phone: \"+123 456\" }; // ✅\nconst y: EitherOr = { name: \"John\", email: \"\", phone: \"\" }; // ⛔️\nconst z: EitherOr = { name: \"John\", phne: \"\", provider: \"\" }; // ⛔️\n" } ] } diff --git a/utils/snippetParser.ts b/utils/snippetParser.ts index 09482b47..cff74f5d 100644 --- a/utils/snippetParser.ts +++ b/utils/snippetParser.ts @@ -76,7 +76,6 @@ function parseSnippet(snippetPath, name, text) { title: properties.title, description: properties.description, author: properties.author, - code, tags: properties.tags .split(",") .map((tag) => tag.trim()) @@ -85,6 +84,7 @@ function parseSnippet(snippetPath, name, text) { .split(",") .map((contributor) => contributor.trim()) .filter((contributor) => contributor), + code, }; } From ccc4cc0a3675dfc562d2b6fabd8f4aef1d7e9ffd Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 20:18:05 +0000 Subject: [PATCH 06/13] remove duplicate code in script --- utils/snippetParser.ts | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/utils/snippetParser.ts b/utils/snippetParser.ts index cff74f5d..65a93f58 100644 --- a/utils/snippetParser.ts +++ b/utils/snippetParser.ts @@ -6,15 +6,23 @@ import { isCorrectType } from "../src/utils/objectUtils"; import { raise } from "../src/utils/raise"; import { reverseSlugify, slugify } from "../src/utils/slugify"; -let errored = false; - const crlfRegex = /\r\n/gm; const propertyRegex = /^\s+([a-zA-Z]+):\s*(.+)/; const headerEndCodeStartRegex = /^\s*---\s*```.*\n/; const codeRegex = /^(.+)```/s; -function parseSnippet(snippetPath, name, text) { + +let errored = false; + +function parseSnippet({ + snippetPath, + name, + text, +}: { + snippetPath: string; + name: string; + text: string; +}): SnippetType | null { if (crlfRegex.exec(text) !== null) { - errored = true; return raise( "Found CRLF line endings instead of LF line endings", snippetPath @@ -25,7 +33,6 @@ function parseSnippet(snippetPath, name, text) { const fromCursor = () => text.substring(cursor); if (!fromCursor().trim().startsWith("---")) { - errored = true; return raise("Missing header start delimiter '---'", snippetPath); } cursor += 3; @@ -46,12 +53,10 @@ function parseSnippet(snippetPath, name, text) { "tags", ]) ) { - errored = true; return raise("Invalid properties", snippetPath); } if (slugify(properties.title) !== name) { - errored = true; return raise( `slugifyed 'title' property doesn't match snippet file name`, snippetPath @@ -60,14 +65,12 @@ function parseSnippet(snippetPath, name, text) { match = headerEndCodeStartRegex.exec(fromCursor()); if (match === null) { - errored = true; return raise("Missing header end '---' or code start '```'", snippetPath); } cursor += match[0].length; match = codeRegex.exec(fromCursor()); if (match === null) { - errored = true; return raise("Missing code block end '```'", snippetPath); } const code: string = match[1]; @@ -103,24 +106,29 @@ export function parseAllSnippets() { } const categories: CategoryType[] = []; + for (const category of readdirSync(languagePath)) { if (category === "icon.svg") continue; - const categoryPath = join(languagePath, category); + const categoryPath = join(languagePath, category); const categorySnippets: SnippetType[] = []; + for (const snippet of readdirSync(categoryPath)) { const snippetPath = join(categoryPath, snippet); const snippetContent = readFileSync(snippetPath).toString(); const snippetFileName = snippet.slice(0, -3); - - const snippetData = parseSnippet( + const snippetData = parseSnippet({ snippetPath, - snippetFileName, - snippetContent - ); - if (!snippetData) continue; + name: snippetFileName, + text: snippetContent, + }); + if (snippetData === null) { + errored = true; + continue; + } categorySnippets.push(snippetData); } + categories.push({ categoryName: reverseSlugify(category), snippets: categorySnippets, From 411ccb8e076ed4def1f5435a6494be4423eec170 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 20:19:58 +0000 Subject: [PATCH 07/13] testing tsx usage in workflow --- .github/workflows/pre-commit-checks.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pre-commit-checks.yml b/.github/workflows/pre-commit-checks.yml index c30b6817..2e640b99 100644 --- a/.github/workflows/pre-commit-checks.yml +++ b/.github/workflows/pre-commit-checks.yml @@ -21,6 +21,9 @@ jobs: - name: Install dependencies run: npm ci + - name: Temp + run: npx tsx utils/checkSnippetFormatting.ts + - name: Run cspell run: npm run cspell From 8d63d17eec9d9996883c81f941e6e9842f28c606 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 20:22:06 +0000 Subject: [PATCH 08/13] prefix tsx calls with npx in workflows --- .github/workflows/check-snippets.yml | 2 +- .github/workflows/consolidate-snippets.yml | 2 +- .github/workflows/pre-commit-checks.yml | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/check-snippets.yml b/.github/workflows/check-snippets.yml index 1efb01f2..0c07c753 100644 --- a/.github/workflows/check-snippets.yml +++ b/.github/workflows/check-snippets.yml @@ -25,7 +25,7 @@ jobs: - name: Check if snippets are formated correctly uses: int128/comment-action@v1 with: - run: tsx utils/checkSnippetFormatting.ts # Run the script located in the utils/ folder + run: npx tsx utils/checkSnippetFormatting.ts # Run the script located in the utils/ folder post-on-failure: | ## :x: Snippet Format Error ${run.output} diff --git a/.github/workflows/consolidate-snippets.yml b/.github/workflows/consolidate-snippets.yml index e873beda..ed994d8d 100644 --- a/.github/workflows/consolidate-snippets.yml +++ b/.github/workflows/consolidate-snippets.yml @@ -27,7 +27,7 @@ jobs: - name: Consolidate Snippets run: | - tsx utils/consolidateSnippets.ts # Run the script located in the utils/ folder + npx tsx utils/consolidateSnippets.ts # Run the script located in the utils/ folder - name: Commit and push changes run: | diff --git a/.github/workflows/pre-commit-checks.yml b/.github/workflows/pre-commit-checks.yml index 2e640b99..c30b6817 100644 --- a/.github/workflows/pre-commit-checks.yml +++ b/.github/workflows/pre-commit-checks.yml @@ -21,9 +21,6 @@ jobs: - name: Install dependencies run: npm ci - - name: Temp - run: npx tsx utils/checkSnippetFormatting.ts - - name: Run cspell run: npm run cspell From f8d41daf9fb1c316b5b0e17699cb58c94f948717 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 20:25:31 +0000 Subject: [PATCH 09/13] install deps in check-snippets script --- .github/workflows/check-snippets.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check-snippets.yml b/.github/workflows/check-snippets.yml index 0c07c753..626458a1 100644 --- a/.github/workflows/check-snippets.yml +++ b/.github/workflows/check-snippets.yml @@ -22,6 +22,9 @@ jobs: with: node-version: 22 + - name: Install dependencies + run: npm ci + - name: Check if snippets are formated correctly uses: int128/comment-action@v1 with: From 5dcad06828c70186b3b80cdbdfea7f607abedb2b Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 3 Jan 2025 20:32:49 +0000 Subject: [PATCH 10/13] revert arg object structure conversion for the parseSnippet function --- utils/snippetParser.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/utils/snippetParser.ts b/utils/snippetParser.ts index 65a93f58..f50c2038 100644 --- a/utils/snippetParser.ts +++ b/utils/snippetParser.ts @@ -13,15 +13,11 @@ const codeRegex = /^(.+)```/s; let errored = false; -function parseSnippet({ - snippetPath, - name, - text, -}: { - snippetPath: string; - name: string; - text: string; -}): SnippetType | null { +function parseSnippet( + snippetPath: string, + name: string, + text: string +): SnippetType | null { if (crlfRegex.exec(text) !== null) { return raise( "Found CRLF line endings instead of LF line endings", @@ -117,11 +113,11 @@ export function parseAllSnippets() { const snippetPath = join(categoryPath, snippet); const snippetContent = readFileSync(snippetPath).toString(); const snippetFileName = snippet.slice(0, -3); - const snippetData = parseSnippet({ + const snippetData = parseSnippet( snippetPath, - name: snippetFileName, - text: snippetContent, - }); + snippetFileName, + snippetContent + ); if (snippetData === null) { errored = true; continue; From 4208ae827b2d58eaeeb297f7a1ebebd75fe1aa10 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Thu, 9 Jan 2025 23:00:13 +0000 Subject: [PATCH 11/13] update scripts --- utils/checkSnippetFormatting.ts | 2 +- utils/consolidateSnippets.ts | 52 +++++++--- utils/snippetParser.ts | 166 +++++++++++++++++++++----------- 3 files changed, 147 insertions(+), 73 deletions(-) diff --git a/utils/checkSnippetFormatting.ts b/utils/checkSnippetFormatting.ts index 28b808c5..24d60cdf 100644 --- a/utils/checkSnippetFormatting.ts +++ b/utils/checkSnippetFormatting.ts @@ -2,7 +2,7 @@ import { exit } from "process"; import { parseAllSnippets } from "./snippetParser.ts"; -const [errored] = parseAllSnippets(); +const { errored } = parseAllSnippets(); if (errored) { exit(1); diff --git a/utils/consolidateSnippets.ts b/utils/consolidateSnippets.ts index 8e16c254..d8d47911 100644 --- a/utils/consolidateSnippets.ts +++ b/utils/consolidateSnippets.ts @@ -1,36 +1,56 @@ -import { copyFileSync, writeFileSync } from "fs"; +import { copyFileSync, mkdirSync, writeFileSync } from "fs"; import { join } from "path"; import { exit } from "process"; -import { parseAllSnippets } from "./snippetParser.ts"; -import { LanguageType } from "../src/types"; -import { reverseSlugify } from "../src/utils/slugify"; +import { parseAllSnippets } from "./snippetParser.js"; +import { LanguageType } from "../src/types/index.js"; +import { slugify } from "../src/utils/slugify.js"; const dataPath = "public/consolidated/"; const indexPath = join(dataPath, "_index.json"); const iconPath = "public/icons/"; -const snippetsPath = "snippets/"; -const [errored, snippets] = parseAllSnippets(); +const { errored, languages } = parseAllSnippets(); if (errored) { exit(1); } -const languages: LanguageType[] = []; -for (const [language, categories] of Object.entries(snippets)) { - const languageIconPath = join(snippetsPath, language, "icon.svg"); +mkdirSync(dataPath, { recursive: true }); +mkdirSync(iconPath, { recursive: true }); - copyFileSync(languageIconPath, join(iconPath, `${language}.svg`)); +const index: LanguageType[] = []; +for (const language of languages) { + copyFileSync(language.icon, join(iconPath, `${slugify(language.name)}.svg`)); - languages.push({ - lang: reverseSlugify(language).toUpperCase(), - icon: `/icons/${language}.svg`, + const subIndexes: LanguageType["subIndexes"] = []; + + for (const subLanguage of language.subLanguages) { + const joinedName = `${slugify(language.name)}--${slugify(subLanguage.name)}`; + const iconName = `${joinedName}.svg`; + const subLanguageFilePath = join(dataPath, `${joinedName}.json`); + + copyFileSync(subLanguage.icon, join(iconPath, iconName)); + subIndexes.push({ + name: subLanguage.name.toUpperCase(), + icon: `/icons/${iconName}`, + }); + + writeFileSync( + subLanguageFilePath, + JSON.stringify(subLanguage.categories, null, 4) + ); + } + + index.push({ + name: language.name.toUpperCase(), + icon: `/icons/${slugify(language.name)}.svg`, + subIndexes, }); - const languageFilePath = join(dataPath, `${language}.json`); + const languageFilePath = join(dataPath, `${slugify(language.name)}.json`); - writeFileSync(languageFilePath, JSON.stringify(categories, null, 4)); + writeFileSync(languageFilePath, JSON.stringify(language.categories, null, 4)); } -writeFileSync(indexPath, JSON.stringify(languages, null, 4)); +writeFileSync(indexPath, JSON.stringify(index, null, 4)); diff --git a/utils/snippetParser.ts b/utils/snippetParser.ts index f50c2038..8f4bca71 100644 --- a/utils/snippetParser.ts +++ b/utils/snippetParser.ts @@ -1,41 +1,49 @@ import { existsSync, readdirSync, readFileSync } from "fs"; import { join } from "path"; -import { CategoryType, RawSnippetType, SnippetType } from "../src/types"; +import { RawSnippetType, SnippetType } from "../src/types"; import { isCorrectType } from "../src/utils/objectUtils"; import { raise } from "../src/utils/raise"; import { reverseSlugify, slugify } from "../src/utils/slugify"; -const crlfRegex = /\r\n/gm; +interface ParseLanguageResponse { + name: string; + icon: string; + categories: Array<{ + name: string; + snippets: Array; + }>; + subLanguages: ParseLanguageResponse[]; +} + +interface ParseCategoryResponse { + name: string; + snippets: Array; +} + const propertyRegex = /^\s+([a-zA-Z]+):\s*(.+)/; -const headerEndCodeStartRegex = /^\s*---\s*```.*\n/; +const headerEndCodeStartRegex = /^\s*---\s*```.*\r?\n/; const codeRegex = /^(.+)```/s; -let errored = false; +let errored: boolean = false; function parseSnippet( - snippetPath: string, + path: string, name: string, text: string ): SnippetType | null { - if (crlfRegex.exec(text) !== null) { - return raise( - "Found CRLF line endings instead of LF line endings", - snippetPath - ); - } - let cursor = 0; + let cursor: number = 0; const fromCursor = () => text.substring(cursor); - if (!fromCursor().trim().startsWith("---")) { - return raise("Missing header start delimiter '---'", snippetPath); + return raise("Missing header start delimiter '---'", path); } + cursor += 3; const properties = {}; - let match; + let match: string[] | null; while ((match = propertyRegex.exec(fromCursor())) !== null) { cursor += match[0].length; properties[match[1].toLowerCase()] = match[2]; @@ -49,26 +57,28 @@ function parseSnippet( "tags", ]) ) { - return raise("Invalid properties", snippetPath); + return raise("Invalid properties", path); } if (slugify(properties.title) !== name) { return raise( `slugifyed 'title' property doesn't match snippet file name`, - snippetPath + path ); } match = headerEndCodeStartRegex.exec(fromCursor()); if (match === null) { - return raise("Missing header end '---' or code start '```'", snippetPath); + return raise("Missing header end '---' or code start '```'", path); } + cursor += match[0].length; match = codeRegex.exec(fromCursor()); if (match === null) { - return raise("Missing code block end '```'", snippetPath); + return raise("Missing code block end '```'", path); } + const code: string = match[1]; return { @@ -83,56 +93,100 @@ function parseSnippet( .split(",") .map((contributor) => contributor.trim()) .filter((contributor) => contributor), - code, + code: code.replace(/\r\n/g, "\n"), }; } -const snippetPath = "snippets/"; -export function parseAllSnippets() { - const snippets = {}; +function parseCategory(path: string, name: string): ParseCategoryResponse { + const snippets: SnippetType[] = []; - for (const language of readdirSync(snippetPath)) { - const languagePath = join(snippetPath, language); - const languageIconPath = join(languagePath, "icon.svg"); + for (const snippet of readdirSync(path)) { + const snippetPath = join(path, snippet); + const snippetContent = readFileSync(snippetPath).toString(); + const snippetFileName = snippet.slice(0, -3); - if (!existsSync(languageIconPath)) { + const snippetData = parseSnippet( + snippetPath, + snippetFileName, + snippetContent + ); + if (!snippetData) { errored = true; - raise(`icon for '${language}' is missing`); continue; } + snippets.push(snippetData); + } + + return { + name: reverseSlugify(name), + snippets, + }; +} + +function parseLanguage( + path: string, + name: string, + subLanguageOf: string | null = null +): ParseLanguageResponse | null { + const iconPath = join(path, "icon.svg"); - const categories: CategoryType[] = []; - - for (const category of readdirSync(languagePath)) { - if (category === "icon.svg") continue; - - const categoryPath = join(languagePath, category); - const categorySnippets: SnippetType[] = []; - - for (const snippet of readdirSync(categoryPath)) { - const snippetPath = join(categoryPath, snippet); - const snippetContent = readFileSync(snippetPath).toString(); - const snippetFileName = snippet.slice(0, -3); - const snippetData = parseSnippet( - snippetPath, - snippetFileName, - snippetContent - ); - if (snippetData === null) { - errored = true; - continue; - } - categorySnippets.push(snippetData); + if (!existsSync(iconPath)) { + return raise( + `icon for '${subLanguageOf ? `${subLanguageOf}/` : ""}${name}' is missing` + ); + } + + const subLanguages: Array = []; + const categories: Array = []; + + for (const category of readdirSync(path)) { + if (category === "icon.svg") continue; + const categoryPath = join(path, category); + + if (category.startsWith("[") && category.endsWith("]")) { + if (subLanguageOf !== null) { + return raise("Cannot have more than two level of language nesting"); } - categories.push({ - categoryName: reverseSlugify(category), - snippets: categorySnippets, - }); + const parsedLanguage = parseLanguage( + categoryPath, + category.slice(1, -1), + name + ); + if (!parsedLanguage) { + errored = true; + continue; + } + subLanguages.push(parsedLanguage); + } else { + categories.push(parseCategory(categoryPath, category)); } + } - snippets[language] = categories; + return { + name: reverseSlugify(name), + icon: iconPath, + categories, + subLanguages, + }; +} + +export function parseAllSnippets() { + const snippetPath = "snippets/"; + + const languages: ParseLanguageResponse[] = []; + for (const language of readdirSync(snippetPath)) { + const languagePath = join(snippetPath, language); + const parsedLanguage = parseLanguage(languagePath, language); + if (!parsedLanguage) { + errored = true; + continue; + } + languages.push(parsedLanguage); } - return [errored, snippets]; + return { + errored, + languages, + }; } From 0167af2d16604849e2277280c6f7dba6e2d7ad36 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 10 Jan 2025 12:05:50 +0000 Subject: [PATCH 12/13] remove unused file --- public/consolidated/javascript.json | 856 ---------------------------- 1 file changed, 856 deletions(-) delete mode 100644 public/consolidated/javascript.json diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json deleted file mode 100644 index c7b78ff8..00000000 --- a/public/consolidated/javascript.json +++ /dev/null @@ -1,856 +0,0 @@ -[ - { - "categoryName": "Array Manipulation", - "snippets": [ - { - "title": "Partition Array", - "description": "Splits an array into two arrays based on a callback function.", - "author": "Swaraj-Singh-30", - "tags": [ - "array", - "partition", - "reduce" - ], - "contributors": [], - "code": "const partition = (arr, callback) =>\n arr.reduce(\n ([pass, fail], elem) => (callback(elem) ? [[...pass, elem], fail] : [pass, [...fail, elem]]),\n [[], []]\n );\n\n// Usage:\nconst numbers = [1, 2, 3, 4, 5, 6];\nconst isEven = (n) => n % 2 === 0;\npartition(numbers, isEven); // Returns: [[2, 4, 6], [1, 3, 5]]\n" - }, - { - "title": "Remove Duplicates", - "description": "Removes duplicate values from an array.", - "author": "dostonnabotov", - "tags": [ - "array", - "deduplicate" - ], - "contributors": [], - "code": "const removeDuplicates = (arr) => [...new Set(arr)];\n\n// Usage:\nconst numbers = [1, 2, 2, 3, 4, 4, 5];\nremoveDuplicates(numbers); // Returns: [1, 2, 3, 4, 5]\n" - }, - { - "title": "Remove Falsy Values", - "description": "Removes falsy values from an array.", - "author": "mubasshir", - "tags": [ - "array", - "falsy", - "filter" - ], - "contributors": [], - "code": "const removeFalsy = (arr) => arr.filter(Boolean);\n\n// Usage:\nconst array = [0, 1, false, 2, \"\", 3, null];\nremoveFalsy(array); // Returns: [1, 2, 3]\n" - }, - { - "title": "Shuffle Array", - "description": "Shuffles an Array.", - "author": "loxt-nixo", - "tags": [ - "array", - "shuffle" - ], - "contributors": [], - "code": "function shuffleArray(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n}\n\n// Usage:\nconst array = [1, 2, 3, 4, 5];\nshuffleArray(array); // Shuffles `array` in place\n" - }, - { - "title": "Zip Arrays", - "description": "Combines two arrays by pairing corresponding elements from each array.", - "author": "Swaraj-Singh-30", - "tags": [ - "array", - "map" - ], - "contributors": [], - "code": "const zip = (arr1, arr2) => arr1.map((value, index) => [value, arr2[index]]);\n\n// Usage:\nconst arr1 = ['a', 'b', 'c'];\nconst arr2 = [1, 2, 3];\nconsole.log(zip(arr1, arr2)); // Output: [['a', 1], ['b', 2], ['c', 3]]\n" - } - ] - }, - { - "categoryName": "Basics", - "snippets": [ - { - "title": "Hello, World!", - "description": "Prints Hello, World! to the terminal.", - "author": "James-Beans", - "tags": [ - "printing", - "hello-world" - ], - "contributors": [], - "code": "console.log(\"Hello, World!\"); // Prints Hello, World! to the console\n" - } - ] - }, - { - "categoryName": "Color Manipulation", - "snippets": [ - { - "title": "RGB to Hex Color", - "description": "Converts RGB color values to hexadecimal color code.", - "author": "jjcantu", - "tags": [ - "color", - "conversion" - ], - "contributors": [], - "code": "function rgbToHex(r, g, b) {\n const toHex = (n) => {\n const hex = n.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n \n return '#' + toHex(r) + toHex(g) + toHex(b);\n}\n\n// Usage:\nconsole.log(rgbToHex(255, 128, 0)); // Output: \"#ff8000\"\nconsole.log(rgbToHex(0, 255, 0)); // Output: \"#00ff00\"\n" - } - ] - }, - { - "categoryName": "Date And Time", - "snippets": [ - { - "title": "Check Leap Year", - "description": "Determines if a given year is a leap year.", - "author": "axorax", - "tags": [ - "date", - "leap-year" - ], - "contributors": [], - "code": "const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n\n// Usage:\nisLeapYear(2024); // Returns: true\nisLeapYear(2023); // Returns: false\n" - }, - { - "title": "Convert to Unix Timestamp", - "description": "Converts a date to a Unix timestamp in seconds.", - "author": "Yugveer06", - "tags": [ - "date", - "unix", - "timestamp" - ], - "contributors": [], - "code": "function convertToUnixSeconds(input) {\n if (typeof input === 'string') {\n if (!input.trim()) {\n throw new Error('Date string cannot be empty or whitespace');\n }\n } else if (!input) {\n throw new Error('Input is required');\n }\n\n let date;\n\n if (typeof input === 'string') {\n date = new Date(input);\n } else if (input instanceof Date) {\n date = input;\n } else {\n throw new Error('Input must be a valid date string or Date object');\n }\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid date provided');\n }\n\n return Math.floor(date.getTime() / 1000);\n}\n\n// Usage:\nconvertToUnixSeconds('2025-01-01T12:00:00Z'); // Returns: 1735732800\nconvertToUnixSeconds(new Date('2025-01-01T12:00:00Z')); // Returns: 1735732800\nconvertToUnixSeconds(new Date()); // Returns: Current Unix timestamp in seconds\n" - }, - { - "title": "Format Date", - "description": "Formats a date in 'YYYY-MM-DD' format.", - "author": "dostonnabotov", - "tags": [ - "date", - "format" - ], - "contributors": [], - "code": "const formatDate = (date) => date.toISOString().split('T')[0];\n\n// Usage:\nformatDate(new Date(2024, 11, 10)); // Returns: '2024-12-10'\n" - }, - { - "title": "Get Day of the Year", - "description": "Calculates the day of the year (1-365 or 1-366 for leap years) for a given date.", - "author": "axorax", - "tags": [ - "date", - "day-of-year" - ], - "contributors": [], - "code": "const getDayOfYear = (date) => {\n const startOfYear = new Date(date.getFullYear(), 0, 0);\n const diff = date - startOfYear + (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000;\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\ngetDayOfYear(new Date('2024-12-31')) // Returns: 366 (Leap year)\n" - }, - { - "title": "Get Days in Month", - "description": "Calculates the number of days in a specific month of a given year.", - "author": "axorax", - "tags": [ - "date", - "days-in-month" - ], - "contributors": [], - "code": "const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();\n\n// Usage:\ngetDaysInMonth(2024, 1); // Returns: 29 (February in a leap year)\ngetDaysInMonth(2023, 1); // Returns: 28\n" - }, - { - "title": "Get Time Difference", - "description": "Calculates the time difference in days between two dates.", - "author": "dostonnabotov", - "tags": [ - "date", - "time-difference" - ], - "contributors": [], - "code": "const getTimeDifference = (date1, date2) => {\n const diff = Math.abs(date2 - date1);\n return Math.ceil(diff / (1000 * 60 * 60 * 24));\n};\n\n// Usage:\nconst date1 = new Date('2024-01-01');\nconst date2 = new Date('2024-12-31');\ngetTimeDifference(date1, date2); // Returns: 365\n" - }, - { - "title": "Relative Time Formatter", - "description": "Displays how long ago a date occurred or how far in the future a date is.", - "author": "Yugveer06", - "tags": [ - "date", - "time", - "relative", - "future", - "past" - ], - "contributors": [], - "code": "const getRelativeTime = (date) => {\n const now = Date.now();\n const diff = date.getTime() - now;\n const seconds = Math.abs(Math.floor(diff / 1000));\n const minutes = Math.abs(Math.floor(seconds / 60));\n const hours = Math.abs(Math.floor(minutes / 60));\n const days = Math.abs(Math.floor(hours / 24));\n const years = Math.abs(Math.floor(days / 365));\n\n if (Math.abs(diff) < 1000) return 'just now';\n\n const isFuture = diff > 0;\n\n if (years > 0) return `${isFuture ? 'in ' : ''}${years} ${years === 1 ? 'year' : 'years'}${isFuture ? '' : ' ago'}`;\n if (days > 0) return `${isFuture ? 'in ' : ''}${days} ${days === 1 ? 'day' : 'days'}${isFuture ? '' : ' ago'}`;\n if (hours > 0) return `${isFuture ? 'in ' : ''}${hours} ${hours === 1 ? 'hour' : 'hours'}${isFuture ? '' : ' ago'}`;\n if (minutes > 0) return `${isFuture ? 'in ' : ''}${minutes} ${minutes === 1 ? 'minute' : 'minutes'}${isFuture ? '' : ' ago'}`;\n\n return `${isFuture ? 'in ' : ''}${seconds} ${seconds === 1 ? 'second' : 'seconds'}${isFuture ? '' : ' ago'}`;\n}\n\n// Usage:\nconst pastDate = new Date('2021-12-29 13:00:00');\nconst futureDate = new Date('2099-12-29 13:00:00');\ngetRelativeTime(pastDate); // x years ago\ngetRelativeTime(new Date()); // just now\ngetRelativeTime(futureDate); // in x years\n" - }, - { - "title": "Start of the Day", - "description": "Returns the start of the day (midnight) for a given date.", - "author": "axorax", - "tags": [ - "date", - "start-of-day" - ], - "contributors": [], - "code": "const startOfDay = (date) => new Date(date.setHours(0, 0, 0, 0));\n\n// Usage:\nconst today = new Date();\nstartOfDay(today); // Returns: Date object for midnight\n" - } - ] - }, - { - "categoryName": "Dom Manipulation", - "snippets": [ - { - "title": "Change Element Style", - "description": "Changes the inline style of an element.", - "author": "axorax", - "tags": [ - "dom", - "style" - ], - "contributors": [], - "code": "const changeElementStyle = (element, styleObj) => {\n Object.entries(styleObj).forEach(([property, value]) => {\n element.style[property] = value;\n });\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nchangeElementStyle(element, { color: 'red', backgroundColor: 'yellow' });\n" - }, - { - "title": "Remove Element", - "description": "Removes a specified element from the DOM.", - "author": "axorax", - "tags": [ - "dom", - "remove" - ], - "contributors": [], - "code": "const removeElement = (element) => {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n};\n\n// Usage:\nconst element = document.querySelector('.my-element');\nremoveElement(element);\n" - } - ] - }, - { - "categoryName": "Function Utilities", - "snippets": [ - { - "title": "Compose Functions", - "description": "Composes multiple functions into a single function, where the output of one function becomes the input of the next.", - "author": "axorax", - "tags": [ - "function", - "compose" - ], - "contributors": [], - "code": "const compose = (...funcs) => (initialValue) => {\n return funcs.reduce((acc, func) => func(acc), initialValue);\n};\n\n// Usage:\nconst add2 = (x) => x + 2;\nconst multiply3 = (x) => x * 3;\nconst composed = compose(multiply3, add2);\ncomposed(5); // Returns: 17 ((5 * 3) + 2)\n" - }, - { - "title": "Curry Function", - "description": "Transforms a function into its curried form.", - "author": "axorax", - "tags": [ - "curry", - "function" - ], - "contributors": [], - "code": "const curry = (func) => {\n const curried = (...args) => {\n if (args.length >= func.length) {\n return func(...args);\n }\n return (...nextArgs) => curried(...args, ...nextArgs);\n };\n return curried;\n};\n\n// Usage:\nconst add = (a, b, c) => a + b + c;\nconst curriedAdd = curry(add);\ncurriedAdd(1)(2)(3); // Returns: 6\ncurriedAdd(1, 2)(3); // Returns: 6\n" - }, - { - "title": "Debounce Function", - "description": "Delays a function execution until after a specified time.", - "author": "dostonnabotov", - "tags": [ - "debounce", - "performance" - ], - "contributors": [], - "code": "const debounce = (func, delay) => {\n let timeout;\n\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), delay);\n };\n};\n\n// Usage:\nwindow.addEventListener(\n 'resize',\n debounce(() => console.log('Resized!'), 500), // Will only output after resizing has stopped for 500ms\n);\n" - }, - { - "title": "Get Contrast Color", - "description": "Returns either black or white text color based on the brightness of the provided hex color.", - "author": "yaya12085", - "tags": [ - "color", - "hex", - "contrast", - "brightness" - ], - "contributors": [], - "code": "const getContrastColor = (hexColor) => {\n // Expand short hex color to full format\n if (hexColor.length === 4) {\n hexColor = `#${hexColor[1]}${hexColor[1]}${hexColor[2]}${hexColor[2]}${hexColor[3]}${hexColor[3]}`;\n }\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness >= 128 ? \"#000000\" : \"#FFFFFF\";\n};\n\n// Usage:\ngetContrastColor('#fff'); // Returns: #000000 (black)\ngetContrastColor('#123456'); // Returns: #FFFFFF (white)\ngetContrastColor('#ff6347'); // Returns: #000000 (black)\ngetContrastColor('#f4f'); // Returns: #000000 (black)\n" - }, - { - "title": "Memoize Function", - "description": "Caches the result of a function based on its arguments to improve performance.", - "author": "axorax", - "tags": [ - "memoization", - "optimization" - ], - "contributors": [], - "code": "const memoize = (func) => {\n const cache = new Map();\n return (...args) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n};\n\n// Usage:\nconst factorial = memoize((n) => (n <= 1 ? 1 : n * factorial(n - 1)));\nfactorial(5); // Returns: 120\nfactorial(5); // Returns: 120 (retrieved from cache)\n" - }, - { - "title": "Once Function", - "description": "Ensures a function is only called once.", - "author": "axorax", - "tags": [ - "function", - "once" - ], - "contributors": [], - "code": "const once = (func) => {\n let called = false;\n return (...args) => {\n if (!called) {\n called = true;\n return func(...args);\n }\n };\n};\n\n// Usage:\nconst initialize = once(() => console.log('Initialized!'));\ninitialize(); // Output: Initialized!\ninitialize(); // No output\n" - }, - { - "title": "Rate Limit Function", - "description": "Limits how often a function can be executed within a given time window.", - "author": "axorax", - "tags": [ - "function", - "rate-limiting" - ], - "contributors": [], - "code": "const rateLimit = (func, limit, timeWindow) => {\n let queue = [];\n setInterval(() => {\n if (queue.length) {\n const next = queue.shift();\n func(...next.args);\n }\n }, timeWindow);\n return (...args) => {\n if (queue.length < limit) {\n queue.push({ args });\n }\n };\n};\n\n// Usage:\nconst fetchData = () => console.log('Fetching data...');\nconst rateLimitedFetch = rateLimit(fetchData, 2, 1000);\nsetInterval(() => rateLimitedFetch(), 200); // Limits fetchData calls to twice a seconds\n" - }, - { - "title": "Repeat Function Invocation", - "description": "Invokes a function a specified number of times.", - "author": "dostonnabotov", - "tags": [ - "function", - "repeat" - ], - "contributors": [], - "code": "const times = (func, n) => {\n Array.from(Array(n)).forEach(() => {\n func();\n });\n};\n\n// Usage:\nconst randomFunction = () => console.log('Function called!');\ntimes(randomFunction, 3); // Logs 'Function called!' three times\n" - }, - { - "title": "Sleep Function", - "description": "Waits for a specified amount of milliseconds before resolving.", - "author": "0xHouss", - "tags": [ - "javascript", - "sleep", - "delay", - "utility", - "promises" - ], - "contributors": [], - "code": "const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// Usage:\nconsole.log('Hello');\nawait sleep(2000); // Waits for 2 seconds\nconsole.log('World!');\n" - } - ] - }, - { - "categoryName": "Local Storage", - "snippets": [ - { - "title": "Add Item to localStorage", - "description": "Stores a value in localStorage under the given key.", - "author": "dostonnabotov", - "tags": [ - "localStorage", - "storage" - ], - "contributors": [], - "code": "const addToLocalStorage = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\n\n// Usage:\naddToLocalStorage('user', { name: 'John', age: 30 });\n" - }, - { - "title": "Check if Item Exists in localStorage", - "description": "Checks if a specific item exists in localStorage.", - "author": "axorax", - "tags": [ - "localStorage", - "storage" - ], - "contributors": [], - "code": "const isItemInLocalStorage = (key) => {\n return localStorage.getItem(key) !== null;\n};\n\n// Usage:\nconsole.log(isItemInLocalStorage('user')); // Output: true or false\n" - }, - { - "title": "Retrieve Item from localStorage", - "description": "Retrieves a value from localStorage by key and parses it.", - "author": "dostonnabotov", - "tags": [ - "localStorage", - "storage" - ], - "contributors": [], - "code": "const getFromLocalStorage = (key) => {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : null;\n};\n\n// Usage:\ngetFromLocalStorage('user'); // Returns: { name: 'John', age: 30 }\n" - } - ] - }, - { - "categoryName": "Number Formatting", - "snippets": [ - { - "title": "Convert Number to Currency", - "description": "Converts a number to a currency format with a specific locale.", - "author": "axorax", - "tags": [ - "number", - "currency" - ], - "contributors": [], - "code": "const convertToCurrency = (num, locale = 'en-US', currency = 'USD') => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency\n }).format(num);\n};\n\n// Usage:\nconvertToCurrency(1234567.89); // Returns: '$1,234,567.89'\nconvertToCurrency(987654.32, 'de-DE', 'EUR'); // Returns: '987.654,32 €'\n" - }, - { - "title": "Convert Number to Roman Numerals", - "description": "Converts a number to Roman numeral representation.", - "author": "axorax", - "tags": [ - "number", - "roman" - ], - "contributors": [], - "code": "const numberToRoman = (num) => {\n const romanNumerals = {\n 1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L',\n 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'\n };\n let result = '';\n Object.keys(romanNumerals).reverse().forEach(value => {\n while (num >= value) {\n result += romanNumerals[value];\n num -= value;\n }\n });\n return result;\n};\n\n// Usage:\nnumberToRoman(1994); // Returns: 'MCMXCIV'\nnumberToRoman(58); // Returns: 'LVIII'\n" - }, - { - "title": "Convert to Scientific Notation", - "description": "Converts a number to scientific notation.", - "author": "axorax", - "tags": [ - "number", - "scientific" - ], - "contributors": [], - "code": "const toScientificNotation = (num) => {\n if (isNaN(num)) {\n throw new Error('Input must be a number');\n }\n if (num === 0) {\n return '0e+0';\n }\n const exponent = Math.floor(Math.log10(Math.abs(num)));\n const mantissa = num / Math.pow(10, exponent);\n return `${mantissa.toFixed(2)}e${exponent >= 0 ? '+' : ''}${exponent}`;\n};\n\n// Usage:\ntoScientificNotation(12345); // Returns: '1.23e+4'\ntoScientificNotation(0.0005678); // Returns: '5.68e-4'\ntoScientificNotation(1000); // Returns: '1.00e+3'\ntoScientificNotation(0); // Returns: '0e+0'\ntoScientificNotation(-54321); // Returns: '-5.43e+4'\n" - }, - { - "title": "Format File Size", - "description": "Converts bytes into human-readable file size format.", - "author": "jjcantu", - "tags": [ - "format", - "size" - ], - "contributors": [], - "code": "function formatFileSize(bytes) {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n// Usage:\nconsole.log(formatFileSize(1234)); // Output: \"1.21 KB\"\nconsole.log(formatFileSize(1234567)); // Output: \"1.18 MB\"\n" - }, - { - "title": "Format Number with Commas", - "description": "Formats a number with commas for better readability (e.g., 1000 -> 1,000).", - "author": "axorax", - "tags": [ - "number", - "format" - ], - "contributors": [], - "code": "const formatNumberWithCommas = (num) => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// Usage:\nformatNumberWithCommas(1000); // Returns: '1,000'\nformatNumberWithCommas(1234567); // Returns: '1,234,567'\nformatNumberWithCommas(987654321); // Returns: '987,654,321'\n" - }, - { - "title": "Number Formatter", - "description": "Formats a number with suffixes (K, M, B, etc.).", - "author": "realvishalrana", - "tags": [ - "number", - "format" - ], - "contributors": [], - "code": "const nFormatter = (num) => {\n if (!num) return;\n num = parseFloat(num.toString().replace(/[^0-9.]/g, ''));\n const suffixes = ['', 'K', 'M', 'B', 'T', 'P', 'E'];\n let index = 0;\n while (num >= 1000 && index < suffixes.length - 1) {\n num /= 1000;\n index++;\n }\n return num.toFixed(2).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + suffixes[index];\n};\n\n// Usage:\nnFormatter(1234567); // Returns: '1.23M'\n" - }, - { - "title": "Number to Words Converter", - "description": "Converts a number to its word representation in English.", - "author": "axorax", - "tags": [ - "number", - "words" - ], - "contributors": [], - "code": "const numberToWords = (num) => {\n const below20 = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n const above1000 = ['Hundred', 'Thousand', 'Million', 'Billion'];\n if (num < 20) return below20[num];\n let words = '';\n for (let i = 0; num > 0; i++) {\n if (i > 0 && num % 1000 !== 0) words = above1000[i] + ' ' + words;\n if (num % 100 >= 20) {\n words = tens[Math.floor(num / 10)] + ' ' + words;\n num %= 10;\n }\n if (num < 20) words = below20[num] + ' ' + words;\n num = Math.floor(num / 100);\n }\n return words.trim();\n};\n\n// Usage:\nnumberToWords(123); // Returns: 'One Hundred Twenty Three'\nnumberToWords(2045); // Returns: 'Two Thousand Forty Five'\n" - } - ] - }, - { - "categoryName": "Object Manipulation", - "snippets": [ - { - "title": "Check if Object is Empty", - "description": "Checks whether an object has no own enumerable properties.", - "author": "axorax", - "tags": [ - "object", - "check", - "empty" - ], - "contributors": [], - "code": "function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// Usage:\nisEmptyObject({}); // Returns: true\nisEmptyObject({ a: 1 }); // Returns: false\n" - }, - { - "title": "Compare Two Objects Shallowly", - "description": "Compares two objects shallowly and returns whether they are equal.", - "author": "axorax", - "tags": [ - "object", - "compare", - "shallow" - ], - "contributors": [], - "code": "function shallowEqual(obj1, obj2) {\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n return keys1.every(key => obj1[key] === obj2[key]);\n}\n\n// Usage:\nconst obj1 = { a: 1, b: 2 };\nconst obj2 = { a: 1, b: 2 };\nconst obj3 = { a: 1, b: 3 };\nshallowEqual(obj1, obj2); // Returns: true\nshallowEqual(obj1, obj3); // Returns: false\n" - }, - { - "title": "Convert Object to Query String", - "description": "Converts an object to a query string for use in URLs.", - "author": "axorax", - "tags": [ - "object", - "query string", - "url" - ], - "contributors": [], - "code": "function toQueryString(obj) {\n return Object.entries(obj)\n .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))\n .join('&');\n}\n\n// Usage:\nconst params = { search: 'test', page: 1 };\ntoQueryString(params); // Returns: 'search=test&page=1'\n" - }, - { - "title": "Count Properties in Object", - "description": "Counts the number of own properties in an object.", - "author": "axorax", - "tags": [ - "object", - "count", - "properties" - ], - "contributors": [], - "code": "function countProperties(obj) {\n return Object.keys(obj).length;\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ncountProperties(obj); // Returns: 3\n" - }, - { - "title": "Deep Clone Object", - "description": "Creates a deep copy of an object or array without reference.", - "author": "jjcantu", - "tags": [ - "object", - "clone" - ], - "contributors": [], - "code": "function deepClone(obj) {\n if (obj === null || typeof obj !== 'object') return obj;\n \n const clone = Array.isArray(obj) ? [] : {};\n \n for (let key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clone[key] = deepClone(obj[key]);\n }\n }\n \n return clone;\n}\n\n// Usage:\nconst original = { a: 1, b: { c: 2 }, d: [1, 2, 3] };\nconst cloned = deepClone(original);\nconsole.log(cloned); // Output: 'original' but cloned\n" - }, - { - "title": "Filter Object", - "description": "Filter out entries in an object where the value is falsy, including empty strings, empty objects, null, and undefined.", - "author": "realvishalrana", - "tags": [ - "object", - "filter" - ], - "contributors": [], - "code": "export const filterObject = (object = {}) =>\n Object.fromEntries(\n Object.entries(object)\n .filter(([key, value]) => value !== null && value !== undefined && value !== '' && (typeof value !== 'object' || Object.keys(value).length > 0))\n );\n\n// Usage:\nconst obj1 = { a: 1, b: null, c: undefined, d: 4, e: '', f: {} };\nfilterObject(obj1); // Returns: { a: 1, d: 4 }\n\nconst obj2 = { x: 0, y: false, z: 'Hello', w: [] };\nfilterObject(obj2); // Returns: { z: 'Hello' }\n\nconst obj3 = { name: 'John', age: null, address: { city: 'New York' }, phone: '' };\nfilterObject(obj3); // Returns: { name: 'John', address: { city: 'New York' } }\n\nconst obj4 = { a: 0, b: '', c: false, d: {}, e: 'Valid' };\nfilterObject(obj4); // Returns: { e: 'Valid' }\n" - }, - { - "title": "Flatten Nested Object", - "description": "Flattens a nested object into a single-level object with dot notation for keys.", - "author": "axorax", - "tags": [ - "object", - "flatten" - ], - "contributors": [], - "code": "function flattenObject(obj, prefix = '') {\n return Object.keys(obj).reduce((acc, key) => {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n Object.assign(acc, flattenObject(obj[key], fullPath));\n } else {\n acc[fullPath] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// Usage:\nconst nestedObj = { a: { b: { c: 1 }, d: 2 }, e: 3 };\nflattenObject(nestedObj); // Returns: { 'a.b.c': 1, 'a.d': 2, e: 3 }\n" - }, - { - "title": "Freeze Object", - "description": "Freezes an object to make it immutable.", - "author": "axorax", - "tags": [ - "object", - "freeze", - "immutable" - ], - "contributors": [], - "code": "function freezeObject(obj) {\n return Object.freeze(obj);\n}\n\n// Usage:\nconst obj = { a: 1, b: 2 };\nconst frozenObj = freezeObject(obj);\nfrozenObj.a = 42; // This will fail silently in strict mode.\nfrozenObj.a; // Returns: 1\n" - }, - { - "title": "Get Nested Value", - "description": "Retrieves the value at a given path in a nested object.", - "author": "realvishalrana", - "tags": [ - "object", - "nested" - ], - "contributors": [], - "code": "const getNestedValue = (obj, path) => {\n const keys = path.split('.');\n return keys.reduce((currentObject, key) => {\n return currentObject && typeof currentObject === 'object' ? currentObject[key] : undefined;\n }, obj);\n};\n\n// Usage:\nconst obj = { a: { b: { c: 42 } } };\ngetNestedValue(obj, 'a.b.c'); // Returns: 42\n" - }, - { - "title": "Invert Object Keys and Values", - "description": "Creates a new object by swapping keys and values of the given object.", - "author": "axorax", - "tags": [ - "object", - "invert" - ], - "contributors": [], - "code": "function invertObject(obj) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [value, key])\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\ninvertObject(obj); // Returns: { '1': 'a', '2': 'b', '3': 'c' }\n" - }, - { - "title": "Merge Objects Deeply", - "description": "Deeply merges two or more objects, including nested properties.", - "author": "axorax", - "tags": [ - "object", - "merge", - "deep" - ], - "contributors": [], - "code": "function deepMerge(...objects) {\n return objects.reduce((acc, obj) => {\n Object.keys(obj).forEach(key => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n acc[key] = deepMerge(acc[key] || {}, obj[key]);\n } else {\n acc[key] = obj[key];\n }\n });\n return acc;\n }, {});\n}\n\n// Usage:\nconst obj1 = { a: 1, b: { c: 2 } };\nconst obj2 = { b: { d: 3 }, e: 4 };\ndeepMerge(obj1, obj2); // Returns: { a: 1, b: { c: 2, d: 3 }, e: 4 }\n" - }, - { - "title": "Omit Keys from Object", - "description": "Creates a new object with specific keys omitted.", - "author": "axorax", - "tags": [ - "object", - "omit" - ], - "contributors": [], - "code": "function omitKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => !keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\nomitKeys(obj, ['b', 'c']); // Returns: { a: 1 }\n" - }, - { - "title": "Pick Keys from Object", - "description": "Creates a new object with only the specified keys.", - "author": "axorax", - "tags": [ - "object", - "pick" - ], - "contributors": [], - "code": "function pickKeys(obj, keys) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => keys.includes(key))\n );\n}\n\n// Usage:\nconst obj = { a: 1, b: 2, c: 3 };\npickKeys(obj, ['a', 'c']); // Returns: { a: 1, c: 3 }\n" - }, - { - "title": "Unique By Key", - "description": "Filters an array of objects to only include unique objects by a specified key.", - "author": "realvishalrana", - "tags": [ - "array", - "unique" - ], - "contributors": [], - "code": "const uniqueByKey = (key, arr) =>\n arr.filter((obj, index, self) => index === self.findIndex((t) => t?.[key] === obj?.[key]));\n\n// Usage:\nconst arr = [\n { id: 1, name: 'John' },\n { id: 2, name: 'Jane' },\n { id: 1, name: 'John' }\n];\nuniqueByKey('id', arr); // Returns: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\n" - } - ] - }, - { - "categoryName": "String Manipulation", - "snippets": [ - { - "title": "Capitalize String", - "description": "Capitalizes the first letter of a string.", - "author": "dostonnabotov", - "tags": [ - "string", - "capitalize" - ], - "contributors": [], - "code": "function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// Usage:\ncapitalize('hello'); // Returns: 'Hello'\n" - }, - { - "title": "Check if String is a Palindrome", - "description": "Checks whether a given string is a palindrome.", - "author": "axorax", - "tags": [ - "check", - "palindrome", - "string" - ], - "contributors": [], - "code": "function isPalindrome(str) {\n const cleanStr = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n return cleanStr === cleanStr.split('').reverse().join('');\n}\n\n// Example usage:\nisPalindrome('A man, a plan, a canal, Panama'); // Returns: true\n" - }, - { - "title": "Convert String to Camel Case", - "description": "Converts a given string into camelCase.", - "author": "aumirza", - "tags": [ - "string", - "case", - "camelCase" - ], - "contributors": [], - "code": "function toCamelCase(str) {\n return str.replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoCamelCase('hello world test'); // Returns: 'helloWorldTest'\n" - }, - { - "title": "Convert String to Param Case", - "description": "Converts a given string into param-case.", - "author": "aumirza", - "tags": [ - "string", - "case", - "paramCase" - ], - "contributors": [], - "code": "function toParamCase(str) {\n return str.toLowerCase().replace(/\\s+/g, '-');\n}\n\n// Usage:\ntoParamCase('Hello World Test'); // Returns: 'hello-world-test'\n" - }, - { - "title": "Convert String to Pascal Case", - "description": "Converts a given string into Pascal Case.", - "author": "aumirza", - "tags": [ - "string", - "case", - "pascalCase" - ], - "contributors": [], - "code": "function toPascalCase(str) {\n return str.replace(/\\b\\w/g, (s) => s.toUpperCase()).replace(/\\W+(.)/g, (match, chr) => chr.toUpperCase());\n}\n\n// Usage:\ntoPascalCase('hello world test'); // Returns: 'HelloWorldTest'\n" - }, - { - "title": "Convert String to Snake Case", - "description": "Converts a given string into snake_case.", - "author": "axorax", - "tags": [ - "string", - "case", - "snake_case" - ], - "contributors": [], - "code": "function toSnakeCase(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/\\s+/g, '_')\n .toLowerCase();\n}\n\n// Usage:\ntoSnakeCase('Hello World Test'); // Returns: 'hello_world_test'\n" - }, - { - "title": "Convert String to Title Case", - "description": "Converts a given string into Title Case.", - "author": "aumirza", - "tags": [ - "string", - "case", - "titleCase" - ], - "contributors": [], - "code": "function toTitleCase(str) {\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// Usage:\ntoTitleCase('hello world test'); // Returns: 'Hello World Test'\n" - }, - { - "title": "Convert Tabs to Spaces", - "description": "Converts all tab characters in a string to spaces.", - "author": "axorax", - "tags": [ - "string", - "tabs", - "spaces" - ], - "contributors": [], - "code": "function tabsToSpaces(str, spacesPerTab = 4) {\n return str.replace(/\\t/g, ' '.repeat(spacesPerTab));\n}\n\n// Usage:\ntabsToSpaces('Hello\\tWorld', 2); // Returns: 'Hello World'\n" - }, - { - "title": "Count Words in a String", - "description": "Counts the number of words in a string.", - "author": "axorax", - "tags": [ - "string", - "manipulation", - "word count", - "count" - ], - "contributors": [], - "code": "function countWords(str) {\n return str.trim().split(/\\s+/).length;\n}\n\n// Usage:\ncountWords('Hello world! This is a test.'); // Returns: 6\n" - }, - { - "title": "Data with Prefix", - "description": "Adds a prefix and postfix to data, with a fallback value.", - "author": "realvishalrana", - "tags": [ - "data", - "prefix", - "postfix", - "format" - ], - "contributors": [], - "code": "const dataWithPrefix = (data, fallback = '-', prefix = '', postfix = '') => {\n return data ? `${prefix}${data}${postfix}` : fallback;\n};\n\n// Usage:\ndataWithPrefix('123', '-', '(', ')'); // Returns: '(123)'\ndataWithPrefix('', '-', '(', ')'); // Returns: '-'\ndataWithPrefix('Hello', 'N/A', 'Mr. ', ''); // Returns: 'Mr. Hello'\ndataWithPrefix(null, 'N/A', 'Mr. ', ''); // Returns: 'N/A'\n" - }, - { - "title": "Extract Initials from Name", - "description": "Extracts and returns the initials from a full name.", - "author": "axorax", - "tags": [ - "string", - "initials", - "name" - ], - "contributors": [], - "code": "function getInitials(name) {\n return name.split(' ').map(part => part.charAt(0).toUpperCase()).join('');\n}\n\n// Usage:\ngetInitials('John Doe'); // Returns: 'JD'\n" - }, - { - "title": "Generate UUID", - "description": "Generates a UUID (v4) string.", - "author": "jjcantu", - "tags": [ - "uuid", - "generate", - "string" - ], - "contributors": [], - "code": "function generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\n// Usage:\nconsole.log(generateUUID()); // Output: \"a1b2c3d4-e5f6-4g7h-8i9j-k0l1m2n3o4p5\"\n" - }, - { - "title": "Mask Sensitive Information", - "description": "Masks parts of a sensitive string, like a credit card or email address.", - "author": "axorax", - "tags": [ - "string", - "mask", - "sensitive" - ], - "contributors": [], - "code": "function maskSensitiveInfo(str, visibleCount = 4, maskChar = '*') {\n return str.slice(0, visibleCount) + maskChar.repeat(Math.max(0, str.length - visibleCount));\n}\n\n// Usage:\nmaskSensitiveInfo('123456789', 4); // Returns: '1234*****'\nmaskSensitiveInfo('example@mail.com', 2, '#'); // Returns: 'ex#############'\n" - }, - { - "title": "Pad String on Both Sides", - "description": "Pads a string on both sides with a specified character until it reaches the desired length.", - "author": "axorax", - "tags": [ - "string", - "pad", - "manipulation" - ], - "contributors": [], - "code": "function padString(str, length, char = ' ') {\n const totalPad = length - str.length;\n const padStart = Math.floor(totalPad / 2);\n const padEnd = totalPad - padStart;\n return char.repeat(padStart) + str + char.repeat(padEnd);\n}\n\n// Usage:\npadString('hello', 10, '*'); // Returns: '**hello***'\n" - }, - { - "title": "Random string", - "description": "Generates a random string of characters of a certain length", - "author": "kruimol", - "tags": [ - "function", - "random" - ], - "contributors": [], - "code": "function makeid(length, characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {\n return Array.from({ length }, () => characters.charAt(Math.floor(Math.random() * characters.length))).join('');\n}\n\nmakeid(3); // Returns: gDs (Random)\nmakeid(5, \"1234\" /* (optional) */); // Returns: \"35453\" (Random)\n" - }, - { - "title": "Remove All Whitespace", - "description": "Removes all whitespace from a string.", - "author": "axorax", - "tags": [ - "string", - "whitespace" - ], - "contributors": [], - "code": "function removeWhitespace(str) {\n return str.replace(/\\s+/g, '');\n}\n\n// Usage:\nremoveWhitespace('Hello world!'); // Returns: 'Helloworld!'\n" - }, - { - "title": "Remove Vowels from a String", - "description": "Removes all vowels from a given string.", - "author": "axorax", - "tags": [ - "string", - "remove", - "vowels" - ], - "contributors": [], - "code": "function removeVowels(str) {\n return str.replace(/[aeiouAEIOU]/g, '');\n}\n\n// Usage:\nremoveVowels('Hello World'); // Returns: 'Hll Wrld'\n" - }, - { - "title": "Reverse String", - "description": "Reverses the characters in a string.", - "author": "dostonnabotov", - "tags": [ - "string", - "reverse" - ], - "contributors": [], - "code": "const reverseString = (str) => str.split('').reverse().join('');\n\n// Usage:\nreverseString('hello'); // Returns: 'olleh'\n" - }, - { - "title": "Slugify String", - "description": "Converts a string into a URL-friendly slug format.", - "author": "dostonnabotov", - "tags": [ - "string", - "slug" - ], - "contributors": [], - "code": "const slugify = (string, separator = \"-\") => {\n return string\n .toString() // Cast to string (optional)\n .toLowerCase() // Convert the string to lowercase letters\n .trim() // Remove whitespace from both sides of a string (optional)\n .replace(/\\s+/g, separator) // Replace spaces with {separator}\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\n .replace(/\\_/g, separator) // Replace _ with {separator}\n .replace(/\\-\\-+/g, separator) // Replace multiple - with single {separator}\n .replace(/\\-$/g, \"\"); // Remove trailing -\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\nslugify(title); // Returns: 'hello-world-this-is-a-test'\nslugify(title, \"_\"); // Returns: 'hello_world_this_is_a_test'\n" - }, - { - "title": "Truncate Text", - "description": "Truncates the text to a maximum length and appends '...' if the text exceeds the maximum length.", - "author": "realvishalrana", - "tags": [ - "string", - "truncate", - "text" - ], - "contributors": [], - "code": "const truncateText = (text = '', maxLength = 50) => {\n return `${text.slice(0, maxLength)}${text.length >= maxLength ? '...' : ''}`;\n};\n\n// Usage:\nconst title = \"Hello, World! This is a Test.\";\ntruncateText(title); // Returns: 'Hello, World! This is a Test.'\ntruncateText(title, 10); // Returns: 'Hello, Wor...'\n" - } - ] - } -] \ No newline at end of file From 068c8314792352308f09e1fa09f66ab78de4f3e5 Mon Sep 17 00:00:00 2001 From: Neil Murphy Date: Fri, 10 Jan 2025 22:14:34 +0000 Subject: [PATCH 13/13] replace Array<> generic type with the shorthand [] --- utils/snippetParser.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/utils/snippetParser.ts b/utils/snippetParser.ts index 8f4bca71..c64f2988 100644 --- a/utils/snippetParser.ts +++ b/utils/snippetParser.ts @@ -9,16 +9,16 @@ import { reverseSlugify, slugify } from "../src/utils/slugify"; interface ParseLanguageResponse { name: string; icon: string; - categories: Array<{ + categories: { name: string; - snippets: Array; - }>; + snippets: SnippetType[]; + }[]; subLanguages: ParseLanguageResponse[]; } interface ParseCategoryResponse { name: string; - snippets: Array; + snippets: SnippetType[]; } const propertyRegex = /^\s+([a-zA-Z]+):\s*(.+)/; @@ -136,8 +136,8 @@ function parseLanguage( ); } - const subLanguages: Array = []; - const categories: Array = []; + const subLanguages: ParseLanguageResponse[] = []; + const categories: ParseCategoryResponse[] = []; for (const category of readdirSync(path)) { if (category === "icon.svg") continue;