UNPKG

@onhive.io/astro-loader

Version:

Astro Content Layer loader for the Hive blockchain

1 lines 10.2 kB
{"version":3,"sources":["../src/api/common.ts","../src/adapters/posts.ts","../src/api/posts.ts","../src/schema/utils.ts","../src/schema/accounts.ts","../src/loaders/blogLoader.ts","../src/adapters/accounts.ts","../src/api/accounts.ts","../src/loaders/accountsLoader.ts"],"sourcesContent":["import { Client } from \"@hiveio/dhive\";\n\nconst HIVE_API = \"https://api.hive.blog\";\nconst HIVEKINGS_API = \"https://api.hivekings.com\";\nconst ANYX_API = \"https://anyx.io\";\nconst OPENHIVE_API = \"https://api.openhive.network\";\n\nconst APIS = [HIVE_API, HIVEKINGS_API, ANYX_API, OPENHIVE_API];\n\nexport const hive = new Client(APIS);\n","import type { Discussion } from \"@hiveio/dhive\";\nimport type { Post } from \"~/schema/posts.ts\";\n\n/**\n * Adapts dHive Discussion to our Post schema.\n * Unfortunately, data returned by dHive is different to Discussion type...\n */\nexport function adaptPost(post: Discussion): Post {\n return {\n id: post.post_id.toString(),\n author: post.author,\n title: post.title,\n description: post.json_metadata.description,\n created: new Date(post.created),\n updated: post.updated ? new Date(post.updated) : undefined,\n community: post?.community\n ? { id: post.community, name: post.community_title }\n : undefined,\n category: post.category,\n tags: post.json_metadata.tags,\n image: post.json_metadata.image?.length\n ? post.json_metadata.image[0]\n : undefined,\n canonical: post.url,\n content: post.body,\n meta: {\n app: post.json_metadata.app,\n format: post.json_metadata.format\n }\n };\n}\n","import { hive } from \"~/api/common\";\nimport { adaptPost } from \"~/adapters/posts.ts\";\nimport type { Post } from \"~/schema/posts.ts\";\n\nexport async function getAccountPosts(author: string): Promise<Post[]> {\n return hive.hivemind\n .getAccountPosts({ account: author, sort: \"posts\" })\n .then((discussions) => {\n return discussions.map(adaptPost);\n });\n}\n","import { z } from \"astro/zod\";\nimport { Money } from \"~/schema/accounts.ts\";\nimport type { DynamicGlobalProperties } from \"@hiveio/dhive\";\n\nexport function typeToZ<T>() {\n return z.custom<T>(() => true) as z.ZodType<T>;\n}\n\nexport function balanceToMoney(\n balance: string,\n precision: number\n): Money | null {\n const [amount, currency] = balance.split(\" \");\n if (!amount || !currency) {\n throw new Error(`Invalid balance: ${balance}`);\n }\n return new Money(currency, amount, precision);\n}\n\nexport const vestsToHive = (\n vests: string,\n params: DynamicGlobalProperties\n): Money => {\n const [v] = vests.split(\" \");\n const [totalFund] = (params.total_vesting_fund_hive as string).split(\" \");\n const [totalShares] = (params.total_vesting_shares as string).split(\" \");\n const hive =\n (parseFloat(v!) * parseFloat(totalFund!)) / parseFloat(totalShares!);\n return new Money(\"HIVE\", hive.toString(), 3);\n};\n","export type Account = {\n id: string;\n name: string;\n created: Date;\n wallet: Wallet;\n postCount: number;\n profile: Profile;\n};\n\nexport type Profile = {\n name: string;\n about: string;\n coverImage: string;\n profileImage: string;\n website: string;\n location: string;\n};\n\nexport type Wallet = {\n hive: {\n liquid: Money;\n frozen: Money;\n };\n hbd: {\n liquid: Money;\n frozen: Money;\n };\n};\n\nexport interface MoneyInterface {\n currency: string;\n amount: string;\n precision: number;\n\n asFloat(): number;\n}\n\nexport class Money implements MoneyInterface {\n currency: string;\n amount: string;\n precision: number;\n\n constructor(currency: string, amount: string, precision: number) {\n this.currency = currency;\n this.amount = parseFloat(amount).toFixed(precision).toString();\n this.precision = precision;\n }\n\n asFloat(): number {\n return parseFloat(this.amount);\n }\n}\n","import type { Loader } from \"astro/loaders\";\nimport { getAccountPosts } from \"~/api/posts.ts\";\nimport { typeToZ } from \"~/schema/utils.ts\";\nimport type { Post } from \"~/schema/posts.ts\";\n\nexport function hiveBlogLoader(author: string): Loader {\n return {\n name: \"hive-blog-loader\",\n load: async function (this: Loader, { store, logger }) {\n logger.debug(`Fetching blog posts [author: ${author}]`);\n const data = await getAccountPosts(author);\n store.clear();\n data.forEach((post) => {\n store.set({\n id: post.id.toString(),\n data: { ...post }\n });\n });\n },\n schema: typeToZ<Post[]>\n };\n}\n","import type { DynamicGlobalProperties, ExtendedAccount } from \"@hiveio/dhive\";\nimport { type Account } from \"~/schema/accounts.ts\";\nimport { balanceToMoney, vestsToHive } from \"~/schema/utils.ts\";\n\nconst adaptAccount = (\n account: ExtendedAccount,\n params: DynamicGlobalProperties\n): Account => {\n const jsonMetadata = JSON.parse(account.posting_json_metadata);\n\n return {\n id: account.id.toString(),\n name: account.name,\n created: new Date(account.created),\n wallet: {\n hive: {\n liquid: balanceToMoney(account.balance as string, 3)!,\n frozen: vestsToHive(account.vesting_shares as string, params)\n },\n hbd: {\n liquid: balanceToMoney(account.hbd_balance as string, 3)!,\n frozen: balanceToMoney(account.savings_hbd_balance as string, 3)!\n }\n },\n postCount: account.post_count,\n profile: {\n name: jsonMetadata.profile.name,\n about: jsonMetadata.profile.about,\n coverImage: jsonMetadata.profile.cover_image,\n profileImage: jsonMetadata.profile.profile_image,\n website: jsonMetadata.profile.website,\n location: jsonMetadata.profile.location\n }\n };\n};\n\nexport { adaptAccount };\n","import { hive } from \"~/api/common\";\nimport type { Account } from \"~/schema/accounts.ts\";\nimport { adaptAccount } from \"~/adapters/accounts.ts\";\n\nexport async function getAccounts(usernames: string[]): Promise<Account[]> {\n const params = await hive.database.getDynamicGlobalProperties();\n const accounts = await hive.database.getAccounts(usernames);\n return accounts.map((acc) => adaptAccount(acc, params));\n}\n","import type { Loader } from \"astro/loaders\";\nimport { typeToZ } from \"~/schema/utils.ts\";\nimport type { Account } from \"~/schema/accounts.ts\";\nimport { getAccounts } from \"~/api/accounts.ts\";\n\nexport function hiveAccountsLoader(username: string | string[]): Loader {\n return {\n name: \"hive-accounts-loader\",\n load: async function (this: Loader, { store, logger }) {\n logger.debug(`Fetching accounts [usernames: ${username}]`);\n const data = await getAccounts(\n Array.isArray(username) ? username : [username]\n );\n store.clear();\n data.forEach((account) => {\n store.set({\n id: account.id.toString(),\n data: { ...account }\n });\n });\n },\n schema: typeToZ<Account[]>\n };\n}\n"],"mappings":"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","names":["hive"]}