diff --git a/public/open-source-projects/issues/bdk/index.json b/public/open-source-projects/issues/bdk/index.json index cdb09c05..126f2a65 100644 --- a/public/open-source-projects/issues/bdk/index.json +++ b/public/open-source-projects/issues/bdk/index.json @@ -46,5 +46,14 @@ "bug" ], "imageUrl": "https://avatars.githubusercontent.com/u/62867074?v=4" + }, + { + "url": "https://github.com/bitcoindevkit/bdk/issues/2088", + "publishedAt": "2026-01-03T21:39:04Z", + "title": "`CanonicalReason::Assumed` should map to `ChainPosition::Confirmed` if a direct anchor exists", + "labels": [ + "bug" + ], + "imageUrl": "https://avatars.githubusercontent.com/u/62867074?v=4" } ] \ No newline at end of file diff --git a/public/open-source-projects/issues/bitcoin/index.json b/public/open-source-projects/issues/bitcoin/index.json index 92edc309..3fb37c22 100644 --- a/public/open-source-projects/issues/bitcoin/index.json +++ b/public/open-source-projects/issues/bitcoin/index.json @@ -264,16 +264,6 @@ ], "imageUrl": "https://avatars.githubusercontent.com/u/528860?v=4" }, - { - "url": "https://github.com/bitcoin/bitcoin/issues/28179", - "publishedAt": "2023-07-28T10:56:14Z", - "title": "test: 999 of 999 multisig", - "labels": [ - "Tests", - "good first issue" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/528860?v=4" - }, { "url": "https://github.com/bitcoin/bitcoin/issues/28648", "publishedAt": "2023-10-13T10:24:00Z", @@ -339,7 +329,7 @@ { "url": "https://github.com/bitcoin/bitcoin/issues/33128", "publishedAt": "2025-08-02T15:22:03Z", - "title": "OpenBSD, NetBSD: `-reindex` is broken", + "title": "*BSD, OmniOS: `-reindex` is broken", "labels": [ "Bug", "Block storage" @@ -368,12 +358,11 @@ "imageUrl": "https://avatars.githubusercontent.com/u/528860?v=4" }, { - "url": "https://github.com/bitcoin/bitcoin/issues/33615", - "publishedAt": "2025-10-13T17:23:46Z", - "title": "ASAN use-after-free in `m_reconnections`", + "url": "https://github.com/bitcoin/bitcoin/issues/34086", + "publishedAt": "2025-12-17T04:16:29Z", + "title": "doc: Use multi-path descriptors in descriptors.md and linked tests.", "labels": [ - "Bug", - "P2P" + "good first issue" ], "imageUrl": "https://avatars.githubusercontent.com/u/528860?v=4" } diff --git a/public/open-source-projects/issues/btcpayserver/index.json b/public/open-source-projects/issues/btcpayserver/index.json index b60a9503..300995d0 100644 --- a/public/open-source-projects/issues/btcpayserver/index.json +++ b/public/open-source-projects/issues/btcpayserver/index.json @@ -44,15 +44,6 @@ ], "imageUrl": "https://avatars.githubusercontent.com/u/31132886?v=4" }, - { - "url": "https://github.com/btcpayserver/btcpayserver/issues/6653", - "publishedAt": "2025-04-05T16:45:11Z", - "title": "In Email Rules show \"Send the email to the buyer\" checkbox only if trigger supports it", - "labels": [ - "good first issue" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/31132886?v=4" - }, { "url": "https://github.com/btcpayserver/btcpayserver/issues/6667", "publishedAt": "2025-04-10T21:06:56Z", @@ -82,27 +73,5 @@ "good first issue" ], "imageUrl": "https://avatars.githubusercontent.com/u/31132886?v=4" - }, - { - "url": "https://github.com/btcpayserver/btcpayserver/issues/6772", - "publishedAt": "2025-06-06T21:12:26Z", - "title": "Don't show payment method selector if there's only a single payment method or in Bitcoin case Unified QR is selected", - "labels": [ - "Enhancement", - "UI / UX", - "good first issue", - "Checkout" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/31132886?v=4" - }, - { - "url": "https://github.com/btcpayserver/btcpayserver/issues/6991", - "publishedAt": "2025-11-12T09:51:32Z", - "title": "[Bug]: Don't display `Create a new wallet` on the wallet creation flow, if the server settings disable hot and watch only wallet creation", - "labels": [ - "good first issue", - "Wallet" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/31132886?v=4" } ] \ No newline at end of file diff --git a/public/open-source-projects/issues/fedimint/index.json b/public/open-source-projects/issues/fedimint/index.json index 70bd9a12..b801e17e 100644 --- a/public/open-source-projects/issues/fedimint/index.json +++ b/public/open-source-projects/issues/fedimint/index.json @@ -1,14 +1,4 @@ [ - { - "url": "https://github.com/fedimint/fedimint/issues/1344", - "publishedAt": "2023-01-16T17:35:13Z", - "title": "1-click deployments", - "labels": [ - "good first issue", - "deployment" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/84478549?v=4" - }, { "url": "https://github.com/fedimint/fedimint/issues/2190", "publishedAt": "2023-04-11T14:45:18Z", @@ -18,15 +8,6 @@ ], "imageUrl": "https://avatars.githubusercontent.com/u/84478549?v=4" }, - { - "url": "https://github.com/fedimint/fedimint/issues/2257", - "publishedAt": "2023-04-19T21:00:18Z", - "title": "Convert (most) logging statements to use pre-defined logging targets", - "labels": [ - "good first issue" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/84478549?v=4" - }, { "url": "https://github.com/fedimint/fedimint/issues/2836", "publishedAt": "2023-07-25T14:13:08Z", @@ -151,5 +132,15 @@ "bug" ], "imageUrl": "https://avatars.githubusercontent.com/u/84478549?v=4" + }, + { + "url": "https://github.com/fedimint/fedimint/issues/8101", + "publishedAt": "2025-12-20T17:50:33Z", + "title": "Investigate potential race condition in LNv1 reucrringd registration", + "labels": [ + "bug", + "client" + ], + "imageUrl": "https://avatars.githubusercontent.com/u/84478549?v=4" } ] \ No newline at end of file diff --git a/public/open-source-projects/issues/polar/index.json b/public/open-source-projects/issues/polar/index.json index 06c4e443..18991bc4 100644 --- a/public/open-source-projects/issues/polar/index.json +++ b/public/open-source-projects/issues/polar/index.json @@ -126,14 +126,5 @@ "bug" ], "imageUrl": "https://avatars.githubusercontent.com/u/1356600?u=332766210005f71b61f09f64ab2d6b9aad32f160&v=4" - }, - { - "url": "https://github.com/jamaljsr/polar/issues/1329", - "publishedAt": "2025-12-01T06:43:14Z", - "title": "Bug: 2 UNKNOWN: error funding channel", - "labels": [ - "bug" - ], - "imageUrl": "https://avatars.githubusercontent.com/u/1356600?u=332766210005f71b61f09f64ab2d6b9aad32f160&v=4" } ] \ No newline at end of file diff --git a/public/open-source-projects/issues/rustlightning/index.json b/public/open-source-projects/issues/rustlightning/index.json index c3aec2ed..8ba9ab67 100644 --- a/public/open-source-projects/issues/rustlightning/index.json +++ b/public/open-source-projects/issues/rustlightning/index.json @@ -119,5 +119,14 @@ "good first issue" ], "imageUrl": "https://avatars.githubusercontent.com/u/60484029?v=4" + }, + { + "url": "https://github.com/lightningdevkit/rust-lightning/issues/4292", + "publishedAt": "2025-12-22T02:05:35Z", + "title": "`Bolt11Invoice::payment_hash` should return a `PaymentHash`", + "labels": [ + "good first issue" + ], + "imageUrl": "https://avatars.githubusercontent.com/u/60484029?v=4" } ] \ No newline at end of file diff --git a/public/open-source-projects/issues/rustpayjoin/index.json b/public/open-source-projects/issues/rustpayjoin/index.json index 9236526c..d3b08385 100644 --- a/public/open-source-projects/issues/rustpayjoin/index.json +++ b/public/open-source-projects/issues/rustpayjoin/index.json @@ -73,12 +73,12 @@ "imageUrl": "https://avatars.githubusercontent.com/u/125623455?v=4" }, { - "url": "https://github.com/payjoin/rust-payjoin/issues/1172", - "publishedAt": "2025-10-23T20:09:45Z", - "title": "payjoin-cli `resume` command fails when any session has expired", + "url": "https://github.com/payjoin/rust-payjoin/issues/1250", + "publishedAt": "2025-12-29T10:42:24Z", + "title": "JS bindings should include `io` functionality", "labels": [ - "bug", - "payjoin-cli" + "good first issue", + "ffi" ], "imageUrl": "https://avatars.githubusercontent.com/u/125623455?v=4" } diff --git a/scripts/types/curriculum.js b/scripts/types/curriculum.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/scripts/types/curriculum.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/scripts/utils/fetchJson.js b/scripts/utils/fetchJson.js new file mode 100644 index 00000000..c95e02a1 --- /dev/null +++ b/scripts/utils/fetchJson.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fetchJsonData = fetchJsonData; +async function fetchJsonData(path) { + const res = await fetch(path); + if (!res.ok) { + throw new Error(`Failed to fetch ${path}: ${res.status}`); + } + return res.json(); +} diff --git a/scripts/utils/index.js b/scripts/utils/index.js deleted file mode 100644 index 1eb57ea4..00000000 --- a/scripts/utils/index.js +++ /dev/null @@ -1,155 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.swapImageUrl = exports.applySearch = exports.applyFilter = exports.applySort = exports.createSortKeys = exports.FILTERTAGS = exports.ISSUEOPTIONS = exports.SORTOPTIONS = void 0; -exports.getValues = getValues; -exports.filterIssues = filterIssues; -exports.shuffle = shuffle; -exports.SORTOPTIONS = ["sort", "random", "newest first", "oldest first"]; -exports.ISSUEOPTIONS = ["labels", "good first issue", "bug", "help wanted"]; -exports.FILTERTAGS = [ - "search", - "sort", - "labels", - "languages", - "tags", - "repo", - "owner" -]; -function getValues({ key, issues }) { - const properties = issues.reduce((acc, issue) => { - const project = issue[key]; - if (Array.isArray(project)) { - return acc.concat(project); - } - acc.push(project); - return acc; - }, [key]); - const uniqueProperties = Array.from(new Set(properties).values()); - return { properties: uniqueProperties }; -} -const createSortKeys = () => { - const sortKeys = exports.SORTOPTIONS.slice(1).map((key) => { - const dashed_key = key.split(" ").join("-"); - return { key: dashed_key, label: key }; - }); - return { sortKeys }; -}; -exports.createSortKeys = createSortKeys; -function filterIssues(filterArgNkey, dataSet, sortKey, searchQuery) { - let result = []; - if (!filterArgNkey.length || filterArgNkey.length === 0) { - return dataSet; - } - if (filterArgNkey.length) { - (0, exports.applyFilter)(dataSet, filterArgNkey, result); - } - if (sortKey) { - result = result.length === 0 ? dataSet : result; - (0, exports.applySort)(sortKey, result); - } - if (searchQuery) { - result = result.length === 0 ? dataSet : result; - return (0, exports.applySearch)(searchQuery, result); - } - return result; -} -// applies sort to the dataset or result -// Sorts according to newest-issues, oldest-issues and relevance which is the default state -const applySort = (sortKey, result) => { - switch (sortKey) { - case "random": - return result; - case "newest-first": - return result.sort((a, b) => new Date(b.publishedAt).getTime() - - new Date(a.publishedAt).getTime()); - case "oldest-first": - return result.sort((a, b) => new Date(a.publishedAt).getTime() - - new Date(b.publishedAt).getTime()); - default: - break; - } -}; -exports.applySort = applySort; -// applies filter to the dataset or result -// filter searhes each item in the dataset based on filter key selected and returns results as expected -const applyFilter = (dataSet, filterArgNkey, result) => { - const rename_keys = filterArgNkey.map(({ key, filter }) => { - switch (key) { - case "name": - return { key: "repo", filter }; - case "lang": - return { key: "languages", filter }; - case "org": - return { key: "owner", filter }; - default: - return { key, filter }; - } - }); - dataSet.filter((resultValue) => { - rename_keys.map(({ key, filter }) => { - filter = filter.toLowerCase(); - const isPresent = result.some((val) => val.number === resultValue.number); - let valueInCheck = resultValue?.[key]; - if (Array.isArray(valueInCheck)) { - valueInCheck = valueInCheck.map((val) => val.toLowerCase()); - if (valueInCheck.includes(filter)) { - if (isPresent) - return; - return result.push(resultValue); - } - } - else if (typeof valueInCheck === "string" && - valueInCheck.toLowerCase() === filter.toLowerCase()) { - if (isPresent) - return; - return result.push(resultValue); - } - }); - }); -}; -exports.applyFilter = applyFilter; -// applies search to the dataset or result -// Search is based on title, repository and language -const applySearch = (searchQuery, result) => { - const nullableSearchTerm = searchQuery?.toLocaleLowerCase() ?? ""; - return result.filter((item) => { - return ((item?.title) - .toLowerCase() - .includes(nullableSearchTerm) || - (item?.owner) - .toLowerCase() - .includes(nullableSearchTerm) || - (item?.repo).toLowerCase().includes(nullableSearchTerm) || - (item?.languages).some((val) => val.toLowerCase().includes(nullableSearchTerm))); - }); -}; -exports.applySearch = applySearch; -function shuffle(data) { - let currIndex = data.length; - while (currIndex !== 0) { - let randomIndex = Math.floor(Math.random() * currIndex); - currIndex--; - [data[currIndex], data[randomIndex]] = [ - data[randomIndex], - data[currIndex] - ]; - } - return data; -} -const swapImageUrl = (name, imageUrl) => { - switch (name) { - case "polar": - return "/images/projects/polar.jpg"; - case "lnd": - return "/images/projects/lnd.png"; - case "eclair": - return "/images/projects/eclair-logo.png"; - case "warnet": - return "/images/projects/warnet.jpg"; - case "sim-ln": - return "/images/projects/simln.jpg"; - default: - return imageUrl; - } -}; -exports.swapImageUrl = swapImageUrl; diff --git a/tsconfig.scripts.json b/tsconfig.scripts.json index 1f64be69..6cd6f58e 100644 --- a/tsconfig.scripts.json +++ b/tsconfig.scripts.json @@ -9,5 +9,5 @@ "skipLibCheck": true }, "include": ["helpers/**/*.ts", "utils/**/*.ts", "types/**/*.ts"], - "exclude": ["utils/content-utils.ts"] + "exclude": ["utils/content-utils.ts", "utils/index.ts"] } diff --git a/types/index.ts b/types/index.ts index 76cea463..86b2344a 100644 --- a/types/index.ts +++ b/types/index.ts @@ -1,6 +1,6 @@ -import { TagType } from "@bitcoin-dev-project/bdp-ui" import { ImageProps } from "next/image" import { ComponentType, SVGProps } from "react" +import { TagType } from "./curriculum" export type ProjectProperties = { name: string