From def2273d8ca7a2a81bff25aa5e2d000abbee1d48 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Tue, 16 Sep 2025 09:21:01 +0800 Subject: [PATCH 01/14] feat: carry all of dob-render-sdk core logic code under spore module --- packages/spore/package.json | 7 +- .../spore/src/__examples__/renderDob.test.ts | 14 ++ packages/spore/src/dob/index.ts | 1 + .../spore/src/dob/render/api/dobDecode.ts | 18 ++ .../src/dob/render/background-color-parser.ts | 29 +++ packages/spore/src/dob/render/config.ts | 82 +++++++ .../spore/src/dob/render/constants/key.ts | 5 + .../spore/src/dob/render/constants/regex.ts | 4 + .../render/fonts/SpaceGrotesk-Bold.base64.ts | 1 + .../render/fonts/TurretRoad-Bold.base64.ts | 1 + .../render/fonts/TurretRoad-Medium.base64.ts | 1 + packages/spore/src/dob/render/index.ts | 10 + .../render/render-by-dob-decode-response.ts | 36 +++ .../src/dob/render/render-by-token-key.ts | 13 + .../spore/src/dob/render/render-dob-bit.ts | 108 +++++++++ .../spore/src/dob/render/render-dob1-svg.ts | 53 +++++ .../spore/src/dob/render/render-image-svg.ts | 60 +++++ .../dob/render/render-text-params-parser.ts | 120 ++++++++++ .../spore/src/dob/render/render-text-svg.ts | 123 ++++++++++ .../src/dob/render/resolve-svg-traits.ts | 48 ++++ packages/spore/src/dob/render/style-parser.ts | 104 ++++++++ .../spore/src/dob/render/svg-to-base64.ts | 6 + .../test/background-color-parser.test.ts | 49 ++++ .../test/render-text-params-parser.ts.test.ts | 144 ++++++++++++ .../src/dob/render/test/style-parser.test.ts | 222 ++++++++++++++++++ .../src/dob/render/test/traits-parser.test.ts | 91 +++++++ .../spore/src/dob/render/traits-parser.ts | 73 ++++++ packages/spore/src/dob/render/types/index.ts | 20 ++ .../spore/src/dob/render/types/internal.ts | 8 + packages/spore/src/dob/render/utils/mime.ts | 87 +++++++ packages/spore/src/dob/render/utils/string.ts | 33 +++ pnpm-lock.yaml | 6 + vitest.config.mts | 4 +- 33 files changed, 1578 insertions(+), 3 deletions(-) create mode 100644 packages/spore/src/__examples__/renderDob.test.ts create mode 100644 packages/spore/src/dob/render/api/dobDecode.ts create mode 100644 packages/spore/src/dob/render/background-color-parser.ts create mode 100644 packages/spore/src/dob/render/config.ts create mode 100644 packages/spore/src/dob/render/constants/key.ts create mode 100644 packages/spore/src/dob/render/constants/regex.ts create mode 100644 packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts create mode 100644 packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts create mode 100644 packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts create mode 100644 packages/spore/src/dob/render/index.ts create mode 100644 packages/spore/src/dob/render/render-by-dob-decode-response.ts create mode 100644 packages/spore/src/dob/render/render-by-token-key.ts create mode 100644 packages/spore/src/dob/render/render-dob-bit.ts create mode 100644 packages/spore/src/dob/render/render-dob1-svg.ts create mode 100644 packages/spore/src/dob/render/render-image-svg.ts create mode 100644 packages/spore/src/dob/render/render-text-params-parser.ts create mode 100644 packages/spore/src/dob/render/render-text-svg.ts create mode 100644 packages/spore/src/dob/render/resolve-svg-traits.ts create mode 100644 packages/spore/src/dob/render/style-parser.ts create mode 100644 packages/spore/src/dob/render/svg-to-base64.ts create mode 100644 packages/spore/src/dob/render/test/background-color-parser.test.ts create mode 100644 packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts create mode 100644 packages/spore/src/dob/render/test/style-parser.test.ts create mode 100644 packages/spore/src/dob/render/test/traits-parser.test.ts create mode 100644 packages/spore/src/dob/render/traits-parser.ts create mode 100644 packages/spore/src/dob/render/types/index.ts create mode 100644 packages/spore/src/dob/render/types/internal.ts create mode 100644 packages/spore/src/dob/render/utils/mime.ts create mode 100644 packages/spore/src/dob/render/utils/string.ts diff --git a/packages/spore/package.json b/packages/spore/package.json index 8239c768..ffe8ed14 100644 --- a/packages/spore/package.json +++ b/packages/spore/package.json @@ -60,7 +60,12 @@ }, "dependencies": { "@ckb-ccc/core": "workspace:*", - "axios": "^1.11.0" + "axios": "^1.11.0", + "satori": "^0.10.13", + "svgson": "^5.3.1" + }, + "peerDependencies": { + "satori": "^0.10.13" }, "packageManager": "pnpm@10.8.1" } diff --git a/packages/spore/src/__examples__/renderDob.test.ts b/packages/spore/src/__examples__/renderDob.test.ts new file mode 100644 index 00000000..9baddcc0 --- /dev/null +++ b/packages/spore/src/__examples__/renderDob.test.ts @@ -0,0 +1,14 @@ +import { describe, it } from "vitest"; +import { renderByTokenKey, svgToBase64 } from "../dob/index.js"; + +describe("decodeDob [testnet]", () => { + it("should respose a decoded dob render data from a spore id", async () => { + // The spore id that you want to decode (must be a valid spore dob) + const sporeId = + "dc19e68af1793924845e2a4dbc23598ed919dcfe44d3f9cd90964fe590efb0e4"; + + // Decode from spore id + const dob = await renderByTokenKey(sporeId); + console.log(dob); + }, 60000); +}); diff --git a/packages/spore/src/dob/index.ts b/packages/spore/src/dob/index.ts index 68d17aa1..e2edf74c 100644 --- a/packages/spore/src/dob/index.ts +++ b/packages/spore/src/dob/index.ts @@ -1,3 +1,4 @@ export * from "./api/index.js"; export * from "./config/index.js"; export * from "./helper/index.js"; +export * from "./render/index.js"; diff --git a/packages/spore/src/dob/render/api/dobDecode.ts b/packages/spore/src/dob/render/api/dobDecode.ts new file mode 100644 index 00000000..27ae9205 --- /dev/null +++ b/packages/spore/src/dob/render/api/dobDecode.ts @@ -0,0 +1,18 @@ +import { config } from '../config' +import type { DobDecodeResponse } from '../types' + +export async function dobDecode(tokenKey: string): Promise { + const response = await fetch(config.dobDecodeServerURL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + id: 2, + jsonrpc: '2.0', + method: 'dob_decode', + params: [tokenKey], + }), + }) + return response.json() +} diff --git a/packages/spore/src/dob/render/background-color-parser.ts b/packages/spore/src/dob/render/background-color-parser.ts new file mode 100644 index 00000000..c1424f84 --- /dev/null +++ b/packages/spore/src/dob/render/background-color-parser.ts @@ -0,0 +1,29 @@ +import type { ParsedTrait } from './traits-parser' +import { Key } from './constants/key' + +export function getBackgroundColorByTraits( + traits: ParsedTrait[], +): ParsedTrait | undefined { + return traits.find((trait) => trait.name === Key.BgColor) +} + +export function backgroundColorParser( + traits: ParsedTrait[], + options?: { + defaultColor?: string + }, +): string { + const bgColorTrait = getBackgroundColorByTraits(traits) + if (bgColorTrait) { + if (typeof bgColorTrait.value === 'string') { + if ( + bgColorTrait.value.startsWith('#(') && + bgColorTrait.value.endsWith(')') + ) { + return bgColorTrait.value.replace('#(', 'linear-gradient(') + } + return bgColorTrait.value + } + } + return options?.defaultColor || '#000' +} diff --git a/packages/spore/src/dob/render/config.ts b/packages/spore/src/dob/render/config.ts new file mode 100644 index 00000000..ff5bdc59 --- /dev/null +++ b/packages/spore/src/dob/render/config.ts @@ -0,0 +1,82 @@ +export type FileServerResult = + | string + | { + content: string + content_type: string + } + +export type BtcFsResult = FileServerResult +export type IpfsResult = FileServerResult + +export type BtcFsURI = `btcfs://${string}` +export type IpfsURI = `ipfs://${string}` + +export type QueryBtcFsFn = (uri: BtcFsURI) => Promise +export type QueryIpfsFn = (uri: IpfsURI) => Promise +export type QueryUrlFn = (uri: string) => Promise + +export class Config { + private _dobDecodeServerURL = 'https://dob-decoder.rgbpp.io' + private _queryBtcFsFn: QueryBtcFsFn = async (uri) => { + return fetch(`https://api.omiga.io/api/v1/nfts/dob_imgs?uri=${uri}`).then( + (res) => res.json(), + ) + } + + private _queryUrlFn = async (url: string) => { + try { + const response = await fetch(url) + const blob = await response.blob() + return new Promise((resolve, reject) => { + const reader = new FileReader() + // eslint-disable-next-line func-names + reader.onload = function () { + const base64 = this.result as string + resolve(base64) + } + reader.onerror = (error) => { + reject(error) + } + reader.readAsDataURL(blob) + }) + } catch (error) { + throw error + } + } + + private _queryIpfsFn = async (uri: IpfsURI) => { + const key = uri.substring('ipfs://'.length) + const url = `https://ipfs.io/ipfs/${key}` + return this._queryUrlFn(url) + } + + get dobDecodeServerURL() { + return this._dobDecodeServerURL + } + + setDobDecodeServerURL(dobDecodeServerURL: string): void { + this._dobDecodeServerURL = dobDecodeServerURL + } + + setQueryBtcFsFn(fn: QueryBtcFsFn): void { + this._queryBtcFsFn = fn + } + + setQueryIpfsFn(fn: QueryIpfsFn): void { + this._queryIpfsFn = fn + } + + get queryBtcFsFn(): QueryBtcFsFn { + return this._queryBtcFsFn + } + + get queryIpfsFn(): QueryIpfsFn { + return this._queryIpfsFn + } + + get queryUrlFn(): QueryUrlFn { + return this._queryUrlFn + } +} + +export const config = new Config() diff --git a/packages/spore/src/dob/render/constants/key.ts b/packages/spore/src/dob/render/constants/key.ts new file mode 100644 index 00000000..6aa61a4e --- /dev/null +++ b/packages/spore/src/dob/render/constants/key.ts @@ -0,0 +1,5 @@ +export enum Key { + BgColor = 'prev.bgcolor', + Prev = 'prev', + Image = 'IMAGE', +} diff --git a/packages/spore/src/dob/render/constants/regex.ts b/packages/spore/src/dob/render/constants/regex.ts new file mode 100644 index 00000000..ab9fb0c5 --- /dev/null +++ b/packages/spore/src/dob/render/constants/regex.ts @@ -0,0 +1,4 @@ +export const ARRAY_REG = /\(%(.*?)\):(\[.*?\])/ +export const ARRAY_INDEX_REG = /(\d+)<_>$/ +export const GLOBAL_TEMPLATE_REG = /^prev<(.*?)>/ +export const TEMPLATE_REG = /^(.*?)<(.*?)>/ diff --git a/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts b/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts new file mode 100644 index 00000000..5f3428bf --- /dev/null +++ b/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts @@ -0,0 +1 @@ +export default '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//8ADgC/AMwBfRAHABH/2ADNAAD//wAo/yoBIAAUEAYA5wAA//8AEAFeAN4CvBIHAQMAAAFeAAAAAgAgAVQBlALGAAsAFwAAEyImNTQ2MzIWFRQGJzI2NTQmIyIGFRQW2lRmZlRUZmZUKjIyKioyMgFUYVhZYGBZWGFMNzY2Nzc2NjcAAAIARAAGApwB6gAJABMAACU1NzUnNTMFFQUhNTc1JzUzBRUFAXC1tQYBJv7a/s61tQYBJv7aBohhEmGIroiuiGESYYiuiK4A//8AEP/2Ay4CxhAmAQQAABAmANo+ABAHAPgBuAAAAAD//wAQ//YDHALGECYBBAAAECYA2j4AEAcBGQHMAAAAAP//ABT/9gNrAsYQJgEVAAAQJgDaewAQBwD4AfUAAAAAAAIAKv8qAiAB/gAkADAAAAUiLgE1ND4BPwE+AT0BMxUUBg8BDgEVFB4BMzI+AT0BMxUUDgEDMhYVFAYjIiY1NDYBIEdvQCxDIxESDoQoLxEtMB00IyQ5IYJEdD0pNjYpKDc31jRcPDxNMBAICBcWDhQzQhYIFS8pHSkWGDAkFhRFYzYC1DUqKjU1Kio1AAAA//8AEgAAAmgDeBImACQAABAHAPwAiwAA//8AEgAAAmgDeBImACQAABAHAOYAxwAA//8AEgAAAmgDeBImACQAABAGAOlVAAAA//8AEgAAAmgDehImACQAABAGARhgAAAA//8AEgAAAmgDkhImACQAABAGAOtVAAAA//8AEgAAAmgDtBImACQAABAHAQkArQAAAAIAEgAAAxUCvAALABUAACERIRUhFTMVIxUhFSETMxUjAzMVIwcBdwGY/ur6+gEc/P3qexJzhawyArx4p3iteAK8Rv6eepoA//8AMv8qAloCyhImACYAABAHAOcAsQAA//8AQgAAAgoDeBImACgAABAGAPx2AAAA//8AQgAAAgoDeBImACgAABAHAOYAsgAA//8AQgAAAgoDeBImACgAABAGAOlAAAAA//8AQgAAAgoDkhImACgAABAGAOtAAAAA////+gAAANIDeBImACwAABAGAPzSAAAA//8ANgAAAQ4DeBImACwAABAGAOYOAAAA////xAAAAUQDeBImACwAABAGAOmcAAAA////xAAAAUQDkhImACwAABAGAOucAAAA//8ALgAAAm4CvBImACcAABAGARLyAAAA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CGdseXBoMjExCGdseXBoMjEyCGdseXBoMjE0CGdseXBoMjE1CGdseXBoMjE2CGdseXBoMjE4CGdseXBoMjE5CGdseXBoMjIxCmVpZ2h0LmRub20KZWlnaHQubnVtcgplaWdodC50bnVtCGZfZi5saWdhCmZfZl9pLmxpZ2EKZl9mX2oubGlnYQpmX2ZfbC5saWdhCGZfai5saWdhCWZpdmUuZG5vbQlmaXZlLm51bXIJZml2ZS50bnVtCWZvdXIuZG5vbQlmb3VyLm51bXIJZm91ci50bnVtCGdseXBoMjM5CGdseXBoMjQwBmkubG9jbAhnbHlwaDI0NQhnbHlwaDI0NgluaW5lLmRub20JbmluZS5udW1yCW5pbmUudG51bQhvbmUuZG5vbQhvbmUubnVtcghvbmUudG51bQhnbHlwaDI1NghnbHlwaDI1NwhnbHlwaDI1OAhnbHlwaDI1OQpzZXZlbi5kbm9tCnNldmVuLm51bXIKc2V2ZW4udG51bQhzaXguZG5vbQhzaXgubnVtcghzaXgudG51bQhnbHlwaDI2NwhnbHlwaDI2OAhnbHlwaDI3MAh0X3QubGlnYQp0aHJlZS5kbm9tCnRocmVlLm51bXIKdGhyZWUudG51bQhnbHlwaDI3NghnbHlwaDI3Nwh0d28uZG5vbQh0d28ubnVtcgh0d28udG51bQl6ZXJvLmRub20JemVyby5udW1yCXplcm8udG51bQABAAH//wAPAAEAAgAOAAAAeAAAAPIAAgARACQAKAABACoAMgABADUAOAABADoAOgABADwAPQABAEQASAABAEoASwABAE4AUgABAFUAWAABAFoAWgABAFwAXQABAIgAiAABAKgAqAABAMIAwgABAOIA4wACAPAA9AACARMBEwACAGYACAAUABwAJAAsADoASABWAF4AAQAEAAEBfgABAAQAAQGYAAEABAABAXoAAgAGAAoAAQF6AAECxAACAAYACgABAXoAAQLEAAIABgAKAAEBegABAt4AAQAEAAEBfgABAAQAAQG2AAEACADiAOMA8ADxAPIA8wD0ARMAAQACAAAADAAAABAAAQAAAAEAAAAAAAEAAAAKAJIBBAACREZMVAAObGF0bgAkAAQAAAAA//8ABgAAAAEAAgAGAAcACAAWAANDQVQgAChOTEQgADxUUksgAFAAAP//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//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/cAAAAAP/o//IAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAD/5P/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//r/7v++AAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAD/kgAAAAAAAP+g/77/2gAAAAAAAAAAAAAAAAAAAAAAAAAA//7/zAAA/97/9gAAAAD/2P/oAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6v/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/54AAAAAAAD/tP/c//b/2P/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/UAAAAAAAA//T/+v/c/+oAAAAAAAAAAP/yAAAAAP/u//gAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAA//L/+AAA//T/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9r/7gAA/9r/3gAA/97/3gAAAAAAAP/A/8oAAAAA/9wAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qP/k/87/uP+sAAD/tP+0AAAAAAAA/5L/ngAAAAD/mAAAAAAAMv/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7AAAAAAAAAAAP/A/8L/vP+yAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAAAAAAAAAAAAAA//b/5AAAAAAAAAAAAAAAAP/4/+IAAAAA//YAAAAAAAAAAAAAAAD/9gAA//AAAP+SAAD/+AAKAAAAAAAAAAAAAP+8//YAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAADQAAAAiAAAAAAAAAAAAAAAAAFoAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAASAAD/9P/6AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//z/+gAA/9T/+AAAAAAAAAAAAAAAAP+2AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAP/eAAAAAAAA/+D/7P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y/+L/4gAAAAAAAP/0AAAAAAAAAAAAAP/aAAAAAAAAAAAAAAAo//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAA/+b/9AAAAAAAAAAAAAD/6P/QAAAAAP+YAAAAAAAA/+wAAAAA/9wAAAAAAAD/jgAAAAAAAP+g/7r/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4P/4AAAAAAAAAAD/9AAAAAD/yv/2AAAAAAAAAAAAAAAA/57/4v/8AAD/2P/4AAAAIAAA//7//AAA/+r/7gAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAeAAD/9P/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAD/6gAAAAAAAP/q//YAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ov/k/8T/wP+qAAD/uP+8//QAAAAA/6D/tAAAAAD/qAAAAAAAQv/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7QAAAAAAAAAAP+8/7z/sP+2AAAAAP/i//L/9v/S/+IAAP/0//gAAAAAAAD/vv/cAAAAAAAAAAAAAABA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAAAAA//D/8v/o//oAAAAA//r/+v/8/+7/+gAAAAAAAAAAAAAAAP/a//YAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/o/+4AAP/8AAD/+AAAAAAAAAAAAAD/2AAAAAD/+AAAAAAAKP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAP/y//gAAAAAAAAAAP/4//T/9AAAAAAAAP/6AAAAAAAAAAAAAP/cAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAAAAAAAAA//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAD/9AAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9oAAP/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAD/9AAAAAAAAAAAAAAAAP+w//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/8//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vP/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0gAAAAAAAAAAAAAAAAAA//YAAAAA//wAAP/8AAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAA//AAAAAA//wAAAAAAAAAAAAAAAD/7gAA/34AAAAAAAoAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAA//wAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAP/0AAAAAAAAAAAAAAAA/9j/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAD/+AAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAACAFsABQAFAAMACgAKAAMADwAPAAkAEAAQAAsAEQARAAkAEwATADUAFQAVADAAFgAWAC8AFwAXACMAGAAYACIAGQAZAC0AGgAaACwAGwAbACEAHAAcACkAJAAkAAQAJQAlABQAJgAmAA0AJwAnAAEAKAAoAAUAKQApABUAKgAqABYAKwAsAAcALQAtAA8ALgAuABcALwAvABgAMAAxAAcAMgAyAAEAMwAzABkANAA0AAEANQA1ABoANgA2ABsANwA3ABwAOAA4AAgAOQA5AB0AOgA6AB4AOwA7AB8APAA8ABAAPQA9ACAAPgA+ABEARABEAAYARwBHAAoASQBJABIASwBLAAwATABNAAIATgBOACgATwBPAAoAUABRAAwAVQBVACoAVgBWACsAVwBXAC4AWQBZADEAWgBaADIAWwBbADMAXQBdADQAXgBeABEAbwBvAAsAggCHAAQAiACIAAUAiQCJAA0AigCNAAUAkACRAA4AkgCSAAEAkwCTAAcAlACYAAEAmgCaAAEAmwCeAAgAnwCfABAAogCnAAYArgCvAAIAsACxABMAswCzAAwAwwDDAAUAxQDGAAMAzADNAAsAzgDPAAMA0ADQAAkA0QDSAAMA0wDTAAkA1QDVAAkA4gDiAAIA4wDjAAoA5QDlAA8A7QDtACQA8ADwABIA8QDyAAIA8wDzAAoA9AD0AAIA/QD+AAIBAAEAACUBDQENACYBHAEcACcAAgBcAAUABQAGAAoACgAGAA8ADwAMABAAEAANABEAEQAMABMAEwAtABQAFAAjABUAFQAoABYAFgAnABcAFwAbABkAGQAmABoAGgAlABsAGwAaABwAHAAiACQAJAAEACUAJQAOACYAJgACACcAJwAOACoAKgACAC0ALQAQADIAMgACADQANAACADYANgAUADcANwAVADgAOAAKADkAOQAWADoAOgAXADsAOwAYADwAPAARAD0APQAZAEAAQAASAEQARAAFAEUARQALAEYASAABAEkASQADAEoASgABAEsASwALAEwATQAJAE4ATwALAFAAUQAIAFIAUgABAFMAUwAIAFQAVAABAFUAVQAIAFYAVgAkAFcAVwADAFgAWAAHAFkAWQApAFoAWgAqAFsAWwArAFwAXAAHAF0AXQAsAGAAYAASAG8AbwANAIIAiAAEAIkAiQACAJAAkQAPAJQAmAACAJoAmgACAJsAngAKAJ8AnwARAKIAqAAFAKkArQABAK4ArwAJALAAsQATALIAsgABALMAswAIALQAuAABALoAugABALsAvwAHAMAAwAALAMEAwQAHAMIAwgAIAMMAwwACAMQAxAABAMUAxgAGAMwAzQANAM4AzwAGANAA0AAMANEA0gAGANMA0wAMANUA1QAMAOIA4wADAOUA5QAQAO0A7QAcAPAA9AADAPgA+AAdAP0A/gAJAQABAAAeAQMBAwAfAQ0BDQAgARwBHAAhAAIAHQAFAAUAAAAKAAoAAQAPABEAAgATABMABQAVABwABgAkAD4ADgBEAEkAKQBLAFMALwBVAFcAOABZAFsAOwBdAF4APgBvAG8AQACCAI0AQQCQAJgATQCaAJ8AVgCiALgAXAC6ALoAcwDAAMAAdADDAMYAdQDMANMAeQDVANUAgQDiAOMAggDlAOUAhADtAO0AhQDwAPQAhgD9AP4AiwEAAQAAjQENAQ0AjgEcARwAjwAAAAEAAAAA2lOZ8AAAAADbnCKZAAAAANucjWM=' diff --git a/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts b/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts new file mode 100644 index 00000000..fd54abe9 --- /dev/null +++ b/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts @@ -0,0 +1 @@ +export default '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Ov47IztlO6Q7zjvsPAk8JDx1PKI8wDzdPPU9DT0XPSE9Kz01PT89ST1TPV09Zz1xPXs9hT2PPagAAAANAKIAAwABBAkAAACwApQAAwABBAkAAQAWAn4AAwABBAkAAgAIAnYAAwABBAkAAwA0AkIAAwABBAkABAAgAiIAAwABBAkABQBCAeAAAwABBAkABgAeAcIAAwABBAkACAAQAbIAAwABBAkACQAQAbIAAwABBAkACwAmAYwAAwABBAkADAA4AVQAAwABBAkADQEgADQAAwABBAkADgA0AAAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIABUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAGgAdAB0AHAAcwA6AC8ALwBnAGkAdABoAHUAYgAuAGMAbwBtAC8AbgBvAHAAbwBuAGkAZQBzAC8AaAB0AHQAcAA6AC8ALwBuAG8AcABvAG4AaQBlAHMALgBjAG8AbQBOAG8AcABvAG4AaQBlAHMAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7ACAAdAB0AGYAYQB1AHQAbwBoAGkAbgB0ACAAKAB2ADEALgA4ACkAVAB1AHIAcgBlAHQAIABSAG8AYQBkACAAQgBvAGwAZAAxAC4AMAAwADEAOwBOAE8AUABOADsAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAEIAbwBsAGQAQgBvAGwAZABUAHUAcgByAGUAdAAgAFIAbwBhAGQAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQA4ACAAVABoAGUAIABUAHUAcgByAGUAdAAgAFIAbwBhAGQAIABQAHIAbwBqAGUAYwB0ACAAQQB1AHQAaABvAHIAcwAgACgAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwBuAG8AcABvAG4AaQBlAHMALwB0AHUAcgByAGUAdAAtAHIAbwBhAGQAKQAAAAAAAgAAAAMAAAAUAAMAAQAAABQABATUAAAAggCAAAYAAgANAC8AOQB+AQcBEwEbASMBJwErATEBNwE+AUgBTQFbAWcBawF+AZICGwI3AscC3QMEAwgDDAMSAygDOAOUA6kDvAPAHoUe8yAUIBogHiAiICYgMCA6IEQgcCB5IKwhIiFfIYkhmSICIgUiDyISIhUiGiIeIisiSCJgImUlyvsC//8AAAANACAAMAA6AKABCgEWAR4BJgEqAS4BNgE5AUEBSgFQAV4BagFuAZICGAI3AsYC2AMAAwYDCgMSAyYDNQOUA6kDvAPAHoAe8iATIBggHCAgICYgMCA5IEQgcCB0IKwhIiFQIYkhkCICIgUiDyIRIhUiGiIeIisiSCJgImQlyvsB////9AAAAL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EAAD+awAAAAAAAAAAAAD+g/5w/mT9Vv1C/TD9LQAAAADhLwAAAAAAAOEJ4ULhFODS4JzgnOCp4GIAAN+QAADfbd9k310AAN9E31TfTN9A3x3e/wAA27MF5QABAAAAgAAAAJwBJAHyAgQCDgIYAhoCHAIiAiQCLgI8AkICWAJqAmwAAAKKAAACjgKQApoCogKmAAAAAAAAAAAAAAAAAAACnAKmAAACpgKqAq4AAAAAAAAAAAAAAAAAAAAAAqIAAAK+AAAAAAAAAsoAAAAAAAAAAAAAAAACwAAAAAAAAAACATABTwE3AVQBcQF/AVABOgE7ATYBWgEsAUABKwE4AS0BLgFhAV4BYAEyAX4AAwAOAA8AFAAYACEAIgAmACgAMAAxADMAOAA5AD8ASQBLAEwAUABVAFoAYwBkAGkAagBvAT4BOQE/AWgBRAGkAHMAfgB/AIQAiACRAJIAlgCYAKEAowClAKoAqwCxALsAvQC+AMIAyADNANYA1wDcAN0A4gE8AYYBPQFmAVEBMQFSAVcBUwFYAYcBgQGiAYIA6AFLAWcBQQGDAaYBhQFkAQ4BDwGdAXABgAE0AaABDQDpAUwBHAEYAR0BMwAIAAQABgAMAAcACwANABIAHgAZABsAHAAtACkAKgArABUAPgBDAEAAQQBHAEIBXABGAF4AWwBcAF0AawBKAMcAeAB0AHYAfAB3AHsAfQCCAI4AiQCLAIwAngCaAJsAnACFALAAtQCyALMAuQC0AV0AuADRAM4AzwDQAN4AvADgAAkAeQAFAHUACgB6ABAAgAATAIMAEQCBABYAhgAXAIcAHwCPAB0AjQAgAJAAGgCKACMAkwAlAJUAJACUACcAlwAuAJ8ALwCgACwAmQAyAKQANACmADYAqAA1AKcANwCpADoArAA8AK4AOwCtAD0ArwBFALcARAC2AEgAugBNAL8ATwDBAE4AwABRAMMAUwDFAFIAxABYAMsAVwDKAFYAyQBgANMAYgDVAF8A0gBhANQAZgDZAGwA3wBtAHAA4wByAOUAcQDkAFQAxgBZAMwBoQGfAZ4BowGoAacBqQGlAYwBjQGPAZMBlAGRAYsBigGSAY4BkABoANsAZQDYAGcA2gBuAOEBSQFKAUUBRwFIAUYBiAGJATUBJAEpASoBGgEbAR4BHwEgASEBIgEjASUBJgEnASgBFwF5AXMBdQF3AXsBfAF6AXQBdgF4AW0BWwFjAWICQwAyAcIAAAGQAAACeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoA9cAKAJ/ADICsgAoArIAKAKyACgCsgAoArIAKAKtADIDKgAyAq0AMgMqADICEAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAhAAMgIQADIB+AAoArMAKAKzACgCswAoArMAKAJaADICWv/nAL4AMgC+ACwBXAAyAZIAMgC+ACkAvgAsAVQAMgC+ACoBoAAeAh4AMgIeADIBygAyAcoAMgHKADIBygAyAk4AMgQAADICrgAyAq4AMgKuADICrgAyAq4AMgKuADICxAAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyAsQAMgLEADIEEwAyAnEAMgJxADICwgAyAnIAMgJyADICcgAyAnIAMgKdACgCnQAoAp0AKAKdACgCnQAoAnUAKAJ1ACgCdQAoAnUAKAJ1ACgCpAAyAqQAMgKkADICpAAyAqQAMgKkADICpAAyAqQAMgKkADICewAoA+wAKAPsACgD7AAoA+wAKAPsACgCmQAoAnwAKAJ8ACgCfAAoAnwAKAJ8ACgCYgAoAmIAKAJiACgCYgAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAPAACgCNwAyAkIAMgJCADICQgAyAkIAMgJCADICNgAoAnYAKAI2ACgCkQAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAXwAKAI2ACgCNgAoAjYAKAI2ACgCGQAyAmkAMgC2ADIAtQAyALUAJAFmADIBkgAyALUAIQC1ACQBVAAyALUAIQC3AAUAtwAAAdEAMgHRADIBJwAyAScAMgEn/+wBJwAyAbwAMgMOACgCGgAyAhoAMgIaADICGgAyAhoAMgIaADICJAAoAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoAiQAKAIkACgDogAoAjUAMgI1ADICNQAoAcQAMgHEADIBxAAyAcQAMgH3ACgB9wAoAfcAKAH3ACgB9wAoAn8AMgGGACgBmQAoAYYAKAGGACgBhgAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAgsAKAMNACgDDQAoAw0AKAMNACgDDQAoAfUAKAILACgCCwAoAgsAKAILACgCCwAoAhUAKAIVACgCFQAoAhUAKAIyACgCowAoAW4AMgFjADIC3QAyAqQAMgIZACgCCAAoAoQAKAFTACgCkAAoAi8AKAIPACgCkQAoAjgAMgJKACgCLwAoAjkAKAHJABwA6gAcAcUAHAGCABwBbAAcAcUAHAGIACMBlAAcAYIAHAGJABwByQAcAOoAHAHFABwBggAcAWwAHAHFABwBiAAjAZQAHAGCABwBiQAcAckAHADqABwBxQAcAYIAHAFsABwBxQAcAYgAIwGUABwBggAcAYkAHAE+/7ACWgAcBB8AHASJABwD3AAcBIUAHAPGABwELAAcBB8AHATIABwEhQAcBG8AHAPiABwEiwAcA+4AHAPcABwEQgAcBIUAHARAABwD4wAcBQ0AHAC2ADIA5AAjAKIAKADkACMB9QAyAL4AMgC+ADICvwAyAr8AMgC2ADIBUQAyAckAMgMTADIBkwAoAZMAKADcADIA4QAjASIAMgEiACMA9wAyAPcAKAGSADICWAAy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aW9nb25lawd1bmkwMjM3B3VuaTAxMzcGbGFjdXRlBmxjYXJvbgd1bmkwMTNDBm5hY3V0ZQZuY2Fyb24HdW5pMDE0NgNlbmcNb2h1bmdhcnVtbGF1dAdvbWFjcm9uBnJhY3V0ZQZyY2Fyb24HdW5pMDE1NwZzYWN1dGUHdW5pMDIxOQR0YmFyBnRjYXJvbgd1bmkwMTYzB3VuaTAyMUINdWh1bmdhcnVtbGF1dAd1bWFjcm9uB3VvZ29uZWsFdXJpbmcGd2FjdXRlC3djaXJjdW1mbGV4CXdkaWVyZXNpcwZ3Z3JhdmULeWNpcmN1bWZsZXgGeWdyYXZlBnphY3V0ZQp6ZG90YWNjZW50B3VuaTAzOTQHdW5pMDNBOQd1bmkwM0JDCXplcm8uZG5vbQhvbmUuZG5vbQh0d28uZG5vbQp0aHJlZS5kbm9tCWZvdXIuZG5vbQlmaXZlLmRub20Ic2l4LmRub20Kc2V2ZW4uZG5vbQplaWdodC5kbm9tCW5pbmUuZG5vbQl6ZXJvLm51bXIIb25lLm51bXIIdHdvLm51bXIKdGhyZWUubnVtcglmb3VyLm51bXIJZml2ZS5udW1yCHNpeC5udW1yCnNldmVuLm51bXIKZWlnaHQubnVtcgluaW5lLm51bXIHdW5pMjA3MAd1bmkwMEI5B3VuaTAwQjIHdW5pMDBCMwd1bmkyMDc0B3VuaTIwNzUHdW5pMjA3Ngd1bmkyMDc3B3VuaTIwNzgHdW5pMjA3OQd1bmkyMTVGB3VuaTIxODkHdW5pMjE1Mwd1bmkyMTU0B3VuaTIxNTUHdW5pMjE1Ngd1bmkyMTU3B3VuaTIxNTgHdW5pMjE1OQd1bmkyMTVBB3VuaTIxNTAJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1MQd1bmkyMTUyB3VuaTAwQUQHdW5pMDBBMARFdXJvB3VuaTIyMTUIZW1wdHlzZXQHdW5pMDBCNQdhcnJvd3VwB3VuaTIxOTcKYXJyb3dyaWdodAd1bmkyMTk4CWFycm93ZG93bgd1bmkyMTk5CWFycm93bGVmdAd1bmkyMTk2CWFycm93Ym90aAlhcnJvd3VwZG4HdW5pMDMwOAd1bmkwMzA3CWdyYXZlY29tYglhY3V0ZWNvbWIHdW5p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Ky2wgyyxAT4rsEIrLbCELLEAPysusTABFCstsIUssQA/K7BAKy2whiyxAD8rsEErLbCHLLEAPyuwQistsIgssQE/K7BAKy2wiSyxAT8rsEErLbCKLLEBPyuwQistsIsssgsAA0VQWLAGG7IEAgNFWCMhGyFZWUIrsAhlsAMkUHixBQEVRVgwWS0AAAAAAQAAAAoAOAB2AAJERkxUAB5sYXRuAA4ABAAAAAD//wADAAEAAwAFAAQAAAAA//8AAwAAAAIABAAGa2VybgA4a2VybgA4bWFyawAubWFyawAubWttawAmbWttawAmAAAAAgAEAAUAAAADAAEAAgADAAAAAQAAAAYPvA6QDgwBgAEiAA4ABgIAAAEACAABAQIAtAABANAADAAXAKIAnACWAJYAkACKAIQAfgB4AHIAbABmAGAAWgBUCXQATgBIAGAAQgA8ADYAMAABANQC6QABAH0CvAABAMgCvAABAJwCvQABAGgC2AABAMkC2AABALMCvwABAKQCvAABAGUCvAAB/50C0wAB/zgCvAAB/y0C6QAB/4QCvAAB/10CvAAB/00CvwAB/00CvAAB/2UCvQAB/5wCvAAB/5gC2AAB/zcC2AACAAQBigGVAAABnQGfAAwBoQGmAA8BqAGpABUADAAADsAAAA66AAAOtAAADrQAAA6uAAAOqAAADqIAAA6cAAAOlgAADpAAAA6KAAAOhAACAAEBigGVAAAABgEAAAEACAABAE4ANgABAEQADAAFACQAHgAYABIADAABAJ7/HgABALMCPAAB/2P/HgAB/53/IgAB/00CPAABAAUBkAGWAZcBnwGgAAIAAA32AAAN8AABAAIBlgGXAAQAAAABAAgAAQ4kC84ABAwyAAwA0Au8C7YLsAAAC7wLtguqAAALvAu2C6QAAAu8C7YLqgAAC7wLtgueAAALvAu2C6oAAAu8C7YLmAAAC7wLtguwAAALvAu2C6oAAAu8C7YLkgAAC4wLhguAAAALegAAC3QAAAt6AAALbgAAC3oAAAtoAAALYgAAAAAAAAt6AAALXAAAC1YAAAtQC0oLRAAACz4LOAtWAAALMgtKC0QAAAs+CzgNLgssCyYAAA0uCywLIAAADS4LLAsaAAANLgssCyAAAA0uCywLFAAADS4LLAsOAAANLgssCyAAAA0uCywLCAAADS4LLAsmAAALAgAACvwAAAsCAAAK9gAACvAAAAr8AAALAgAACuoAAArkAAAK3grYCuQAAAreCtgK0grMCsYAAArSCswKwAAACroKtAquAAAKqAqiCpwAAArSCswKlgAACtIKzArAAAAAAAqQCooAAArSCswKxgAACoQAAAp+AAAKeAAACn4AAApyAAAKbApmCnIAAApgCmYKcgAACloKZgpUAAAKbApmCk4AAApICkIKPAAACjYAAAo8AAAKMAAACjwAAAoqAAAKJAAACjYAAAo8AAAKNgAACjwAAAoeAAAKGAoSCgwKBgoYChIKAAoGChgKEgoACgYKGAoSCfoKBgoYChIKAAoGChgKEgn0CgYKGAoSCe4KBgoYChIKDAoGChgKEgnoCgYJ4gncCdYKBgnQAAAJygAACdAAAAnEAAAJ0AAACb4AAAm4AAAJygAACbIAAAmsAAAJsgAACaYAAAmyAAAJoAAACZoAAAAAAAAJlAAACawAAAmOAAAJiAmCCY4AAAmICYIJjgAACXwJggl2AAAAAAmCCXAAAAmICYIMmglqDKYAAAyaCWoJZAAADJoJaglkAAAMmglqCV4AAAyaCWoJZAAADJoJaglYAAAMmglqCVIAAAyaCWoMpgAADJoJaglkAAAJTAAACUYAAAlMAAAJQAAACUwAAAlAAAAJTAAACToAAAlMAAAJQAAACTQAAAkuAAAJNAAACSgAAAk0AAAJKAAACTQAAAkiAAAJNAAACSgAAAkcAAAJFgAACRwAAAkQAAAJHAAACQoAAAkcAAAJBAAACP4I+AjyAAAI/gj4COwAAAj+CPgI5gAACP4I+AjsAAAI/gj4COAAAAj+CPgI7AAACP4I+AjaAAAI/gj4CPIAAAj+CPgI7AAACP4I+AjUAAAIzgjICMIAAAi8AAAItgAACLwAAAiwAAAIvAAACKoAAAikAAAAAAAACLwAAAieAAAI/gAACOYImAj+AAAIkgiYCP4AAAjmCJgIjAiGCIAAAAiMCIYIegAACIwIhgh0AAAIjAiGCHoAAAiMCIYIbgAACIwIhghoAAAIjAiGCHoAAAiMCIYIYgAACIwIhgiAAAAIXAAACFYAAAhcAAAIUAAACFwAAAhKAAAIXAAACEQAAA0uAAAIPgg4CDIAAAgsCCYIIAgaCBQAAAggCBoIFAAACCAIGggOAAAKuggICAIAAAqoB/wH9gAA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' diff --git a/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts b/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts new file mode 100644 index 00000000..34b9b6ad --- /dev/null +++ b/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts @@ -0,0 +1 @@ +export default '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OqM6yDsKO0k7cTuPO6w7xzwVPEI8YDx9PJU8rTy3PME8yzzVPN886TzzPP09Bz0RPRs9JT0vPUgAAAAPALoAAwABBAkAAACwArIAAwABBAkAAQAkAo4AAwABBAkAAgAOAoAAAwABBAkAAwA4AkgAAwABBAkABAAkAo4AAwABBAkABQBCAgYAAwABBAkABgAiAeQAAwABBAkACAAQAdQAAwABBAkACQAQAdQAAwABBAkACwAmAa4AAwABBAkADAA4AXYAAwABBAkADQEgAFYAAwABBAkADgA0ACIAAwABBAkAEAAWAAwAAwABBAkAEQAMAAAATQBlAGQAaQB1AG0AVAB1AHIAcgBlAHQAIABSAG8AYQBkAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuACAAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQAvAG4AbwBwAG8AbgBpAGUAcwAvAGgAdAB0AHAAOgAvAC8AbgBvAHAAbwBuAGkAZQBzAC4AYwBvAG0ATgBvAHAAbwBuAGkAZQBzAFQAdQByAHIAZQB0AFIAbwBhAGQALQBNAGUAZABpAHUAbQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMAAxADsAIAB0AHQAZgBhAHUAdABvAGgAaQBuAHQAIAAoAHYAMQAuADgAKQAxAC4AMAAwADEAOwBOAE8AUABOADsAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAVAB1AHIAcgBlAHQAIABSAG8AYQBkACAATQBlAGQAaQB1AG0AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQA4ACAAVABoAGUAIABUAHUAcgByAGUAdAAgAFIAbwBhAGQAIABQAHIAbwBqAGUAYwB0ACAAQQB1AHQAaABvAHIAcwAgACgAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwBuAG8AcABvAG4AaQBlAHMALwB0AHUAcgByAGUAdAAtAHIAbwBhAGQAKQAAAAIAAAADAAAAFAADAAEAAAAUAAQE1AAAAIIAgAAGAAIADQAvADkAfgEHARMBGwEjAScBKwExATcBPgFIAU0BWwFnAWsBfgGSAhsCNwLHAt0DBAMIAwwDEgMoAzgDlAOpA7wDwB6FHvMgFCAaIB4gIiAmIDAgOiBEIHAgeSCsISIhXyGJIZkiAiIFIg8iEiIVIhoiHiIrIkgiYCJlJcr7Av//AAAADQAgADAAOgCgAQoBFgEeASYBKgEuATYBOQFBAUoBUAFeAWoBbgGSAhgCNwLGAtgDAAMGAwoDEgMmAzUDlAOpA7wDwB6AHvIgEyAYIBwgICAmIDAgOSBEIHAgdCCsISIhUCGJIZAiAiIFIg8iESIVIhoiHiIrIkgiYCJkJcr7Af////QAAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xAAA/msAAAAAAAAAAAAA/oP+cP5k/Vb9Qv0w/S0AAAAA4S8AAAAAAADhCeFC4RTg0uCc4JzgqeBiAADfkAAA323fZN9dAADfRN9U30zfQN8d3v8AANuzBeUAAQAAAIAAAACcASQB8gIEAg4CGAIaAhwCIgIkAi4CPAJCAlgCagJsAAACigAAAo4CkAKaAqICpgAAAAAAAAAAAAAAAAAAApwCpgAAAqYCqgKuAAAAAAAAAAAAAAAAAAAAAAKiAAACvgAAAAAAAALKAAAAAAAAAAAAAAAAAsAAAAAAAAAAAgEwAU8BNwFUAXEBfwFQAToBOwE2AVoBLAFAASsBOAEtAS4BYQFeAWABMgF+AAMADgAPABQAGAAhACIAJgAoADAAMQAzADgAOQA/AEkASwBMAFAAVQBaAGMAZABpAGoAbwE+ATkBPwFoAUQBpABzAH4AfwCEAIgAkQCSAJYAmAChAKMApQCqAKsAsQC7AL0AvgDCAMgAzQDWANcA3ADdAOIBPAGGAT0BZgFRATEBUgFXAVMBWAGHAYEBogGCAOgBSwFnAUEBgwGmAYUBZAEOAQ8BnQFwAYABNAGgAQ0A6QFMARwBGAEdATMACAAEAAYADAAHAAsADQASAB4AGQAbABwALQApACoAKwAVAD4AQwBAAEEARwBCAVwARgBeAFsAXABdAGsASgDHAHgAdAB2AHwAdwB7AH0AggCOAIkAiwCMAJ4AmgCbAJwAhQCwALUAsgCzALkAtAFdALgA0QDOAM8A0ADeALwA4AAJAHkABQB1AAoAegAQAIAAEwCDABEAgQAWAIYAFwCHAB8AjwAdAI0AIACQABoAigAjAJMAJQCVACQAlAAnAJcALgCfAC8AoAAsAJkAMgCkADQApgA2AKgANQCnADcAqQA6AKwAPACuADsArQA9AK8ARQC3AEQAtgBIALoATQC/AE8AwQBOAMAAUQDDAFMAxQBSAMQAWADLAFcAygBWAMkAYADTAGIA1QBfANIAYQDUAGYA2QBsAN8AbQBwAOMAcgDlAHEA5ABUAMYAWQDMAaEBnwGeAaMBqAGnAakBpQGMAY0BjwGTAZQBkQGLAYoBkgGOAZAAaADbAGUA2ABnANoAbgDhAUkBSgFFAUcBSAFGAYgBiQE1ASQBKQEqARoBGwEeAR8BIAEhASIBIwElASYBJwEoARcBeQFzAXUBdwF7AXwBegF0AXYBeAFtAVsBYwFiAkMAMgHCAAABkAAAAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAPxACgCfwAyArEALQKxAC0CsQAtArEALQKxAC0CrQAyAxwAMgKtADIDHAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAfgAKAKzACgCswAoArMAKAKzACgCWgAyAlr/5wClADIApQAkAVoAMgFjADIApQAmAKUAJAFMADIApQAfAaAAHgIeADICHgAyAcoAMgHKADIBygAyAcoAMgJYADIEAAAyAq4AMgKuADICrgAyAq4AMgKuADICrgAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyBC0AMgJxADICcQAyAsIAMgJyADICcgAyAnIAMgJyADICnQAoAp0AKAKdACgCnQAoAp0AKAJ1ACgCdQAoAnUAKAJ1ACgCdQAoAqQAMgKkADICpAAyAqQAMgKkADICpAAyAqQAMgKkADICpAAyAnsAKAPsACgD7AAoA+wAKAPsACgD7AAoApkAKAJ8ACgCfAAoAnwAKAJ8ACgCfAAoAmIAKAJiACgCYgAoAmIAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgD0AAoAjcAMgJCADICQgAyAkIAMgJCADICQgAyAjYAKAJxACgCNgAoAocAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAF3ACMCNgAoAjYAKAI2ACgCNgAoAhkAMgJjADIAoQAyAKEAMgChACABZAAyAWMAMgChACIAoQAgAUwAMgChABwAvgADAKoAAAHRADIB0QAyAScAMgEnACwBJ//aAScAMgG7ADIDDgAoAhoAMgIaADICGgAyAhoAMgIaADICGgAyAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoA70AKAI1ADICNQAyAjUAKAG2ADIBtgAyAbYAMgG2ADIB9wAoAfcAKAH3ACgB9wAoAfcAKAJ/ADIBhgAoAZAALQGGACgBhgAoAYYAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAILACgDDQAoAw0AKAMNACgDDQAoAw0AKAH1ACgCCwAoAgsAKAILACgCCwAoAgsAKAIVACgCFQAoAhUAKAIVACgCGAAjAp4AIwFuADIBYwAyAusAMgKkADICGQAoAggAKAKEACgBTgAoAooAKAIvACgCDwAoAosAKAIzAC0CRAAoAi8AKAI0ACgB0wAiAPcAIgHBABkBggAaAWwAGgHBABkBhQAeAZAAGQGCABoBhgAaAdMAIgD3ACIBwQAZAYIAGgFsABoBwQAZAYUAHgGQABkBggAaAYYAGgHTACIA9wAiAcEAGQGCABoBbAAaAcEAGQGFAB4BkAAZAYIAGgGGABoBPf+1AmYAIgQmACIEkgAiA+gAIgSAABkD0gAiBCsAGgQnACIEvwAZBIAAGgRqABoD6gAiBIIAGQP2ACID6AAiBEEAGgSAABkENgAZA+sAIgUvACIAoQAyAMUAIwCNACgAzgAjAc0AMgClADIApQAyArkAMgK5ADIAoQAy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APwBTgCJAFcBTwFQAVEBUgBYAH4AgACBAH8BUwFUAVUBVgBZAFoBVwFYAVkBWgBbAFwA7AFbALoBXABdAV0A5wFeAMAAwQCdAJ4BXwFgAWEAmwATABQAFQAWABcAGAAZABoAGwAcAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/ALwBgAD0AYEBggGDAPUA9gGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQABEADwAdAB4AqwAEAKMAIgCiAMMAhwANAAYAEgA/AAsADABeAGAAPgBAABABkQCyALMAQgDEAMUAtAC1ALYAtwCpAKoAvgC/AAUACgGSAIQAvQAHAZMApgCFAJYBlAAOAO8A8AC4ACAAjwAhAB8AlQCUAJMApwBhAKQAQQGVAJIAnACaAJkApQCYAZYACADGAZcBmAGZAZoBmwGcAZ0BngGfAaAAuQAjAAkAiACGAIsAigCMAIMAXwDoAIIAwgGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAI0A2wDhAN4A2ACOANwAQwDfANoA4ADdANkBtAZBYnJldmUHQW1hY3JvbgdBb2dvbmVrCkNkb3RhY2NlbnQGRGNhcm9uBkRjcm9hdAZFY2Fyb24KRWRvdGFjY2VudAdFbWFjcm9uB0VvZ29uZWsHdW5pMDEyMgpHZG90YWNjZW50BEhiYXIHSW1hY3JvbgdJb2dvbmVrB3VuaTAxMzYGTGFjdXRlBkxjYXJvbgd1bmkwMTNCBk5hY3V0ZQZOY2Fyb24HdW5pMDE0NQNFbmcNT2h1bmdhcnVtbGF1dAdPbWFjcm9uBlJhY3V0ZQZSY2Fyb24HdW5pMDE1NgZTYWN1dGUHdW5pMDIxOARUYmFyBlRjYXJvbgd1bmkwMTYyB3VuaTAyMUENVWh1bmdhcnVtbGF1dAdVbWFjcm9uB1VvZ29uZWsFVXJpbmcGV2FjdXRlC1djaXJjdW1mbGV4CVdkaWVyZXNpcwZXZ3JhdmULWWNpcmN1bWZsZXgGWWdyYXZlBlphY3V0ZQpaZG90YWNjZW50BmFicmV2ZQdhbWFjcm9uB2FvZ29uZWsKY2RvdGFjY2VudAZkY2Fyb24GZWNhcm9uCmVkb3RhY2NlbnQHZW1hY3Jvbgdlb2dvbmVrB3VuaTAxMjMKZ2RvdGFjY2VudARoYmFyCWkubG9jbFRSSwdpbWFjcm9uB2lvZ29uZWsHdW5pMDIzNwd1bmkwMTM3BmxhY3V0ZQZsY2Fyb24HdW5pMDEzQwZuYWN1dGUGbmNhcm9uB3VuaTAxNDYDZW5nDW9odW5nYXJ1bWxhdXQHb21hY3JvbgZyYWN1dGUGcmNhcm9uB3VuaTAxNTcGc2FjdXRlB3VuaTAyMTkEdGJhcgZ0Y2Fyb24HdW5pMDE2Mwd1bmkwMjFCDXVodW5nYXJ1bWxhdXQHdW1hY3Jvbgd1b2dvbmVrBXVyaW5nBndhY3V0ZQt3Y2lyY3VtZmxleAl3ZGllcmVzaXMGd2dyYXZlC3ljaXJjdW1mbGV4BnlncmF2ZQZ6YWN1dGUKemRvdGFjY2VudAd1bmkwMzk0B3VuaTAzQTkHdW5pMDNCQwl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yB3VuaTIwNzAHdW5pMDBCOQd1bmkwMEIyB3VuaTAwQjMHdW5pMjA3NAd1bmkyMDc1B3VuaTIwNzYHdW5pMjA3Nwd1bmkyMDc4B3VuaTIwNzkHdW5pMjE1Rgd1bmkyMTg5B3VuaTIxNTMHdW5pMjE1NAd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU4B3VuaTIxNTkHdW5pMjE1QQd1bmkyMTUwCW9uZWVpZ2h0aAx0aHJlZWVpZ2h0aHMLZml2ZWVpZ2h0aHMMc2V2ZW5laWdodGhzB3VuaTIxNTEHdW5pMjE1Mgd1bmkwMEFEB3VuaTAwQTAERXVybwd1bmkyMjE1CGVtcHR5c2V0B3VuaTAwQjUHYXJyb3d1cAd1bmkyMTk3CmFycm93cmlnaHQHdW5pMjE5OAlhcnJvd2Rvd24HdW5pMjE5OQlhcnJvd2xlZnQHdW5pMjE5NglhcnJvd2JvdGgJYXJyb3d1cGRuB3VuaTAzMDgHdW5pMDMwNwlncmF2ZWNvbWIJYWN1dGVjb21iB3VuaTAzMEIHdW5pMDMwMgd1bmkwMzBDB3VuaTAzMDYHdW5pMDMwQQl0aWxkZWNvbWIHdW5pMDMwNAd1bmkwMzEyB3VuaTAzMjYHdW5pMDMyNwd1bmkwMzI4B3VuaTAzMzUHdW5pMDMzNgd1bmkwMzM3B3VuaTAzMzgMdW5pMDMzOC5jYXNlALAALCCwAFVYRVkgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbkIAAgAY2MjYhshIbAAWbAAQyNEsgABAENgQi2wASywIGBmLbACLCMhIyEtsAMsIGSzAxQVAEJDsBNDIGBgQrECFENCsSUDQ7ACQ1R4ILAMI7ACQ0NhZLAEUHiyAgICQ2BCsCFlHCGwAkNDsg4VAUIcILACQyNCshMBE0NgQiOwAFBYZVmyFgECQ2BCLbAELLADK7AVQ1gjISMhsBZDQyOwAFBYZVkbIGQgsMBQsAQmWrIoAQ1DRWNFsAZFWCGwAyVZUltYISMhG4pYILBQUFghsEBZGyCwOFBYIbA4WVkgsQENQ0VjRWFksChQWCGxAQ1DRWNFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwAiWwDENjsABSWLAAS7AKUFghsAxDG0uwHlBYIbAeS2G4EABjsAxDY7gFAGJZWWRhWbABK1lZI7AAUFhlWVkgZLAWQyNCWS2wBSwgRSCwBCVhZCCwB0NQWLAHI0KwCCNCGyEhWbABYC2wBiwjISMhsAMrIGSxB2JCILAII0KwBkVYG7EBDUNFY7EBDUOwA2BFY7AFKiEgsAhDIIogirABK7EwBSWwBCZRWGBQG2FSWVgjWSFZILBAU1iwASsbIbBAWSOwAFBYZVktsAcssAlDK7IAAgBDYEItsAgssAkjQiMgsAAjQmGwAmJmsAFjsAFgsAcqLbAJLCAgRSCwDkNjuAQAYiCwAFBYsEBgWWawAWNgRLABYC2wCiyyCQ4AQ0VCKiGyAAEAQ2BCLbALLLAAQyNEsgABAENgQi2wDCwgIEUgsAErI7AAQ7AEJWAgRYojYSBkILAgUFghsAAbsDBQWLAgG7BAWVkjsABQWGVZsAMlI2FERLABYC2wDSwgIEUgsAErI7AAQ7AEJWAgRYojYSBksCRQWLAAG7BAWSOwAFBYZVmwAyUjYUREsAFgLbAOLCCwACNCsw0MAANFUFghGyMhWSohLbAPLLECAkWwZGFELbAQLLABYCAgsA9DSrAAUFggsA8jQlmwEENKsABSWCCwECNCWS2wESwgsBBiZrABYyC4BABjiiNhsBFDYCCKYCCwESNCIy2wEixLVFixBGREWSSwDWUjeC2wEyxLUVhLU1ixBGREWRshWSSwE2UjeC2wFCyxABJDVVixEhJDsAFhQrARK1mwAEOwAiVCsQ8CJUKxEAIlQrABFiMgsAMlUFixAQBDYLAEJUKKiiCKI2GwECohI7ABYSCKI2GwECohG7EBAENgsAIlQrACJWGwECohWbAPQ0ewEENHYLACYiCwAFBYsEBgWWawAWMgsA5DY7gEAGIgsABQWLBAYFlmsAFjYLEAABMjRLABQ7AAPrIBAQFDYEItsBUsALEAAkVUWLASI0IgRbAOI0KwDSOwA2BCILAUI0IgYLABYbcYGAEAEQATAEJCQopgILAUQ2CwFCNCsRQIK7CLKxsiWS2wFiyxABUrLbAXLLEBFSstsBgssQIVKy2wGSyxAxUrLbAaLLEEFSstsBsssQUVKy2wHCyxBhUrLbAdLLEHFSstsB4ssQgVKy2wHyyxCRUrLbArLCMgsBBiZrABY7AGYEtUWCMgLrABXRshIVktsCwsIyCwEGJmsAFjsBZgS1RYIyAusAFxGyEhWS2wLSwjILAQYmawAWOwJmBLVFgjIC6wAXIbISFZLbAgLACwDyuxAAJFVFiwEiNCIEWwDiNCsA0jsANgQiBgsAFhtRgYAQARAEJCimCxFAgrsIsrGyJZLbAhLLEAICstsCIssQEgKy2wIyyxAiArLbAkLLEDICstsCUssQQgKy2wJiyxBSArLbAnLLEGICstsCgssQcgKy2wKSyxCCArLbAqLLEJICstsC4sIDywAWAtsC8sIGCwGGAgQyOwAWBDsAIlYbABYLAuKiEtsDAssC8rsC8qLbAxLCAgRyAgsA5DY7gEAGIgsABQWLBAYFlmsAFjYCNhOCMgilVYIEcgILAOQ2O4BABiILAAUFiwQGBZZrABY2AjYTgbIVktsDIsALEAAkVUWLEOBkVCsAEWsDEqsQUBFUVYMFkbIlktsDMsALAPK7EAAkVUWLEOBkVCsAEWsDEqsQUBFUVYMFkbIlktsDQsIDWwAWAtsDUsALEOBkVCsAFFY7gEAGIgsABQWLBAYFlmsAFjsAErsA5DY7gEAGIgsABQWLBAYFlmsAFjsAErsAAWtAAAAAAARD4jOLE0ARUqIS2wNiwgPCBHILAOQ2O4BABiILAAUFiwQGBZZrABY2CwAENhOC2wNywuFzwtsDgsIDwgRyCwDkNjuAQAYiCwAFBYsEBgWWawAWNgsABDYbABQ2M4LbA5LLECABYlIC4gR7AAI0KwAiVJiopHI0cjYSBYYhshWbABI0KyOAEBFRQqLbA6LLAAFrAXI0KwBCWwBCVHI0cjYbEMAEKwC0MrZYouIyAgPIo4LbA7LLAAFrAXI0KwBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgsApDIIojRyNHI2EjRmCwBkOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILAEQ2BkI7AFQ2FkUFiwBENhG7AFQ2BZsAMlsAJiILAAUFiwQGBZZrABY2EjICCwBCYjRmE4GyOwCkNGsAIlsApDRyNHI2FgILAGQ7ACYiCwAFBYsEBgWWawAWNgIyCwASsjsAZDYLABK7AFJWGwBSWwAmIgsABQWLBAYFlmsAFjsAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wPCywABawFyNCICAgsAUmIC5HI0cjYSM8OC2wPSywABawFyNCILAKI0IgICBGI0ewASsjYTgtsD4ssAAWsBcjQrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWG5CAAIAGNjIyBYYhshWWO4BABiILAAUFiwQGBZZrABY2AjLiMgIDyKOCMhWS2wPyywABawFyNCILAKQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbBALCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrLbBBLCMgLkawAiVGsBdDWFIbUFlYIDxZLrEwARQrLbBCLCMgLkawAiVGsBdDWFAbUllYIDxZIyAuRrACJUawF0NYUhtQWVggPFkusTABFCstsEMssDorIyAuRrACJUawF0NYUBtSWVggPFkusTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAAAAAAEAAAAKADgAeAACREZMVAAebGF0bgAOAAQAAAAA//8AAwABAAMABQAEAAAAAP//AAMAAAACAAQABmtlcm4AOGtlcm4AOG1hcmsALm1hcmsALm1rbWsAJm1rbWsAJgAAAAIABQAGAAAAAwACAAMABAAAAAIAAAABAAcR/g+gDnoN9gGCASQAEAAGAgAAAQAIAAEBAgC0AAEA0AAMABcAogCcAJYAlgCQAIoAhAB+AHgAcgBsAGYAYABaAFQJbgBOAEgAYABCADwANgAwAAEA0wLlAAEAfQK8AAEAzAK8AAEAkgK9AAEAXwLKAAEAsgLKAAEAsgK+AAEAmAK8AAEAYAK8AAH/oQLIAAH/RgK8AAH/LgLlAAH/hAK8AAH/aQK8AAH/TgK+AAH/TgK8AAH/bgK9AAH/oQK8AAH/ogLKAAH/TwLKAAIABAGKAZUAAAGdAZ8ADAGhAaYADwGoAakAFQAMAAAOogAADpwAAA6WAAAOlgAADpAAAA6KAAAOhAAADn4AAA54AAAOcgAADmwAAA6WAAIAAQGKAZUAAAAGAQAAAQAIAAEATgA2AAEARAAMAAUAJAAeABgAEgAMAAEAm/8eAAEAsgI8AAH/Zf8eAAH/of85AAH/TgI8AAEABQGQAZYBlwGfAaAAAgAADd4AAA3YAAEAAgGWAZcABAAAAAEACAABDgYLtgAEDBoADADQC6QLnguYAAALpAueC5IAAAukC54LjAAAC6QLnguSAAALpAueC4YAAAukC54LkgAAC6QLnguAAAALpAueC5gAAAukC54LkgAAC6QLngt6AAALdAtuC2gAAAtiAAALXAAAC2IAAAtWAAALYgAAC1AAAAtKAAAAAAAAC2IAAAtEAAALPgAACzgLMgssAAALJgsgCz4AAAsaCzILLAAACyYLIAsUCw4LCAAACxQLDgsCAAALFAsOCvwAAAsUCw4LAgAACxQLDgr2AAALFAsOCvYAAAsUCw4LAgAACxQLDgrwAAALFAsOCwgAAArqAAAK5AAACuoAAAreAAAK2AAACuQAAArqAAAK0gAACswAAArGCsAKzAAACsYKwAq6CrQKrgAACroKtAqoAAAKogqcCpYAAAqiCpwKkAAACroKtAqKAAAKugq0CqgAAAAACoQKfgAACroKtAquAAAKeAAACnIAAApsAAAKcgAACmYAAApgCloKZgAAClQKWgpmAAAKTgpaCkgAAApgCloKQgAACjwKNgowAAAKKgAACjAAAAokAAAKMAAACh4AAAoYAAAKKgAACjAAAAoqAAAKMAAAChIAAAoMCgYKAAn6CgwKBgn0CfoKDAoGCfQJ+goMCgYJ7gn6CgwKBgn0CfoKDAoGCegJ+goMCgYJ4gn6CgwKBgoACfoKDAoGCdwJ+gnWCdAJygn6CcQAAAm+AAAJxAAACbgAAAnEAAAJsgAACawAAAm+AAAJpgAACaAAAAmmAAAJmgAACaYAAAmUAAAJjgAAAAAAAAmIAAAJoAAACYIAAAl8CXYJggAACXwJdgmCAAAJcAl2CWoAAAAACXYJZAAACXwJdgyCCV4MjgAADIIJXglYAAAMggleCVgAAAyCCV4JUgAADIIJXglYAAAMggleCUwAAAyCCV4JRgAADIIJXgyOAAAMggleCVgAAAlAAAAJOgAACUAAAAk0AAAJQAAACTQAAAlAAAAJLgAACUAAAAk0AAAJKAAACSIAAAkoAAAJHAAACSgAAAkcAAAJKAAACRYAAAkoAAAJHAAACRAAAAkKAAAJEAAACQQAAAkQAAAI/gAACRAAAAj4AAAI8gjsCOYAAAjyCOwI4AAACPII7AjaAAAI8gjsCOAAAAjyCOwI1AAACPII7AjgAAAI8gjsCM4AAAjyCOwI5gAACPII7AjgAAAI8gjsCMgAAAjCCLwItgAACLAAAAiqAAAIsAAACKQAAAiwAAAIngAACJgAAAAAAAAIsAAACJIAAAjyAAAIjAiGCPIAAAiACIYI8gAACIwIhgh6CHQIbgAACHoIdAhoAAAIegh0CGIAAAh6CHQIaAAACHoIdAhcAAAIegh0CFwAAAh6CHQIaAAACHoIdAhWAAAIegh0CG4AAAhQAAAISgAACFAAAAhEAAAIUAAACD4AAAhQAAAIOAAA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AMIAxQACAM0A4gABAAIABQAxADEAAQAzADMAAgBJAEkAAwBVAFUABABqAGoABQABADIABAAAABQBagFQAUoBOAEeAOgA4gDYANIBSgDAALIAqACiAJgAjgB8AGoAZABeAAEAFAADACEAMQAzAEkAVQBaAGMAZABpAGoAbwCRAJsApQCxAL4AyADdAUcAAQAw/84AAQEs//YABACq//YBK//iASz/4QEu/+wABADI//EBK//dASz/0wEu/8kAAgEs//YBLv/2AAIAkf/TAN3/4gABAKUAFAACASv/8QEs/84AAwCbABkAnAAKAJ4ADwAEASv/5wEs/7oBLv/JAS//4gABASz/8AACAJsAGQEs/+cAAQCaAAoADQAD/84AD//2ABj/9gCY/+UAmf/iAJv/8QCq/84A0P/JASv/5wEs/8IBLf/sAS7/xAEv/+IABgAD/+cAMP+cAKH/9gEs/78BLv/iAS//xAAEAFX/sABj/+cAav/dAUj/3QABAN3/7AAGADD/nACY//EAof/sAKr/7AEs/90BLv/nAAIAVf/nAGr/5wACAAgAAQAIAAEAEAAEAAAAAwAmACAAGgABAAMBAwEJARYAAQD5AAAAAQEW/+cAAQEWADIAAAACADL/gAIRApgAAwAHACJAHwABAAIDAQJnAAMAAANXAAMDAF8AAAMATxERERAEBhorBSERIQchESECEf4hAd85/pQBbIADGDj9WAAAAgAoAAACUQK8AAkADwA2QDMNCggFBAUEAUwABQAAAQUAZwAEBAJfAAICJk0GAwIBAScBTgAADw4MCwAJAAkSEREHCBkrITUhFSMREzMTEQMDIwMVIQIP/ltC4VjwRM8RwgGi8vIBWQFj/pv+qQFGATP+zhMA//8AKAAAAlEDmgAiAAMAAAEHAY0BnADeAAixAgGw3rA1KwAA//8AKAAAAlEDgQAiAAMAAAEHAZEB1ADFAAixAgGwxbA1KwAA//8AKAAAAlEDmgAiAAMAAAEHAY8B7wDeAAixAgGw3rA1KwAA//8AKAAAAlEDUwAiAAMAAAEHAYoB7wCJAAixAgKwibA1KwAA//8AKAAAAlEDmgAiAAMAAAEHAYwBnADeAAixAgGw3rA1KwAA//8AKAAAAlEDRwAiAAMAAAEHAZQB9wCLAAixAgGwi7A1KwAAAAIAKP9RAoMCvAASABgASUBG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AdoCvAALADBALQgBAgAEAUwAAAABAgABZwUBBAQDXwADAyZNAAICJwJOAAAACwALEhEREgYIGisTBxUhFSERIxE3IRWrQAEY/uhDYQFRAnlUoUP+vwI8gEMAAAEAKAAAAosCvAATADlANgoHBgMEBQITDgsCBAMEAkwABQAEAwUEZwACAgFfAAEBJk0AAwMAXwAAACcAThESExMTEAYIHCshIScRNyEXBychBxEXITc1IzUzFQIo/mJiYgGeXDZH/qRAQAFcQY3QggG5gXgpXlX+dVZWT0Sq//8AKAAAAosDgQAiACIAAAEHAZEB8QDFAAixAQGwxbA1KwAA//8AKP85AosCvAAiACIAAAADAZYBuQAA//8AKAAAAosDUwAiACIAAAEHAYsBuQCJAAixAQGwibA1KwAAAAEAMgAAAigCvAALACdAJAADAAABAwBnBAECAiZNBgUCAQEnAU4AAAALAAsREREREQcIGyshESERIxEzESERMxEB5v6OQkIBckIBP/7BArz+xgE6/UQAAv/nAAACcgK8ABMAFwA2QDMJBwIFCgQCAAsFAGcACwACAQsCZwgBBgYmTQMBAQEnAU4XFhUUExIRERERERERERAMCB8rASMRIxEhESMRIzUzNTMVITUzFTMHIRUhAnJKQv6OQktLQgFyQkqM/o4BcgIf/eEBP/7BAh80aWlpaTSdAAEAMgAAAHMCvAADABlAFgAAACZNAgEBAScBTgAAAAMAAxEDCBcrMxEzETJBArz9RAD//wAkAAAAfwOaACIAKAAAAQcBjQCxAN4ACLEBAbDesDUrAAD//wAyAAABMgOaACIAKGAAAQcBjwFkAN4ACLEBAbDesDUrAAD//wAyAAABMQNUACIAKF8AAQcBigFjAIoACLEBArCKsDUrAAD//wAmAAAAfwNTACIAKAAAAQcBiwCxAIkACLEBAbCJsDUrAAD//wAkAAAAfwOaACIAKAAAAQcBjACxAN4ACLEBAbDesDUrAAAAAgAyAAABGgNHAAMABwAjQCAAAAABAgABZwACAiZNBAEDAycDTgQEBAcEBxIREAUIGSsTMxUjExEzETLo6FRBA0cq/OMCvP1EAAABAB//UQCqArwADAAlQCIKCAQDBAIBAUwDAQIAAAIAYwABASYBTgAAAAwADBQRBAgYKxcVIyc3IxEzESMHFxeqUTob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' diff --git a/packages/spore/src/dob/render/index.ts b/packages/spore/src/dob/render/index.ts new file mode 100644 index 00000000..3248306b --- /dev/null +++ b/packages/spore/src/dob/render/index.ts @@ -0,0 +1,10 @@ +export * from './render-by-dob-decode-response' +export * from './traits-parser' +export * from './svg-to-base64' +export * from './render-text-svg' +export * from './render-text-params-parser' +export * from './render-image-svg' +export * from './types' +export * from './render-by-token-key' +export * from './render-dob-bit' +export { config } from './config' diff --git a/packages/spore/src/dob/render/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/render-by-dob-decode-response.ts new file mode 100644 index 00000000..616e444a --- /dev/null +++ b/packages/spore/src/dob/render/render-by-dob-decode-response.ts @@ -0,0 +1,36 @@ +import type { DobDecodeResult, RenderPartialOutput } from './types' +import { traitsParser } from './traits-parser' +import { renderTextParamsParser } from './render-text-params-parser' +import type { RenderProps } from './render-text-svg' +import { renderTextSvg } from './render-text-svg' +import { renderImageSvg } from './render-image-svg' +import { renderDob1Svg } from './render-dob1-svg' +import { Key } from './constants/key' + +export function renderByDobDecodeResponse( + dob0Data: DobDecodeResult | string, + props?: Pick & { + outputType?: 'svg' + }, +) { + if (typeof dob0Data === 'string') { + dob0Data = JSON.parse(dob0Data) as DobDecodeResult + } + if (typeof dob0Data.render_output === 'string') { + dob0Data.render_output = JSON.parse( + dob0Data.render_output, + ) as RenderPartialOutput[] + } + const { traits, indexVarRegister } = traitsParser(dob0Data.render_output) + for (const trait of traits) { + if (trait.name === 'prev.type' && trait.value === 'image') { + return renderImageSvg(traits) + } + // TODO: multiple images + if (trait.name === Key.Image && trait.value instanceof Promise) { + return renderDob1Svg(trait.value) + } + } + const renderOptions = renderTextParamsParser(traits, indexVarRegister) + return renderTextSvg({ ...renderOptions, font: props?.font }) +} diff --git a/packages/spore/src/dob/render/render-by-token-key.ts b/packages/spore/src/dob/render/render-by-token-key.ts new file mode 100644 index 00000000..67945d70 --- /dev/null +++ b/packages/spore/src/dob/render/render-by-token-key.ts @@ -0,0 +1,13 @@ +import { dobDecode } from './api/dobDecode' +import type { RenderProps } from './render-text-svg' +import { renderByDobDecodeResponse } from './render-by-dob-decode-response' + +export async function renderByTokenKey( + tokenKey: string, + options?: Pick & { + outputType?: 'svg' + }, +) { + const dobDecodeResponse = await dobDecode(tokenKey) + return renderByDobDecodeResponse(dobDecodeResponse.result, options) +} diff --git a/packages/spore/src/dob/render/render-dob-bit.ts b/packages/spore/src/dob/render/render-dob-bit.ts new file mode 100644 index 00000000..e18e7772 --- /dev/null +++ b/packages/spore/src/dob/render/render-dob-bit.ts @@ -0,0 +1,108 @@ +import satori from 'satori' +import type { DobDecodeResult, RenderPartialOutput } from './types' +import { traitsParser } from './traits-parser' +import { base64ToArrayBuffer } from './utils/string' +import SpaceGroteskBoldBase64 from './fonts/SpaceGrotesk-Bold.base64' + +const iconBase64 = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNTA0XzI4OCkiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAwMCAwSDBWMTAwMEgxMDAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTAwIDY0NS42NjlDNjE1LjE1NyA2NDUuNjY5IDcwOC42NjEgNTUyLjE2NSA3MDguNjYxIDQzNy4wMDhDNzA4LjY2MSAzOTAuMDkyIDY5My4yNDIgMzQ2Ljc4NSA2NjYuOTk1IDMxMi4wMDhDNjkyLjI1NyAyOTIuNjUxIDcwOC42NjEgMjYyLjQ2NyA3MDguNjYxIDIyOC4zNDZINTAwQzM4NC44NDMgMjI4LjM0NiAyOTEuMzM5IDMyMS44NSAyOTEuMzM5IDQzNy4wMDhDMjkxLjMzOSA1NTEuODM3IDM4NS4xNzEgNjQ1LjY2OSA1MDAgNjQ1LjY2OVpNNTAwIDMyMy44MTlDNTYyLjMzNiAzMjMuODE5IDYxMy4xODkgMzc0LjY3MiA2MTMuMTg5IDQzNy4wMDhDNjEzLjE4OSA0OTkuMzQ0IDU2Mi4zMzYgNTUwLjE5NyA1MDAgNTUwLjE5N0M0MzcuNjY0IDU1MC4xOTcgMzg2LjgxMSA0OTkuMzQ0IDM4Ni44MTEgNDM3LjAwOEMzODYuODExIDM3NC42NzIgNDM3LjY2NCAzMjMuODE5IDUwMCAzMjMuODE5WiIgZmlsbD0iIzAwREY5QiIvPgo8cGF0aCBkPSJNNTAwIDgxMS4zNTJDNDA0LjE5OSA4MTEuMzUyIDMwOC4zOTkgNzc0LjkzNCAyMzUuMjM2IDcwMS43NzJDMjQ2LjcxOSA2NzEuNTg4IDI3MS45ODIgNjQ2LjY1NCAzMDUuNzc0IDYzNy4xMzlDMzU5LjkwOCA2ODkuNjMzIDQyOS43OSA3MTUuODc5IDUwMCA3MTUuODc5QzU3MC4yMSA3MTUuODc5IDY0MC4wOTIgNjg5LjYzMyA2OTQuMjI2IDYzNy4xMzlDNzI4LjAxOCA2NDYuNjU0IDc1My4yODEgNjcxLjI2IDc2NC43NjQgNzAxLjc3MkM2OTEuOTI5IDc3NC42MDYgNTk1LjgwMSA4MTEuMzUyIDUwMCA4MTEuMzUyWiIgZmlsbD0iIzI0NzFGRSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzUwNF8yODgiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=' + +export function renderDobBit( + dob0Data: DobDecodeResult | string, + props?: { + outputType?: 'svg' + }, +) { + if (typeof dob0Data === 'string') { + dob0Data = JSON.parse(dob0Data) as DobDecodeResult + } + if (typeof dob0Data.render_output === 'string') { + dob0Data.render_output = JSON.parse( + dob0Data.render_output, + ) as RenderPartialOutput[] + } + const { traits } = traitsParser(dob0Data.render_output) + const account = traits.find((trait) => trait.name === 'Account')?.value ?? '-' + let fontSize = 76 + if (typeof account === 'string') { + if (account.length > 10) { + fontSize = fontSize / 2 + } + if (account.length > 20) { + fontSize = fontSize / 2 + } + if (account.length > 30) { + fontSize = fontSize * 0.75 + } + } + const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64) + return satori( + { + key: 'container', + type: 'div', + props: { + style: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + width: '500px', + background: '#3A3A43', + color: '#fff', + height: '500px', + textAlign: 'center', + }, + children: [ + { + type: 'img', + props: { + src: iconBase64, + width: 100, + height: 100, + style: { + width: '100px', + height: '100px', + borderRadius: '100%', + marginBottom: '40px', + }, + }, + }, + { + type: 'div', + props: { + children: account, + style: { + marginBottom: '20px', + fontSize: `${fontSize}px`, + textAlign: 'center', + }, + }, + }, + { + type: 'div', + props: { + children: '.bit', + style: { + fontSize: '44px', + padding: '4px 40px', + borderRadius: '200px', + background: 'rgba(255, 255, 255, 0.10)', + }, + }, + }, + ], + }, + }, + { + width: 500, + height: 500, + fonts: [ + { + name: 'SpaceGrotesk', + data: spaceGroteskBoldFont, + weight: 700, + }, + ], + }, + ) +} diff --git a/packages/spore/src/dob/render/render-dob1-svg.ts b/packages/spore/src/dob/render/render-dob1-svg.ts new file mode 100644 index 00000000..1b101f57 --- /dev/null +++ b/packages/spore/src/dob/render/render-dob1-svg.ts @@ -0,0 +1,53 @@ +import { type INode, stringify } from 'svgson' +import satori from 'satori' +import { svgToBase64 } from './svg-to-base64' +import { base64ToArrayBuffer } from './utils/string' +import SpaceGroteskBoldBase64 from './fonts/SpaceGrotesk-Bold.base64' + +export async function renderDob1Svg(nodePromise: Promise) { + const node = await nodePromise + const str = stringify(node) + const base64 = await svgToBase64(str) + const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64) + const width = parseInt(node.attributes.width, 10) || 500 + const height = parseInt(node.attributes.height, 10) || 500 + + return satori( + { + key: 'container', + type: 'div', + props: { + style: { + display: 'flex', + width: `${width}px`, + height: `${width}px`, + }, + children: [ + { + type: 'img', + props: { + src: base64, + width, + height, + style: { + width: `${width}px`, + height: `${height}px`, + }, + }, + }, + ], + }, + }, + { + width, + height, + fonts: [ + { + name: 'SpaceGrotesk', + data: spaceGroteskBoldFont, + weight: 700, + }, + ], + }, + ) +} diff --git a/packages/spore/src/dob/render/render-image-svg.ts b/packages/spore/src/dob/render/render-image-svg.ts new file mode 100644 index 00000000..d51933f6 --- /dev/null +++ b/packages/spore/src/dob/render/render-image-svg.ts @@ -0,0 +1,60 @@ +import satori from 'satori' +import type { ParsedTrait } from './traits-parser' +import { config } from './config' +import { backgroundColorParser } from './background-color-parser' +import { processFileServerResult } from './utils/mime' +import { isBtcFs, isIpfs } from './utils/string' + +export async function renderImageSvg(traits: ParsedTrait[]): Promise { + const prevBg = traits.find((trait) => trait.name === 'prev.bg') + const bgColor = backgroundColorParser(traits, { defaultColor: '#FFFFFF00' }) + + let bgImage = '' + if (prevBg?.value && typeof prevBg.value === 'string') { + if (isBtcFs(prevBg.value)) { + const btcFsResult = await config.queryBtcFsFn(prevBg.value) + bgImage = processFileServerResult(btcFsResult) + } else if (isIpfs(prevBg.value)) { + const ipfsFsResult = await config.queryIpfsFn(prevBg.value) + bgImage = processFileServerResult(ipfsFsResult) + } else if (prevBg.value.startsWith('https://')) { + bgImage = prevBg.value + } + } + + return satori( + { + key: 'container', + type: 'div', + props: { + style: { + display: 'flex', + width: '500px', + background: bgColor ?? '#000', + color: '#fff', + height: '500px', + justifyContent: 'center', + alignItems: 'center', + overflow: 'hidden', + }, + children: [ + bgImage + ? { + key: 'bg_image', + type: 'img', + props: { + src: bgImage, + style: { + objectFit: 'contain', + maxWidth: '100%', + maxHeight: '100%', + }, + }, + } + : null, + ], + }, + }, + { width: 500, height: 500, fonts: [] }, + ) +} diff --git a/packages/spore/src/dob/render/render-text-params-parser.ts b/packages/spore/src/dob/render/render-text-params-parser.ts new file mode 100644 index 00000000..ac2eaf1e --- /dev/null +++ b/packages/spore/src/dob/render/render-text-params-parser.ts @@ -0,0 +1,120 @@ +import type { ParsedTrait } from './traits-parser' +import { backgroundColorParser } from './background-color-parser' +import { GLOBAL_TEMPLATE_REG, TEMPLATE_REG } from './constants/regex' +import { ParsedStyleFormat, styleParser } from './style-parser' +import { Key } from './constants/key' + +export const DEFAULT_TEMPLATE = `%k: %v` + +export function renderTextParamsParser( + traits: ParsedTrait[], + indexVarRegister: Record, + options?: { + defaultTemplate?: string + }, +) { + const bgColor = backgroundColorParser(traits, { defaultColor: '#000' }) + let template = options?.defaultTemplate ?? DEFAULT_TEMPLATE + let style = styleParser('') + + const globalTemplateTrait = traits.find((trait) => + GLOBAL_TEMPLATE_REG.test(trait.name), + ) + if (globalTemplateTrait) { + if (typeof globalTemplateTrait.value === 'string') { + let { value } = globalTemplateTrait + if (!value.startsWith('<') && !value.endsWith('>')) { + value = `<${value}>` + } + style = styleParser(value) + } + const matchTemplate = globalTemplateTrait.name.match(TEMPLATE_REG)?.[2] + if (matchTemplate) { + template = matchTemplate + } + } + + const items = traits + .filter( + (trait) => + !trait.name.startsWith(Key.Prev) && + typeof trait.value !== 'undefined' && + !(trait.name in indexVarRegister) && + trait.name !== Key.Image, + ) + .map((trait) => { + let currentTemplate = template + let parsedStyle = style + let { name, value } = trait + if (typeof value === 'string') { + const currentLayoutMatch = value.match(TEMPLATE_REG) + if (currentLayoutMatch) { + if (currentLayoutMatch[1]) { + ;[, value] = currentLayoutMatch + } + if (currentLayoutMatch[2]) { + parsedStyle = styleParser(`<${currentLayoutMatch[2]}>`, { + baseStyle: JSON.parse(JSON.stringify(parsedStyle)), + }) + } + } + } + + const currentTemplateMatch = name.match(TEMPLATE_REG) + if (currentTemplateMatch && currentTemplateMatch[2]) { + if (currentTemplateMatch[1]) { + name = currentTemplateMatch[1] + } + if (currentTemplateMatch[2]) { + currentTemplate = currentTemplateMatch[2] + } + } + + const text = currentTemplate + .replace(/%k/g, name) + .replace(/%v/g, `${value}`) + .replace(/%%/g, '%') + + const styleCss: { + textAlign?: string + color?: string + fontWeight?: string + fontStyle?: string + textDecoration?: string + } = {} + if (parsedStyle.alignment) { + styleCss.textAlign = parsedStyle.alignment + } + if (parsedStyle.color) { + styleCss.color = parsedStyle.color + } + if (parsedStyle.format) { + if (parsedStyle.format.includes(ParsedStyleFormat.Bold)) { + styleCss.fontWeight = '700' + } + if (parsedStyle.format.includes(ParsedStyleFormat.Italic)) { + styleCss.fontStyle = 'italic' + } + if (parsedStyle.format.includes(ParsedStyleFormat.Underline)) { + styleCss.textDecoration = 'underline' + } + if (parsedStyle.format.includes(ParsedStyleFormat.Strikethrough)) { + styleCss.textDecoration = 'line-through' + } + } + + return { + name, + value, + parsedStyle, + template: currentTemplate, + text, + style: styleCss, + } + }) + + return { + items, + bgColor, + } +} diff --git a/packages/spore/src/dob/render/render-text-svg.ts b/packages/spore/src/dob/render/render-text-svg.ts new file mode 100644 index 00000000..4c87a3c9 --- /dev/null +++ b/packages/spore/src/dob/render/render-text-svg.ts @@ -0,0 +1,123 @@ +import satori from 'satori' +import type { renderTextParamsParser } from './render-text-params-parser' +import { base64ToArrayBuffer } from './utils/string' +import TurretRoadBoldBase64 from './fonts/TurretRoad-Bold.base64' +import TurretRoadMediumBase64 from './fonts/TurretRoad-Medium.base64' +import type { RenderElement } from './types/internal' + +const TurretRoadMediumFont = base64ToArrayBuffer(TurretRoadMediumBase64) +const TurretRoadBoldFont = base64ToArrayBuffer(TurretRoadBoldBase64) + +export interface RenderProps extends ReturnType { + font?: { + regular: ArrayBuffer + italic: ArrayBuffer + bold: ArrayBuffer + boldItalic: ArrayBuffer + } +} + +export async function renderTextSvg(props: RenderProps) { + const { regular, italic, bold, boldItalic } = props.font ?? { + regular: TurretRoadMediumFont, + italic: TurretRoadMediumFont, + bold: TurretRoadBoldFont, + boldItalic: TurretRoadBoldFont, + } + const children = props.items.reduce((acc, item) => { + const justifyContent = { + left: 'flex-start', + center: 'center', + right: 'flex-end', + }[item.parsedStyle.alignment] + const el: RenderElement = { + key: item.name, + type: 'p', + props: { + children: [item.text], + style: { + ...item.style, + display: 'flex', + justifyContent, + flexWrap: 'wrap', + width: '100%', + margin: 0, + }, + }, + } + if (item.parsedStyle.breakLine === 0 && acc[acc.length - 1]) { + const lastEl = acc[acc.length - 1] + el.type = 'span' + delete el.props.style.width + el.props.style.display = 'block' + lastEl.props.children.push(el) + return acc + } + acc.push(el) + for (let i = 1; i < item.parsedStyle.breakLine; i++) { + acc.push({ + key: `${item.name}${i}`, + type: 'p', + props: { + children: ``, + style: { + height: '36px', + margin: 0, + }, + }, + }) + } + return acc + }, []) + + return satori( + { + key: 'container', + type: 'div', + props: { + style: { + display: 'flex', + flexDirection: 'column', + width: '100%', + background: props.bgColor ?? '#000', + color: '#fff', + lineHeight: '150%', + fontSize: '36px', + padding: '20px', + minHeight: '500px', + textAlign: 'center', + }, + children: [...children], + }, + }, + { + width: 500, + fonts: [ + { + name: 'TurretRoad', + data: regular, + weight: 400, + style: 'normal', + }, + { + name: 'TurretRoad', + data: bold, + weight: 700, + style: 'normal', + }, + { + name: 'TurretRoad', + data: italic, + weight: 400, + style: 'italic', + }, + { + name: 'TurretRoad', + data: boldItalic, + weight: 700, + style: 'italic', + }, + ], + }, + ) +} diff --git a/packages/spore/src/dob/render/resolve-svg-traits.ts b/packages/spore/src/dob/render/resolve-svg-traits.ts new file mode 100644 index 00000000..96a03e3b --- /dev/null +++ b/packages/spore/src/dob/render/resolve-svg-traits.ts @@ -0,0 +1,48 @@ +import type { INode } from 'svgson' +import { parse } from 'svgson' +import type { BtcFsURI, IpfsURI } from './config' +import { config } from './config' +import { processFileServerResult } from './utils/mime' + +async function handleNodeHref(node: INode) { + if (node.name !== 'image') { + if (node.children.length) { + node.children = await Promise.all( + node.children.map((n) => handleNodeHref(n)), + ) + } + return node + } + if ('href' in node.attributes) { + const href = node.attributes.href + let result; + + if (href.startsWith('btcfs://')) { + result = await config.queryBtcFsFn(node.attributes.href as BtcFsURI) + } else if (href.startsWith('ipfs://')) { + result = await config.queryIpfsFn(node.attributes.href as IpfsURI) + } else { + result = await config.queryUrlFn(node.attributes.href as string) + } + + node.attributes.href = processFileServerResult(result) + } + + return node +} + +export async function resolveSvgTraits(svgStr: string): Promise { + try { + const svgAST = await parse(svgStr) + await handleNodeHref(svgAST) + return svgAST + } catch (error) { + return { + value: '', + type: 'element', + name: 'svg', + children: [], + attributes: {}, + } + } +} diff --git a/packages/spore/src/dob/render/style-parser.ts b/packages/spore/src/dob/render/style-parser.ts new file mode 100644 index 00000000..76b32daa --- /dev/null +++ b/packages/spore/src/dob/render/style-parser.ts @@ -0,0 +1,104 @@ +export enum ParsedStyleFormat { + Bold = 'bold', + Italic = 'italic', + Strikethrough = 'strikethrough', + Underline = 'underline', +} + +export enum ParsedStyleAlignment { + Left = 'left', + Center = 'center', + Right = 'right', +} + +export interface ParsedStyle { + color: string + format: ParsedStyleFormat[] + alignment: ParsedStyleAlignment + breakLine: number +} + +export const DEFAULT_STYLE: ParsedStyle = { + color: '#fff', + format: [], + alignment: ParsedStyleAlignment.Left, + breakLine: 1, +} as const + +export function styleParser( + str: string, + options?: { + baseStyle: ParsedStyle + }, +) { + let text = str + const jsonResult = options?.baseStyle || { ...DEFAULT_STYLE } + + if (text.startsWith('<') && text.endsWith('>')) { + text = text.substring(1, str.length - 1) + } + + const colorMatch6 = /#([0-9a-fA-F]{6})/.exec(text) + if (colorMatch6) { + jsonResult.color = `#${colorMatch6[1]}` + text = text.replace(/#([0-9a-fA-F]{6})/, '') + } + + const colorMatch3 = /#([0-9a-fA-F]{3})/.exec(text) + if (colorMatch3) { + jsonResult.color = `#${colorMatch3[1]}` + text = text.replace(/#([0-9a-fA-F]{3})/, '') + } + + const formatMatch = /\*([bisu]+)/.exec(text) + if (formatMatch) { + jsonResult.format = formatMatch[1] + .split('') + .map((char) => { + switch (char) { + case 'b': + return ParsedStyleFormat.Bold + case 'i': + return ParsedStyleFormat.Italic + case 's': + return ParsedStyleFormat.Strikethrough + case 'u': + return ParsedStyleFormat.Underline + default: + return null + } + }) + .filter((char) => char) + .map((token) => token!) + text = text.replace(/\*([bisu]+)/, '') + } + + const alignmentMatch = /@(l|c|r)/.exec(text) + if (alignmentMatch) { + switch (alignmentMatch[1]) { + case 'l': + jsonResult.alignment = ParsedStyleAlignment.Left + break + case 'c': + jsonResult.alignment = ParsedStyleAlignment.Center + break + case 'r': + jsonResult.alignment = ParsedStyleAlignment.Right + break + } + text = text.replace(/@(l|c|r)/, '') + } + + const traitsMatch = /&/.exec(text) + if (traitsMatch) { + text = text.replace(/&/, '') + jsonResult.breakLine = 0 + } + + const breakLineMatch = text.match(/~/g) + if (breakLineMatch) { + jsonResult.breakLine = breakLineMatch.length + 1 + } + + return jsonResult +} diff --git a/packages/spore/src/dob/render/svg-to-base64.ts b/packages/spore/src/dob/render/svg-to-base64.ts new file mode 100644 index 00000000..3a046e3b --- /dev/null +++ b/packages/spore/src/dob/render/svg-to-base64.ts @@ -0,0 +1,6 @@ +export function svgToBase64(svgCode: string) { + if (typeof window !== 'undefined') { + return `data:image/svg+xml;base64,${window.btoa(svgCode)}` // browser + } + return `data:image/svg+xml;base64,${Buffer.from(svgCode).toString('base64')}` // nodejs +} diff --git a/packages/spore/src/dob/render/test/background-color-parser.test.ts b/packages/spore/src/dob/render/test/background-color-parser.test.ts new file mode 100644 index 00000000..ff2e1792 --- /dev/null +++ b/packages/spore/src/dob/render/test/background-color-parser.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from 'vitest' +import { + backgroundColorParser, + getBackgroundColorByTraits, +} from '../background-color-parser' +import { traitsParser } from '../traits-parser' +import { Key } from '../constants/key' + +describe('function backgroundColorParser', async () => { + it('case: normal', () => { + const { traits } = traitsParser([ + { + name: Key.BgColor, + traits: [ + { + String: `#FFF`, + }, + ], + }, + ]) + expect(backgroundColorParser(traits)).toEqual( + getBackgroundColorByTraits(traits), + ) + }) + + it('case: not found and default', () => { + const { traits } = traitsParser([]) + const defaultColor = '#fff' + expect(backgroundColorParser(traits, { defaultColor })).toEqual( + defaultColor, + ) + }) + + it('case: linear-gradient', () => { + const { traits } = traitsParser([ + { + name: Key.BgColor, + traits: [ + { + String: `#(45deg, blue, pink)`, + }, + ], + }, + ]) + expect(backgroundColorParser(traits)).toEqual( + 'linear-gradient(45deg, blue, pink)', + ) + }) +}) diff --git a/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts b/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts new file mode 100644 index 00000000..47704205 --- /dev/null +++ b/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts @@ -0,0 +1,144 @@ +import { describe, expect, it } from 'vitest' +import { + DEFAULT_TEMPLATE, + renderTextParamsParser, +} from '../render-text-params-parser' +import { traitsParser } from '../traits-parser' +import { Key } from '../constants/key' +import { DEFAULT_STYLE } from '../style-parser' + +describe('function renderTextParamsParser', () => { + it('case: default template', () => { + const { traits, indexVarRegister } = traitsParser([ + { + name: 'Key', + traits: [ + { + String: 'Value', + }, + ], + }, + ]) + const params = renderTextParamsParser(traits, indexVarRegister, { + defaultTemplate: DEFAULT_TEMPLATE, + }) + expect(params.items[0].text).toEqual('Key: Value') + }) + + it('case: customized default template by options', () => { + const { traits, indexVarRegister } = traitsParser([ + { + name: 'Key', + traits: [ + { + String: 'Value', + }, + ], + }, + ]) + const params = renderTextParamsParser(traits, indexVarRegister, { + defaultTemplate: '%v', + }) + expect(params.items[0].text).toEqual('Value') + }) + + it('case: customized default template by global traits', () => { + const { traits, indexVarRegister } = traitsParser([ + { + name: `${Key.Prev}`, + traits: [ + { + String: '#fff', + }, + ], + }, + { + name: 'Key', + traits: [ + { + String: 'Value', + }, + ], + }, + ]) + const params = renderTextParamsParser(traits, indexVarRegister) + expect(params.items[0].text).toEqual('ddd Value') + }) + + it('case: customized default template by current traits', () => { + const { traits, indexVarRegister } = traitsParser([ + { + name: 'Key<%k %k %v>', + traits: [ + { + String: 'Value', + }, + ], + }, + ]) + const params = renderTextParamsParser(traits, indexVarRegister) + expect(params.items[0].text).toEqual('Key Key Value') + }) + + it('case: customized default template and style by global traits', () => { + const { traits, indexVarRegister } = traitsParser([ + { + name: `${Key.Prev}`, + traits: [ + { + String: '<#ff0>', + }, + ], + }, + { + name: 'Key', + traits: [ + { + String: 'Value', + }, + ], + }, + { + name: 'Key2<%k %k %v>', + traits: [ + { + String: 'Value<#f00>', + }, + ], + }, + ]) + const params = renderTextParamsParser(traits, indexVarRegister) + expect(params.items[0].text).toEqual('ddd Value') + const expectStyle = { + ...DEFAULT_STYLE, + color: '#ff0', + } + expect(params.items[0].parsedStyle).toEqual(expectStyle) + expect(params.items[1].text).toEqual('Key2 Key2 Value') + const expectStyle2 = { + ...DEFAULT_STYLE, + color: '#f00', + } + expect(params.items[1].parsedStyle).toEqual(expectStyle2) + }) + + it('case: customized default template and style by current traits', () => { + const { traits, indexVarRegister } = traitsParser([ + { + name: 'Key<%k %k %v>', + traits: [ + { + String: 'Value<#f00>', + }, + ], + }, + ]) + const params = renderTextParamsParser(traits, indexVarRegister) + expect(params.items[0].text).toEqual('Key Key Value') + const expectStyle = { + ...DEFAULT_STYLE, + color: '#f00', + } + expect(params.items[0].parsedStyle).toEqual(expectStyle) + }) +}) diff --git a/packages/spore/src/dob/render/test/style-parser.test.ts b/packages/spore/src/dob/render/test/style-parser.test.ts new file mode 100644 index 00000000..980ad58a --- /dev/null +++ b/packages/spore/src/dob/render/test/style-parser.test.ts @@ -0,0 +1,222 @@ +import { describe, expect, it } from 'vitest' +import { + DEFAULT_STYLE, + ParsedStyleAlignment, + ParsedStyleFormat, + styleParser, +} from '../style-parser' + +describe('function styleParser', async () => { + it('case: empty string', () => { + expect(styleParser('')).toEqual(DEFAULT_STYLE) + }) + + it('case: "#fff"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + } + expect(styleParser(color)).toEqual(expectStyle) + }) + + it('case: "#ffffff"', () => { + const color = '#ffffff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + } + expect(styleParser(color)).toEqual(expectStyle) + }) + + it('case: "<#ffffff>"', () => { + const color = '#ffffff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + } + expect(styleParser(color)).toEqual(expectStyle) + }) + + it('case: "<#fff>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + } + expect(styleParser(color)).toEqual(expectStyle) + }) + + it('case: "<#fff@c>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + alignment: 'center', + } + expect(styleParser(`<${color}@c>`)).toEqual(expectStyle) + }) + + it('case: "<#fff@l>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + alignment: 'left', + } + expect(styleParser(`<${color}@l>`)).toEqual(expectStyle) + }) + + it('case: "<#fff@r>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + alignment: 'right', + } + expect(styleParser(`<${color}@r>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*b>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ParsedStyleFormat.Bold], + } + expect(styleParser(`<${color}*b>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*bu>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ParsedStyleFormat.Bold, ParsedStyleFormat.Underline], + } + expect(styleParser(`<${color}*bu>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*bui>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ + ParsedStyleFormat.Bold, + ParsedStyleFormat.Underline, + ParsedStyleFormat.Italic, + ], + } + expect(styleParser(`<${color}*bui>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*buis>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ + ParsedStyleFormat.Bold, + ParsedStyleFormat.Underline, + ParsedStyleFormat.Italic, + ParsedStyleFormat.Strikethrough, + ], + } + expect(styleParser(`<${color}*buis>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*bis>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ + ParsedStyleFormat.Bold, + ParsedStyleFormat.Italic, + ParsedStyleFormat.Strikethrough, + ], + } + expect(styleParser(`<${color}*bis>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*is>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ParsedStyleFormat.Italic, ParsedStyleFormat.Strikethrough], + } + expect(styleParser(`<${color}*is>`)).toEqual(expectStyle) + }) + + it('case: "<#fff*s>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + format: [ParsedStyleFormat.Strikethrough], + } + expect(styleParser(`<${color}*s>`)).toEqual(expectStyle) + }) + + it('case: "<#fff&>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + breakLine: 0, + } + expect(styleParser(`<${color}&>`)).toEqual({ + ...expectStyle, + }) + }) + + it('case: "<#fff&~>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + breakLine: 2, + } + expect(styleParser(`<${color}&~>`)).toEqual({ + ...expectStyle, + }) + }) + + it('case: "<#fff~~>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + breakLine: 3, + } + expect(styleParser(`<${color}~~>`)).toEqual({ + ...expectStyle, + }) + }) + + it('case: "<~~#fff>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + breakLine: 3, + } + expect(styleParser(`<~~${color}>`)).toEqual({ + ...expectStyle, + }) + }) + + it('case: "<@r#fff>"', () => { + const color = '#fff' + const expectStyle = { + ...DEFAULT_STYLE, + color, + alignment: ParsedStyleAlignment.Right, + } + expect(styleParser(`<@r${color}>`)).toEqual({ + ...expectStyle, + }) + }) +}) diff --git a/packages/spore/src/dob/render/test/traits-parser.test.ts b/packages/spore/src/dob/render/test/traits-parser.test.ts new file mode 100644 index 00000000..4d916e40 --- /dev/null +++ b/packages/spore/src/dob/render/test/traits-parser.test.ts @@ -0,0 +1,91 @@ +import { describe, expect, it } from 'vitest' +import { traitsParser } from '../traits-parser' + +describe('function traitsParser', async () => { + it('case: var', () => { + const varName = 'var' + const value = 3 + const traits = [ + { + name: 'var', + traits: [ + { + String: `${value}<_>`, + }, + ], + }, + ] + + const { indexVarRegister } = traitsParser(traits) + expect(indexVarRegister[varName]).toEqual(value) + }) + + it('case: array index', () => { + const varName = 'var' + const value = 3 + const { traits, indexVarRegister } = traitsParser([ + { + name: varName, + traits: [ + { + String: `${value}<_>`, + }, + ], + }, + { + name: 'prev.bgcolor', + traits: [ + { + String: `(%${varName}):['#FFFF00', '#0000FF', '#FF00FF', '#FF0000', '#000000']`, + }, + ], + }, + ]) + const trait = traits.find(({ name }) => name === 'prev.bgcolor') + expect(indexVarRegister[varName]).toEqual(value) + expect(trait?.value).toEqual('#FF0000') + }) + + it('case: array with over index', () => { + const varName = 'var' + const value = 10 + const { traits, indexVarRegister } = traitsParser([ + { + name: varName, + traits: [ + { + String: `${value}<_>`, + }, + ], + }, + { + name: 'prev.bgcolor', + traits: [ + { + String: `(%${varName}):['#FFFF00', '#0000FF', '#FF00FF', '#FF0000', '#000000']`, + }, + ], + }, + ]) + const trait = traits.find(({ name }) => name === 'prev.bgcolor') + expect(indexVarRegister[varName]).toEqual(value) + expect(trait?.value).toEqual('#FFFF00') + }) + + it('case: number', () => { + const key = 'data' + const value = 1 + const { traits } = traitsParser([ + { + name: key, + traits: [ + { + Number: value, + }, + ], + }, + ]) + const trait = traits.find(({ name }) => name === key) + expect(trait?.value).toEqual(value) + }) +}) diff --git a/packages/spore/src/dob/render/traits-parser.ts b/packages/spore/src/dob/render/traits-parser.ts new file mode 100644 index 00000000..bc928469 --- /dev/null +++ b/packages/spore/src/dob/render/traits-parser.ts @@ -0,0 +1,73 @@ +import type { INode } from 'svgson' +import { ARRAY_INDEX_REG, ARRAY_REG } from './constants/regex' +import type { RenderPartialOutput } from './types' +import { parseStringToArray } from './utils/string' +import { resolveSvgTraits } from './resolve-svg-traits' + +export interface ParsedTrait { + name: string + value: number | string | Date | Promise +} + +export function traitsParser(items: RenderPartialOutput[]): { + traits: ParsedTrait[] + indexVarRegister: Record +} { + const indexVarRegister = items.reduce>((acc, item) => { + if (!item.traits[0]?.String) return acc + const match = item.traits[0].String.match(ARRAY_INDEX_REG) + if (!match) return acc + const intIndex = parseInt(match[1], 10) + if (isNaN(intIndex)) return acc + acc[item.name] = intIndex + return acc + }, {}) + const traits = items + .map((item) => { + const { traits: trait } = item + if (!trait[0]) return null + if ('String' in trait[0] && typeof trait[0].String === 'string') { + let value = item.traits[0].String + const matchArray = value!.match(ARRAY_REG) + if (matchArray) { + const varName = matchArray[1] + const array = parseStringToArray(matchArray[2]) + const index = indexVarRegister[varName] % array.length + value = array[index] + } + return { + value, + name: item.name, + } as ParsedTrait + } + if ('Number' in trait[0] && typeof trait[0].Number === 'number') { + return { + name: item.name, + value: trait[0].Number, + } as ParsedTrait + } + if ('Timestamp' in trait[0] && typeof trait[0].Timestamp === 'number') { + let timestamp = trait[0].Timestamp as number + if (`${timestamp}`.length === 10) { + timestamp = timestamp * 1000 + } + return { + name: item.name, + value: new Date(timestamp), + } as ParsedTrait + } + if ('SVG' in trait[0] && typeof trait[0].SVG === 'string') { + return { + name: item.name, + value: resolveSvgTraits(trait[0].SVG), + } + } + return null + }) + .map((e) => e!) + .filter((e) => e) + return { + traits, + indexVarRegister, + } +} diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/spore/src/dob/render/types/index.ts new file mode 100644 index 00000000..d3a533b1 --- /dev/null +++ b/packages/spore/src/dob/render/types/index.ts @@ -0,0 +1,20 @@ +export interface DobDecodeResponse { + jsonrpc: string + result: string + id: number +} + +export interface DobDecodeResult { + dob_content: { + dna: string + block_number: number + cell_id: number + id: string + } + render_output: RenderPartialOutput[] | string +} + +export interface RenderPartialOutput { + name: string + traits: { String?: string; Number?: number; Timestamp?: Date; SVG?: string }[] +} diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/spore/src/dob/render/types/internal.ts new file mode 100644 index 00000000..73d5719a --- /dev/null +++ b/packages/spore/src/dob/render/types/internal.ts @@ -0,0 +1,8 @@ +export interface RenderElement

{ + type: T + props: P & { + children: RenderElement | RenderElement[] + style: S + } + key: string | null +} diff --git a/packages/spore/src/dob/render/utils/mime.ts b/packages/spore/src/dob/render/utils/mime.ts new file mode 100644 index 00000000..9d2e41b8 --- /dev/null +++ b/packages/spore/src/dob/render/utils/mime.ts @@ -0,0 +1,87 @@ +import type { FileServerResult } from '../config' +import { hexToBase64 } from './string' + +/** + * Detects the MIME type of an image from its hex-encoded content by examining file signatures + * @param hexContent Hex-encoded image content + * @returns The detected MIME type or null if not recognized + */ +export function detectImageMimeType(hexContent: string): string | null { + // Skip if string is too short to contain a signature and content + if (!hexContent || hexContent.length < 64) { + return null + } + + // Extract just the file header (first 32 bytes should be enough for most formats) + // and convert to lowercase for consistent comparison + const header = hexContent.substring(0, 64).toLowerCase() // 32 bytes = 64 hex chars + + // JPEG: starts with ffd8ff + if (header.startsWith('ffd8ff')) { + return 'image/jpeg' + } + + // PNG: starts with 89504e47 (‰PNG) + if (header.startsWith('89504e47')) { + return 'image/png' + } + + // GIF: starts with 474946 (GIF) + if (header.startsWith('474946')) { + return 'image/gif' + } + + // WebP: RIFF....WEBP + if (header.startsWith('52494646') && header.substring(16, 24) === '57454250') { + return 'image/webp' + } + + // BMP: starts with 424d (BM) + if (header.startsWith('424d')) { + return 'image/bmp' + } + + // SVG: starts with match[1]) +} + +export function base64ToArrayBuffer(base64: string): ArrayBuffer { + const binaryString = atob(base64) + + const uint8Array = new Uint8Array(binaryString.length) + for (let i = 0; i < binaryString.length; i++) { + uint8Array[i] = binaryString.charCodeAt(i) + } + + return uint8Array.buffer +} + +export function isBtcFs(uri: string): uri is BtcFsURI { + return uri.startsWith('btcfs://') +} + +export function isIpfs(uri: string): uri is IpfsURI { + return uri.startsWith('ipfs://') +} + +export function hexToBase64(hexstring: string): string { + const str = hexstring + .match(/\w{2}/g) + ?.map((a) => String.fromCharCode(parseInt(a, 16))) + .join('') + return str ? btoa(str) : '' +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78369fd1..f2f68214 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1002,6 +1002,12 @@ importers: axios: specifier: ^1.11.0 version: 1.11.0 + satori: + specifier: ^0.10.13 + version: 0.10.14 + svgson: + specifier: ^5.3.1 + version: 5.3.1 devDependencies: '@eslint/js': specifier: ^9.34.0 diff --git a/vitest.config.mts b/vitest.config.mts index 7af3d4a8..36ee8aeb 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -2,9 +2,9 @@ import { defineConfig, coverageConfigDefaults } from "vitest/config"; export default defineConfig({ test: { - projects: ["packages/core"], + projects: ["packages/core", "packages/spore"], coverage: { - include: ["packages/core"], + include: ["packages/core", "packages/spore"], exclude: [ "**/dist/**", "**/dist.commonjs/**", From 600a36e5a2b2801d868edfee34064f4b4c1f6b51 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Sat, 20 Sep 2025 11:35:44 +0800 Subject: [PATCH 02/14] feat: connect to our own decoder server --- .../spore/src/__examples__/renderDob.test.ts | 2 +- .../spore/src/dob/render/api/dobDecode.ts | 16 +- .../src/dob/render/background-color-parser.ts | 22 +-- packages/spore/src/dob/render/config.ts | 87 ++++----- .../spore/src/dob/render/constants/key.ts | 6 +- .../spore/src/dob/render/constants/regex.ts | 8 +- .../render/fonts/SpaceGrotesk-Bold.base64.ts | 2 +- .../render/fonts/TurretRoad-Bold.base64.ts | 2 +- .../render/fonts/TurretRoad-Medium.base64.ts | 2 +- packages/spore/src/dob/render/index.ts | 20 +- .../render/render-by-dob-decode-response.ts | 40 ++-- .../src/dob/render/render-by-token-key.ts | 14 +- .../spore/src/dob/render/render-dob-bit.ts | 93 +++++----- .../spore/src/dob/render/render-dob1-svg.ts | 34 ++-- .../spore/src/dob/render/render-image-svg.ts | 64 +++---- .../dob/render/render-text-params-parser.ts | 90 ++++----- .../spore/src/dob/render/render-text-svg.ts | 112 ++++++------ .../src/dob/render/resolve-svg-traits.ts | 52 +++--- packages/spore/src/dob/render/style-parser.ts | 108 +++++------ .../spore/src/dob/render/svg-to-base64.ts | 6 +- .../test/background-color-parser.test.ts | 40 ++-- .../test/render-text-params-parser.ts.test.ts | 128 ++++++------- .../src/dob/render/test/style-parser.test.ts | 172 +++++++++--------- .../src/dob/render/test/traits-parser.test.ts | 74 ++++---- .../spore/src/dob/render/traits-parser.ts | 76 ++++---- packages/spore/src/dob/render/types/index.ts | 27 +-- .../spore/src/dob/render/types/internal.ts | 10 +- packages/spore/src/dob/render/utils/mime.ts | 150 +++++++++------ packages/spore/src/dob/render/utils/string.ts | 22 +-- 29 files changed, 763 insertions(+), 716 deletions(-) diff --git a/packages/spore/src/__examples__/renderDob.test.ts b/packages/spore/src/__examples__/renderDob.test.ts index 9baddcc0..33314340 100644 --- a/packages/spore/src/__examples__/renderDob.test.ts +++ b/packages/spore/src/__examples__/renderDob.test.ts @@ -1,5 +1,5 @@ import { describe, it } from "vitest"; -import { renderByTokenKey, svgToBase64 } from "../dob/index.js"; +import { renderByTokenKey } from "../dob/index.js"; describe("decodeDob [testnet]", () => { it("should respose a decoded dob render data from a spore id", async () => { diff --git a/packages/spore/src/dob/render/api/dobDecode.ts b/packages/spore/src/dob/render/api/dobDecode.ts index 27ae9205..e6d4a1d4 100644 --- a/packages/spore/src/dob/render/api/dobDecode.ts +++ b/packages/spore/src/dob/render/api/dobDecode.ts @@ -1,18 +1,18 @@ -import { config } from '../config' -import type { DobDecodeResponse } from '../types' +import { config } from "../config"; +import type { DobDecodeResponse } from "../types"; export async function dobDecode(tokenKey: string): Promise { const response = await fetch(config.dobDecodeServerURL, { - method: 'POST', + method: "POST", headers: { - 'Content-Type': 'application/json', + "Content-Type": "application/json", }, body: JSON.stringify({ id: 2, - jsonrpc: '2.0', - method: 'dob_decode', + jsonrpc: "2.0", + method: "dob_decode", params: [tokenKey], }), - }) - return response.json() + }); + return response.json(); } diff --git a/packages/spore/src/dob/render/background-color-parser.ts b/packages/spore/src/dob/render/background-color-parser.ts index c1424f84..a792b058 100644 --- a/packages/spore/src/dob/render/background-color-parser.ts +++ b/packages/spore/src/dob/render/background-color-parser.ts @@ -1,29 +1,29 @@ -import type { ParsedTrait } from './traits-parser' -import { Key } from './constants/key' +import { Key } from "./constants/key"; +import type { ParsedTrait } from "./traits-parser"; export function getBackgroundColorByTraits( traits: ParsedTrait[], ): ParsedTrait | undefined { - return traits.find((trait) => trait.name === Key.BgColor) + return traits.find((trait) => trait.name === Key.BgColor); } export function backgroundColorParser( traits: ParsedTrait[], options?: { - defaultColor?: string + defaultColor?: string; }, ): string { - const bgColorTrait = getBackgroundColorByTraits(traits) + const bgColorTrait = getBackgroundColorByTraits(traits); if (bgColorTrait) { - if (typeof bgColorTrait.value === 'string') { + if (typeof bgColorTrait.value === "string") { if ( - bgColorTrait.value.startsWith('#(') && - bgColorTrait.value.endsWith(')') + bgColorTrait.value.startsWith("#(") && + bgColorTrait.value.endsWith(")") ) { - return bgColorTrait.value.replace('#(', 'linear-gradient(') + return bgColorTrait.value.replace("#(", "linear-gradient("); } - return bgColorTrait.value + return bgColorTrait.value; } } - return options?.defaultColor || '#000' + return options?.defaultColor || "#000"; } diff --git a/packages/spore/src/dob/render/config.ts b/packages/spore/src/dob/render/config.ts index ff5bdc59..adc18396 100644 --- a/packages/spore/src/dob/render/config.ts +++ b/packages/spore/src/dob/render/config.ts @@ -1,82 +1,87 @@ export type FileServerResult = | string | { - content: string - content_type: string - } + content: string; + content_type: string; + }; -export type BtcFsResult = FileServerResult -export type IpfsResult = FileServerResult +export type BtcFsResult = FileServerResult; +export type IpfsResult = FileServerResult; -export type BtcFsURI = `btcfs://${string}` -export type IpfsURI = `ipfs://${string}` +export type BtcFsURI = `btcfs://${string}`; +export type IpfsURI = `ipfs://${string}`; -export type QueryBtcFsFn = (uri: BtcFsURI) => Promise -export type QueryIpfsFn = (uri: IpfsURI) => Promise -export type QueryUrlFn = (uri: string) => Promise +export type QueryBtcFsFn = (uri: BtcFsURI) => Promise; +export type QueryIpfsFn = (uri: IpfsURI) => Promise; +export type QueryUrlFn = (uri: string) => Promise; export class Config { - private _dobDecodeServerURL = 'https://dob-decoder.rgbpp.io' + private _dobDecodeServerURL = "https://dob-decoder.ckbccc.com"; private _queryBtcFsFn: QueryBtcFsFn = async (uri) => { - return fetch(`https://api.omiga.io/api/v1/nfts/dob_imgs?uri=${uri}`).then( - (res) => res.json(), - ) - } + console.log("requiring", uri); + const response = await fetch( + `https://dob-decoder.ckbccc.com/restful/dob_extract_image?uri=${uri}&encode=base64`, + ); + return { + content: await response.text(), + content_type: "", + }; + }; - private _queryUrlFn = async (url: string) => { + private _queryUrlFn = async (url: string) => { try { - const response = await fetch(url) - const blob = await response.blob() + const response = await fetch(url); + const blob = await response.blob(); return new Promise((resolve, reject) => { - const reader = new FileReader() - // eslint-disable-next-line func-names + const reader = new FileReader(); + reader.onload = function () { - const base64 = this.result as string - resolve(base64) - } + const base64 = this.result as string; + resolve(base64); + }; reader.onerror = (error) => { - reject(error) - } - reader.readAsDataURL(blob) - }) + reject(error); + }; + reader.readAsDataURL(blob); + }); } catch (error) { - throw error + throw error; } - } + }; private _queryIpfsFn = async (uri: IpfsURI) => { - const key = uri.substring('ipfs://'.length) - const url = `https://ipfs.io/ipfs/${key}` - return this._queryUrlFn(url) - } + const key = uri.substring("ipfs://".length); + const url = `https://ipfs.io/ipfs/${key}`; + return this._queryUrlFn(url); + }; get dobDecodeServerURL() { - return this._dobDecodeServerURL + return this._dobDecodeServerURL; } setDobDecodeServerURL(dobDecodeServerURL: string): void { - this._dobDecodeServerURL = dobDecodeServerURL + this._dobDecodeServerURL = dobDecodeServerURL; } setQueryBtcFsFn(fn: QueryBtcFsFn): void { - this._queryBtcFsFn = fn + this._queryBtcFsFn = fn; } setQueryIpfsFn(fn: QueryIpfsFn): void { - this._queryIpfsFn = fn + this._queryIpfsFn = fn; } get queryBtcFsFn(): QueryBtcFsFn { - return this._queryBtcFsFn + return this._queryBtcFsFn; } get queryIpfsFn(): QueryIpfsFn { - return this._queryIpfsFn + return this._queryIpfsFn; } get queryUrlFn(): QueryUrlFn { - return this._queryUrlFn + return this._queryUrlFn; } } -export const config = new Config() +export const config = new Config(); diff --git a/packages/spore/src/dob/render/constants/key.ts b/packages/spore/src/dob/render/constants/key.ts index 6aa61a4e..8468784c 100644 --- a/packages/spore/src/dob/render/constants/key.ts +++ b/packages/spore/src/dob/render/constants/key.ts @@ -1,5 +1,5 @@ export enum Key { - BgColor = 'prev.bgcolor', - Prev = 'prev', - Image = 'IMAGE', + BgColor = "prev.bgcolor", + Prev = "prev", + Image = "IMAGE", } diff --git a/packages/spore/src/dob/render/constants/regex.ts b/packages/spore/src/dob/render/constants/regex.ts index ab9fb0c5..af1e89fc 100644 --- a/packages/spore/src/dob/render/constants/regex.ts +++ b/packages/spore/src/dob/render/constants/regex.ts @@ -1,4 +1,4 @@ -export const ARRAY_REG = /\(%(.*?)\):(\[.*?\])/ -export const ARRAY_INDEX_REG = /(\d+)<_>$/ -export const GLOBAL_TEMPLATE_REG = /^prev<(.*?)>/ -export const TEMPLATE_REG = /^(.*?)<(.*?)>/ +export const ARRAY_REG = /\(%(.*?)\):(\[.*?\])/; +export const ARRAY_INDEX_REG = /(\d+)<_>$/; +export const GLOBAL_TEMPLATE_REG = /^prev<(.*?)>/; +export const TEMPLATE_REG = /^(.*?)<(.*?)>/; diff --git a/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts b/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts index 5f3428bf..3cb75a64 100644 --- a/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts +++ b/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts @@ -1 +1 @@ -export default 'AAEAAAAQAQAABAAARkZUTZGMSe0AAHkYAAAAHEdERUYafhWGAABTEAAAAQZHUE9TIs9Z8gAAWFwAACC8R1NVQrg5tdIAAFQYAAAEQk9TLzIUSBWxAAABiAAAAGBjbWFwWV3nmgAABmQAAAIMZ2FzcAAAABAAAFMIAAAACGdseWZM4Yq6AAAKuAAAP3xoZWFkGdXznwAAAQwAAAA2aGhlYQdXAgIAAAFEAAAAJGhtdHg3my34AAAB6AAABHxsb2Nh3KftQAAACHgAAAJAbWF4cAEsAKcAAAFoAAAAIG5hbWW/atlEAABKNAAAA6hwb3N0HJqtlAAATdwAAAUscHJlcGgGjIUAAAhwAAAABwABAAAAAgAAOQZYcF8PPPUACwPoAAAAANucIpkAAAAA25yNY//E/woDuAO0AAEACAACAAAAAAAAAAEAAAPY/twAAAP2/8T+EAO4AAEAAAAAAAAAAAAAAAAAAAEfAAEAAAEfAFQABQBQAAQAAQAAAAAAAAAAAAAAAAADAAIABAIjArwABQAAAooCWAAAAEsCigJYAAABXgAyASMAAAAAAAAAAAAAAACAAAAnAAAAawAAAAAAAAAARksAAACgAA0iFQPY/twAAAR+ASQgAAGTAAAAAAHmArwAAAAgAAMDjgBfAAAAAAJYAAAA/gAAASoANgICADYCfAAoAl4AIgL2ABoCTwAcASYANgGOADIBhgAAAhwALAJsAGUBJgA2AbAARAEqADYBhP/wAogAMgHEAAwCUgAqAmAAIgJ8ABoCWAAmAmoAMgIqABoCWAAcAmoAKAEqADYBKgA2AmwAZAJsAGUCbABkAkIAIgP2AEICegASApgALgKEADICmgAuAioAQgIWAEIClgAyApAAQgEIAEICYgAgAnIAQgIeAEIDcgBCAp4AQgKkADICXABCAqQAMgJ4AEICXgAiAkwAGAKgAD4CagASA4IAHgKEABYCcAAIAkAALgFmAEYBhP/wAWYAEAJsAEYCbABBASgAKAJCACYCfgBGAkoALgJ+AC4CQQAuAbQAGgJ+AC4CaABGAQoANAEM/+oCNABGAQoARgNWAEYCaABGAmQALgJ+AEYCfgAuAYwARgIMACoByAAaAmgAQgIkABADEAAoAlAAGgJoAEICBgA0AdIAJAECAEIB0gAQAmwAKwD+AAABKgA2AlYAMgJ+ADQCbAAmAmz//gECAEIB2gAeAcAAKALQADIBowAiAtAANAJsAGQBsABEAgQAMAGYACgBigAgAmwAZQFsABoBawAUASgAKAJwAEICZgAQANoADgFIACgBBgAQAbQAIALQAEQDPgAQAzgAEAN7ABQCQgAqAnoAEgJ6ABICegASAnoAEgJ6ABICegASAzUAEgKEADICKgBCAioAQgIqAEICKgBCAQj/+gEIADYBCP/EAQj/xAKaAC4CngBCAqQAMgKkADICpAAyAqQAMgKkADICbABgAqQAMgKgAD4CoAA+AqAAPgKgAD4CcAAIAlwAQgKLAEYCQgAmAkIAJgJCACYCQgAmAkIAJgJCACYDagAmAkoALgJBAC4CQQAuAkEALgJBAC4BCv/5AQoAOQEK/8UBCv/NAmgALgJoAEYCZAAuAmQALgJkAC4CZAAuAmQALgJsAGUCZAAuAmgAQgJoAEICaABCAmgAQgJoAEICfgBGAmgAQgEKAEYDRAAyA9gALgEmADYBJgA2AdAAKAEgACgBtAAoALgAAAAAAAACSABEA3gARAEmADYBJgA2ASYANgICADYCAgA2AgIANgGQADgDHgA2AOgAMAGgADAB4AA0AeAARAJ+ABABhgASAqYAKgIoACACbAAeAmwAHgJsAGUBmf/wAqIAGgKiABoAAAAoAmIAIAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgBdAAcAXQAHAJsACYC+gAaA+gAGgPoABoD6AAaAqIAGgFoABgBaAAYAmwAMgGGABIBhgASAmwAIAAAACgAAAAoAQoANAEM/+oBDP/qAXIAGAFyABgCbAAoAQYAEAEGABACbABEAMIAEADeAAAAAAAoAAAAKAFQAAwBUAAMAmwAJgFyACABcgAgAmwANAAAACgAAAAoAcwAPAMOABoBawAUAWsAFAJsACYAAAAoAAAAKAFsABoBbAAaAmwAOAF8ACABfAAgAmwAJAAAAAMAAAADAAAAHAABAAAAAAEGAAMAAQAAABwABADqAAAAJgAgAAQABgANAH4A/wExAVMCvALGAtwgCyAmIDMgOiBEIHQgrCEiIZMiFf//AAAADQAgAKABMQFSArsCxgLaIAkgEyAyIDkgRCB0IKwhIiGRIhL////1/+P/wv+R/3H+Cv4BAAAAAAAA4KTgn+CW4GfgMN+7AAAAAAABAAAAAAAAAAAAAAAAAAAAGAAcACAAAAAAAAAAAAAAAAAAOgA+AAAAyAAAAMkAygAAAMsAzADNAAAAAAAAAM4AzwDQAAAA0QDSANMAAAAAAAAA1AAAAAAAAADVAN4AAADfAOAAAAAAAOEAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhAIaHiYuTmJ6joqSmpaepq6qsra+usLGztbS2uLe8u72+AHJkZWnUeKFwa912agCImgBzAABndwAAAAAAbHwAqLqBY24AAAAAbX3VYoKFl8PEzM3R0s7PuQDBANrc2NkAAAB50NMAhIyDjYqPkJGOlZYAlJydm8LHyXEAAMh6AAAAuAH/hbAEjQAAAABwAHAAcABwAIwAmgDEARQBagGmAbABzgHsAjYCSgJmAnICiAKYAsIC1AMQA0YDZAOeA+QEAARcBKIErgS6BM4E4gT2BTwFqgXEBgQGMAZUBmoGfga2Bs4G2gb8BxgHKAdGB14HiAeuB+YIFghgCHIIlAioCMgI5Aj6CRIJLgk+CVoJbgl6CYIJxgn8CjIKaAqcCrgK9gsaCyYLMgtKC1YLjAuuC94MFAxMDGYMpgzCDOYM+g0aDTQNYA14DagNtg3mDhYOFg40DnAOmA7oDw4PIg+GD44P6BAoEEwQXBBkELQQwhDuEQgREhEcESQRUhF+EYgRkBGaEcAR5BH0EgQSFBJcEmgSdBKAEowSmBKkEsgS1BLgEuwS+BMEExATHBMoEzQTQBNME1gTZBNwE3wTiBOiE64TuhPGE9IT3hPqFBIUahR2FIIUjhSaFKYUshUaFSYVMhU+FUoVVhViFW4VehWGFcoV1hXiFe4V+hYGFhIWPhZKFlYWYhZuFnoWhha+FsoW1hcAF1gXYBdoF3AXeBeAF4AXgBeMF5gXohesF7QXxBfSF94X+hgKGBgYLhhEGFoYaBhyGK4Y0hjwGRAZHhkuGWAZghmQGZwZqhnQGeIZ9BoaGkAaVhqgGqoashrkGy4bgBu4G/IcIhwsHDQcThxYHHYchBySHJ4cqhy+HPgdAh0KHRwdJh0+HVQdah2QHbYd0B3aHfgeMh48HkQeUh5gHm4eoB7OHtge4B8SH0QfcB96H4IfrB+2H74ABABf/34DLwM0AA8AHwArAE8AAAUiJjURNDYzITIWFREUBiMlITI2NRE0JiMhIgYVERQWNyImNTQ2MzIWFRQGJzU0Nj8BPgE1NCYjIgYdASM1ND4BMzIeAR0BFA4BDwEOAR0BASFZaWlZAUxZaWlZ/soBIDs3Nzv+4Ds3N8gcJSUcHCUlTBwgDB4gKyMkMFovTzAwTCweLhgMCwmCZmICJmJmZmL92mJmYEA8Af48QEA8/gI8QIwjHBwjIxwcI6AWIi4NBQ0cGRshIyIQFC5CJCM+KgMnMx8KBQQRDw8AAAACADb/8gD0ArwAAwAPAAA3ETMRByImNTQ2MzIWFRQGVYA/KTc3KSg2NuYB1v4q9DUqKjU1Kio1//8ANgGJAcwCyhAnAA8AAAIcEAcADwDcAhwAAAACACgAAAJUArwAGwAfAAAzNSM1MzUjNTM1MxUzNTMVMxUjFTMVIxUjNSMVETM1I5RsbGxscnBybGxsbHJwcHC6bHBsurq6umxwbLq6ugEmcAAAAAACACL/jAI+AzAANAA4AAAFIi4BPQEzFRQWMzI2NTQuAS8BLgI1ND4BMzIeAR0BIzU0LgEjIgYVFB4BHwEeAhUUDgEHETMRATVRfEaCTkNEQyA+LRdIZzc9b0tLdUOCHzooPDkbNioXS249QXeOeA46bEwcHD8/NiodJBcKBRAxUEBAWzEzZUweHigxFy0nGiQYCQUQMlJAQGE3ZgOk/FwABQAa//MC3ALJAAMAEQAfAC0AOwAAFycBFwMiJj0BNDYzMhYdARQGJzI2PQE0JiMiBh0BFBYBIiY9ATQ2MzIWHQEUBicyNj0BNCYjIgYdARQWlEwCGkx0TFZWTEpYVkwdISEdHSEh/p9MVlZMSlhWTB0hIR0dISENPQKZPf1qUUYHR1FRRwdGUVIkHRAdJCQdEB0kAUhRRgdHUVFHB0ZRUiQdEB0kJB0QHSQAAAIAHAAAAkECvAAiACsAADMiLgE1ND4BNzUuATU0PgE7ARUjIgYVFB4BOwE1MxUzFSMRJzM1IyIGFRQW6z5dNB82ITJANl08bVYtOx0vHGF+XFzjZWUsPD8tVTsrQCoKDg9KPT1UK2gwLyEqFFpaaP7SaMYyMTIx//8ANgGJAPACyhIHAA8AAAIcAAAAAQAy/woBhgL0ABEAAAUiLgE1ETQ+ATMVIgYVERQWMwGGb5hNTZhvbW1tbfZOoHwBFnygTmx9hf7yhX0AAQAA/woBVAL0ABEAABU1MjY1ETQmIzUyHgEVERQOAW5sbG5wl01Nl/ZsfYUBDoV9bE6gfP7qfKBOAAAAAQAsAPgB8AK8AC8AABM1Mxc3LwE3HwE3JzUzFQcXPwEXDwEXNzMVIycHHwEHLwEHFxUjNTcnDwEnPwEnByxOSAU8NzQ4KQ0NSg0NKTg0NzwFSE5OSAU8NzQ4KQ0NSg0NKTg0NzwFSAG1Sg0NKTg0NzwFSE5OSAU8NzQ4KQ0NSg0NKTg0NzwFSE5OSAU8NzQ4KQ0NAAEAZQCNAgcCLwALAAA3NSM1MzUzFTMVIxX7lpZ2lpaNmHKYmHKYAAABADb/bQDwAK4AEgAAFzUzMj0BIyImNTQ2MzIWHQEUI08nLhEoNTUoKTRwk0QuIDAlKDIzK3NwAAEARADGAWwBOAADAAA3NSEVRAEoxnJyAAEANv/yAPQAsAALAAAXIiY1NDYzMhYVFAaWKTc3KSg2Ng41Kio1NSoqNQAAAf/w/zgBlAK8AAMAAAcBMwEQASZ+/trIA4T8fAAAAAACADL/8gJWAsoADQAbAAAFIiY9ATQ2MzIWHQEUBicyNj0BNCYjIgYdARQWAUR8lpZ8fZWVfUtHT0NFTUkOiYuwh42Nh7CLiXJSTLpNT1JKuk9PAAABAAwAAAGCArwABwAAIREjByMTMxEBAhJeho/nAl7eATz9RAABACoAAAIsAsoAKQAAMzU0PgE/AT4CPQE0JiMiBh0BIzU0PgEzMh4BHQEUDgEPAQ4CHQEhFSowW0JDJTIbRDs6R4BEdUhIdEM3XjxAKzATAXlUSWE/FBUMIzIgBDI7PzsSEExqODdjQwpDXTsTFA0fJRoEcgAAAAABACL/8gI4ArwAJQAABSIuAT0BMxUUFjMyNj0BNC4BKwE1NzUhNSEVBxUzMh4BHQEUDgEBME96RYBOQEFHIDYijOL+ngHw0yUvWTpCdw44aUgSDjhDPi8KICgTjHgQcqpwECZPPwxEZTcAAAACABoAAAJmArwACgAPAAAhNSE1EzMRMxUjFQEzESMDAXL+qPLmdHT+ot4SzI6UAZr+RHKOAQABav6mAAABACb/8gI2ArwAKAAABSIuAT0BMxUUFjMyNj0BNCYjIg4BByMRIRUhFTM+AjMyHgEdARQOAQEvUndAgkNCQkdHNR0mGAibAd7+ohIKIjYlPmY9P3YOOmpGCgkyR0c5CjhCEBgMAYh0qw0YEDRlSgxKbDsAAAIAMv/yAkICygAhADEAAAUiLgE9ATQ+ATMyHgEVIzQmIyIGHQEzPgEzMh4BHQEUDgEnMjY9ATQuASMiDgEdARQWAThQdkBFeU5Ocz+COkRDSRIRRkM9Z0BCeE4/SSE9Kik+IUkOPGpF71VxODRiRCo+Rj5IFCQ0Y0YMRWk7ckI3CCU2Hh42JQg3QgAAAQAaAAACEgK8AA8AADM1NDY3EzUhNSEVAw4BHQGDDBTr/owB+PgNChonNyMBnxBymP5FFyQaFAADABz/8gI8AsoAJQAzAEEAAAUiLgE9ATQ+ATc1LgI9ATQ+ATMyHgEdARQOAQcVHgIdARQOAScyNj0BNCYjIgYdARQWEzI2PQE0JiMiBh0BFBYBLFB7RSIzFxcuHUF2T092QR0tGBgyIkV7UEVLSUdGSktFQEZIPj5IRg4wWz4MMD8kBxIIJDwqDDdTLy9TNwwqPCQIEgckPzAMPlswcjUsCCw1NSwILDUBPC4qCCouLioIKi4AAAAAAgAo//ICOALKACEAMQAABSIuATUzFBYzMjY9ASMOASMiLgE9ATQ+ATMyHgEdARQOAQMyPgE9ATQmIyIGHQEUHgEBLE5zP4I7Q0RIEhFFRDxoQEJ4UFB2QEV5Sio9IUk/P0khPg40YkQqPkc9SBQkNGNGDEZoOzxqRe9VcTgBbB42JQg4QUE4CCU2Hv//ADb/8gD0Af4SJgARAAAQBwARAAABTv//ADb/bQD0Af4SJwARAAABThAGAA8CAAABAGQAggIIAjoABwAALQE1JRUFFQUCCP5cAaT+1gEqgo6cjnhbElsAAgBlAM4CBwHuAAMABwAAEzUhFQU1IRVlAaL+XgGiAXxycq5ycgAAAAEAZACCAggCOgAHAAA3NSU1JTUFFWQBKv7WAaSCeFsSW3iOnAAAAAACACL/8gIYAsoAJAAwAAA3NTQ2PwE+ATU0LgEjIg4BHQEjNTQ+ATMyHgEVFA4BDwEOAR0BByImNTQ2MzIWFRQG0SkuES0wHTQjJDkhgkR0SEdvQCxDIxESDj4oNzcoKTY25hgzQhYIFTAoHSkWGDAkFhRFZDU0XDw8TS8RCAgXFhL0NSoqNTUqKjUAAAIAQv84A7gCygBFAFMAAAUiLgE9ATQ+ATsBMh4BHQEUBisBIiY9ASMOAiMiLgE9ATQ+ATMyHgEXMzUzERQWOwEyNj0BNC4BKwEiDgEdARQeATsBFQMyNj0BNCYjIgYdARQWAgyPzW5syIoWfrxoVlY6LzISCB8wJT9bMS9XOyUwHgoSeg4RBB0aQYRlDmWST1GZbNDnMTo6MTE4OMhtyIkYicdsabx9Sml1JiACFSQVQ3BFEEZwQhIeEjz+nhERNzdIX4lKTJVtEG2WTXIBLkxCDEJMTEIMQkwAAAACABIAAAJoArwABwALAAAzEzMTIycjBxMzAyMSuOa4iCb6JkW8VRICvP1EmpoBFAFVAAAAAwAuAAACbgK8ABkAIwAtAAAzNTMRIzUhMh4BHQEUDgEHFR4CHQEUDgEjJzMyNj0BNCYrATUzMjY9ATQmKwEuXFwBaEBfNSQxFhY0JTZfP4x8KzU0LHx6KTU0Knp0AdR0K083CjA9IQcSBiE+Mgo6Uyx4KicKJyp4KiUKJikAAAABADL/8gJaAsoAHwAABSImPQE0NjMyFh0BIzU0JiMiBh0BFBYzMjY9ATMVFAYBTIKYmIKBjYJFR0ZQUEZHRYKNDpGHqIeRjXsGCj5QVkqsSVdRPRIOe40AAgAuAAACbgK8AA0AFwAAMzUzESM1ITIWHQEUBiMnMzI2PQE0JisBLlxcASCNk5ONQEJQSkpQQnQB1HSPjYSNj3hUTIxNUwAAAQBCAAACCgK8AAsAADMRIRUhFSEVIRUhFUIBwv7CASL+3gFEArx4p3iteAABAEIAAAH6ArwACQAAMxEhFSEVIRUhEUIBuP7MARz+5AK8eKl4/t0AAQAy//ICWgLKACcAAAUiLgE9ATQ2MzIWHQEjNTQuASMiBh0BFBYzMjY9ASM1IREjNSMOAgE0SHVFmIKBjYIfPi9GUFBISEKmASh6EgcfPg5BfVqoh5GJdQQIJTwjVkqsSVlMOgpw/ppDESYaAAAAAAEAQgAAAk4CvAALAAAzETMRIREzESMRIRFChAEEhIT+/AK8/t8BIf1EASP+3QAAAAEAQgAAAMYCvAADAAAzETMRQoQCvP1EAAEAIP/yAjgCvAAVAAAFIiY9ATMVFBYzMjY1ESM1IRUjERQGAQtsf4Q0LywxeAFMUHYOdmpCQi81NDABcnh4/o5tcwAAAQBCAAACbgK8AAwAADMRMxEzEzMJASMDIxFChBLjqf7cAS6u6BICvP7qARb+p/6dARz+5AAAAAABAEIAAAIGArwABQAAMxEzESEVQoQBQAK8/bx4AAAAAAEAQgAAAzACvAAPAAAzETMTMxMzESMRIwMjAyMRQvV5Enn1gBJ42ngSArz9ngJi/UQCW/2lAlv9pQAAAAEAQgAAAlwCvAALAAAzETMTMxEzESMDIxFC+4sSgvuLEgK8/Z4CYv1EAmL9ngAAAAIAMv/yAnICygANABsAAAUiJj0BNDYzMhYdARQGJzI2PQE0JiMiBh0BFBYBUoScnISEnJyESlJSSklTUw6Rh6iHkZGHqIeRdlZIsEhWVkiwSFYAAAIAQgAAAkICvAANABcAADMRITIeAR0BFA4BKwEZATMyNj0BNCYrAUIBIEJlOTtlQJyPLzo6L48CvDVgQg5BYTX/AAF4NC0KLTQAAAADADL/TAJyAsoADQAbACYAAAUiJj0BNDYzMhYdARQGJzI2PQE0JiMiBh0BFBYTIiY9ATMVFDsBFQFShJychIScnIRKUlJKSVNTdzE9gBw7DpGHqIeRkYeoh5F2VkiwSFZWSLBIVv7kPTNEMB5mAAAAAgBCAAACTAK8ABYAIAAAMxEhMh4BHQEUBgcVHgEdASM1NCYrARkBMzI2PQE0JisBQgEwQmI2PCwoLIQZHbieLzU0MJ4CvC5UOQw/ThISAjMq5dIYHv74AYAzKgoqMwAAAQAi//ICPgLKADQAAAUiLgE9ATMVFBYzMjY1NC4BLwEuAjU0PgEzMh4BHQEjNTQuASMiBhUUHgEfAR4CFRQOAQE1UXxGgk5DREMhPy0XSGc3PW9LS3VDgh86KDw5GzYqF0tvPkF3DjpsTBwcPz82Kh0kFwoFEDFQQEBbMTNlTB4eKDEXLScaJBgJBRAyUkBAYTcAAAEAGAAAAjQCvAAHAAAzESM1IRUjEeTMAhzMAkR4eP28AAAAAAEAPv/yAmICvAATAAAFIi4BNREzERQWMzI2NREzERQOAQFQVntBhElFRUmEQXsOP3VQAcb+NkBKSkAByv46UHU/AAAAAQASAAACWAK8AAcAADMDMxMzEzMDxLKIlA6UiLICvP2ZAmf9RAAAAAEAHgAAA2QCvAAPAAAzAzMTMxMzEzMTMwMjAyMDelyDRBJY5FgSRINc5FoSWgK8/aACYP2gAmD9RAJu/ZIAAAABABYAAAJuArwADQAAMxMDMxczNzMDEyMDIwMWzcuWixKLlsvNlo0SjQFhAVv9/f6l/p8BA/79AAEACAAAAmgCvAAJAAAzNQMzEzMTMwMV9u6TlBKUk+7xAcv+1AEs/jXxAAAAAQAuAAACFAK8AAsAADM1ATUhNSEVARUhFS4BWv6wAdr+pgFcqAGOEHao/nIQdgAAAQBG/woBVgL0ABEAABciJjURNDY7ARUjIhURFDsBFawtOTktqnsbG3v2OS0DHi05bB79Kh5sAAAB//D/OAGUArwAAwAABQEzAQEW/tp+ASbIA4T8fAAAAAEAEP8KASAC9AARAAAXNTMyNRE0KwE1MzIWFREUBiMQexsbe6otOTkt9mweAtYebDkt/OItOQAAAQBGAagCJgK8AAcAABsBMxMjJyMHRpK8koxbElsBqAEU/uzExAAAAAEAQf9eAiv/0AADAAAXNSEVQQHqonJy//8AKAIoAQACvBAGAPsAAAACACb/8gIsAf4AJgAxAAAXIi4BNTQ+ATsBNTQmIyIGByc+AjMyFh0BFDsBFSMiJj0BIw4CJzI2PQEjIgYVFBbgNVQxMVc4iCwwLy4HdAw1WUBichwoVCUwEwQcPB41Q38jKCoOJUczM0UjHCMtKyInJj8nYl25HmgkHgEMJx5mOzEKHhsbIgAAAgBG//ICUAK8ABYAJAAABSImJyMVIxEzETM+AjMyHgEdARQOAScyNj0BNCYjIgYdARQWAXBDSBESfH4SCyU9LTxmPj5mYjpOTTs6Tk4OLhw8Arz++xIgFTtyURBRcjtuS0gKSEtLSApISwAAAQAu//ICKAH+ACIAAAUiLgE9ATQ+ATMyHgEXBy4CIyIOAR0BFB4BMzI2NxcOAgEvSHVERHVIR2Y/CnoEHDMmJj0jIz0mOTsIeg0/Zg48clEOUXI8Mlc3Gh4wHCFBLwovQSE7MB01VzIAAAAAAgAu//ICOAK8ABYAJAAABSIuAT0BND4BMzIeARczETMRIzUjDgEnMjY9ATQmIyIGHQEUFgEOO2c+PmY8LT0mChJ+fBIRRx46Tk07Ok5ODjtyURBRcjsVIBIBBf1EPBwubktICkhLS0gKSEsAAgAu//ICFwH+ABkAIAAABSIuAT0BND4BMzIeAR0BIR4BMzI2NxcOAgMzLgEjIgYBKEpxPz5wSklsPP6XAkg0NTINZw41WL3oBD0xMzwOP3NODE5zP0FzTCszQC4cNho9KwE/KzQ0AAABABoAAAGYArwAEgAAMxEjNTM1NDY7ARUjIh0BMxUjEZh+fj0xglYcgoIBiGhcMz1oHkZo/ngAAAIALv84AjgB/gAdACsAADc1ND4BMzIWFzM1MxEUBiMhNSEyPQEjDgIjIi4BBTI2PQE0JiMiBh0BFBYuPmc9REYQEnw8Mv60ASAcEgokPC49Zz4BBjpOTTs6Tk72EE5vOzAaPP24Mz1uHoEQIRY7bzxKQwpESUlECkNKAAABAEYAAAImArwAFgAAMxEzETM+AjMyHgEVESMRNCYjIgYdAUZ+EggiOSw6VzB+NzM6QAK8/vcQIBU1XT7+2AEeODhNRfwAAP//ADQAAADWAsoSJgDCAAAQBgDsDAAAAP///+r/OADYAsoSJgD/AAAQBgDsDgAAAAABAEYAAAImArwADAAAMxEzETM3MwcTIycjFUZ+EqSk5e2irhICvP59t/D/AMXFAAABAEYAAADEArwAAwAAMxEzEUZ+Arz9RAABAEYAAAMUAfgAJQAAMxEzFTM+ATMyFhczPgEzMh4BFREjETQmIyIGFREjETQmIyIGFRFGfBINPDE1QBESET45LkstfiomKy9+KiYrLwHwNhklKSEgKidPPP66AT0pKTcz/tsBPSkpNzP+2wABAEYAAAImAfgAFQAAMxEzFTM+ATMyHgEVESMRNCYjIgYdAUZ8EgxCQzpXMH43MzpAAfBBGi81XT7+2AEeODhNRfwAAAIALv/yAjYB/gARAB8AAAUiLgE9ATQ+ATMyHgEdARQOAScyNj0BNCYjIgYdARQWATJKdkREdkpKdkREdko6TEs7OkxMDjxyUBBQcjw8clAQUHI8cEtGCkZLS0YKRksAAAIARv84AlAB/gAWACQAABcRMxUzPgEzMh4BHQEUDgEjIi4BJyMREzI2PQE0JiMiBh0BFBZGfBIRSEM8Zj4+ZjwtPSULEoY7TU46Ok5OyAK4PB0tO3JREFFyOxUhEf7/AShLSApIS0tICkhLAAIALv84AjgB/gAWACQAAAURIw4CIyIuAT0BND4BMzIWFzM1MxEBMjY9ATQmIyIGHQEUFgG6EgomPS08Zj4+ZztERxESfP78O01OOjpOTsgBAREhFTtyURBRcjstHTz9SAEoS0gKSEtLSApISwAAAAABAEYAAAFwAfIADgAAMxEzFTM+ATsBFSMiBhURRnwSCzMiPD4wPgHwOB4ccDM1/uYAAAAAAQAq//IB5AH+ACoAAAUiJic3HgIzMjY1NCYvAS4CNTQ2MzIWFwcuASMiBhUUFh8BHgIVFAYBFGF8DXQHITEdLCooLBw0VjRsWFNuEXUIMSQkJigiHDhbNXEOVE4eIygRHxcXGQgFCiM+MUpPSjwkJiAZFhgXBgUKIT00TlUAAAABABoAAAGcAooAEgAAISImNREjNTM1MxUzFSMRFDsBFQEEMT18fH6IiBxgPTMBGGiammj+/h5oAAEAQv/4AiIB8AAVAAAFIi4BNREzERQWMzI2PQEzESM1Iw4BAQM6VzB+NzM6QH58EgxCCDVePQEo/uI4OE1F/P4QQRkwAAAAAAEAEAAAAhQB8AAHAAAzAzMTMxMzA66ehnMSc4aeAfD+bAGU/hAAAAABACgAAALoAfAADwAAMwMzEzMTMxMzEzMDIwMjA25GfSwSQMpAEix9RtFAEkAB8P5lAZv+ZQGb/hABm/5lAAAAAQAaAAACNgHwAA0AADM3JzMXMzczBxcjJyMHGrSyknEScZKytJRxEnH69qWl9vqnpwAAAAEAQv84AiIB8AAdAAAXNSEyPQEjDgIjIi4BNREzERQWMzI2PQEzERQGI3wBDhwSCCI6LTpXMH43MzpAfjwyyG4efREiFjVePQEo/uI4OE1F/P24Mz0AAAABADQAAAHWAfAACwAAMzUlNSE1IRUFFSEVNAEQ/voBkP7wARiW4hBoluIQaAAAAAABACT/CgHCAvQAIwAABSImNRE0KwE1MzI1ETQ2OwEVIyIVERQGKwEVMzIWFREUOwEVARgtORtzcxs5Lap7GysjEBAjKxt79jktATYdeB0BNi05bB7+7iIuEi4i/u4ebAABAEL/CgDAAyYAAwAAFxEzEUJ+9gQc++QAAAAAAQAQ/woBrgL0ACMAABc1MzI1ETQ2OwE1IyImNRE0KwE1MzIWFREUOwEVIyIVERQGIxB7GysjEBAjKxt7qi05G3NzGzkt9mweARIiLhIuIgESHmw5Lf7KHXgd/sotOQAAAQArAO0CQAHPAB0AADcnNz4BMzIWFx4BMzI2PwEXBw4BIyImJy4BIyIGB3FGeBQtHR0nDQ4QDQwVDU9GeBQtHR0nDQ4PDgwVDe1dWhAVFxITEA0KO11aEBUXEhQPDQoAAgA2/zgA9AH+AAMADwAAFxEzEQMyFhUUBiMiJjU0NlWAPyg2NigpNzfIAdL+LgLGNSoqNTUqKjUAAAAAAgAy/4wCLAJkACIAJgAABSIuAT0BND4BMzIeARcHLgIjIg4BHQEUHgEzMjY3Fw4CBxEzEQEzSHVERHVIR2Y/CnoEHDMmJj0jIz0mOTsIeg0/Zn1wDjxyUQ5RcjwyVzcaHjAcIUEvCi9BITswHTVXMmYC2P0oAAAAAQA0AAACSgLKAB0AADM1MzUjNTM1NDYzMhYdASM1NCYjIgYdATMVIxUhFTRKRkZ7aWl7fjcvLjhkZAFOcqxmamh0dGg+QjA2NjBuZqxyAAACACYATgJGAm4AIwAzAAA3JzcuATU0NjcnNxc+ATMyFhc3FwceARUUBgcXBycOASMiJic3Mj4BNTQuASMiDgEVFB4Bc009ExQUEz1NPR1DJiVEHT1NPRIVFRI9TT0dRCUmQx2GKEAmJkAoJ0EmJkBOTT0dQyYlRB09TT0SFRUSPU09HUQlJkMdPU09ExQUE0UmQCgoQCYmQCgnQSYAAAAAA//+AAACbgK8AAsADwATAAAzEScDMxMzEzMDBxElNSEVJTUhFfQV4ZaZEpmW4RX+2wHG/joBxgELCgGn/tYBKv5ZCv71amZmnGZmAAIAQv8KAMADJgADAAcAABMRMxEDETMRQn5+fgFuAbj+SP2cAbj+SAACAB7/8gGyAsoANwBIAAAXIiY9ATMVFBYzMjY1NCYnLgE1NDY3Jj0BND4BMzIWHQEjNTQuASMiBhUUFhceARUUBx4BHQEUBgM2NDU0JicuAScGFRQWFx4B8GFxbDE0KyooNVRfCwoVL1E0VmxsECUeIic6K1pREgkJZQ0BJTURIBADOykRGg5tWQ4MLDYgIB4hCg9OSBgpESEtBjJGJllNFgwUIhQeGiAdCBBRQjIkECUVCEtfAUMCBQQaIgkDCQUGCh8cCAMG//8AKAImAZgCxhAGAOoAAAADADL/9AKeAsgAEwAjAEMAAAUiLgE9ATQ+ATsBMh4BHQEUDgEjJzMyNj0BNCYrASIGHQEUFjciJj0BNDYzMhYdASM1NCYjIgYdARQWMzI2PQEzFRQGAV5ch0lJh1wUXIdJSYdcEhBgaGhgEGBoaGpATExAR0NeFRcWFhYWFxVeQwxIh194X4dISIdfeF+HSGBpY3xjaWljfGNpRk5IXkhOTT8OFBQYGBR+FBgYFBQOP00AAAACACIBVAGPAsYAIgAtAAATIiY1NDY7ATU0JiMiBgcnPgEzMhYdARQ7ARUjIiYnIw4CJzI2PQEjIgYVFBahN0hKOlkbIB8gBVELS0JCUhMhQhofAgwDFioQIylQFhscAVQ5NzU5EBogHhQbKDlDRYMVSBgVCRoUSiIlCxcREhgAAAIANAAGAowB6gAJABMAAC0BNSUzFQcVFxUhJTUlMxUHFRcVAob+2gEmBrW1/s7+2gEmBrW1Bq6IrohhEmGIroiuiGESYYgAAAEAZACiAggBlwAFAAAlNSE1IRUBmP7MAaSig3L1AAD//wBEAMYBbAE4EgYAEAAAAAQAMAEqAdQCygAPABsALwA4AAABIi4BNTQ+ATMyHgEVFA4BJzI2NTQmIyIGFRQWNzUzMhYVFAYHFR4BHQEjNTQrARU1MzI2NTQmKwEBAjxfNzdfPDxfNzdfPEtbW0tLW1sDVSUmExURDyoVLysREBARKwEqNV49PV41NV49PV41KltLS1tbS0tbOd4kGBMdCAoBFBE6PBVRdxQNDhIAAAABACgCNgFwApoAAwAAEzUhFSgBSAI2ZGQAAAAAAgAgAYoBagLKAA8AGwAAEyIuATU0PgEzMh4BFRQOAScyNjU0JiMiBhUUFsUuSywsSy4uSywsSy4cJSUcHCUlAYopSS8uSCkpSC8uSSlgJBwdIyMdHCQAAAIAZQAAAgcCHAALAA8AADc1IzUzNTMVMxUjFQU1IRX7lpZ2lpb+9AGiooRyhIRyhKJycv//ABoBXgFQAsgSBwEZAAABXgAA//8AFAFSAVECvBIHARQAAAFeAAD//wAoAigBAAK8EAYA5AAAAAEAQv84AmIB8AAeAAAXETMRFBYzMjY1ETMRFDsBFSMiJic1Iw4BIyImJyMVQn43Mzo8fhwoVCUvAhINQzUgJwwSyAK4/uA0OkhCAQT+lh5oJCIEIy8RCdoAAAAAAgAQAAACJAK8ABEAGwAAMxEjIi4BPQE0PgEzIREjESMRAzM1IyIGHQEUFv4aPmA2OGM/ATpsTowgICs3OgEcNVs6DDxbM/1EAlb9qgGC1DgvBi84AAAA//8ADgC/AMwBfRAHABH/2ADNAAD//wAo/yoBIAAUEAYA5wAA//8AEAFeAN4CvBIHAQMAAAFeAAAAAgAgAVQBlALGAAsAFwAAEyImNTQ2MzIWFRQGJzI2NTQmIyIGFRQW2lRmZlRUZmZUKjIyKioyMgFUYVhZYGBZWGFMNzY2Nzc2NjcAAAIARAAGApwB6gAJABMAACU1NzUnNTMFFQUhNTc1JzUzBRUFAXC1tQYBJv7a/s61tQYBJv7aBohhEmGIroiuiGESYYiuiK4A//8AEP/2Ay4CxhAmAQQAABAmANo+ABAHAPgBuAAAAAD//wAQ//YDHALGECYBBAAAECYA2j4AEAcBGQHMAAAAAP//ABT/9gNrAsYQJgEVAAAQJgDaewAQBwD4AfUAAAAAAAIAKv8qAiAB/gAkADAAAAUiLgE1ND4BPwE+AT0BMxUUBg8BDgEVFB4BMzI+AT0BMxUUDgEDMhYVFAYjIiY1NDYBIEdvQCxDIxESDoQoLxEtMB00IyQ5IYJEdD0pNjYpKDc31jRcPDxNMBAICBcWDhQzQhYIFS8pHSkWGDAkFhRFYzYC1DUqKjU1Kio1AAAA//8AEgAAAmgDeBImACQAABAHAPwAiwAA//8AEgAAAmgDeBImACQAABAHAOYAxwAA//8AEgAAAmgDeBImACQAABAGAOlVAAAA//8AEgAAAmgDehImACQAABAGARhgAAAA//8AEgAAAmgDkhImACQAABAGAOtVAAAA//8AEgAAAmgDtBImACQAABAHAQkArQAAAAIAEgAAAxUCvAALABUAACERIRUhFTMVIxUhFSETMxUjAzMVIwcBdwGY/ur6+gEc/P3qexJzhawyArx4p3iteAK8Rv6eepoA//8AMv8qAloCyhImACYAABAHAOcAsQAA//8AQgAAAgoDeBImACgAABAGAPx2AAAA//8AQgAAAgoDeBImACgAABAHAOYAsgAA//8AQgAAAgoDeBImACgAABAGAOlAAAAA//8AQgAAAgoDkhImACgAABAGAOtAAAAA////+gAAANIDeBImACwAABAGAPzSAAAA//8ANgAAAQ4DeBImACwAABAGAOYOAAAA////xAAAAUQDeBImACwAABAGAOmcAAAA////xAAAAUQDkhImACwAABAGAOucAAAA//8ALgAAAm4CvBImACcAABAGARLyAAAA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CGdseXBoMjExCGdseXBoMjEyCGdseXBoMjE0CGdseXBoMjE1CGdseXBoMjE2CGdseXBoMjE4CGdseXBoMjE5CGdseXBoMjIxCmVpZ2h0LmRub20KZWlnaHQubnVtcgplaWdodC50bnVtCGZfZi5saWdhCmZfZl9pLmxpZ2EKZl9mX2oubGlnYQpmX2ZfbC5saWdhCGZfai5saWdhCWZpdmUuZG5vbQlmaXZlLm51bXIJZml2ZS50bnVtCWZvdXIuZG5vbQlmb3VyLm51bXIJZm91ci50bnVtCGdseXBoMjM5CGdseXBoMjQwBmkubG9jbAhnbHlwaDI0NQhnbHlwaDI0NgluaW5lLmRub20JbmluZS5udW1yCW5pbmUudG51bQhvbmUuZG5vbQhvbmUubnVtcghvbmUudG51bQhnbHlwaDI1NghnbHlwaDI1NwhnbHlwaDI1OAhnbHlwaDI1OQpzZXZlbi5kbm9tCnNldmVuLm51bXIKc2V2ZW4udG51bQhzaXguZG5vbQhzaXgubnVtcghzaXgudG51bQhnbHlwaDI2NwhnbHlwaDI2OAhnbHlwaDI3MAh0X3QubGlnYQp0aHJlZS5kbm9tCnRocmVlLm51bXIKdGhyZWUudG51bQhnbHlwaDI3NghnbHlwaDI3Nwh0d28uZG5vbQh0d28ubnVtcgh0d28udG51bQl6ZXJvLmRub20JemVyby5udW1yCXplcm8udG51bQABAAH//wAPAAEAAgAOAAAAeAAAAPIAAgARACQAKAABACoAMgABADUAOAABADoAOgABADwAPQABAEQASAABAEoASwABAE4AUgABAFUAWAABAFoAWgABAFwAXQABAIgAiAABAKgAqAABAMIAwgABAOIA4wACAPAA9AACARMBEwACAGYACAAUABwAJAAsADoASABWAF4AAQAEAAEBfgABAAQAAQGYAAEABAABAXoAAgAGAAoAAQF6AAECxAACAAYACgABAXoAAQLEAAIABgAKAAEBegABAt4AAQAEAAEBfgABAAQAAQG2AAEACADiAOMA8ADxAPIA8wD0ARMAAQACAAAADAAAABAAAQAAAAEAAAAAAAEAAAAKAJIBBAACREZMVAAObGF0bgAkAAQAAAAA//8ABgAAAAEAAgAGAAcACAAWAANDQVQgAChOTEQgADxUUksgAFAAAP//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//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/cAAAAAP/o//IAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAD/5P/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//r/7v++AAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAD/kgAAAAAAAP+g/77/2gAAAAAAAAAAAAAAAAAAAAAAAAAA//7/zAAA/97/9gAAAAD/2P/oAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6v/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/54AAAAAAAD/tP/c//b/2P/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/UAAAAAAAA//T/+v/c/+oAAAAAAAAAAP/yAAAAAP/u//gAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAA//L/+AAA//T/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9r/7gAA/9r/3gAA/97/3gAAAAAAAP/A/8oAAAAA/9wAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qP/k/87/uP+sAAD/tP+0AAAAAAAA/5L/ngAAAAD/mAAAAAAAMv/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7AAAAAAAAAAAP/A/8L/vP+yAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAAAAAAAAAAAAAA//b/5AAAAAAAAAAAAAAAAP/4/+IAAAAA//YAAAAAAAAAAAAAAAD/9gAA//AAAP+SAAD/+AAKAAAAAAAAAAAAAP+8//YAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAADQAAAAiAAAAAAAAAAAAAAAAAFoAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAASAAD/9P/6AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//z/+gAA/9T/+AAAAAAAAAAAAAAAAP+2AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAP/eAAAAAAAA/+D/7P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y/+L/4gAAAAAAAP/0AAAAAAAAAAAAAP/aAAAAAAAAAAAAAAAo//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAA/+b/9AAAAAAAAAAAAAD/6P/QAAAAAP+YAAAAAAAA/+wAAAAA/9wAAAAAAAD/jgAAAAAAAP+g/7r/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4P/4AAAAAAAAAAD/9AAAAAD/yv/2AAAAAAAAAAAAAAAA/57/4v/8AAD/2P/4AAAAIAAA//7//AAA/+r/7gAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAeAAD/9P/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAD/6gAAAAAAAP/q//YAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ov/k/8T/wP+qAAD/uP+8//QAAAAA/6D/tAAAAAD/qAAAAAAAQv/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7QAAAAAAAAAAP+8/7z/sP+2AAAAAP/i//L/9v/S/+IAAP/0//gAAAAAAAD/vv/cAAAAAAAAAAAAAABA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAAAAA//D/8v/o//oAAAAA//r/+v/8/+7/+gAAAAAAAAAAAAAAAP/a//YAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/o/+4AAP/8AAD/+AAAAAAAAAAAAAD/2AAAAAD/+AAAAAAAKP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAP/y//gAAAAAAAAAAP/4//T/9AAAAAAAAP/6AAAAAAAAAAAAAP/cAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAAAAAAAAA//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAD/9AAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9oAAP/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAD/9AAAAAAAAAAAAAAAAP+w//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/8//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vP/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0gAAAAAAAAAAAAAAAAAA//YAAAAA//wAAP/8AAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAA//AAAAAA//wAAAAAAAAAAAAAAAD/7gAA/34AAAAAAAoAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAA//wAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAP/0AAAAAAAAAAAAAAAA/9j/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAD/+AAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAACAFsABQAFAAMACgAKAAMADwAPAAkAEAAQAAsAEQARAAkAEwATADUAFQAVADAAFgAWAC8AFwAXACMAGAAYACIAGQAZAC0AGgAaACwAGwAbACEAHAAcACkAJAAkAAQAJQAlABQAJgAmAA0AJwAnAAEAKAAoAAUAKQApABUAKgAqABYAKwAsAAcALQAtAA8ALgAuABcALwAvABgAMAAxAAcAMgAyAAEAMwAzABkANAA0AAEANQA1ABoANgA2ABsANwA3ABwAOAA4AAgAOQA5AB0AOgA6AB4AOwA7AB8APAA8ABAAPQA9ACAAPgA+ABEARABEAAYARwBHAAoASQBJABIASwBLAAwATABNAAIATgBOACgATwBPAAoAUABRAAwAVQBVACoAVgBWACsAVwBXAC4AWQBZADEAWgBaADIAWwBbADMAXQBdADQAXgBeABEAbwBvAAsAggCHAAQAiACIAAUAiQCJAA0AigCNAAUAkACRAA4AkgCSAAEAkwCTAAcAlACYAAEAmgCaAAEAmwCeAAgAnwCfABAAogCnAAYArgCvAAIAsACxABMAswCzAAwAwwDDAAUAxQDGAAMAzADNAAsAzgDPAAMA0ADQAAkA0QDSAAMA0wDTAAkA1QDVAAkA4gDiAAIA4wDjAAoA5QDlAA8A7QDtACQA8ADwABIA8QDyAAIA8wDzAAoA9AD0AAIA/QD+AAIBAAEAACUBDQENACYBHAEcACcAAgBcAAUABQAGAAoACgAGAA8ADwAMABAAEAANABEAEQAMABMAEwAtABQAFAAjABUAFQAoABYAFgAnABcAFwAbABkAGQAmABoAGgAlABsAGwAaABwAHAAiACQAJAAEACUAJQAOACYAJgACACcAJwAOACoAKgACAC0ALQAQADIAMgACADQANAACADYANgAUADcANwAVADgAOAAKADkAOQAWADoAOgAXADsAOwAYADwAPAARAD0APQAZAEAAQAASAEQARAAFAEUARQALAEYASAABAEkASQADAEoASgABAEsASwALAEwATQAJAE4ATwALAFAAUQAIAFIAUgABAFMAUwAIAFQAVAABAFUAVQAIAFYAVgAkAFcAVwADAFgAWAAHAFkAWQApAFoAWgAqAFsAWwArAFwAXAAHAF0AXQAsAGAAYAASAG8AbwANAIIAiAAEAIkAiQACAJAAkQAPAJQAmAACAJoAmgACAJsAngAKAJ8AnwARAKIAqAAFAKkArQABAK4ArwAJALAAsQATALIAsgABALMAswAIALQAuAABALoAugABALsAvwAHAMAAwAALAMEAwQAHAMIAwgAIAMMAwwACAMQAxAABAMUAxgAGAMwAzQANAM4AzwAGANAA0AAMANEA0gAGANMA0wAMANUA1QAMAOIA4wADAOUA5QAQAO0A7QAcAPAA9AADAPgA+AAdAP0A/gAJAQABAAAeAQMBAwAfAQ0BDQAgARwBHAAhAAIAHQAFAAUAAAAKAAoAAQAPABEAAgATABMABQAVABwABgAkAD4ADgBEAEkAKQBLAFMALwBVAFcAOABZAFsAOwBdAF4APgBvAG8AQACCAI0AQQCQAJgATQCaAJ8AVgCiALgAXAC6ALoAcwDAAMAAdADDAMYAdQDMANMAeQDVANUAgQDiAOMAggDlAOUAhADtAO0AhQDwAPQAhgD9AP4AiwEAAQAAjQENAQ0AjgEcARwAjwAAAAEAAAAA2lOZ8AAAAADbnCKZAAAAANucjWM=' +export default "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//8ADgC/AMwBfRAHABH/2ADNAAD//wAo/yoBIAAUEAYA5wAA//8AEAFeAN4CvBIHAQMAAAFeAAAAAgAgAVQBlALGAAsAFwAAEyImNTQ2MzIWFRQGJzI2NTQmIyIGFRQW2lRmZlRUZmZUKjIyKioyMgFUYVhZYGBZWGFMNzY2Nzc2NjcAAAIARAAGApwB6gAJABMAACU1NzUnNTMFFQUhNTc1JzUzBRUFAXC1tQYBJv7a/s61tQYBJv7aBohhEmGIroiuiGESYYiuiK4A//8AEP/2Ay4CxhAmAQQAABAmANo+ABAHAPgBuAAAAAD//wAQ//YDHALGECYBBAAAECYA2j4AEAcBGQHMAAAAAP//ABT/9gNrAsYQJgEVAAAQJgDaewAQBwD4AfUAAAAAAAIAKv8qAiAB/gAkADAAAAUiLgE1ND4BPwE+AT0BMxUUBg8BDgEVFB4BMzI+AT0BMxUUDgEDMhYVFAYjIiY1NDYBIEdvQCxDIxESDoQoLxEtMB00IyQ5IYJEdD0pNjYpKDc31jRcPDxNMBAICBcWDhQzQhYIFS8pHSkWGDAkFhRFYzYC1DUqKjU1Kio1AAAA//8AEgAAAmgDeBImACQAABAHAPwAiwAA//8AEgAAAmgDeBImACQAABAHAOYAxwAA//8AEgAAAmgDeBImACQAABAGAOlVAAAA//8AEgAAAmgDehImACQAABAGARhgAAAA//8AEgAAAmgDkhImACQAABAGAOtVAAAA//8AEgAAAmgDtBImACQAABAHAQkArQAAAAIAEgAAAxUCvAALABUAACERIRUhFTMVIxUhFSETMxUjAzMVIwcBdwGY/ur6+gEc/P3qexJzhawyArx4p3iteAK8Rv6eepoA//8AMv8qAloCyhImACYAABAHAOcAsQAA//8AQgAAAgoDeBImACgAABAGAPx2AAAA//8AQgAAAgoDeBImACgAABAHAOYAsgAA//8AQgAAAgoDeBImACgAABAGAOlAAAAA//8AQgAAAgoDkhImACgAABAGAOtAAAAA////+gAAANIDeBImACwAABAGAPzSAAAA//8ANgAAAQ4DeBImACwAABAGAOYOAAAA////xAAAAUQDeBImACwAABAGAOmcAAAA////xAAAAUQDkhImACwAABAGAOucAAAA//8ALgAAAm4CvBImACcAABAGARLyAAAA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CGdseXBoMjExCGdseXBoMjEyCGdseXBoMjE0CGdseXBoMjE1CGdseXBoMjE2CGdseXBoMjE4CGdseXBoMjE5CGdseXBoMjIxCmVpZ2h0LmRub20KZWlnaHQubnVtcgplaWdodC50bnVtCGZfZi5saWdhCmZfZl9pLmxpZ2EKZl9mX2oubGlnYQpmX2ZfbC5saWdhCGZfai5saWdhCWZpdmUuZG5vbQlmaXZlLm51bXIJZml2ZS50bnVtCWZvdXIuZG5vbQlmb3VyLm51bXIJZm91ci50bnVtCGdseXBoMjM5CGdseXBoMjQwBmkubG9jbAhnbHlwaDI0NQhnbHlwaDI0NgluaW5lLmRub20JbmluZS5udW1yCW5pbmUudG51bQhvbmUuZG5vbQhvbmUubnVtcghvbmUudG51bQhnbHlwaDI1NghnbHlwaDI1NwhnbHlwaDI1OAhnbHlwaDI1OQpzZXZlbi5kbm9tCnNldmVuLm51bXIKc2V2ZW4udG51bQhzaXguZG5vbQhzaXgubnVtcghzaXgudG51bQhnbHlwaDI2NwhnbHlwaDI2OAhnbHlwaDI3MAh0X3QubGlnYQp0aHJlZS5kbm9tCnRocmVlLm51bXIKdGhyZWUudG51bQhnbHlwaDI3NghnbHlwaDI3Nwh0d28uZG5vbQh0d28ubnVtcgh0d28udG51bQl6ZXJvLmRub20JemVyby5udW1yCXplcm8udG51bQABAAH//wAPAAEAAgAOAAAAeAAAAPIAAgARACQAKAABACoAMgABADUAOAABADoAOgABADwAPQABAEQASAABAEoASwABAE4AUgABAFUAWAABAFoAWgABAFwAXQABAIgAiAABAKgAqAABAMIAwgABAOIA4wACAPAA9AACARMBEwACAGYACAAUABwAJAAsADoASABWAF4AAQAEAAEBfgABAAQAAQGYAAEABAABAXoAAgAGAAoAAQF6AAECxAACAAYACgABAXoAAQLEAAIABgAKAAEBegABAt4AAQAEAAEBfgABAAQAAQG2AAEACADiAOMA8ADxAPIA8wD0ARMAAQACAAAADAAAABAAAQAAAAEAAAAAAAEAAAAKAJIBBAACREZMVAAObGF0bgAkAAQAAAAA//8ABgAAAAEAAgAGAAcACAAWAANDQVQgAChOTEQgADxUUksgAFAAAP//AAYAAAABAAIABgAHAAgAAP//AAcAAAABAAIAAwAGAAcACAAA//8ABwAAAAEAAgAEAAYABwAIAAD//wAHAAAAAQACAAUABgAHAAgACWRub20AOGZyYWMAPmxpZ2EASGxvY2wATmxvY2wAVGxvY2wAWm51bXIAYHBudW0AZnRudW0AbAAAAAEABwAAAAMACAAJAAoAAAABAA8AAAABAAEAAAABAAQAAAABAAAAAAABAAYAAAABAA0AAAABAA4AEAAiACoANAA8AEQATgBWAF4AZgBuAHYAgACIAJAAmACgAAEAAAABAIYABgAAAAIAigCwAAEAAAABAMwAAQAAAAEA0AAGAAAAAgDUAPIAAQAAAAEBBgABAAAAAQEQAAEAAAABASwAAQAAAAEBSAABAAAAAQFMAAYAAAACAWgBmAABAAAAAQHQAAEAAAABAeYAAQAAAAEB/AABAAAAAQImAAQACAABAkIAAQAGALEAAQABAEwAAwABABoAAQAUAAEAIAABAAAAAgABAAEAeQABAAEATwABAAEATwADAAEAGgABABQAAQAgAAEAAAADAAEAAQB5AAEAAQAvAAEAAQAvAAEABgCNAAEAAQB5AAEABgCOAAEAAQB5AAMAAQAYAAEAEgAAAAEAAAAFAAEAAQBNAAEAAQCvAAMAAQAYAAEAEgAAAAEAAAAFAAEAAQAtAAEAAQCPAAIACgACAOUA/gABAAIALQBNAAIAGgAKAR0BBAEaARUA+QD2AQ4BCwDuAQEAAgABABMAHAAAAAIAGgAKARwBAwEZARQA+AD1AQ0BCgDtAQAAAgABABMAHAAAAAEABgDIAAEAAQASAAIAGgAKAR0BBAEaARUA+QD2AQ4BCwDuAQEAAgABABMAHAAAAAMAAQAqAAEAEgAAAAEAAAALAAEACgDuAPYA+QEBAQQBCwEOARUBGgEdAAEAAQDaAAMAAQAqAAEAEgAAAAEAAAAMAAEACgDuAPYA+QEBAQQBCwEOARUBGgEdAAEACgDtAPUA+AEAAQMBCgENARQBGQEcAAEABv//AAEACgDuAPYA+QEBAQQBCwEOARUBGgEdAAEABv//AAEACgDuAPYA+QEBAQQBCwEOARUBGgEdAAIAGgAKABsAGAAXABwAFAAaABkAFgAVABMAAQAKAO8A9wD6AQIBBQEMAQ8BFgEbAR4AAgAaAAoBHgEFARsBFgD6APcBDwEMAO8BAgACAAEAEwAcAAAAAQBUAAIACgBKAAcAEAAYACAAKAAuADQAOgDzAAMASQBPAPIAAwBJAE0A8QADAEkATAD0AAIATQDwAAIASQDjAAIATwDiAAIATAABAAQBEwACAFcAAQACAEkAVwAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAA//8AAQAAAAQAAAAA//8AAQAAAAFrZXJuAAgAAAABAAAAAQAEAAIACAACAAoH/gABBvgABAAAAHwBAgFkAqoCyALOAtQDlgOWA5YDlgOcA64DuAPCA8gD0gO4A+QDuAPuA/QD/gQYBB4ELAQ2BEAERgVsBXoFegV6BYgFogWsBawFogWiBXoFegWyBbgFxgXsBfYEQALIAsgGAAYGBgwDnAOcA5wDnAOcA5wGEgYcA7gDuAO4A7gDuAO4A7gEGAQYBBgEGAQ2BiYGZAVsBWwFbAVsBWwFbAV6BXoFegV6BXoFegWsBawGkgaSBXoFogV6BXoFegV6BXoFegV6BXoCyALIAs4CzgLOBqwGBgWsA8gG1gbcBawFrAWsBgYGBgWsBawGBgYMBvIGBgYGBgAGBgAYAA//4gAQ/+YAEf/iACT/9AA2AAAAN//iADn/9AA6//oAPP/2AF7/5gBv/+YAgv/0AIP/9ACE//QAhf/0AIb/9ACH//QAiP/0AJ//9gDM/+YAzf/mAND/4gDT/+IA1f/iAFEADAAQABP/9gAU/+IAFf/8ABf/2AAZ//YAG//2ABz/9gAk//YAJv/0ACr/9AAt/9gAMv/0ADT/9AA2AAAARP/2AEb/7ABH/+wASP/sAEn/9gBK/+wATQAsAFL/7ABU/+wAVv/2AFf/9gBY//YAWf/oAFr/8ABc//YAgv/2AIP/9gCE//YAhf/2AIb/9gCH//YAiP/2AIn/9ACU//QAlf/0AJb/9ACX//QAmP/0AJr/9ACi//YAo//2AKT/9gCl//YApv/2AKf/9gCo//YAqf/sAKr/7ACr/+wArP/sAK3/7ACwAFAAsQBQALL/7AC0/+wAtf/sALb/7AC3/+wAuP/sALr/7AC7//YAvP/2AL3/9gC+//YAv//2AMH/9gDD//QAxP/sAOL/9gDj//YA5f/YAPD/9gDx//YA8v/2APP/9gD0//YABwAD/+IATAAAAE0AFACuAAAArwAAAP0AAAD+AAAAAQAD/+YAAQAD/+IAMAAkAAAALf/uADcAFAA5ABQARP/yAEb/8gBH//IASP/yAEr/8gBMAB4ATQAeAFL/8gBU//IAVv/2AIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACi//IAo//yAKT/8gCl//IApv/yAKf/8gCo//IAqf/yAKr/8gCr//IArP/yAK3/8gCuAB4ArwAeALAAZACxAGQAsv/yALT/8gC1//IAtv/yALf/8gC4//IAuv/yAMT/8gDl/+4A/QAeAP4AHgABAAz/9gAEAAP/9AAM//YAIv/WAD8AAAACAAz//AASAAAAAgAM//QAEv/qAAEAEv/iAAIAEv/HAD8ADgAEAAP/4gAM//gAP//aAQf/IgACAAz/+gAS/7QAAQAM//wAAgAMAAAAEv/4AAYAA//iABL/sAA/ABQAof/oAK//9ACwAEIAAQAS//AAAwAD//QAEv/EAD8AFAACAAP/+gAS/+YAAgAD//YAEv+0AAEATQAoAEkAJv/qACr/6gAt//YAMv/qADT/6gA2//gAN/+wADj/8AA5/8QAOv/mADz/tABE//oARv/yAEf/8gBI//IASf/EAEr/8gBNAEoAUv/yAFT/8gBW//YAV//EAFj/6gBZ/+wAWv/4AFz/6gCJ/+oAlP/qAJX/6gCW/+oAl//qAJj/6gCa/+oAm//wAJz/8ACd//AAnv/wAJ//tACi//oAo//6AKT/+gCl//oApv/6AKf/+gCo//oAqf/yAKr/8gCr//IArP/yAK3/8gCy//IAtP/yALX/8gC2//IAt//yALj/8gC6//IAu//qALz/6gC9/+oAvv/qAL//6gDB/+oAw//qAMT/8gDi/8QA4//EAOX/9gDw/8QA8f/EAPL/xADz/8QA9P/EAAMADP/uACL/6AA//+wAAwAM/+wAEv/yAD//8gAGABL/3AA/ABQATP/kAE3/5ABP/+QAV//2AAIADP/2AD//6gABAD8AHgABABL/3gADAAz/9gAS//YAP//2AAkASf/oAFf/fgDi/34A4/9+APD/fgDx/34A8v9+APP/fgD0/34AAgAM/+gAEv/sAAIADP/wABL/+AABANr/JAABANr/EAABANr/OAACAJAAAACRAAAAAgCOAAAAjwAAAA8AJP/gADf/wgA5/+wAOv/8ADv/xgA8/84APf/SAIL/4ACD/+AAhP/gAIX/4ACG/+AAh//gAIj/4ACf/84ACwBJ/+QAV//kAFn/5gBa//AA4v/kAOP/5ADw/+QA8f/kAPL/5ADz/+QA9P/kAAYADABQAA0APAAiAFAAPwBkAHAAUADdAGQACgDt/xYA9f84APj+/AEA/xABA/84AQr/TAEN/xABFP84ARn/EAEc/xAAAQDa/xYABQAS/9wAPwAUAEz/5ABN/+QAT//kAAEA2v7YAAEAfAADAAsADwAQABEAEgATABkAGwAcACQAJQAnACkALQAvADIAMwA0ADUANgA3ADgAOQA6ADwAPgA/AEQARQBGAEgASQBLAEwATQBQAFEAUgBTAFUAVgBXAFkAWgBeAGAAbwB0AHUAewCCAIMAhACFAIYAhwCPAJEAkgCUAJUAlgCXAJgAmgCbAJwAnQCeAJ8AoAChAKIAowCkAKUApgCnAKgAqQCqAKsArACtAK4ArwCwALEAsgCzALQAtQC2ALcAuAC6AMAAxADMAM0A0ADTANUA2gDbAOIA5QDuAPAA8QDyAPQA9gD5AP0A/gEBAQQBCwEOARUBGgEdAAIXygAEAAATeBWeADYALgAAAAAAAP/wAAAAAP/oAAAAAAAAAAAAAP/6AAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/+/+D/+AAAAAAAAAAAAAD/+gAAAAAAAAAAAAAAAAAA/+4AAP/qAAAAAP/kAAAADAAA/+T/8v/6/+j/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+gAAAAK/8D/6gAAAAAAAAAAAAAAAAAAAAAAAAAA/7IAAAAAAFAAAAAAAAAAAAAAAAAAAP/WAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6/+YAAAAA/8AAAAAAAAD/9gAAAAD/+AAAAAAAAP+4AAAAAAAA/8D/0v/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/cAAAAAP/o//IAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAD/5P/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//r/7v++AAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAD/kgAAAAAAAP+g/77/2gAAAAAAAAAAAAAAAAAAAAAAAAAA//7/zAAA/97/9gAAAAD/2P/oAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6v/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/54AAAAAAAD/tP/c//b/2P/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/UAAAAAAAA//T/+v/c/+oAAAAAAAAAAP/yAAAAAP/u//gAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAA//L/+AAA//T/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9r/7gAA/9r/3gAA/97/3gAAAAAAAP/A/8oAAAAA/9wAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qP/k/87/uP+sAAD/tP+0AAAAAAAA/5L/ngAAAAD/mAAAAAAAMv/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7AAAAAAAAAAAP/A/8L/vP+yAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAAAAAAAAAAAAAA//b/5AAAAAAAAAAAAAAAAP/4/+IAAAAA//YAAAAAAAAAAAAAAAD/9gAA//AAAP+SAAD/+AAKAAAAAAAAAAAAAP+8//YAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAADQAAAAiAAAAAAAAAAAAAAAAAFoAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAASAAD/9P/6AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//z/+gAA/9T/+AAAAAAAAAAAAAAAAP+2AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAP/eAAAAAAAA/+D/7P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y/+L/4gAAAAAAAP/0AAAAAAAAAAAAAP/aAAAAAAAAAAAAAAAo//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAA/+b/9AAAAAAAAAAAAAD/6P/QAAAAAP+YAAAAAAAA/+wAAAAA/9wAAAAAAAD/jgAAAAAAAP+g/7r/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4P/4AAAAAAAAAAD/9AAAAAD/yv/2AAAAAAAAAAAAAAAA/57/4v/8AAD/2P/4AAAAIAAA//7//AAA/+r/7gAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAeAAD/9P/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAD/6gAAAAAAAP/q//YAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ov/k/8T/wP+qAAD/uP+8//QAAAAA/6D/tAAAAAD/qAAAAAAAQv/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7QAAAAAAAAAAP+8/7z/sP+2AAAAAP/i//L/9v/S/+IAAP/0//gAAAAAAAD/vv/cAAAAAAAAAAAAAABA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAAAAA//D/8v/o//oAAAAA//r/+v/8/+7/+gAAAAAAAAAAAAAAAP/a//YAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/o/+4AAP/8AAD/+AAAAAAAAAAAAAD/2AAAAAD/+AAAAAAAKP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAP/y//gAAAAAAAAAAP/4//T/9AAAAAAAAP/6AAAAAAAAAAAAAP/cAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAAAAAAAAA//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAD/9AAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9oAAP/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAD/9AAAAAAAAAAAAAAAAP+w//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/8//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vP/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0gAAAAAAAAAAAAAAAAAA//YAAAAA//wAAP/8AAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAA//AAAAAA//wAAAAAAAAAAAAAAAD/7gAA/34AAAAAAAoAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAA//wAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAP/0AAAAAAAAAAAAAAAA/9j/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAD/+AAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAACAFsABQAFAAMACgAKAAMADwAPAAkAEAAQAAsAEQARAAkAEwATADUAFQAVADAAFgAWAC8AFwAXACMAGAAYACIAGQAZAC0AGgAaACwAGwAbACEAHAAcACkAJAAkAAQAJQAlABQAJgAmAA0AJwAnAAEAKAAoAAUAKQApABUAKgAqABYAKwAsAAcALQAtAA8ALgAuABcALwAvABgAMAAxAAcAMgAyAAEAMwAzABkANAA0AAEANQA1ABoANgA2ABsANwA3ABwAOAA4AAgAOQA5AB0AOgA6AB4AOwA7AB8APAA8ABAAPQA9ACAAPgA+ABEARABEAAYARwBHAAoASQBJABIASwBLAAwATABNAAIATgBOACgATwBPAAoAUABRAAwAVQBVACoAVgBWACsAVwBXAC4AWQBZADEAWgBaADIAWwBbADMAXQBdADQAXgBeABEAbwBvAAsAggCHAAQAiACIAAUAiQCJAA0AigCNAAUAkACRAA4AkgCSAAEAkwCTAAcAlACYAAEAmgCaAAEAmwCeAAgAnwCfABAAogCnAAYArgCvAAIAsACxABMAswCzAAwAwwDDAAUAxQDGAAMAzADNAAsAzgDPAAMA0ADQAAkA0QDSAAMA0wDTAAkA1QDVAAkA4gDiAAIA4wDjAAoA5QDlAA8A7QDtACQA8ADwABIA8QDyAAIA8wDzAAoA9AD0AAIA/QD+AAIBAAEAACUBDQENACYBHAEcACcAAgBcAAUABQAGAAoACgAGAA8ADwAMABAAEAANABEAEQAMABMAEwAtABQAFAAjABUAFQAoABYAFgAnABcAFwAbABkAGQAmABoAGgAlABsAGwAaABwAHAAiACQAJAAEACUAJQAOACYAJgACACcAJwAOACoAKgACAC0ALQAQADIAMgACADQANAACADYANgAUADcANwAVADgAOAAKADkAOQAWADoAOgAXADsAOwAYADwAPAARAD0APQAZAEAAQAASAEQARAAFAEUARQALAEYASAABAEkASQADAEoASgABAEsASwALAEwATQAJAE4ATwALAFAAUQAIAFIAUgABAFMAUwAIAFQAVAABAFUAVQAIAFYAVgAkAFcAVwADAFgAWAAHAFkAWQApAFoAWgAqAFsAWwArAFwAXAAHAF0AXQAsAGAAYAASAG8AbwANAIIAiAAEAIkAiQACAJAAkQAPAJQAmAACAJoAmgACAJsAngAKAJ8AnwARAKIAqAAFAKkArQABAK4ArwAJALAAsQATALIAsgABALMAswAIALQAuAABALoAugABALsAvwAHAMAAwAALAMEAwQAHAMIAwgAIAMMAwwACAMQAxAABAMUAxgAGAMwAzQANAM4AzwAGANAA0AAMANEA0gAGANMA0wAMANUA1QAMAOIA4wADAOUA5QAQAO0A7QAcAPAA9AADAPgA+AAdAP0A/gAJAQABAAAeAQMBAwAfAQ0BDQAgARwBHAAhAAIAHQAFAAUAAAAKAAoAAQAPABEAAgATABMABQAVABwABgAkAD4ADgBEAEkAKQBLAFMALwBVAFcAOABZAFsAOwBdAF4APgBvAG8AQACCAI0AQQCQAJgATQCaAJ8AVgCiALgAXAC6ALoAcwDAAMAAdADDAMYAdQDMANMAeQDVANUAgQDiAOMAggDlAOUAhADtAO0AhQDwAPQAhgD9AP4AiwEAAQAAjQENAQ0AjgEcARwAjwAAAAEAAAAA2lOZ8AAAAADbnCKZAAAAANucjWM="; diff --git a/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts b/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts index fd54abe9..34f5ab05 100644 --- a/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts +++ b/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts @@ -1 +1 @@ -export default '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Ov47IztlO6Q7zjvsPAk8JDx1PKI8wDzdPPU9DT0XPSE9Kz01PT89ST1TPV09Zz1xPXs9hT2PPagAAAANAKIAAwABBAkAAACwApQAAwABBAkAAQAWAn4AAwABBAkAAgAIAnYAAwABBAkAAwA0AkIAAwABBAkABAAgAiIAAwABBAkABQBCAeAAAwABBAkABgAeAcIAAwABBAkACAAQAbIAAwABBAkACQAQAbIAAwABBAkACwAmAYwAAwABBAkADAA4AVQAAwABBAkADQEgADQAAwABBAkADgA0AAAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIABUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAGgAdAB0AHAAcwA6AC8ALwBnAGkAdABoAHUAYgAuAGMAbwBtAC8AbgBvAHAAbwBuAGkAZQBzAC8AaAB0AHQAcAA6AC8ALwBuAG8AcABvAG4AaQBlAHMALgBjAG8AbQBOAG8AcABvAG4AaQBlAHMAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7ACAAdAB0AGYAYQB1AHQAbwBoAGkAbgB0ACAAKAB2ADEALgA4ACkAVAB1AHIAcgBlAHQAIABSAG8AYQBkACAAQgBvAGwAZAAxAC4AMAAwADEAOwBOAE8AUABOADsAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAEIAbwBsAGQAQgBvAGwAZABUAHUAcgByAGUAdAAgAFIAbwBhAGQAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQA4ACAAVABoAGUAIABUAHUAcgByAGUAdAAgAFIAbwBhAGQAIABQAHIAbwBqAGUAYwB0ACAAQQB1AHQAaABvAHIAcwAgACgAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwBuAG8AcABvAG4AaQBlAHMALwB0AHUAcgByAGUAdAAtAHIAbwBhAGQAKQAAAAAAAgAAAAMAAAAUAAMAAQAAABQABATUAAAAggCAAAYAAgANAC8AOQB+AQcBEwEbASMBJwErATEBNwE+AUgBTQFbAWcBawF+AZICGwI3AscC3QMEAwgDDAMSAygDOAOUA6kDvAPAHoUe8yAUIBogHiAiICYgMCA6IEQgcCB5IKwhIiFfIYkhmSICIgUiDyISIhUiGiIeIisiSCJgImUlyvsC//8AAAANACAAMAA6AKABCgEWAR4BJgEqAS4BNgE5AUEBSgFQAV4BagFuAZICGAI3AsYC2AMAAwYDCgMSAyYDNQOUA6kDvAPAHoAe8iATIBggHCAgICYgMCA5IEQgcCB0IKwhIiFQIYkhkCICIgUiDyIRIhUiGiIeIisiSCJgImQlyvsB////9AAAAL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EAAD+awAAAAAAAAAAAAD+g/5w/mT9Vv1C/TD9LQAAAADhLwAAAAAAAOEJ4ULhFODS4JzgnOCp4GIAAN+QAADfbd9k310AAN9E31TfTN9A3x3e/wAA27MF5QABAAAAgAAAAJwBJAHyAgQCDgIYAhoCHAIiAiQCLgI8AkICWAJqAmwAAAKKAAACjgKQApoCogKmAAAAAAAAAAAAAAAAAAACnAKmAAACpgKqAq4AAAAAAAAAAAAAAAAAAAAAAqIAAAK+AAAAAAAAAsoAAAAAAAAAAAAAAAACwAAAAAAAAAACATABTwE3AVQBcQF/AVABOgE7ATYBWgEsAUABKwE4AS0BLgFhAV4BYAEyAX4AAwAOAA8AFAAYACEAIgAmACgAMAAxADMAOAA5AD8ASQBLAEwAUABVAFoAYwBkAGkAagBvAT4BOQE/AWgBRAGkAHMAfgB/AIQAiACRAJIAlgCYAKEAowClAKoAqwCxALsAvQC+AMIAyADNANYA1wDcAN0A4gE8AYYBPQFmAVEBMQFSAVcBUwFYAYcBgQGiAYIA6AFLAWcBQQGDAaYBhQFkAQ4BDwGdAXABgAE0AaABDQDpAUwBHAEYAR0BMwAIAAQABgAMAAcACwANABIAHgAZABsAHAAtACkAKgArABUAPgBDAEAAQQBHAEIBXABGAF4AWwBcAF0AawBKAMcAeAB0AHYAfAB3AHsAfQCCAI4AiQCLAIwAngCaAJsAnACFALAAtQCyALMAuQC0AV0AuADRAM4AzwDQAN4AvADgAAkAeQAFAHUACgB6ABAAgAATAIMAEQCBABYAhgAXAIcAHwCPAB0AjQAgAJAAGgCKACMAkwAlAJUAJACUACcAlwAuAJ8ALwCgACwAmQAyAKQANACmADYAqAA1AKcANwCpADoArAA8AK4AOwCtAD0ArwBFALcARAC2AEgAugBNAL8ATwDBAE4AwABRAMMAUwDFAFIAxABYAMsAVwDKAFYAyQBgANMAYgDVAF8A0gBhANQAZgDZAGwA3wBtAHAA4wByAOUAcQDkAFQAxgBZAMwBoQGfAZ4BowGoAacBqQGlAYwBjQGPAZMBlAGRAYsBigGSAY4BkABoANsAZQDYAGcA2gBuAOEBSQFKAUUBRwFIAUYBiAGJATUBJAEpASoBGgEbAR4BHwEgASEBIgEjASUBJgEnASgBFwF5AXMBdQF3AXsBfAF6AXQBdgF4AW0BWwFjAWICQwAyAcIAAAGQAAACeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoA9cAKAJ/ADICsgAoArIAKAKyACgCsgAoArIAKAKtADIDKgAyAq0AMgMqADICEAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAhAAMgIQADIB+AAoArMAKAKzACgCswAoArMAKAJaADICWv/nAL4AMgC+ACwBXAAyAZIAMgC+ACkAvgAsAVQAMgC+ACoBoAAeAh4AMgIeADIBygAyAcoAMgHKADIBygAyAk4AMgQAADICrgAyAq4AMgKuADICrgAyAq4AMgKuADICxAAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyAsQAMgLEADIEEwAyAnEAMgJxADICwgAyAnIAMgJyADICcgAyAnIAMgKdACgCnQAoAp0AKAKdACgCnQAoAnUAKAJ1ACgCdQAoAnUAKAJ1ACgCpAAyAqQAMgKkADICpAAyAqQAMgKkADICpAAyAqQAMgKkADICewAoA+wAKAPsACgD7AAoA+wAKAPsACgCmQAoAnwAKAJ8ACgCfAAoAnwAKAJ8ACgCYgAoAmIAKAJiACgCYgAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAPAACgCNwAyAkIAMgJCADICQgAyAkIAMgJCADICNgAoAnYAKAI2ACgCkQAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAXwAKAI2ACgCNgAoAjYAKAI2ACgCGQAyAmkAMgC2ADIAtQAyALUAJAFmADIBkgAyALUAIQC1ACQBVAAyALUAIQC3AAUAtwAAAdEAMgHRADIBJwAyAScAMgEn/+wBJwAyAbwAMgMOACgCGgAyAhoAMgIaADICGgAyAhoAMgIaADICJAAoAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoAiQAKAIkACgDogAoAjUAMgI1ADICNQAoAcQAMgHEADIBxAAyAcQAMgH3ACgB9wAoAfcAKAH3ACgB9wAoAn8AMgGGACgBmQAoAYYAKAGGACgBhgAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAgsAKAMNACgDDQAoAw0AKAMNACgDDQAoAfUAKAILACgCCwAoAgsAKAILACgCCwAoAhUAKAIVACgCFQAoAhUAKAIyACgCowAoAW4AMgFjADIC3QAyAqQAMgIZACgCCAAoAoQAKAFTACgCkAAoAi8AKAIPACgCkQAoAjgAMgJKACgCLwAoAjkAKAHJABwA6gAcAcUAHAGCABwBbAAcAcUAHAGIACMBlAAcAYIAHAGJABwByQAcAOoAHAHFABwBggAcAWwAHAHFABwBiAAjAZQAHAGCABwBiQAcAckAHADqABwBxQAcAYIAHAFsABwBxQAcAYgAIwGUABwBggAcAYkAHAE+/7ACWgAcBB8AHASJABwD3AAcBIUAHAPGABwELAAcBB8AHATIABwEhQAcBG8AHAPiABwEiwAcA+4AHAPcABwEQgAcBIUAHARAABwD4wAcBQ0AHAC2ADIA5AAjAKIAKADkACMB9QAyAL4AMgC+ADICvwAyAr8AMgC2ADIBUQAyAckAMgMTADIBkwAoAZMAKADcADIA4QAjASIAMgEiACMA9wAyAPcAKAGSADICWAAy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aW9nb25lawd1bmkwMjM3B3VuaTAxMzcGbGFjdXRlBmxjYXJvbgd1bmkwMTNDBm5hY3V0ZQZuY2Fyb24HdW5pMDE0NgNlbmcNb2h1bmdhcnVtbGF1dAdvbWFjcm9uBnJhY3V0ZQZyY2Fyb24HdW5pMDE1NwZzYWN1dGUHdW5pMDIxOQR0YmFyBnRjYXJvbgd1bmkwMTYzB3VuaTAyMUINdWh1bmdhcnVtbGF1dAd1bWFjcm9uB3VvZ29uZWsFdXJpbmcGd2FjdXRlC3djaXJjdW1mbGV4CXdkaWVyZXNpcwZ3Z3JhdmULeWNpcmN1bWZsZXgGeWdyYXZlBnphY3V0ZQp6ZG90YWNjZW50B3VuaTAzOTQHdW5pMDNBOQd1bmkwM0JDCXplcm8uZG5vbQhvbmUuZG5vbQh0d28uZG5vbQp0aHJlZS5kbm9tCWZvdXIuZG5vbQlmaXZlLmRub20Ic2l4LmRub20Kc2V2ZW4uZG5vbQplaWdodC5kbm9tCW5pbmUuZG5vbQl6ZXJvLm51bXIIb25lLm51bXIIdHdvLm51bXIKdGhyZWUubnVtcglmb3VyLm51bXIJZml2ZS5udW1yCHNpeC5udW1yCnNldmVuLm51bXIKZWlnaHQubnVtcgluaW5lLm51bXIHdW5pMjA3MAd1bmkwMEI5B3VuaTAwQjIHdW5pMDBCMwd1bmkyMDc0B3VuaTIwNzUHdW5pMjA3Ngd1bmkyMDc3B3VuaTIwNzgHdW5pMjA3OQd1bmkyMTVGB3VuaTIxODkHdW5pMjE1Mwd1bmkyMTU0B3VuaTIxNTUHdW5pMjE1Ngd1bmkyMTU3B3VuaTIxNTgHdW5pMjE1OQd1bmkyMTVBB3VuaTIxNTAJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1MQd1bmkyMTUyB3VuaTAwQUQHdW5pMDBBMARFdXJvB3VuaTIyMTUIZW1wdHlzZXQHdW5pMDBCNQdhcnJvd3VwB3VuaTIxOTcKYXJyb3dyaWdodAd1bmkyMTk4CWFycm93ZG93bgd1bmkyMTk5CWFycm93bGVmdAd1bmkyMTk2CWFycm93Ym90aAlhcnJvd3VwZG4HdW5pMDMwOAd1bmkwMzA3CWdyYXZlY29tYglhY3V0ZWNvbWIHdW5p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Ky2wgyyxAT4rsEIrLbCELLEAPysusTABFCstsIUssQA/K7BAKy2whiyxAD8rsEErLbCHLLEAPyuwQistsIgssQE/K7BAKy2wiSyxAT8rsEErLbCKLLEBPyuwQistsIsssgsAA0VQWLAGG7IEAgNFWCMhGyFZWUIrsAhlsAMkUHixBQEVRVgwWS0AAAAAAQAAAAoAOAB2AAJERkxUAB5sYXRuAA4ABAAAAAD//wADAAEAAwAFAAQAAAAA//8AAwAAAAIABAAGa2VybgA4a2VybgA4bWFyawAubWFyawAubWttawAmbWttawAmAAAAAgAEAAUAAAADAAEAAgADAAAAAQAAAAYPvA6QDgwBgAEiAA4ABgIAAAEACAABAQIAtAABANAADAAXAKIAnACWAJYAkACKAIQAfgB4AHIAbABmAGAAWgBUCXQATgBIAGAAQgA8ADYAMAABANQC6QABAH0CvAABAMgCvAABAJwCvQABAGgC2AABAMkC2AABALMCvwABAKQCvAABAGUCvAAB/50C0wAB/zgCvAAB/y0C6QAB/4QCvAAB/10CvAAB/00CvwAB/00CvAAB/2UCvQAB/5wCvAAB/5gC2AAB/zcC2AACAAQBigGVAAABnQGfAAwBoQGmAA8BqAGpABUADAAADsAAAA66AAAOtAAADrQAAA6uAAAOqAAADqIAAA6cAAAOlgAADpAAAA6KAAAOhAACAAEBigGVAAAABgEAAAEACAABAE4ANgABAEQADAAFACQAHgAYABIADAABAJ7/HgABALMCPAAB/2P/HgAB/53/IgAB/00CPAABAAUBkAGWAZcBnwGgAAIAAA32AAAN8AABAAIBlgGXAAQAAAABAAgAAQ4kC84ABAwyAAwA0Au8C7YLsAAAC7wLtguqAAALvAu2C6QAAAu8C7YLqgAAC7wLtgueAAALvAu2C6oAAAu8C7YLmAAAC7wLtguwAAALvAu2C6oAAAu8C7YLkgAAC4wLhguAAAALegAAC3QAAAt6AAALbgAAC3oAAAtoAAALYgAAAAAAAAt6AAALXAAAC1YAAAtQC0oLRAAACz4LOAtWAAALMgtKC0QAAAs+CzgNLgssCyYAAA0uCywLIAAADS4LLAsaAAANLgssCyAAAA0uCywLFAAADS4LLAsOAAANLgssCyAAAA0uCywLCAAADS4LLAsmAAALAgAACvwAAAsCAAAK9gAACvAAAAr8AAALAgAACuoAAArkAAAK3grYCuQAAAreCtgK0grMCsYAAArSCswKwAAACroKtAquAAAKqAqiCpwAAArSCswKlgAACtIKzArAAAAAAAqQCooAAArSCswKxgAACoQAAAp+AAAKeAAACn4AAApyAAAKbApmCnIAAApgCmYKcgAACloKZgpUAAAKbApmCk4AAApICkIKPAAACjYAAAo8AAAKMAAACjwAAAoqAAAKJAAACjYAAAo8AAAKNgAACjwAAAoeAAAKGAoSCgwKBgoYChIKAAoGChgKEgoACgYKGAoSCfoKBgoYChIKAAoGChgKEgn0CgYKGAoSCe4KBgoYChIKDAoGChgKEgnoCgYJ4gncCdYKBgnQAAAJygAACdAAAAnEAAAJ0AAACb4AAAm4AAAJygAACbIAAAmsAAAJsgAACaYAAAmyAAAJoAAACZoAAAAAAAAJlAAACawAAAmOAAAJiAmCCY4AAAmICYIJjgAACXwJggl2AAAAAAmCCXAAAAmICYIMmglqDKYAAAyaCWoJZAAADJoJaglkAAAMmglqCV4AAAyaCWoJZAAADJoJaglYAAAMmglqCVIAAAyaCWoMpgAADJoJaglkAAAJTAAACUYAAAlMAAAJQAAACUwAAAlAAAAJTAAACToAAAlMAAAJQAAACTQAAAkuAAAJNAAACSgAAAk0AAAJKAAACTQAAAkiAAAJNAAACSgAAAkcAAAJFgAACRwAAAkQAAAJHAAACQoAAAkcAAAJBAAACP4I+AjyAAAI/gj4COwAAAj+CPgI5gAACP4I+AjsAAAI/gj4COAAAAj+CPgI7AAACP4I+AjaAAAI/gj4CPIAAAj+CPgI7AAACP4I+AjUAAAIzgjICMIAAAi8AAAItgAACLwAAAiwAAAIvAAACKoAAAikAAAAAAAACLwAAAieAAAI/gAACOYImAj+AAAIkgiYCP4AAAjmCJgIjAiGCIAAAAiMCIYIegAACIwIhgh0AAAIjAiGCHoAAAiMCIYIbgAACIwIhghoAAAIjAiGCHoAAAiMCIYIYgAACIwIhgiAAAAIXAAACFYAAAhcAAAIUAAACFwAAAhKAAAIXAAACEQAAA0uAAAIPgg4CDIAAAgsCCYIIAgaCBQAAAggCBoIFAAACCAIGggOAAAKuggICAIAAAqoB/wH9gAA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' +export default "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Ov47IztlO6Q7zjvsPAk8JDx1PKI8wDzdPPU9DT0XPSE9Kz01PT89ST1TPV09Zz1xPXs9hT2PPagAAAANAKIAAwABBAkAAACwApQAAwABBAkAAQAWAn4AAwABBAkAAgAIAnYAAwABBAkAAwA0AkIAAwABBAkABAAgAiIAAwABBAkABQBCAeAAAwABBAkABgAeAcIAAwABBAkACAAQAbIAAwABBAkACQAQAbIAAwABBAkACwAmAYwAAwABBAkADAA4AVQAAwABBAkADQEgADQAAwABBAkADgA0AAAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIABUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAGgAdAB0AHAAcwA6AC8ALwBnAGkAdABoAHUAYgAuAGMAbwBtAC8AbgBvAHAAbwBuAGkAZQBzAC8AaAB0AHQAcAA6AC8ALwBuAG8AcABvAG4AaQBlAHMALgBjAG8AbQBOAG8AcABvAG4AaQBlAHMAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7ACAAdAB0AGYAYQB1AHQAbwBoAGkAbgB0ACAAKAB2ADEALgA4ACkAVAB1AHIAcgBlAHQAIABSAG8AYQBkACAAQgBvAGwAZAAxAC4AMAAwADEAOwBOAE8AUABOADsAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAEIAbwBsAGQAQgBvAGwAZABUAHUAcgByAGUAdAAgAFIAbwBhAGQAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQA4ACAAVABoAGUAIABUAHUAcgByAGUAdAAgAFIAbwBhAGQAIABQAHIAbwBqAGUAYwB0ACAAQQB1AHQAaABvAHIAcwAgACgAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwBuAG8AcABvAG4AaQBlAHMALwB0AHUAcgByAGUAdAAtAHIAbwBhAGQAKQAAAAAAAgAAAAMAAAAUAAMAAQAAABQABATUAAAAggCAAAYAAgANAC8AOQB+AQcBEwEbASMBJwErATEBNwE+AUgBTQFbAWcBawF+AZICGwI3AscC3QMEAwgDDAMSAygDOAOUA6kDvAPAHoUe8yAUIBogHiAiICYgMCA6IEQgcCB5IKwhIiFfIYkhmSICIgUiDyISIhUiGiIeIisiSCJgImUlyvsC//8AAAANACAAMAA6AKABCgEWAR4BJgEqAS4BNgE5AUEBSgFQAV4BagFuAZICGAI3AsYC2AMAAwYDCgMSAyYDNQOUA6kDvAPAHoAe8iATIBggHCAgICYgMCA5IEQgcCB0IKwhIiFQIYkhkCICIgUiDyIRIhUiGiIeIisiSCJgImQlyvsB////9AAAAL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EAAD+awAAAAAAAAAAAAD+g/5w/mT9Vv1C/TD9LQAAAADhLwAAAAAAAOEJ4ULhFODS4JzgnOCp4GIAAN+QAADfbd9k310AAN9E31TfTN9A3x3e/wAA27MF5QABAAAAgAAAAJwBJAHyAgQCDgIYAhoCHAIiAiQCLgI8AkICWAJqAmwAAAKKAAACjgKQApoCogKmAAAAAAAAAAAAAAAAAAACnAKmAAACpgKqAq4AAAAAAAAAAAAAAAAAAAAAAqIAAAK+AAAAAAAAAsoAAAAAAAAAAAAAAAACwAAAAAAAAAACATABTwE3AVQBcQF/AVABOgE7ATYBWgEsAUABKwE4AS0BLgFhAV4BYAEyAX4AAwAOAA8AFAAYACEAIgAmACgAMAAxADMAOAA5AD8ASQBLAEwAUABVAFoAYwBkAGkAagBvAT4BOQE/AWgBRAGkAHMAfgB/AIQAiACRAJIAlgCYAKEAowClAKoAqwCxALsAvQC+AMIAyADNANYA1wDcAN0A4gE8AYYBPQFmAVEBMQFSAVcBUwFYAYcBgQGiAYIA6AFLAWcBQQGDAaYBhQFkAQ4BDwGdAXABgAE0AaABDQDpAUwBHAEYAR0BMwAIAAQABgAMAAcACwANABIAHgAZABsAHAAtACkAKgArABUAPgBDAEAAQQBHAEIBXABGAF4AWwBcAF0AawBKAMcAeAB0AHYAfAB3AHsAfQCCAI4AiQCLAIwAngCaAJsAnACFALAAtQCyALMAuQC0AV0AuADRAM4AzwDQAN4AvADgAAkAeQAFAHUACgB6ABAAgAATAIMAEQCBABYAhgAXAIcAHwCPAB0AjQAgAJAAGgCKACMAkwAlAJUAJACUACcAlwAuAJ8ALwCgACwAmQAyAKQANACmADYAqAA1AKcANwCpADoArAA8AK4AOwCtAD0ArwBFALcARAC2AEgAugBNAL8ATwDBAE4AwABRAMMAUwDFAFIAxABYAMsAVwDKAFYAyQBgANMAYgDVAF8A0gBhANQAZgDZAGwA3wBtAHAA4wByAOUAcQDkAFQAxgBZAMwBoQGfAZ4BowGoAacBqQGlAYwBjQGPAZMBlAGRAYsBigGSAY4BkABoANsAZQDYAGcA2gBuAOEBSQFKAUUBRwFIAUYBiAGJATUBJAEpASoBGgEbAR4BHwEgASEBIgEjASUBJgEnASgBFwF5AXMBdQF3AXsBfAF6AXQBdgF4AW0BWwFjAWICQwAyAcIAAAGQAAACeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoA9cAKAJ/ADICsgAoArIAKAKyACgCsgAoArIAKAKtADIDKgAyAq0AMgMqADICEAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAhAAMgIQADIB+AAoArMAKAKzACgCswAoArMAKAJaADICWv/nAL4AMgC+ACwBXAAyAZIAMgC+ACkAvgAsAVQAMgC+ACoBoAAeAh4AMgIeADIBygAyAcoAMgHKADIBygAyAk4AMgQAADICrgAyAq4AMgKuADICrgAyAq4AMgKuADICxAAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyAsQAMgLEADIEEwAyAnEAMgJxADICwgAyAnIAMgJyADICcgAyAnIAMgKdACgCnQAoAp0AKAKdACgCnQAoAnUAKAJ1ACgCdQAoAnUAKAJ1ACgCpAAyAqQAMgKkADICpAAyAqQAMgKkADICpAAyAqQAMgKkADICewAoA+wAKAPsACgD7AAoA+wAKAPsACgCmQAoAnwAKAJ8ACgCfAAoAnwAKAJ8ACgCYgAoAmIAKAJiACgCYgAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAPAACgCNwAyAkIAMgJCADICQgAyAkIAMgJCADICNgAoAnYAKAI2ACgCkQAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAXwAKAI2ACgCNgAoAjYAKAI2ACgCGQAyAmkAMgC2ADIAtQAyALUAJAFmADIBkgAyALUAIQC1ACQBVAAyALUAIQC3AAUAtwAAAdEAMgHRADIBJwAyAScAMgEn/+wBJwAyAbwAMgMOACgCGgAyAhoAMgIaADICGgAyAhoAMgIaADICJAAoAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoAiQAKAIkACgDogAoAjUAMgI1ADICNQAoAcQAMgHEADIBxAAyAcQAMgH3ACgB9wAoAfcAKAH3ACgB9wAoAn8AMgGGACgBmQAoAYYAKAGGACgBhgAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAgsAKAMNACgDDQAoAw0AKAMNACgDDQAoAfUAKAILACgCCwAoAgsAKAILACgCCwAoAhUAKAIVACgCFQAoAhUAKAIyACgCowAoAW4AMgFjADIC3QAyAqQAMgIZACgCCAAoAoQAKAFTACgCkAAoAi8AKAIPACgCkQAoAjgAMgJKACgCLwAoAjkAKAHJABwA6gAcAcUAHAGCABwBbAAcAcUAHAGIACMBlAAcAYIAHAGJABwByQAcAOoAHAHFABwBggAcAWwAHAHFABwBiAAjAZQAHAGCABwBiQAcAckAHADqABwBxQAcAYIAHAFsABwBxQAcAYgAIwGUABwBggAcAYkAHAE+/7ACWgAcBB8AHASJABwD3AAcBIUAHAPGABwELAAcBB8AHATIABwEhQAcBG8AHAPiABwEiwAcA+4AHAPcABwEQgAcBIUAHARAABwD4wAcBQ0AHAC2ADIA5AAjAKIAKADkACMB9QAyAL4AMgC+ADICvwAyAr8AMgC2ADIBUQAyAckAMgMTADIBkwAoAZMAKADcADIA4QAjASIAMgEiACMA9wAyAPcAKAGSADICWAAy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aW9nb25lawd1bmkwMjM3B3VuaTAxMzcGbGFjdXRlBmxjYXJvbgd1bmkwMTNDBm5hY3V0ZQZuY2Fyb24HdW5pMDE0NgNlbmcNb2h1bmdhcnVtbGF1dAdvbWFjcm9uBnJhY3V0ZQZyY2Fyb24HdW5pMDE1NwZzYWN1dGUHdW5pMDIxOQR0YmFyBnRjYXJvbgd1bmkwMTYzB3VuaTAyMUINdWh1bmdhcnVtbGF1dAd1bWFjcm9uB3VvZ29uZWsFdXJpbmcGd2FjdXRlC3djaXJjdW1mbGV4CXdkaWVyZXNpcwZ3Z3JhdmULeWNpcmN1bWZsZXgGeWdyYXZlBnphY3V0ZQp6ZG90YWNjZW50B3VuaTAzOTQHdW5pMDNBOQd1bmkwM0JDCXplcm8uZG5vbQhvbmUuZG5vbQh0d28uZG5vbQp0aHJlZS5kbm9tCWZvdXIuZG5vbQlmaXZlLmRub20Ic2l4LmRub20Kc2V2ZW4uZG5vbQplaWdodC5kbm9tCW5pbmUuZG5vbQl6ZXJvLm51bXIIb25lLm51bXIIdHdvLm51bXIKdGhyZWUubnVtcglmb3VyLm51bXIJZml2ZS5udW1yCHNpeC5udW1yCnNldmVuLm51bXIKZWlnaHQubnVtcgluaW5lLm51bXIHdW5pMjA3MAd1bmkwMEI5B3VuaTAwQjIHdW5pMDBCMwd1bmkyMDc0B3VuaTIwNzUHdW5pMjA3Ngd1bmkyMDc3B3VuaTIwNzgHdW5pMjA3OQd1bmkyMTVGB3VuaTIxODkHdW5pMjE1Mwd1bmkyMTU0B3VuaTIxNTUHdW5pMjE1Ngd1bmkyMTU3B3VuaTIxNTgHdW5pMjE1OQd1bmkyMTVBB3VuaTIxNTAJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1MQd1bmkyMTUyB3VuaTAwQUQHdW5pMDBBMARFdXJvB3VuaTIyMTUIZW1wdHlzZXQHdW5pMDBCNQdhcnJvd3VwB3VuaTIxOTcKYXJyb3dyaWdodAd1bmkyMTk4CWFycm93ZG93bgd1bmkyMTk5CWFycm93bGVmdAd1bmkyMTk2CWFycm93Ym90aAlhcnJvd3VwZG4HdW5pMDMwOAd1bmkwMzA3CWdyYXZlY29tYglhY3V0ZWNvbWIHdW5p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Ky2wgyyxAT4rsEIrLbCELLEAPysusTABFCstsIUssQA/K7BAKy2whiyxAD8rsEErLbCHLLEAPyuwQistsIgssQE/K7BAKy2wiSyxAT8rsEErLbCKLLEBPyuwQistsIsssgsAA0VQWLAGG7IEAgNFWCMhGyFZWUIrsAhlsAMkUHixBQEVRVgwWS0AAAAAAQAAAAoAOAB2AAJERkxUAB5sYXRuAA4ABAAAAAD//wADAAEAAwAFAAQAAAAA//8AAwAAAAIABAAGa2VybgA4a2VybgA4bWFyawAubWFyawAubWttawAmbWttawAmAAAAAgAEAAUAAAADAAEAAgADAAAAAQAAAAYPvA6QDgwBgAEiAA4ABgIAAAEACAABAQIAtAABANAADAAXAKIAnACWAJYAkACKAIQAfgB4AHIAbABmAGAAWgBUCXQATgBIAGAAQgA8ADYAMAABANQC6QABAH0CvAABAMgCvAABAJwCvQABAGgC2AABAMkC2AABALMCvwABAKQCvAABAGUCvAAB/50C0wAB/zgCvAAB/y0C6QAB/4QCvAAB/10CvAAB/00CvwAB/00CvAAB/2UCvQAB/5wCvAAB/5gC2AAB/zcC2AACAAQBigGVAAABnQGfAAwBoQGmAA8BqAGpABUADAAADsAAAA66AAAOtAAADrQAAA6uAAAOqAAADqIAAA6cAAAOlgAADpAAAA6KAAAOhAACAAEBigGVAAAABgEAAAEACAABAE4ANgABAEQADAAFACQAHgAYABIADAABAJ7/HgABALMCPAAB/2P/HgAB/53/IgAB/00CPAABAAUBkAGWAZcBnwGgAAIAAA32AAAN8AABAAIBlgGXAAQAAAABAAgAAQ4kC84ABAwyAAwA0Au8C7YLsAAAC7wLtguqAAALvAu2C6QAAAu8C7YLqgAAC7wLtgueAAALvAu2C6oAAAu8C7YLmAAAC7wLtguwAAALvAu2C6oAAAu8C7YLkgAAC4wLhguAAAALegAAC3QAAAt6AAALbgAAC3oAAAtoAAALYgAAAAAAAAt6AAALXAAAC1YAAAtQC0oLRAAACz4LOAtWAAALMgtKC0QAAAs+CzgNLgssCyYAAA0uCywLIAAADS4LLAsaAAANLgssCyAAAA0uCywLFAAADS4LLAsOAAANLgssCyAAAA0uCywLCAAADS4LLAsmAAALAgAACvwAAAsCAAAK9gAACvAAAAr8AAALAgAACuoAAArkAAAK3grYCuQAAAreCtgK0grMCsYAAArSCswKwAAACroKtAquAAAKqAqiCpwAAArSCswKlgAACtIKzArAAAAAAAqQCooAAArSCswKxgAACoQAAAp+AAAKeAAACn4AAApyAAAKbApmCnIAAApgCmYKcgAACloKZgpUAAAKbApmCk4AAApICkIKPAAACjYAAAo8AAAKMAAACjwAAAoqAAAKJAAACjYAAAo8AAAKNgAACjwAAAoeAAAKGAoSCgwKBgoYChIKAAoGChgKEgoACgYKGAoSCfoKBgoYChIKAAoGChgKEgn0CgYKGAoSCe4KBgoYChIKDAoGChgKEgnoCgYJ4gncCdYKBgnQAAAJygAACdAAAAnEAAAJ0AAACb4AAAm4AAAJygAACbIAAAmsAAAJsgAACaYAAAmyAAAJoAAACZoAAAAAAAAJlAAACawAAAmOAAAJiAmCCY4AAAmICYIJjgAACXwJggl2AAAAAAmCCXAAAAmICYIMmglqDKYAAAyaCWoJZAAADJoJaglkAAAMmglqCV4AAAyaCWoJZAAADJoJaglYAAAMmglqCVIAAAyaCWoMpgAADJoJaglkAAAJTAAACUYAAAlMAAAJQAAACUwAAAlAAAAJTAAACToAAAlMAAAJQAAACTQAAAkuAAAJNAAACSgAAAk0AAAJKAAACTQAAAkiAAAJNAAACSgAAAkcAAAJFgAACRwAAAkQAAAJHAAACQoAAAkcAAAJBAAACP4I+AjyAAAI/gj4COwAAAj+CPgI5gAACP4I+AjsAAAI/gj4COAAAAj+CPgI7AAACP4I+AjaAAAI/gj4CPIAAAj+CPgI7AAACP4I+AjUAAAIzgjICMIAAAi8AAAItgAACLwAAAiwAAAIvAAACKoAAAikAAAAAAAACLwAAAieAAAI/gAACOYImAj+AAAIkgiYCP4AAAjmCJgIjAiGCIAAAAiMCIYIegAACIwIhgh0AAAIjAiGCHoAAAiMCIYIbgAACIwIhghoAAAIjAiGCHoAAAiMCIYIYgAACIwIhgiAAAAIXAAACFYAAAhcAAAIUAAACFwAAAhKAAAIXAAACEQAAA0uAAAIPgg4CDIAAAgsCCYIIAgaCBQAAAggCBoIFAAACCAIGggOAAAKuggICAIAAAqoB/wH9gAA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"; diff --git a/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts b/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts index 34b9b6ad..233f4a48 100644 --- a/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts +++ b/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts @@ -1 +1 @@ -export default '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OqM6yDsKO0k7cTuPO6w7xzwVPEI8YDx9PJU8rTy3PME8yzzVPN886TzzPP09Bz0RPRs9JT0vPUgAAAAPALoAAwABBAkAAACwArIAAwABBAkAAQAkAo4AAwABBAkAAgAOAoAAAwABBAkAAwA4AkgAAwABBAkABAAkAo4AAwABBAkABQBCAgYAAwABBAkABgAiAeQAAwABBAkACAAQAdQAAwABBAkACQAQAdQAAwABBAkACwAmAa4AAwABBAkADAA4AXYAAwABBAkADQEgAFYAAwABBAkADgA0ACIAAwABBAkAEAAWAAwAAwABBAkAEQAMAAAATQBlAGQAaQB1AG0AVAB1AHIAcgBlAHQAIABSAG8AYQBkAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuACAAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQAvAG4AbwBwAG8AbgBpAGUAcwAvAGgAdAB0AHAAOgAvAC8AbgBvAHAAbwBuAGkAZQBzAC4AYwBvAG0ATgBvAHAAbwBuAGkAZQBzAFQAdQByAHIAZQB0AFIAbwBhAGQALQBNAGUAZABpAHUAbQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMAAxADsAIAB0AHQAZgBhAHUAdABvAGgAaQBuAHQAIAAoAHYAMQAuADgAKQAxAC4AMAAwADEAOwBOAE8AUABOADsAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAVAB1AHIAcgBlAHQAIABSAG8AYQBkACAATQBlAGQAaQB1AG0AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQA4ACAAVABoAGUAIABUAHUAcgByAGUAdAAgAFIAbwBhAGQAIABQAHIAbwBqAGUAYwB0ACAAQQB1AHQAaABvAHIAcwAgACgAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwBuAG8AcABvAG4AaQBlAHMALwB0AHUAcgByAGUAdAAtAHIAbwBhAGQAKQAAAAIAAAADAAAAFAADAAEAAAAUAAQE1AAAAIIAgAAGAAIADQAvADkAfgEHARMBGwEjAScBKwExATcBPgFIAU0BWwFnAWsBfgGSAhsCNwLHAt0DBAMIAwwDEgMoAzgDlAOpA7wDwB6FHvMgFCAaIB4gIiAmIDAgOiBEIHAgeSCsISIhXyGJIZkiAiIFIg8iEiIVIhoiHiIrIkgiYCJlJcr7Av//AAAADQAgADAAOgCgAQoBFgEeASYBKgEuATYBOQFBAUoBUAFeAWoBbgGSAhgCNwLGAtgDAAMGAwoDEgMmAzUDlAOpA7wDwB6AHvIgEyAYIBwgICAmIDAgOSBEIHAgdCCsISIhUCGJIZAiAiIFIg8iESIVIhoiHiIrIkgiYCJkJcr7Af////QAAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xAAA/msAAAAAAAAAAAAA/oP+cP5k/Vb9Qv0w/S0AAAAA4S8AAAAAAADhCeFC4RTg0uCc4JzgqeBiAADfkAAA323fZN9dAADfRN9U30zfQN8d3v8AANuzBeUAAQAAAIAAAACcASQB8gIEAg4CGAIaAhwCIgIkAi4CPAJCAlgCagJsAAACigAAAo4CkAKaAqICpgAAAAAAAAAAAAAAAAAAApwCpgAAAqYCqgKuAAAAAAAAAAAAAAAAAAAAAAKiAAACvgAAAAAAAALKAAAAAAAAAAAAAAAAAsAAAAAAAAAAAgEwAU8BNwFUAXEBfwFQAToBOwE2AVoBLAFAASsBOAEtAS4BYQFeAWABMgF+AAMADgAPABQAGAAhACIAJgAoADAAMQAzADgAOQA/AEkASwBMAFAAVQBaAGMAZABpAGoAbwE+ATkBPwFoAUQBpABzAH4AfwCEAIgAkQCSAJYAmAChAKMApQCqAKsAsQC7AL0AvgDCAMgAzQDWANcA3ADdAOIBPAGGAT0BZgFRATEBUgFXAVMBWAGHAYEBogGCAOgBSwFnAUEBgwGmAYUBZAEOAQ8BnQFwAYABNAGgAQ0A6QFMARwBGAEdATMACAAEAAYADAAHAAsADQASAB4AGQAbABwALQApACoAKwAVAD4AQwBAAEEARwBCAVwARgBeAFsAXABdAGsASgDHAHgAdAB2AHwAdwB7AH0AggCOAIkAiwCMAJ4AmgCbAJwAhQCwALUAsgCzALkAtAFdALgA0QDOAM8A0ADeALwA4AAJAHkABQB1AAoAegAQAIAAEwCDABEAgQAWAIYAFwCHAB8AjwAdAI0AIACQABoAigAjAJMAJQCVACQAlAAnAJcALgCfAC8AoAAsAJkAMgCkADQApgA2AKgANQCnADcAqQA6AKwAPACuADsArQA9AK8ARQC3AEQAtgBIALoATQC/AE8AwQBOAMAAUQDDAFMAxQBSAMQAWADLAFcAygBWAMkAYADTAGIA1QBfANIAYQDUAGYA2QBsAN8AbQBwAOMAcgDlAHEA5ABUAMYAWQDMAaEBnwGeAaMBqAGnAakBpQGMAY0BjwGTAZQBkQGLAYoBkgGOAZAAaADbAGUA2ABnANoAbgDhAUkBSgFFAUcBSAFGAYgBiQE1ASQBKQEqARoBGwEeAR8BIAEhASIBIwElASYBJwEoARcBeQFzAXUBdwF7AXwBegF0AXYBeAFtAVsBYwFiAkMAMgHCAAABkAAAAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAPxACgCfwAyArEALQKxAC0CsQAtArEALQKxAC0CrQAyAxwAMgKtADIDHAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAfgAKAKzACgCswAoArMAKAKzACgCWgAyAlr/5wClADIApQAkAVoAMgFjADIApQAmAKUAJAFMADIApQAfAaAAHgIeADICHgAyAcoAMgHKADIBygAyAcoAMgJYADIEAAAyAq4AMgKuADICrgAyAq4AMgKuADICrgAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyBC0AMgJxADICcQAyAsIAMgJyADICcgAyAnIAMgJyADICnQAoAp0AKAKdACgCnQAoAp0AKAJ1ACgCdQAoAnUAKAJ1ACgCdQAoAqQAMgKkADICpAAyAqQAMgKkADICpAAyAqQAMgKkADICpAAyAnsAKAPsACgD7AAoA+wAKAPsACgD7AAoApkAKAJ8ACgCfAAoAnwAKAJ8ACgCfAAoAmIAKAJiACgCYgAoAmIAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgD0AAoAjcAMgJCADICQgAyAkIAMgJCADICQgAyAjYAKAJxACgCNgAoAocAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAF3ACMCNgAoAjYAKAI2ACgCNgAoAhkAMgJjADIAoQAyAKEAMgChACABZAAyAWMAMgChACIAoQAgAUwAMgChABwAvgADAKoAAAHRADIB0QAyAScAMgEnACwBJ//aAScAMgG7ADIDDgAoAhoAMgIaADICGgAyAhoAMgIaADICGgAyAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoA70AKAI1ADICNQAyAjUAKAG2ADIBtgAyAbYAMgG2ADIB9wAoAfcAKAH3ACgB9wAoAfcAKAJ/ADIBhgAoAZAALQGGACgBhgAoAYYAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAILACgDDQAoAw0AKAMNACgDDQAoAw0AKAH1ACgCCwAoAgsAKAILACgCCwAoAgsAKAIVACgCFQAoAhUAKAIVACgCGAAjAp4AIwFuADIBYwAyAusAMgKkADICGQAoAggAKAKEACgBTgAoAooAKAIvACgCDwAoAosAKAIzAC0CRAAoAi8AKAI0ACgB0wAiAPcAIgHBABkBggAaAWwAGgHBABkBhQAeAZAAGQGCABoBhgAaAdMAIgD3ACIBwQAZAYIAGgFsABoBwQAZAYUAHgGQABkBggAaAYYAGgHTACIA9wAiAcEAGQGCABoBbAAaAcEAGQGFAB4BkAAZAYIAGgGGABoBPf+1AmYAIgQmACIEkgAiA+gAIgSAABkD0gAiBCsAGgQnACIEvwAZBIAAGgRqABoD6gAiBIIAGQP2ACID6AAiBEEAGgSAABkENgAZA+sAIgUvACIAoQAyAMUAIwCNACgAzgAjAc0AMgClADIApQAyArkAMgK5ADIAoQAy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APwBTgCJAFcBTwFQAVEBUgBYAH4AgACBAH8BUwFUAVUBVgBZAFoBVwFYAVkBWgBbAFwA7AFbALoBXABdAV0A5wFeAMAAwQCdAJ4BXwFgAWEAmwATABQAFQAWABcAGAAZABoAGwAcAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/ALwBgAD0AYEBggGDAPUA9gGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQABEADwAdAB4AqwAEAKMAIgCiAMMAhwANAAYAEgA/AAsADABeAGAAPgBAABABkQCyALMAQgDEAMUAtAC1ALYAtwCpAKoAvgC/AAUACgGSAIQAvQAHAZMApgCFAJYBlAAOAO8A8AC4ACAAjwAhAB8AlQCUAJMApwBhAKQAQQGVAJIAnACaAJkApQCYAZYACADGAZcBmAGZAZoBmwGcAZ0BngGfAaAAuQAjAAkAiACGAIsAigCMAIMAXwDoAIIAwgGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAI0A2wDhAN4A2ACOANwAQwDfANoA4ADdANkBtAZBYnJldmUHQW1hY3JvbgdBb2dvbmVrCkNkb3RhY2NlbnQGRGNhcm9uBkRjcm9hdAZFY2Fyb24KRWRvdGFjY2VudAdFbWFjcm9uB0VvZ29uZWsHdW5pMDEyMgpHZG90YWNjZW50BEhiYXIHSW1hY3JvbgdJb2dvbmVrB3VuaTAxMzYGTGFjdXRlBkxjYXJvbgd1bmkwMTNCBk5hY3V0ZQZOY2Fyb24HdW5pMDE0NQNFbmcNT2h1bmdhcnVtbGF1dAdPbWFjcm9uBlJhY3V0ZQZSY2Fyb24HdW5pMDE1NgZTYWN1dGUHdW5pMDIxOARUYmFyBlRjYXJvbgd1bmkwMTYyB3VuaTAyMUENVWh1bmdhcnVtbGF1dAdVbWFjcm9uB1VvZ29uZWsFVXJpbmcGV2FjdXRlC1djaXJjdW1mbGV4CVdkaWVyZXNpcwZXZ3JhdmULWWNpcmN1bWZsZXgGWWdyYXZlBlphY3V0ZQpaZG90YWNjZW50BmFicmV2ZQdhbWFjcm9uB2FvZ29uZWsKY2RvdGFjY2VudAZkY2Fyb24GZWNhcm9uCmVkb3RhY2NlbnQHZW1hY3Jvbgdlb2dvbmVrB3VuaTAxMjMKZ2RvdGFjY2VudARoYmFyCWkubG9jbFRSSwdpbWFjcm9uB2lvZ29uZWsHdW5pMDIzNwd1bmkwMTM3BmxhY3V0ZQZsY2Fyb24HdW5pMDEzQwZuYWN1dGUGbmNhcm9uB3VuaTAxNDYDZW5nDW9odW5nYXJ1bWxhdXQHb21hY3JvbgZyYWN1dGUGcmNhcm9uB3VuaTAxNTcGc2FjdXRlB3VuaTAyMTkEdGJhcgZ0Y2Fyb24HdW5pMDE2Mwd1bmkwMjFCDXVodW5nYXJ1bWxhdXQHdW1hY3Jvbgd1b2dvbmVrBXVyaW5nBndhY3V0ZQt3Y2lyY3VtZmxleAl3ZGllcmVzaXMGd2dyYXZlC3ljaXJjdW1mbGV4BnlncmF2ZQZ6YWN1dGUKemRvdGFjY2VudAd1bmkwMzk0B3VuaTAzQTkHdW5pMDNCQwl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yB3VuaTIwNzAHdW5pMDBCOQd1bmkwMEIyB3VuaTAwQjMHdW5pMjA3NAd1bmkyMDc1B3VuaTIwNzYHdW5pMjA3Nwd1bmkyMDc4B3VuaTIwNzkHdW5pMjE1Rgd1bmkyMTg5B3VuaTIxNTMHdW5pMjE1NAd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU4B3VuaTIxNTkHdW5pMjE1QQd1bmkyMTUwCW9uZWVpZ2h0aAx0aHJlZWVpZ2h0aHMLZml2ZWVpZ2h0aHMMc2V2ZW5laWdodGhzB3VuaTIxNTEHdW5pMjE1Mgd1bmkwMEFEB3VuaTAwQTAERXVybwd1bmkyMjE1CGVtcHR5c2V0B3VuaTAwQjUHYXJyb3d1cAd1bmkyMTk3CmFycm93cmlnaHQHdW5pMjE5OAlhcnJvd2Rvd24HdW5pMjE5OQlhcnJvd2xlZnQHdW5pMjE5NglhcnJvd2Jv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sTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAAAAAAEAAAAKADgAeAACREZMVAAebGF0bgAOAAQAAAAA//8AAwABAAMABQAEAAAAAP//AAMAAAACAAQABmtlcm4AOGtlcm4AOG1hcmsALm1hcmsALm1rbWsAJm1rbWsAJgAAAAIABQAGAAAAAwACAAMABAAAAAIAAAABAAcR/g+gDnoN9gGCASQAEAAGAgAAAQAIAAEBAgC0AAEA0AAMABcAogCcAJYAlgCQAIoAhAB+AHgAcgBsAGYAYABaAFQJbgBOAEgAYABCADwANgAwAAEA0wLlAAEAfQK8AAEAzAK8AAEAkgK9AAEAXwLKAAEAsgLKAAEAsgK+AAEAmAK8AAEAYAK8AAH/oQLIAAH/RgK8AAH/LgLlAAH/hAK8AAH/aQK8AAH/TgK+AAH/TgK8AAH/bgK9AAH/oQK8AAH/ogLKAAH/TwLKAAIABAGKAZUAAAGdAZ8ADAGhAaYADwGoAakAFQAMAAAOogAADpwAAA6WAAAOlgAADpAAAA6KAAAOhAAADn4AAA54AAAOcgAADmwAAA6WAAIAAQGKAZUAAAAGAQAAAQAIAAEATgA2AAEARAAMAAUAJAAeABgAEgAMAAEAm/8eAAEAsgI8AAH/Zf8eAAH/of85AAH/TgI8AAEABQGQAZYBlwGfAaAAAgAADd4AAA3YAAEAAgGWAZcABAAAAAEACAABDgYLtgAEDBoADADQC6QLnguYAAALpAueC5IAAAukC54LjAAAC6QLnguSAAALpAueC4YAAAukC54LkgAAC6QLnguAAAALpAueC5gAAAukC54LkgAAC6QLngt6AAALdAtuC2gAAAtiAAALXAAAC2IAAAtWAAALYgAAC1AAAAtKAAAAAAAAC2IAAAtEAAALPgAACzgLMgssAAALJgsgCz4AAAsaCzILLAAACyYLIAsUCw4LCAAACxQLDgsCAAALFAsOCvwAAAsUCw4LAgAACxQLDgr2AAALFAsOCvYAAAsUCw4LAgAACxQLDgrwAAALFAsOCwgAAArqAAAK5AAACuoAAAreAAAK2AAACuQAAArqAAAK0gAACswAAArGCsAKzAAACsYKwAq6CrQKrgAACroKtAqoAAAKogqcCpYAAAqiCpwKkAAACroKtAqKAAAKugq0CqgAAAAACoQKfgAACroKtAquAAAKeAAACnIAAApsAAAKcgAACmYAAApgCloKZgAAClQKWgpmAAAKTgpaCkgAAApgCloKQgAACjwKNgowAAAKKgAACjAAAAokAAAKMAAACh4AAAoYAAAKKgAACjAAAAoqAAAKMAAAChIAAAoMCgYKAAn6CgwKBgn0CfoKDAoGCfQJ+goMCgYJ7gn6CgwKBgn0CfoKDAoGCegJ+goMCgYJ4gn6CgwKBgoACfoKDAoGCdwJ+gnWCdAJygn6CcQAAAm+AAAJxAAACbgAAAnEAAAJsgAACawAAAm+AAAJpgAACaAAAAmmAAAJmgAACaYAAAmUAAAJjgAAAAAAAAmIAAAJoAAACYIAAAl8CXYJggAACXwJdgmCAAAJcAl2CWoAAAAACXYJZAAACXwJdgyCCV4MjgAADIIJXglYAAAMggleCVgAAAyCCV4JUgAADIIJXglYAAAMggleCUwAAAyCCV4JRgAADIIJXgyOAAAMggleCVgAAAlAAAAJOgAACUAAAAk0AAAJQAAACTQAAAlAAAAJLgAACUAAAAk0AAAJKAAACSIAAAkoAAAJHAAACSgAAAkcAAAJKAAACRYAAAkoAAAJHAAACRAAAAkKAAAJEAAACQQAAAkQAAAI/gAACRAAAAj4AAAI8gjsCOYAAAjyCOwI4AAACPII7AjaAAAI8gjsCOAAAAjyCOwI1AAACPII7AjgAAAI8gjsCM4AAAjyCOwI5gAACPII7AjgAAAI8gjsCMgAAAjCCLwItgAACLAAAAiqAAAIsAAACKQAAAiwAAAIngAACJgAAAAAAAAIsAAACJIAAAjyAAAIjAiGCPIAAAiACIYI8gAACIwIhgh6CHQIbgAACHoIdAhoAAAIegh0CGIAAAh6CHQIaAAACHoIdAhcAAAIegh0CFwAAAh6CHQIaAAACHoIdAhWAAAIegh0CG4AAAhQAAAISgAACFAAAAhEAAAIUAAACD4AAAhQAAAIOAAA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AMIAxQACAM0A4gABAAIABQAxADEAAQAzADMAAgBJAEkAAwBVAFUABABqAGoABQABADIABAAAABQBagFQAUoBOAEeAOgA4gDYANIBSgDAALIAqACiAJgAjgB8AGoAZABeAAEAFAADACEAMQAzAEkAVQBaAGMAZABpAGoAbwCRAJsApQCxAL4AyADdAUcAAQAw/84AAQEs//YABACq//YBK//iASz/4QEu/+wABADI//EBK//dASz/0wEu/8kAAgEs//YBLv/2AAIAkf/TAN3/4gABAKUAFAACASv/8QEs/84AAwCbABkAnAAKAJ4ADwAEASv/5wEs/7oBLv/JAS//4gABASz/8AACAJsAGQEs/+cAAQCaAAoADQAD/84AD//2ABj/9gCY/+UAmf/iAJv/8QCq/84A0P/JASv/5wEs/8IBLf/sAS7/xAEv/+IABgAD/+cAMP+cAKH/9gEs/78BLv/iAS//xAAEAFX/sABj/+cAav/dAUj/3QABAN3/7AAGADD/nACY//EAof/sAKr/7AEs/90BLv/nAAIAVf/nAGr/5wACAAgAAQAIAAEAEAAEAAAAAwAmACAAGgABAAMBAwEJARYAAQD5AAAAAQEW/+cAAQEWADIAAAACADL/gAIRApgAAwAHACJAHwABAAIDAQJnAAMAAANXAAMDAF8AAAMATxERERAEBhorBSERIQchESECEf4hAd85/pQBbIADGDj9WAAAAgAoAAACUQK8AAkADwA2QDMNCggFBAUEAUwABQAAAQUAZwAEBAJfAAICJk0GAwIBAScBTgAADw4MCwAJAAkSEREHCBkrITUhFSMREzMTEQMDIwMVIQIP/ltC4VjwRM8RwgGi8vIBWQFj/pv+qQFGATP+zhMA//8AKAAAAlEDmgAiAAMAAAEHAY0BnADeAAixAgGw3rA1KwAA//8AKAAAAlEDgQAiAAMAAAEHAZEB1ADFAAixAgGwxbA1KwAA//8AKAAAAlEDmgAiAAMAAAEHAY8B7wDeAAixAgGw3rA1KwAA//8AKAAAAlEDUwAiAAMAAAEHAYoB7wCJAAixAgKwibA1KwAA//8AKAAAAlEDmgAiAAMAAAEHAYwBnADeAAixAgGw3rA1KwAA//8AKAAAAlEDRwAiAAMAAAEHAZQB9wCLAAixAgGwi7A1KwAAAAIAKP9RAoMCvAASABgASUBG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AdoCvAALADBALQgBAgAEAUwAAAABAgABZwUBBAQDXwADAyZNAAICJwJOAAAACwALEhEREgYIGisTBxUhFSERIxE3IRWrQAEY/uhDYQFRAnlUoUP+vwI8gEMAAAEAKAAAAosCvAATADlANgoHBgMEBQITDgsCBAMEAkwABQAEAwUEZwACAgFfAAEBJk0AAwMAXwAAACcAThESExMTEAYIHCshIScRNyEXBychBxEXITc1IzUzFQIo/mJiYgGeXDZH/qRAQAFcQY3QggG5gXgpXlX+dVZWT0Sq//8AKAAAAosDgQAiACIAAAEHAZEB8QDFAAixAQGwxbA1KwAA//8AKP85AosCvAAiACIAAAADAZYBuQAA//8AKAAAAosDUwAiACIAAAEHAYsBuQCJAAixAQGwibA1KwAAAAEAMgAAAigCvAALACdAJAADAAABAwBnBAECAiZNBgUCAQEnAU4AAAALAAsREREREQcIGyshESERIxEzESERMxEB5v6OQkIBckIBP/7BArz+xgE6/UQAAv/nAAACcgK8ABMAFwA2QDMJBwIFCgQCAAsFAGcACwACAQsCZwgBBgYmTQMBAQEnAU4XFhUUExIRERERERERERAMCB8rASMRIxEhESMRIzUzNTMVITUzFTMHIRUhAnJKQv6OQktLQgFyQkqM/o4BcgIf/eEBP/7BAh80aWlpaTSdAAEAMgAAAHMCvAADABlAFgAAACZNAgEBAScBTgAAAAMAAxEDCBcrMxEzETJBArz9RAD//wAkAAAAfwOaACIAKAAAAQcBjQCxAN4ACLEBAbDesDUrAAD//wAyAAABMgOaACIAKGAAAQcBjwFkAN4ACLEBAbDesDUrAAD//wAyAAABMQNUACIAKF8AAQcBigFjAIoACLEBArCKsDUrAAD//wAmAAAAfwNTACIAKAAAAQcBiwCxAIkACLEBAbCJsDUrAAD//wAkAAAAfwOaACIAKAAAAQcBjACxAN4ACLEBAbDesDUrAAAAAgAyAAABGgNHAAMABwAjQCAAAAABAgABZwACAiZNBAEDAycDTgQEBAcEBxIREAUIGSsTMxUjExEzETLo6FRBA0cq/OMCvP1EAAABAB//UQCqArwADAAlQCIKCAQDBAIBAUwDAQIAAAIAYwABASYBTgAAAAwADBQRBAgYKxcVIyc3IxEzESMHFxeqUTob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' +export default "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OqM6yDsKO0k7cTuPO6w7xzwVPEI8YDx9PJU8rTy3PME8yzzVPN886TzzPP09Bz0RPRs9JT0vPUgAAAAPALoAAwABBAkAAACwArIAAwABBAkAAQAkAo4AAwABBAkAAgAOAoAAAwABBAkAAwA4AkgAAwABBAkABAAkAo4AAwABBAkABQBCAgYAAwABBAkABgAiAeQAAwABBAkACAAQAdQAAwABBAkACQAQAdQAAwABBAkACwAmAa4AAwABBAkADAA4AXYAAwABBAkADQEgAFYAAwABBAkADgA0ACIAAwABBAkAEAAWAAwAAwABBAkAEQAMAAAATQBlAGQAaQB1AG0AVAB1AHIAcgBlAHQAIABSAG8AYQBkAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuACAAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQAvAG4AbwBwAG8AbgBpAGUAcwAvAGgAdAB0AHAAOgAvAC8AbgBvAHAAbwBuAGkAZQBzAC4AYwBvAG0ATgBvAHAAbwBuAGkAZQBzAFQAdQByAHIAZQB0AFIAbwBhAGQALQBNAGUAZABpAHUAbQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMAAxADsAIAB0AHQAZgBhAHUAdABvAGgAaQBuAHQAIAAoAHYAMQAuADgAKQAxAC4AMAAwADEAOwBOAE8AUABOADsAVAB1AHIAcgBlAHQAUgBvAGEAZAAtAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAVAB1AHIAcgBlAHQAIABSAG8AYQBkACAATQBlAGQAaQB1AG0AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQA4ACAAVABoAGUAIABUAHUAcgByAGUAdAAgAFIAbwBhAGQAIABQAHIAbwBqAGUAYwB0ACAAQQB1AHQAaABvAHIAcwAgACgAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwBuAG8AcABvAG4AaQBlAHMALwB0AHUAcgByAGUAdAAtAHIAbwBhAGQAKQAAAAIAAAADAAAAFAADAAEAAAAUAAQE1AAAAIIAgAAGAAIADQAvADkAfgEHARMBGwEjAScBKwExATcBPgFIAU0BWwFnAWsBfgGSAhsCNwLHAt0DBAMIAwwDEgMoAzgDlAOpA7wDwB6FHvMgFCAaIB4gIiAmIDAgOiBEIHAgeSCsISIhXyGJIZkiAiIFIg8iEiIVIhoiHiIrIkgiYCJlJcr7Av//AAAADQAgADAAOgCgAQoBFgEeASYBKgEuATYBOQFBAUoBUAFeAWoBbgGSAhgCNwLGAtgDAAMGAwoDEgMmAzUDlAOpA7wDwB6AHvIgEyAYIBwgICAmIDAgOSBEIHAgdCCsISIhUCGJIZAiAiIFIg8iESIVIhoiHiIrIkgiYCJkJcr7Af////QAAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xAAA/msAAAAAAAAAAAAA/oP+cP5k/Vb9Qv0w/S0AAAAA4S8AAAAAAADhCeFC4RTg0uCc4JzgqeBiAADfkAAA323fZN9dAADfRN9U30zfQN8d3v8AANuzBeUAAQAAAIAAAACcASQB8gIEAg4CGAIaAhwCIgIkAi4CPAJCAlgCagJsAAACigAAAo4CkAKaAqICpgAAAAAAAAAAAAAAAAAAApwCpgAAAqYCqgKuAAAAAAAAAAAAAAAAAAAAAAKiAAACvgAAAAAAAALKAAAAAAAAAAAAAAAAAsAAAAAAAAAAAgEwAU8BNwFUAXEBfwFQAToBOwE2AVoBLAFAASsBOAEtAS4BYQFeAWABMgF+AAMADgAPABQAGAAhACIAJgAoADAAMQAzADgAOQA/AEkASwBMAFAAVQBaAGMAZABpAGoAbwE+ATkBPwFoAUQBpABzAH4AfwCEAIgAkQCSAJYAmAChAKMApQCqAKsAsQC7AL0AvgDCAMgAzQDWANcA3ADdAOIBPAGGAT0BZgFRATEBUgFXAVMBWAGHAYEBogGCAOgBSwFnAUEBgwGmAYUBZAEOAQ8BnQFwAYABNAGgAQ0A6QFMARwBGAEdATMACAAEAAYADAAHAAsADQASAB4AGQAbABwALQApACoAKwAVAD4AQwBAAEEARwBCAVwARgBeAFsAXABdAGsASgDHAHgAdAB2AHwAdwB7AH0AggCOAIkAiwCMAJ4AmgCbAJwAhQCwALUAsgCzALkAtAFdALgA0QDOAM8A0ADeALwA4AAJAHkABQB1AAoAegAQAIAAEwCDABEAgQAWAIYAFwCHAB8AjwAdAI0AIACQABoAigAjAJMAJQCVACQAlAAnAJcALgCfAC8AoAAsAJkAMgCkADQApgA2AKgANQCnADcAqQA6AKwAPACuADsArQA9AK8ARQC3AEQAtgBIALoATQC/AE8AwQBOAMAAUQDDAFMAxQBSAMQAWADLAFcAygBWAMkAYADTAGIA1QBfANIAYQDUAGYA2QBsAN8AbQBwAOMAcgDlAHEA5ABUAMYAWQDMAaEBnwGeAaMBqAGnAakBpQGMAY0BjwGTAZQBkQGLAYoBkgGOAZAAaADbAGUA2ABnANoAbgDhAUkBSgFFAUcBSAFGAYgBiQE1ASQBKQEqARoBGwEeAR8BIAEhASIBIwElASYBJwEoARcBeQFzAXUBdwF7AXwBegF0AXYBeAFtAVsBYwFiAkMAMgHCAAABkAAAAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAJ5ACgCeQAoAnkAKAPxACgCfwAyArEALQKxAC0CsQAtArEALQKxAC0CrQAyAxwAMgKtADIDHAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAhAAMgIQADICEAAyAfgAKAKzACgCswAoArMAKAKzACgCWgAyAlr/5wClADIApQAkAVoAMgFjADIApQAmAKUAJAFMADIApQAfAaAAHgIeADICHgAyAcoAMgHKADIBygAyAcoAMgJYADIEAAAyAq4AMgKuADICrgAyAq4AMgKuADICrgAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyAsQAMgLEADICxAAyBC0AMgJxADICcQAyAsIAMgJyADICcgAyAnIAMgJyADICnQAoAp0AKAKdACgCnQAoAp0AKAJ1ACgCdQAoAnUAKAJ1ACgCdQAoAqQAMgKkADICpAAyAqQAMgKkADICpAAyAqQAMgKkADICpAAyAnsAKAPsACgD7AAoA+wAKAPsACgD7AAoApkAKAJ8ACgCfAAoAnwAKAJ8ACgCfAAoAmIAKAJiACgCYgAoAmIAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgCNQAoAjUAKAI1ACgD0AAoAjcAMgJCADICQgAyAkIAMgJCADICQgAyAjYAKAJxACgCNgAoAocAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAIsACgCLAAoAiwAKAF3ACMCNgAoAjYAKAI2ACgCNgAoAhkAMgJjADIAoQAyAKEAMgChACABZAAyAWMAMgChACIAoQAgAUwAMgChABwAvgADAKoAAAHRADIB0QAyAScAMgEnACwBJ//aAScAMgG7ADIDDgAoAhoAMgIaADICGgAyAhoAMgIaADICGgAyAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoAiQAKAIkACgCJAAoA70AKAI1ADICNQAyAjUAKAG2ADIBtgAyAbYAMgG2ADIB9wAoAfcAKAH3ACgB9wAoAfcAKAJ/ADIBhgAoAZAALQGGACgBhgAoAYYAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAIZACgCGQAoAhkAKAILACgDDQAoAw0AKAMNACgDDQAoAw0AKAH1ACgCCwAoAgsAKAILACgCCwAoAgsAKAIVACgCFQAoAhUAKAIVACgCGAAjAp4AIwFuADIBYwAyAusAMgKkADICGQAoAggAKAKEACgBTgAoAooAKAIvACgCDwAoAosAKAIzAC0CRAAoAi8AKAI0ACgB0wAiAPcAIgHBABkBggAaAWwAGgHBABkBhQAeAZAAGQGCABoBhgAaAdMAIgD3ACIBwQAZAYIAGgFsABoBwQAZAYUAHgGQABkBggAaAYYAGgHTACIA9wAiAcEAGQGCABoBbAAaAcEAGQGFAB4BkAAZAYIAGgGGABoBPf+1AmYAIgQmACIEkgAiA+gAIgSAABkD0gAiBCsAGgQnACIEvwAZBIAAGgRqABoD6gAiBIIAGQP2ACID6AAiBEEAGgSAABkENgAZA+sAIgUvACIAoQAyAMUAIwCNACgAzgAjAc0AMgClADIApQAyArkAMgK5ADIAoQAy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APwBTgCJAFcBTwFQAVEBUgBYAH4AgACBAH8BUwFUAVUBVgBZAFoBVwFYAVkBWgBbAFwA7AFbALoBXABdAV0A5wFeAMAAwQCdAJ4BXwFgAWEAmwATABQAFQAWABcAGAAZABoAGwAcAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/ALwBgAD0AYEBggGDAPUA9gGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQABEADwAdAB4AqwAEAKMAIgCiAMMAhwANAAYAEgA/AAsADABeAGAAPgBAABABkQCyALMAQgDEAMUAtAC1ALYAtwCpAKoAvgC/AAUACgGSAIQAvQAHAZMApgCFAJYBlAAOAO8A8AC4ACAAjwAhAB8AlQCUAJMApwBhAKQAQQGVAJIAnACaAJkApQCYAZYACADGAZcBmAGZAZoBmwGcAZ0BngGfAaAAuQAjAAkAiACGAIsAigCMAIMAXwDoAIIAwgGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAI0A2wDhAN4A2ACOANwAQwDfANoA4ADdANkBtAZBYnJldmUHQW1hY3JvbgdBb2dvbmVrCkNkb3RhY2NlbnQGRGNhcm9uBkRjcm9hdAZFY2Fyb24KRWRvdGFjY2VudAdFbWFjcm9uB0VvZ29uZWsHdW5pMDEyMgpHZG90YWNjZW50BEhiYXIHSW1hY3JvbgdJb2dvbmVrB3VuaTAxMzYGTGFjdXRlBkxjYXJvbgd1bmkwMTNCBk5hY3V0ZQZOY2Fyb24HdW5pMDE0NQNFbmcNT2h1bmdhcnVtbGF1dAdPbWFjcm9uBlJhY3V0ZQZSY2Fyb24HdW5pMDE1NgZTYWN1dGUHdW5pMDIxOARUYmFyBlRjYXJvbgd1bmkwMTYyB3VuaTAyMUENVWh1bmdhcnVtbGF1dAdVbWFjcm9uB1VvZ29uZWsFVXJpbmcGV2FjdXRlC1djaXJjdW1mbGV4CVdkaWVyZXNpcwZXZ3JhdmULWWNpcmN1bWZsZXgGWWdyYXZlBlphY3V0ZQpaZG90YWNjZW50BmFicmV2ZQdhbWFjcm9uB2FvZ29uZWsKY2RvdGFjY2VudAZkY2Fyb24GZWNhcm9uCmVkb3RhY2NlbnQHZW1hY3Jvbgdlb2dvbmVrB3VuaTAxMjMKZ2RvdGFjY2VudARoYmFyCWkubG9jbFRSSwdpbWFjcm9uB2lvZ29uZWsHdW5pMDIzNwd1bmkwMTM3BmxhY3V0ZQZsY2Fyb24HdW5pMDEzQwZuYWN1dGUGbmNhcm9uB3VuaTAxNDYDZW5nDW9odW5nYXJ1bWxhdXQHb21hY3JvbgZyYWN1dGUGcmNhcm9uB3VuaTAxNTcGc2FjdXRlB3VuaTAyMTkEdGJhcgZ0Y2Fyb24HdW5pMDE2Mwd1bmkwMjFCDXVodW5nYXJ1bWxhdXQHdW1hY3Jvbgd1b2dvbmVrBXVyaW5nBndhY3V0ZQt3Y2lyY3VtZmxleAl3ZGllcmVzaXMGd2dyYXZlC3ljaXJjdW1mbGV4BnlncmF2ZQZ6YWN1dGUKemRvdGFjY2VudAd1bmkwMzk0B3VuaTAzQTkHdW5pMDNCQwl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yB3VuaTIwNzAHdW5pMDBCOQd1bmkwMEIyB3VuaTAwQjMHdW5pMjA3NAd1bmkyMDc1B3VuaTIwNzYHdW5pMjA3Nwd1bmkyMDc4B3VuaTIwNzkHdW5pMjE1Rgd1bmkyMTg5B3VuaTIxNTMHdW5pMjE1NAd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU4B3VuaTIxNTkHdW5pMjE1QQd1bmkyMTUwCW9uZWVpZ2h0aAx0aHJlZWVpZ2h0aHMLZml2ZWVpZ2h0aHMMc2V2ZW5laWdodGhzB3VuaTIxNTEHdW5pMjE1Mgd1bmkwMEFEB3VuaTAwQTAERXVybwd1bmkyMjE1CGVtcHR5c2V0B3VuaTAwQjUHYXJyb3d1cAd1bmkyMTk3CmFycm93cmlnaHQHdW5pMjE5OAlhcnJvd2Rvd24HdW5pMjE5OQlhcnJvd2xlZnQHdW5pMjE5NglhcnJvd2Jv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sTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAAAAAAEAAAAKADgAeAACREZMVAAebGF0bgAOAAQAAAAA//8AAwABAAMABQAEAAAAAP//AAMAAAACAAQABmtlcm4AOGtlcm4AOG1hcmsALm1hcmsALm1rbWsAJm1rbWsAJgAAAAIABQAGAAAAAwACAAMABAAAAAIAAAABAAcR/g+gDnoN9gGCASQAEAAGAgAAAQAIAAEBAgC0AAEA0AAMABcAogCcAJYAlgCQAIoAhAB+AHgAcgBsAGYAYABaAFQJbgBOAEgAYABCADwANgAwAAEA0wLlAAEAfQK8AAEAzAK8AAEAkgK9AAEAXwLKAAEAsgLKAAEAsgK+AAEAmAK8AAEAYAK8AAH/oQLIAAH/RgK8AAH/LgLlAAH/hAK8AAH/aQK8AAH/TgK+AAH/TgK8AAH/bgK9AAH/oQK8AAH/ogLKAAH/TwLKAAIABAGKAZUAAAGdAZ8ADAGhAaYADwGoAakAFQAMAAAOogAADpwAAA6WAAAOlgAADpAAAA6KAAAOhAAADn4AAA54AAAOcgAADmwAAA6WAAIAAQGKAZUAAAAGAQAAAQAIAAEATgA2AAEARAAMAAUAJAAeABgAEgAMAAEAm/8eAAEAsgI8AAH/Zf8eAAH/of85AAH/TgI8AAEABQGQAZYBlwGfAaAAAgAADd4AAA3YAAEAAgGWAZcABAAAAAEACAABDgYLtgAEDBoADADQC6QLnguYAAALpAueC5IAAAukC54LjAAAC6QLnguSAAALpAueC4YAAAukC54LkgAAC6QLnguAAAALpAueC5gAAAukC54LkgAAC6QLngt6AAALdAtuC2gAAAtiAAALXAAAC2IAAAtWAAALYgAAC1AAAAtKAAAAAAAAC2IAAAtEAAALPgAACzgLMgssAAALJgsgCz4AAAsaCzILLAAACyYLIAsUCw4LCAAACxQLDgsCAAALFAsOCvwAAAsUCw4LAgAACxQLDgr2AAALFAsOCvYAAAsUCw4LAgAACxQLDgrwAAALFAsOCwgAAArqAAAK5AAACuoAAAreAAAK2AAACuQAAArqAAAK0gAACswAAArGCsAKzAAACsYKwAq6CrQKrgAACroKtAqoAAAKogqcCpYAAAqiCpwKkAAACroKtAqKAAAKugq0CqgAAAAACoQKfgAACroKtAquAAAKeAAACnIAAApsAAAKcgAACmYAAApgCloKZgAAClQKWgpmAAAKTgpaCkgAAApgCloKQgAACjwKNgowAAAKKgAACjAAAAokAAAKMAAACh4AAAoYAAAKKgAACjAAAAoqAAAKMAAAChIAAAoMCgYKAAn6CgwKBgn0CfoKDAoGCfQJ+goMCgYJ7gn6CgwKBgn0CfoKDAoGCegJ+goMCgYJ4gn6CgwKBgoACfoKDAoGCdwJ+gnWCdAJygn6CcQAAAm+AAAJxAAACbgAAAnEAAAJsgAACawAAAm+AAAJpgAACaAAAAmmAAAJmgAACaYAAAmUAAAJjgAAAAAAAAmIAAAJoAAACYIAAAl8CXYJggAACXwJdgmCAAAJcAl2CWoAAAAACXYJZAAACXwJdgyCCV4MjgAADIIJXglYAAAMggleCVgAAAyCCV4JUgAADIIJXglYAAAMggleCUwAAAyCCV4JRgAADIIJXgyOAAAMggleCVgAAAlAAAAJOgAACUAAAAk0AAAJQAAACTQAAAlAAAAJLgAACUAAAAk0AAAJKAAACSIAAAkoAAAJHAAACSgAAAkcAAAJKAAACRYAAAkoAAAJHAAACRAAAAkKAAAJEAAACQQAAAkQAAAI/gAACRAAAAj4AAAI8gjsCOYAAAjyCOwI4AAACPII7AjaAAAI8gjsCOAAAAjyCOwI1AAACPII7AjgAAAI8gjsCM4AAAjyCOwI5gAACPII7AjgAAAI8gjsCMgAAAjCCLwItgAACLAAAAiqAAAIsAAACKQAAAiwAAAIngAACJgAAAAAAAAIsAAACJIAAAjyAAAIjAiGCPIAAAiACIYI8gAACIwIhgh6CHQIbgAACHoIdAhoAAAIegh0CGIAAAh6CHQIaAAACHoIdAhcAAAIegh0CFwAAAh6CHQIaAAACHoIdAhWAAAIegh0CG4AAAhQAAAISgAACFAAAAhEAAAIUAAACD4AAAhQAAAIOAAA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AMIAxQACAM0A4gABAAIABQAxADEAAQAzADMAAgBJAEkAAwBVAFUABABqAGoABQABADIABAAAABQBagFQAUoBOAEeAOgA4gDYANIBSgDAALIAqACiAJgAjgB8AGoAZABeAAEAFAADACEAMQAzAEkAVQBaAGMAZABpAGoAbwCRAJsApQCxAL4AyADdAUcAAQAw/84AAQEs//YABACq//YBK//iASz/4QEu/+wABADI//EBK//dASz/0wEu/8kAAgEs//YBLv/2AAIAkf/TAN3/4gABAKUAFAACASv/8QEs/84AAwCbABkAnAAKAJ4ADwAEASv/5wEs/7oBLv/JAS//4gABASz/8AACAJsAGQEs/+cAAQCaAAoADQAD/84AD//2ABj/9gCY/+UAmf/iAJv/8QCq/84A0P/JASv/5wEs/8IBLf/sAS7/xAEv/+IABgAD/+cAMP+cAKH/9gEs/78BLv/iAS//xAAEAFX/sABj/+cAav/dAUj/3QABAN3/7AAGADD/nACY//EAof/sAKr/7AEs/90BLv/nAAIAVf/nAGr/5wACAAgAAQAIAAEAEAAEAAAAAwAmACAAGgABAAMBAwEJARYAAQD5AAAAAQEW/+cAAQEWADIAAAACADL/gAIRApgAAwAHACJAHwABAAIDAQJnAAMAAANXAAMDAF8AAAMATxERERAEBhorBSERIQchESECEf4hAd85/pQBbIADGDj9WAAAAgAoAAACUQK8AAkADwA2QDMNCggFBAUEAUwABQAAAQUAZwAEBAJfAAICJk0GAwIBAScBTgAADw4MCwAJAAkSEREHCBkrITUhFSMREzMTEQMDIwMVIQIP/ltC4VjwRM8RwgGi8vIBWQFj/pv+qQFGATP+zhMA//8AKAAAAlEDmgAiAAMAAAEHAY0BnADeAAixAgGw3rA1KwAA//8AKAAAAlEDgQAiAAMAAAEHAZEB1ADFAAixAgGwxbA1KwAA//8AKAAAAlEDmgAiAAMAAAEHAY8B7wDeAAixAgGw3rA1KwAA//8AKAAAAlEDUwAiAAMAAAEHAYoB7wCJAAixAgKwibA1KwAA//8AKAAAAlEDmgAiAAMAAAEHAYwBnADeAAixAgGw3rA1KwAA//8AKAAAAlEDRwAiAAMAAAEHAZQB9wCLAAixAgGwi7A1KwAAAAIAKP9RAoMCvAASABgASUBG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AdoCvAALADBALQgBAgAEAUwAAAABAgABZwUBBAQDXwADAyZNAAICJwJOAAAACwALEhEREgYIGisTBxUhFSERIxE3IRWrQAEY/uhDYQFRAnlUoUP+vwI8gEMAAAEAKAAAAosCvAATADlANgoHBgMEBQITDgsCBAMEAkwABQAEAwUEZwACAgFfAAEBJk0AAwMAXwAAACcAThESExMTEAYIHCshIScRNyEXBychBxEXITc1IzUzFQIo/mJiYgGeXDZH/qRAQAFcQY3QggG5gXgpXlX+dVZWT0Sq//8AKAAAAosDgQAiACIAAAEHAZEB8QDFAAixAQGwxbA1KwAA//8AKP85AosCvAAiACIAAAADAZYBuQAA//8AKAAAAosDUwAiACIAAAEHAYsBuQCJAAixAQGwibA1KwAAAAEAMgAAAigCvAALACdAJAADAAABAwBnBAECAiZNBgUCAQEnAU4AAAALAAsREREREQcIGyshESERIxEzESERMxEB5v6OQkIBckIBP/7BArz+xgE6/UQAAv/nAAACcgK8ABMAFwA2QDMJBwIFCgQCAAsFAGcACwACAQsCZwgBBgYmTQMBAQEnAU4XFhUUExIRERERERERERAMCB8rASMRIxEhESMRIzUzNTMVITUzFTMHIRUhAnJKQv6OQktLQgFyQkqM/o4BcgIf/eEBP/7BAh80aWlpaTSdAAEAMgAAAHMCvAADABlAFgAAACZNAgEBAScBTgAAAAMAAxEDCBcrMxEzETJBArz9RAD//wAkAAAAfwOaACIAKAAAAQcBjQCxAN4ACLEBAbDesDUrAAD//wAyAAABMgOaACIAKGAAAQcBjwFkAN4ACLEBAbDesDUrAAD//wAyAAABMQNUACIAKF8AAQcBigFjAIoACLEBArCKsDUrAAD//wAmAAAAfwNTACIAKAAAAQcBiwCxAIkACLEBAbCJsDUrAAD//wAkAAAAfwOaACIAKAAAAQcBjACxAN4ACLEBAbDesDUrAAAAAgAyAAABGgNHAAMABwAjQCAAAAABAgABZwACAiZNBAEDAycDTgQEBAcEBxIREAUIGSsTMxUjExEzETLo6FRBA0cq/OMCvP1EAAABAB//UQCqArwADAAlQCIKCAQDBAIBAUwDAQIAAAIAYwABASYBTgAAAAwADBQRBAgYKxcVIyc3IxEzESMHFxeqUTob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"; diff --git a/packages/spore/src/dob/render/index.ts b/packages/spore/src/dob/render/index.ts index 3248306b..460ce56f 100644 --- a/packages/spore/src/dob/render/index.ts +++ b/packages/spore/src/dob/render/index.ts @@ -1,10 +1,10 @@ -export * from './render-by-dob-decode-response' -export * from './traits-parser' -export * from './svg-to-base64' -export * from './render-text-svg' -export * from './render-text-params-parser' -export * from './render-image-svg' -export * from './types' -export * from './render-by-token-key' -export * from './render-dob-bit' -export { config } from './config' +export { config } from "./config"; +export * from "./render-by-dob-decode-response"; +export * from "./render-by-token-key"; +export * from "./render-dob-bit"; +export * from "./render-image-svg"; +export * from "./render-text-params-parser"; +export * from "./render-text-svg"; +export * from "./svg-to-base64"; +export * from "./traits-parser"; +export * from "./types"; diff --git a/packages/spore/src/dob/render/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/render-by-dob-decode-response.ts index 616e444a..5b0883cb 100644 --- a/packages/spore/src/dob/render/render-by-dob-decode-response.ts +++ b/packages/spore/src/dob/render/render-by-dob-decode-response.ts @@ -1,36 +1,36 @@ -import type { DobDecodeResult, RenderPartialOutput } from './types' -import { traitsParser } from './traits-parser' -import { renderTextParamsParser } from './render-text-params-parser' -import type { RenderProps } from './render-text-svg' -import { renderTextSvg } from './render-text-svg' -import { renderImageSvg } from './render-image-svg' -import { renderDob1Svg } from './render-dob1-svg' -import { Key } from './constants/key' +import { Key } from "./constants/key"; +import { renderDob1Svg } from "./render-dob1-svg"; +import { renderImageSvg } from "./render-image-svg"; +import { renderTextParamsParser } from "./render-text-params-parser"; +import type { RenderProps } from "./render-text-svg"; +import { renderTextSvg } from "./render-text-svg"; +import { traitsParser } from "./traits-parser"; +import type { DobDecodeResult, RenderPartialOutput } from "./types"; export function renderByDobDecodeResponse( dob0Data: DobDecodeResult | string, - props?: Pick & { - outputType?: 'svg' + props?: Pick & { + outputType?: "svg"; }, ) { - if (typeof dob0Data === 'string') { - dob0Data = JSON.parse(dob0Data) as DobDecodeResult + if (typeof dob0Data === "string") { + dob0Data = JSON.parse(dob0Data) as DobDecodeResult; } - if (typeof dob0Data.render_output === 'string') { + if (typeof dob0Data.render_output === "string") { dob0Data.render_output = JSON.parse( dob0Data.render_output, - ) as RenderPartialOutput[] + ) as RenderPartialOutput[]; } - const { traits, indexVarRegister } = traitsParser(dob0Data.render_output) + const { traits, indexVarRegister } = traitsParser(dob0Data.render_output); for (const trait of traits) { - if (trait.name === 'prev.type' && trait.value === 'image') { - return renderImageSvg(traits) + if (trait.name === "prev.type" && trait.value === "image") { + return renderImageSvg(traits); } // TODO: multiple images if (trait.name === Key.Image && trait.value instanceof Promise) { - return renderDob1Svg(trait.value) + return renderDob1Svg(trait.value); } } - const renderOptions = renderTextParamsParser(traits, indexVarRegister) - return renderTextSvg({ ...renderOptions, font: props?.font }) + const renderOptions = renderTextParamsParser(traits, indexVarRegister); + return renderTextSvg({ ...renderOptions, font: props?.font }); } diff --git a/packages/spore/src/dob/render/render-by-token-key.ts b/packages/spore/src/dob/render/render-by-token-key.ts index 67945d70..75795dcf 100644 --- a/packages/spore/src/dob/render/render-by-token-key.ts +++ b/packages/spore/src/dob/render/render-by-token-key.ts @@ -1,13 +1,13 @@ -import { dobDecode } from './api/dobDecode' -import type { RenderProps } from './render-text-svg' -import { renderByDobDecodeResponse } from './render-by-dob-decode-response' +import { dobDecode } from "./api/dobDecode"; +import { renderByDobDecodeResponse } from "./render-by-dob-decode-response"; +import type { RenderProps } from "./render-text-svg"; export async function renderByTokenKey( tokenKey: string, - options?: Pick & { - outputType?: 'svg' + options?: Pick & { + outputType?: "svg"; }, ) { - const dobDecodeResponse = await dobDecode(tokenKey) - return renderByDobDecodeResponse(dobDecodeResponse.result, options) + const dobDecodeResponse = await dobDecode(tokenKey); + return renderByDobDecodeResponse(dobDecodeResponse.result, options); } diff --git a/packages/spore/src/dob/render/render-dob-bit.ts b/packages/spore/src/dob/render/render-dob-bit.ts index e18e7772..64b53be5 100644 --- a/packages/spore/src/dob/render/render-dob-bit.ts +++ b/packages/spore/src/dob/render/render-dob-bit.ts @@ -1,92 +1,93 @@ -import satori from 'satori' -import type { DobDecodeResult, RenderPartialOutput } from './types' -import { traitsParser } from './traits-parser' -import { base64ToArrayBuffer } from './utils/string' -import SpaceGroteskBoldBase64 from './fonts/SpaceGrotesk-Bold.base64' +import satori from "satori"; +import SpaceGroteskBoldBase64 from "./fonts/SpaceGrotesk-Bold.base64"; +import { traitsParser } from "./traits-parser"; +import type { DobDecodeResult, RenderPartialOutput } from "./types"; +import { base64ToArrayBuffer } from "./utils/string"; const iconBase64 = - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNTA0XzI4OCkiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAwMCAwSDBWMTAwMEgxMDAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTAwIDY0NS42NjlDNjE1LjE1NyA2NDUuNjY5IDcwOC42NjEgNTUyLjE2NSA3MDguNjYxIDQzNy4wMDhDNzA4LjY2MSAzOTAuMDkyIDY5My4yNDIgMzQ2Ljc4NSA2NjYuOTk1IDMxMi4wMDhDNjkyLjI1NyAyOTIuNjUxIDcwOC42NjEgMjYyLjQ2NyA3MDguNjYxIDIyOC4zNDZINTAwQzM4NC44NDMgMjI4LjM0NiAyOTEuMzM5IDMyMS44NSAyOTEuMzM5IDQzNy4wMDhDMjkxLjMzOSA1NTEuODM3IDM4NS4xNzEgNjQ1LjY2OSA1MDAgNjQ1LjY2OVpNNTAwIDMyMy44MTlDNTYyLjMzNiAzMjMuODE5IDYxMy4xODkgMzc0LjY3MiA2MTMuMTg5IDQzNy4wMDhDNjEzLjE4OSA0OTkuMzQ0IDU2Mi4zMzYgNTUwLjE5NyA1MDAgNTUwLjE5N0M0MzcuNjY0IDU1MC4xOTcgMzg2LjgxMSA0OTkuMzQ0IDM4Ni44MTEgNDM3LjAwOEMzODYuODExIDM3NC42NzIgNDM3LjY2NCAzMjMuODE5IDUwMCAzMjMuODE5WiIgZmlsbD0iIzAwREY5QiIvPgo8cGF0aCBkPSJNNTAwIDgxMS4zNTJDNDA0LjE5OSA4MTEuMzUyIDMwOC4zOTkgNzc0LjkzNCAyMzUuMjM2IDcwMS43NzJDMjQ2LjcxOSA2NzEuNTg4IDI3MS45ODIgNjQ2LjY1NCAzMDUuNzc0IDYzNy4xMzlDMzU5LjkwOCA2ODkuNjMzIDQyOS43OSA3MTUuODc5IDUwMCA3MTUuODc5QzU3MC4yMSA3MTUuODc5IDY0MC4wOTIgNjg5LjYzMyA2OTQuMjI2IDYzNy4xMzlDNzI4LjAxOCA2NDYuNjU0IDc1My4yODEgNjcxLjI2IDc2NC43NjQgNzAxLjc3MkM2OTEuOTI5IDc3NC42MDYgNTk1LjgwMSA4MTEuMzUyIDUwMCA4MTEuMzUyWiIgZmlsbD0iIzI0NzFGRSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzUwNF8yODgiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=' + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNTA0XzI4OCkiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAwMCAwSDBWMTAwMEgxMDAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTAwIDY0NS42NjlDNjE1LjE1NyA2NDUuNjY5IDcwOC42NjEgNTUyLjE2NSA3MDguNjYxIDQzNy4wMDhDNzA4LjY2MSAzOTAuMDkyIDY5My4yNDIgMzQ2Ljc4NSA2NjYuOTk1IDMxMi4wMDhDNjkyLjI1NyAyOTIuNjUxIDcwOC42NjEgMjYyLjQ2NyA3MDguNjYxIDIyOC4zNDZINTAwQzM4NC44NDMgMjI4LjM0NiAyOTEuMzM5IDMyMS44NSAyOTEuMzM5IDQzNy4wMDhDMjkxLjMzOSA1NTEuODM3IDM4NS4xNzEgNjQ1LjY2OSA1MDAgNjQ1LjY2OVpNNTAwIDMyMy44MTlDNTYyLjMzNiAzMjMuODE5IDYxMy4xODkgMzc0LjY3MiA2MTMuMTg5IDQzNy4wMDhDNjEzLjE4OSA0OTkuMzQ0IDU2Mi4zMzYgNTUwLjE5NyA1MDAgNTUwLjE5N0M0MzcuNjY0IDU1MC4xOTcgMzg2LjgxMSA0OTkuMzQ0IDM4Ni44MTEgNDM3LjAwOEMzODYuODExIDM3NC42NzIgNDM3LjY2NCAzMjMuODE5IDUwMCAzMjMuODE5WiIgZmlsbD0iIzAwREY5QiIvPgo8cGF0aCBkPSJNNTAwIDgxMS4zNTJDNDA0LjE5OSA4MTEuMzUyIDMwOC4zOTkgNzc0LjkzNCAyMzUuMjM2IDcwMS43NzJDMjQ2LjcxOSA2NzEuNTg4IDI3MS45ODIgNjQ2LjY1NCAzMDUuNzc0IDYzNy4xMzlDMzU5LjkwOCA2ODkuNjMzIDQyOS43OSA3MTUuODc5IDUwMCA3MTUuODc5QzU3MC4yMSA3MTUuODc5IDY0MC4wOTIgNjg5LjYzMyA2OTQuMjI2IDYzNy4xMzlDNzI4LjAxOCA2NDYuNjU0IDc1My4yODEgNjcxLjI2IDc2NC43NjQgNzAxLjc3MkM2OTEuOTI5IDc3NC42MDYgNTk1LjgwMSA4MTEuMzUyIDUwMCA4MTEuMzUyWiIgZmlsbD0iIzI0NzFGRSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzUwNF8yODgiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="; export function renderDobBit( dob0Data: DobDecodeResult | string, props?: { - outputType?: 'svg' + outputType?: "svg"; }, ) { - if (typeof dob0Data === 'string') { - dob0Data = JSON.parse(dob0Data) as DobDecodeResult + if (typeof dob0Data === "string") { + dob0Data = JSON.parse(dob0Data) as DobDecodeResult; } - if (typeof dob0Data.render_output === 'string') { + if (typeof dob0Data.render_output === "string") { dob0Data.render_output = JSON.parse( dob0Data.render_output, - ) as RenderPartialOutput[] + ) as RenderPartialOutput[]; } - const { traits } = traitsParser(dob0Data.render_output) - const account = traits.find((trait) => trait.name === 'Account')?.value ?? '-' - let fontSize = 76 - if (typeof account === 'string') { + const { traits } = traitsParser(dob0Data.render_output); + const account = + traits.find((trait) => trait.name === "Account")?.value ?? "-"; + let fontSize = 76; + if (typeof account === "string") { if (account.length > 10) { - fontSize = fontSize / 2 + fontSize = fontSize / 2; } if (account.length > 20) { - fontSize = fontSize / 2 + fontSize = fontSize / 2; } if (account.length > 30) { - fontSize = fontSize * 0.75 + fontSize = fontSize * 0.75; } } - const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64) + const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64); return satori( { - key: 'container', - type: 'div', + key: "container", + type: "div", props: { style: { - display: 'flex', - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center', - width: '500px', - background: '#3A3A43', - color: '#fff', - height: '500px', - textAlign: 'center', + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + width: "500px", + background: "#3A3A43", + color: "#fff", + height: "500px", + textAlign: "center", }, children: [ { - type: 'img', + type: "img", props: { src: iconBase64, width: 100, height: 100, style: { - width: '100px', - height: '100px', - borderRadius: '100%', - marginBottom: '40px', + width: "100px", + height: "100px", + borderRadius: "100%", + marginBottom: "40px", }, }, }, { - type: 'div', + type: "div", props: { children: account, style: { - marginBottom: '20px', + marginBottom: "20px", fontSize: `${fontSize}px`, - textAlign: 'center', + textAlign: "center", }, }, }, { - type: 'div', + type: "div", props: { - children: '.bit', + children: ".bit", style: { - fontSize: '44px', - padding: '4px 40px', - borderRadius: '200px', - background: 'rgba(255, 255, 255, 0.10)', + fontSize: "44px", + padding: "4px 40px", + borderRadius: "200px", + background: "rgba(255, 255, 255, 0.10)", }, }, }, @@ -98,11 +99,11 @@ export function renderDobBit( height: 500, fonts: [ { - name: 'SpaceGrotesk', + name: "SpaceGrotesk", data: spaceGroteskBoldFont, weight: 700, }, ], }, - ) + ); } diff --git a/packages/spore/src/dob/render/render-dob1-svg.ts b/packages/spore/src/dob/render/render-dob1-svg.ts index 1b101f57..926a0a05 100644 --- a/packages/spore/src/dob/render/render-dob1-svg.ts +++ b/packages/spore/src/dob/render/render-dob1-svg.ts @@ -1,30 +1,30 @@ -import { type INode, stringify } from 'svgson' -import satori from 'satori' -import { svgToBase64 } from './svg-to-base64' -import { base64ToArrayBuffer } from './utils/string' -import SpaceGroteskBoldBase64 from './fonts/SpaceGrotesk-Bold.base64' +import satori from "satori"; +import { type INode, stringify } from "svgson"; +import SpaceGroteskBoldBase64 from "./fonts/SpaceGrotesk-Bold.base64"; +import { svgToBase64 } from "./svg-to-base64"; +import { base64ToArrayBuffer } from "./utils/string"; export async function renderDob1Svg(nodePromise: Promise) { - const node = await nodePromise - const str = stringify(node) - const base64 = await svgToBase64(str) - const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64) - const width = parseInt(node.attributes.width, 10) || 500 - const height = parseInt(node.attributes.height, 10) || 500 + const node = await nodePromise; + const str = stringify(node); + const base64 = await svgToBase64(str); + const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64); + const width = parseInt(node.attributes.width, 10) || 500; + const height = parseInt(node.attributes.height, 10) || 500; return satori( { - key: 'container', - type: 'div', + key: "container", + type: "div", props: { style: { - display: 'flex', + display: "flex", width: `${width}px`, height: `${width}px`, }, children: [ { - type: 'img', + type: "img", props: { src: base64, width, @@ -43,11 +43,11 @@ export async function renderDob1Svg(nodePromise: Promise) { height, fonts: [ { - name: 'SpaceGrotesk', + name: "SpaceGrotesk", data: spaceGroteskBoldFont, weight: 700, }, ], }, - ) + ); } diff --git a/packages/spore/src/dob/render/render-image-svg.ts b/packages/spore/src/dob/render/render-image-svg.ts index d51933f6..e6e31bea 100644 --- a/packages/spore/src/dob/render/render-image-svg.ts +++ b/packages/spore/src/dob/render/render-image-svg.ts @@ -1,53 +1,53 @@ -import satori from 'satori' -import type { ParsedTrait } from './traits-parser' -import { config } from './config' -import { backgroundColorParser } from './background-color-parser' -import { processFileServerResult } from './utils/mime' -import { isBtcFs, isIpfs } from './utils/string' +import satori from "satori"; +import { backgroundColorParser } from "./background-color-parser"; +import { config } from "./config"; +import type { ParsedTrait } from "./traits-parser"; +import { processFileServerResult } from "./utils/mime"; +import { isBtcFs, isIpfs } from "./utils/string"; export async function renderImageSvg(traits: ParsedTrait[]): Promise { - const prevBg = traits.find((trait) => trait.name === 'prev.bg') - const bgColor = backgroundColorParser(traits, { defaultColor: '#FFFFFF00' }) + const prevBg = traits.find((trait) => trait.name === "prev.bg"); + const bgColor = backgroundColorParser(traits, { defaultColor: "#FFFFFF00" }); - let bgImage = '' - if (prevBg?.value && typeof prevBg.value === 'string') { + let bgImage = ""; + if (prevBg?.value && typeof prevBg.value === "string") { if (isBtcFs(prevBg.value)) { - const btcFsResult = await config.queryBtcFsFn(prevBg.value) - bgImage = processFileServerResult(btcFsResult) + const btcFsResult = await config.queryBtcFsFn(prevBg.value); + bgImage = processFileServerResult(btcFsResult); } else if (isIpfs(prevBg.value)) { - const ipfsFsResult = await config.queryIpfsFn(prevBg.value) - bgImage = processFileServerResult(ipfsFsResult) - } else if (prevBg.value.startsWith('https://')) { - bgImage = prevBg.value + const ipfsFsResult = await config.queryIpfsFn(prevBg.value); + bgImage = processFileServerResult(ipfsFsResult); + } else if (prevBg.value.startsWith("https://")) { + bgImage = prevBg.value; } } return satori( { - key: 'container', - type: 'div', + key: "container", + type: "div", props: { style: { - display: 'flex', - width: '500px', - background: bgColor ?? '#000', - color: '#fff', - height: '500px', - justifyContent: 'center', - alignItems: 'center', - overflow: 'hidden', + display: "flex", + width: "500px", + background: bgColor ?? "#000", + color: "#fff", + height: "500px", + justifyContent: "center", + alignItems: "center", + overflow: "hidden", }, children: [ bgImage ? { - key: 'bg_image', - type: 'img', + key: "bg_image", + type: "img", props: { src: bgImage, style: { - objectFit: 'contain', - maxWidth: '100%', - maxHeight: '100%', + objectFit: "contain", + maxWidth: "100%", + maxHeight: "100%", }, }, } @@ -56,5 +56,5 @@ export async function renderImageSvg(traits: ParsedTrait[]): Promise { }, }, { width: 500, height: 500, fonts: [] }, - ) + ); } diff --git a/packages/spore/src/dob/render/render-text-params-parser.ts b/packages/spore/src/dob/render/render-text-params-parser.ts index ac2eaf1e..0716b731 100644 --- a/packages/spore/src/dob/render/render-text-params-parser.ts +++ b/packages/spore/src/dob/render/render-text-params-parser.ts @@ -1,36 +1,36 @@ -import type { ParsedTrait } from './traits-parser' -import { backgroundColorParser } from './background-color-parser' -import { GLOBAL_TEMPLATE_REG, TEMPLATE_REG } from './constants/regex' -import { ParsedStyleFormat, styleParser } from './style-parser' -import { Key } from './constants/key' +import { backgroundColorParser } from "./background-color-parser"; +import { Key } from "./constants/key"; +import { GLOBAL_TEMPLATE_REG, TEMPLATE_REG } from "./constants/regex"; +import { ParsedStyleFormat, styleParser } from "./style-parser"; +import type { ParsedTrait } from "./traits-parser"; -export const DEFAULT_TEMPLATE = `%k: %v` +export const DEFAULT_TEMPLATE = `%k: %v`; export function renderTextParamsParser( traits: ParsedTrait[], indexVarRegister: Record, options?: { - defaultTemplate?: string + defaultTemplate?: string; }, ) { - const bgColor = backgroundColorParser(traits, { defaultColor: '#000' }) - let template = options?.defaultTemplate ?? DEFAULT_TEMPLATE - let style = styleParser('') + const bgColor = backgroundColorParser(traits, { defaultColor: "#000" }); + let template = options?.defaultTemplate ?? DEFAULT_TEMPLATE; + let style = styleParser(""); const globalTemplateTrait = traits.find((trait) => GLOBAL_TEMPLATE_REG.test(trait.name), - ) + ); if (globalTemplateTrait) { - if (typeof globalTemplateTrait.value === 'string') { - let { value } = globalTemplateTrait - if (!value.startsWith('<') && !value.endsWith('>')) { - value = `<${value}>` + if (typeof globalTemplateTrait.value === "string") { + let { value } = globalTemplateTrait; + if (!value.startsWith("<") && !value.endsWith(">")) { + value = `<${value}>`; } - style = styleParser(value) + style = styleParser(value); } - const matchTemplate = globalTemplateTrait.name.match(TEMPLATE_REG)?.[2] + const matchTemplate = globalTemplateTrait.name.match(TEMPLATE_REG)?.[2]; if (matchTemplate) { - template = matchTemplate + template = matchTemplate; } } @@ -38,68 +38,68 @@ export function renderTextParamsParser( .filter( (trait) => !trait.name.startsWith(Key.Prev) && - typeof trait.value !== 'undefined' && + typeof trait.value !== "undefined" && !(trait.name in indexVarRegister) && trait.name !== Key.Image, ) .map((trait) => { - let currentTemplate = template - let parsedStyle = style - let { name, value } = trait - if (typeof value === 'string') { - const currentLayoutMatch = value.match(TEMPLATE_REG) + let currentTemplate = template; + let parsedStyle = style; + let { name, value } = trait; + if (typeof value === "string") { + const currentLayoutMatch = value.match(TEMPLATE_REG); if (currentLayoutMatch) { if (currentLayoutMatch[1]) { - ;[, value] = currentLayoutMatch + [, value] = currentLayoutMatch; } if (currentLayoutMatch[2]) { parsedStyle = styleParser(`<${currentLayoutMatch[2]}>`, { baseStyle: JSON.parse(JSON.stringify(parsedStyle)), - }) + }); } } } - const currentTemplateMatch = name.match(TEMPLATE_REG) + const currentTemplateMatch = name.match(TEMPLATE_REG); if (currentTemplateMatch && currentTemplateMatch[2]) { if (currentTemplateMatch[1]) { - name = currentTemplateMatch[1] + name = currentTemplateMatch[1]; } if (currentTemplateMatch[2]) { - currentTemplate = currentTemplateMatch[2] + currentTemplate = currentTemplateMatch[2]; } } const text = currentTemplate .replace(/%k/g, name) .replace(/%v/g, `${value}`) - .replace(/%%/g, '%') + .replace(/%%/g, "%"); const styleCss: { - textAlign?: string - color?: string - fontWeight?: string - fontStyle?: string - textDecoration?: string - } = {} + textAlign?: string; + color?: string; + fontWeight?: string; + fontStyle?: string; + textDecoration?: string; + } = {}; if (parsedStyle.alignment) { - styleCss.textAlign = parsedStyle.alignment + styleCss.textAlign = parsedStyle.alignment; } if (parsedStyle.color) { - styleCss.color = parsedStyle.color + styleCss.color = parsedStyle.color; } if (parsedStyle.format) { if (parsedStyle.format.includes(ParsedStyleFormat.Bold)) { - styleCss.fontWeight = '700' + styleCss.fontWeight = "700"; } if (parsedStyle.format.includes(ParsedStyleFormat.Italic)) { - styleCss.fontStyle = 'italic' + styleCss.fontStyle = "italic"; } if (parsedStyle.format.includes(ParsedStyleFormat.Underline)) { - styleCss.textDecoration = 'underline' + styleCss.textDecoration = "underline"; } if (parsedStyle.format.includes(ParsedStyleFormat.Strikethrough)) { - styleCss.textDecoration = 'line-through' + styleCss.textDecoration = "line-through"; } } @@ -110,11 +110,11 @@ export function renderTextParamsParser( template: currentTemplate, text, style: styleCss, - } - }) + }; + }); return { items, bgColor, - } + }; } diff --git a/packages/spore/src/dob/render/render-text-svg.ts b/packages/spore/src/dob/render/render-text-svg.ts index 4c87a3c9..78837734 100644 --- a/packages/spore/src/dob/render/render-text-svg.ts +++ b/packages/spore/src/dob/render/render-text-svg.ts @@ -1,20 +1,20 @@ -import satori from 'satori' -import type { renderTextParamsParser } from './render-text-params-parser' -import { base64ToArrayBuffer } from './utils/string' -import TurretRoadBoldBase64 from './fonts/TurretRoad-Bold.base64' -import TurretRoadMediumBase64 from './fonts/TurretRoad-Medium.base64' -import type { RenderElement } from './types/internal' +import satori from "satori"; +import TurretRoadBoldBase64 from "./fonts/TurretRoad-Bold.base64"; +import TurretRoadMediumBase64 from "./fonts/TurretRoad-Medium.base64"; +import type { renderTextParamsParser } from "./render-text-params-parser"; +import type { RenderElement } from "./types/internal"; +import { base64ToArrayBuffer } from "./utils/string"; -const TurretRoadMediumFont = base64ToArrayBuffer(TurretRoadMediumBase64) -const TurretRoadBoldFont = base64ToArrayBuffer(TurretRoadBoldBase64) +const TurretRoadMediumFont = base64ToArrayBuffer(TurretRoadMediumBase64); +const TurretRoadBoldFont = base64ToArrayBuffer(TurretRoadBoldBase64); export interface RenderProps extends ReturnType { font?: { - regular: ArrayBuffer - italic: ArrayBuffer - bold: ArrayBuffer - boldItalic: ArrayBuffer - } + regular: ArrayBuffer; + italic: ArrayBuffer; + bold: ArrayBuffer; + boldItalic: ArrayBuffer; + }; } export async function renderTextSvg(props: RenderProps) { @@ -23,69 +23,69 @@ export async function renderTextSvg(props: RenderProps) { italic: TurretRoadMediumFont, bold: TurretRoadBoldFont, boldItalic: TurretRoadBoldFont, - } + }; const children = props.items.reduce((acc, item) => { const justifyContent = { - left: 'flex-start', - center: 'center', - right: 'flex-end', - }[item.parsedStyle.alignment] + left: "flex-start", + center: "center", + right: "flex-end", + }[item.parsedStyle.alignment]; const el: RenderElement = { key: item.name, - type: 'p', + type: "p", props: { children: [item.text], style: { ...item.style, - display: 'flex', + display: "flex", justifyContent, - flexWrap: 'wrap', - width: '100%', + flexWrap: "wrap", + width: "100%", margin: 0, }, }, - } + }; if (item.parsedStyle.breakLine === 0 && acc[acc.length - 1]) { - const lastEl = acc[acc.length - 1] - el.type = 'span' - delete el.props.style.width - el.props.style.display = 'block' - lastEl.props.children.push(el) - return acc + const lastEl = acc[acc.length - 1]; + el.type = "span"; + delete el.props.style.width; + el.props.style.display = "block"; + lastEl.props.children.push(el); + return acc; } - acc.push(el) + acc.push(el); for (let i = 1; i < item.parsedStyle.breakLine; i++) { acc.push({ key: `${item.name}${i}`, - type: 'p', + type: "p", props: { children: ``, style: { - height: '36px', + height: "36px", margin: 0, }, }, - }) + }); } - return acc - }, []) + return acc; + }, []); return satori( { - key: 'container', - type: 'div', + key: "container", + type: "div", props: { style: { - display: 'flex', - flexDirection: 'column', - width: '100%', - background: props.bgColor ?? '#000', - color: '#fff', - lineHeight: '150%', - fontSize: '36px', - padding: '20px', - minHeight: '500px', - textAlign: 'center', + display: "flex", + flexDirection: "column", + width: "100%", + background: props.bgColor ?? "#000", + color: "#fff", + lineHeight: "150%", + fontSize: "36px", + padding: "20px", + minHeight: "500px", + textAlign: "center", }, children: [...children], }, @@ -94,30 +94,30 @@ export async function renderTextSvg(props: RenderProps) { width: 500, fonts: [ { - name: 'TurretRoad', + name: "TurretRoad", data: regular, weight: 400, - style: 'normal', + style: "normal", }, { - name: 'TurretRoad', + name: "TurretRoad", data: bold, weight: 700, - style: 'normal', + style: "normal", }, { - name: 'TurretRoad', + name: "TurretRoad", data: italic, weight: 400, - style: 'italic', + style: "italic", }, { - name: 'TurretRoad', + name: "TurretRoad", data: boldItalic, weight: 700, - style: 'italic', + style: "italic", }, ], }, - ) + ); } diff --git a/packages/spore/src/dob/render/resolve-svg-traits.ts b/packages/spore/src/dob/render/resolve-svg-traits.ts index 96a03e3b..3c227cc3 100644 --- a/packages/spore/src/dob/render/resolve-svg-traits.ts +++ b/packages/spore/src/dob/render/resolve-svg-traits.ts @@ -1,48 +1,48 @@ -import type { INode } from 'svgson' -import { parse } from 'svgson' -import type { BtcFsURI, IpfsURI } from './config' -import { config } from './config' -import { processFileServerResult } from './utils/mime' +import type { INode } from "svgson"; +import { parse } from "svgson"; +import type { BtcFsURI, IpfsURI } from "./config"; +import { config } from "./config"; +import { processFileServerResult } from "./utils/mime"; async function handleNodeHref(node: INode) { - if (node.name !== 'image') { + if (node.name !== "image") { if (node.children.length) { node.children = await Promise.all( node.children.map((n) => handleNodeHref(n)), - ) + ); } - return node + return node; } - if ('href' in node.attributes) { - const href = node.attributes.href + if ("href" in node.attributes) { + const href = node.attributes.href; let result; - - if (href.startsWith('btcfs://')) { - result = await config.queryBtcFsFn(node.attributes.href as BtcFsURI) - } else if (href.startsWith('ipfs://')) { - result = await config.queryIpfsFn(node.attributes.href as IpfsURI) + + if (href.startsWith("btcfs://")) { + result = await config.queryBtcFsFn(node.attributes.href as BtcFsURI); + } else if (href.startsWith("ipfs://")) { + result = await config.queryIpfsFn(node.attributes.href as IpfsURI); } else { - result = await config.queryUrlFn(node.attributes.href as string) + result = await config.queryUrlFn(node.attributes.href); } - - node.attributes.href = processFileServerResult(result) + + node.attributes.href = processFileServerResult(result); } - return node + return node; } export async function resolveSvgTraits(svgStr: string): Promise { try { - const svgAST = await parse(svgStr) - await handleNodeHref(svgAST) - return svgAST + const svgAST = await parse(svgStr); + await handleNodeHref(svgAST); + return svgAST; } catch (error) { return { - value: '', - type: 'element', - name: 'svg', + value: "", + type: "element", + name: "svg", children: [], attributes: {}, - } + }; } } diff --git a/packages/spore/src/dob/render/style-parser.ts b/packages/spore/src/dob/render/style-parser.ts index 76b32daa..d200f318 100644 --- a/packages/spore/src/dob/render/style-parser.ts +++ b/packages/spore/src/dob/render/style-parser.ts @@ -1,104 +1,104 @@ export enum ParsedStyleFormat { - Bold = 'bold', - Italic = 'italic', - Strikethrough = 'strikethrough', - Underline = 'underline', + Bold = "bold", + Italic = "italic", + Strikethrough = "strikethrough", + Underline = "underline", } export enum ParsedStyleAlignment { - Left = 'left', - Center = 'center', - Right = 'right', + Left = "left", + Center = "center", + Right = "right", } export interface ParsedStyle { - color: string - format: ParsedStyleFormat[] - alignment: ParsedStyleAlignment - breakLine: number + color: string; + format: ParsedStyleFormat[]; + alignment: ParsedStyleAlignment; + breakLine: number; } export const DEFAULT_STYLE: ParsedStyle = { - color: '#fff', + color: "#fff", format: [], alignment: ParsedStyleAlignment.Left, breakLine: 1, -} as const +} as const; export function styleParser( str: string, options?: { - baseStyle: ParsedStyle + baseStyle: ParsedStyle; }, ) { - let text = str - const jsonResult = options?.baseStyle || { ...DEFAULT_STYLE } + let text = str; + const jsonResult = options?.baseStyle || { ...DEFAULT_STYLE }; - if (text.startsWith('<') && text.endsWith('>')) { - text = text.substring(1, str.length - 1) + if (text.startsWith("<") && text.endsWith(">")) { + text = text.substring(1, str.length - 1); } - const colorMatch6 = /#([0-9a-fA-F]{6})/.exec(text) + const colorMatch6 = /#([0-9a-fA-F]{6})/.exec(text); if (colorMatch6) { - jsonResult.color = `#${colorMatch6[1]}` - text = text.replace(/#([0-9a-fA-F]{6})/, '') + jsonResult.color = `#${colorMatch6[1]}`; + text = text.replace(/#([0-9a-fA-F]{6})/, ""); } - const colorMatch3 = /#([0-9a-fA-F]{3})/.exec(text) + const colorMatch3 = /#([0-9a-fA-F]{3})/.exec(text); if (colorMatch3) { - jsonResult.color = `#${colorMatch3[1]}` - text = text.replace(/#([0-9a-fA-F]{3})/, '') + jsonResult.color = `#${colorMatch3[1]}`; + text = text.replace(/#([0-9a-fA-F]{3})/, ""); } - const formatMatch = /\*([bisu]+)/.exec(text) + const formatMatch = /\*([bisu]+)/.exec(text); if (formatMatch) { jsonResult.format = formatMatch[1] - .split('') + .split("") .map((char) => { switch (char) { - case 'b': - return ParsedStyleFormat.Bold - case 'i': - return ParsedStyleFormat.Italic - case 's': - return ParsedStyleFormat.Strikethrough - case 'u': - return ParsedStyleFormat.Underline + case "b": + return ParsedStyleFormat.Bold; + case "i": + return ParsedStyleFormat.Italic; + case "s": + return ParsedStyleFormat.Strikethrough; + case "u": + return ParsedStyleFormat.Underline; default: - return null + return null; } }) .filter((char) => char) - .map((token) => token!) - text = text.replace(/\*([bisu]+)/, '') + .map((token) => token!); + text = text.replace(/\*([bisu]+)/, ""); } - const alignmentMatch = /@(l|c|r)/.exec(text) + const alignmentMatch = /@(l|c|r)/.exec(text); if (alignmentMatch) { switch (alignmentMatch[1]) { - case 'l': - jsonResult.alignment = ParsedStyleAlignment.Left - break - case 'c': - jsonResult.alignment = ParsedStyleAlignment.Center - break - case 'r': - jsonResult.alignment = ParsedStyleAlignment.Right - break + case "l": + jsonResult.alignment = ParsedStyleAlignment.Left; + break; + case "c": + jsonResult.alignment = ParsedStyleAlignment.Center; + break; + case "r": + jsonResult.alignment = ParsedStyleAlignment.Right; + break; } - text = text.replace(/@(l|c|r)/, '') + text = text.replace(/@(l|c|r)/, ""); } - const traitsMatch = /&/.exec(text) + const traitsMatch = /&/.exec(text); if (traitsMatch) { - text = text.replace(/&/, '') - jsonResult.breakLine = 0 + text = text.replace(/&/, ""); + jsonResult.breakLine = 0; } - const breakLineMatch = text.match(/~/g) + const breakLineMatch = text.match(/~/g); if (breakLineMatch) { - jsonResult.breakLine = breakLineMatch.length + 1 + jsonResult.breakLine = breakLineMatch.length + 1; } - return jsonResult + return jsonResult; } diff --git a/packages/spore/src/dob/render/svg-to-base64.ts b/packages/spore/src/dob/render/svg-to-base64.ts index 3a046e3b..f94f67ec 100644 --- a/packages/spore/src/dob/render/svg-to-base64.ts +++ b/packages/spore/src/dob/render/svg-to-base64.ts @@ -1,6 +1,6 @@ export function svgToBase64(svgCode: string) { - if (typeof window !== 'undefined') { - return `data:image/svg+xml;base64,${window.btoa(svgCode)}` // browser + if (typeof window !== "undefined") { + return `data:image/svg+xml;base64,${window.btoa(svgCode)}`; // browser } - return `data:image/svg+xml;base64,${Buffer.from(svgCode).toString('base64')}` // nodejs + return `data:image/svg+xml;base64,${Buffer.from(svgCode).toString("base64")}`; // nodejs } diff --git a/packages/spore/src/dob/render/test/background-color-parser.test.ts b/packages/spore/src/dob/render/test/background-color-parser.test.ts index ff2e1792..6951920f 100644 --- a/packages/spore/src/dob/render/test/background-color-parser.test.ts +++ b/packages/spore/src/dob/render/test/background-color-parser.test.ts @@ -1,13 +1,13 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it } from "vitest"; import { backgroundColorParser, getBackgroundColorByTraits, -} from '../background-color-parser' -import { traitsParser } from '../traits-parser' -import { Key } from '../constants/key' +} from "../background-color-parser"; +import { Key } from "../constants/key"; +import { traitsParser } from "../traits-parser"; -describe('function backgroundColorParser', async () => { - it('case: normal', () => { +describe("function backgroundColorParser", async () => { + it("case: normal", () => { const { traits } = traitsParser([ { name: Key.BgColor, @@ -17,21 +17,21 @@ describe('function backgroundColorParser', async () => { }, ], }, - ]) + ]); expect(backgroundColorParser(traits)).toEqual( getBackgroundColorByTraits(traits), - ) - }) + ); + }); - it('case: not found and default', () => { - const { traits } = traitsParser([]) - const defaultColor = '#fff' + it("case: not found and default", () => { + const { traits } = traitsParser([]); + const defaultColor = "#fff"; expect(backgroundColorParser(traits, { defaultColor })).toEqual( defaultColor, - ) - }) + ); + }); - it('case: linear-gradient', () => { + it("case: linear-gradient", () => { const { traits } = traitsParser([ { name: Key.BgColor, @@ -41,9 +41,9 @@ describe('function backgroundColorParser', async () => { }, ], }, - ]) + ]); expect(backgroundColorParser(traits)).toEqual( - 'linear-gradient(45deg, blue, pink)', - ) - }) -}) + "linear-gradient(45deg, blue, pink)", + ); + }); +}); diff --git a/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts b/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts index 47704205..9c27330e 100644 --- a/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts +++ b/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts @@ -1,144 +1,144 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it } from "vitest"; +import { Key } from "../constants/key"; import { DEFAULT_TEMPLATE, renderTextParamsParser, -} from '../render-text-params-parser' -import { traitsParser } from '../traits-parser' -import { Key } from '../constants/key' -import { DEFAULT_STYLE } from '../style-parser' +} from "../render-text-params-parser"; +import { DEFAULT_STYLE } from "../style-parser"; +import { traitsParser } from "../traits-parser"; -describe('function renderTextParamsParser', () => { - it('case: default template', () => { +describe("function renderTextParamsParser", () => { + it("case: default template", () => { const { traits, indexVarRegister } = traitsParser([ { - name: 'Key', + name: "Key", traits: [ { - String: 'Value', + String: "Value", }, ], }, - ]) + ]); const params = renderTextParamsParser(traits, indexVarRegister, { defaultTemplate: DEFAULT_TEMPLATE, - }) - expect(params.items[0].text).toEqual('Key: Value') - }) + }); + expect(params.items[0].text).toEqual("Key: Value"); + }); - it('case: customized default template by options', () => { + it("case: customized default template by options", () => { const { traits, indexVarRegister } = traitsParser([ { - name: 'Key', + name: "Key", traits: [ { - String: 'Value', + String: "Value", }, ], }, - ]) + ]); const params = renderTextParamsParser(traits, indexVarRegister, { - defaultTemplate: '%v', - }) - expect(params.items[0].text).toEqual('Value') - }) + defaultTemplate: "%v", + }); + expect(params.items[0].text).toEqual("Value"); + }); - it('case: customized default template by global traits', () => { + it("case: customized default template by global traits", () => { const { traits, indexVarRegister } = traitsParser([ { name: `${Key.Prev}`, traits: [ { - String: '#fff', + String: "#fff", }, ], }, { - name: 'Key', + name: "Key", traits: [ { - String: 'Value', + String: "Value", }, ], }, - ]) - const params = renderTextParamsParser(traits, indexVarRegister) - expect(params.items[0].text).toEqual('ddd Value') - }) + ]); + const params = renderTextParamsParser(traits, indexVarRegister); + expect(params.items[0].text).toEqual("ddd Value"); + }); - it('case: customized default template by current traits', () => { + it("case: customized default template by current traits", () => { const { traits, indexVarRegister } = traitsParser([ { - name: 'Key<%k %k %v>', + name: "Key<%k %k %v>", traits: [ { - String: 'Value', + String: "Value", }, ], }, - ]) - const params = renderTextParamsParser(traits, indexVarRegister) - expect(params.items[0].text).toEqual('Key Key Value') - }) + ]); + const params = renderTextParamsParser(traits, indexVarRegister); + expect(params.items[0].text).toEqual("Key Key Value"); + }); - it('case: customized default template and style by global traits', () => { + it("case: customized default template and style by global traits", () => { const { traits, indexVarRegister } = traitsParser([ { name: `${Key.Prev}`, traits: [ { - String: '<#ff0>', + String: "<#ff0>", }, ], }, { - name: 'Key', + name: "Key", traits: [ { - String: 'Value', + String: "Value", }, ], }, { - name: 'Key2<%k %k %v>', + name: "Key2<%k %k %v>", traits: [ { - String: 'Value<#f00>', + String: "Value<#f00>", }, ], }, - ]) - const params = renderTextParamsParser(traits, indexVarRegister) - expect(params.items[0].text).toEqual('ddd Value') + ]); + const params = renderTextParamsParser(traits, indexVarRegister); + expect(params.items[0].text).toEqual("ddd Value"); const expectStyle = { ...DEFAULT_STYLE, - color: '#ff0', - } - expect(params.items[0].parsedStyle).toEqual(expectStyle) - expect(params.items[1].text).toEqual('Key2 Key2 Value') + color: "#ff0", + }; + expect(params.items[0].parsedStyle).toEqual(expectStyle); + expect(params.items[1].text).toEqual("Key2 Key2 Value"); const expectStyle2 = { ...DEFAULT_STYLE, - color: '#f00', - } - expect(params.items[1].parsedStyle).toEqual(expectStyle2) - }) + color: "#f00", + }; + expect(params.items[1].parsedStyle).toEqual(expectStyle2); + }); - it('case: customized default template and style by current traits', () => { + it("case: customized default template and style by current traits", () => { const { traits, indexVarRegister } = traitsParser([ { - name: 'Key<%k %k %v>', + name: "Key<%k %k %v>", traits: [ { - String: 'Value<#f00>', + String: "Value<#f00>", }, ], }, - ]) - const params = renderTextParamsParser(traits, indexVarRegister) - expect(params.items[0].text).toEqual('Key Key Value') + ]); + const params = renderTextParamsParser(traits, indexVarRegister); + expect(params.items[0].text).toEqual("Key Key Value"); const expectStyle = { ...DEFAULT_STYLE, - color: '#f00', - } - expect(params.items[0].parsedStyle).toEqual(expectStyle) - }) -}) + color: "#f00", + }; + expect(params.items[0].parsedStyle).toEqual(expectStyle); + }); +}); diff --git a/packages/spore/src/dob/render/test/style-parser.test.ts b/packages/spore/src/dob/render/test/style-parser.test.ts index 980ad58a..b9e12c7c 100644 --- a/packages/spore/src/dob/render/test/style-parser.test.ts +++ b/packages/spore/src/dob/render/test/style-parser.test.ts @@ -1,104 +1,104 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it } from "vitest"; import { DEFAULT_STYLE, ParsedStyleAlignment, ParsedStyleFormat, styleParser, -} from '../style-parser' +} from "../style-parser"; -describe('function styleParser', async () => { - it('case: empty string', () => { - expect(styleParser('')).toEqual(DEFAULT_STYLE) - }) +describe("function styleParser", async () => { + it("case: empty string", () => { + expect(styleParser("")).toEqual(DEFAULT_STYLE); + }); it('case: "#fff"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, - } - expect(styleParser(color)).toEqual(expectStyle) - }) + }; + expect(styleParser(color)).toEqual(expectStyle); + }); it('case: "#ffffff"', () => { - const color = '#ffffff' + const color = "#ffffff"; const expectStyle = { ...DEFAULT_STYLE, color, - } - expect(styleParser(color)).toEqual(expectStyle) - }) + }; + expect(styleParser(color)).toEqual(expectStyle); + }); it('case: "<#ffffff>"', () => { - const color = '#ffffff' + const color = "#ffffff"; const expectStyle = { ...DEFAULT_STYLE, color, - } - expect(styleParser(color)).toEqual(expectStyle) - }) + }; + expect(styleParser(color)).toEqual(expectStyle); + }); it('case: "<#fff>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, - } - expect(styleParser(color)).toEqual(expectStyle) - }) + }; + expect(styleParser(color)).toEqual(expectStyle); + }); it('case: "<#fff@c>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, - alignment: 'center', - } - expect(styleParser(`<${color}@c>`)).toEqual(expectStyle) - }) + alignment: "center", + }; + expect(styleParser(`<${color}@c>`)).toEqual(expectStyle); + }); it('case: "<#fff@l>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, - alignment: 'left', - } - expect(styleParser(`<${color}@l>`)).toEqual(expectStyle) - }) + alignment: "left", + }; + expect(styleParser(`<${color}@l>`)).toEqual(expectStyle); + }); it('case: "<#fff@r>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, - alignment: 'right', - } - expect(styleParser(`<${color}@r>`)).toEqual(expectStyle) - }) + alignment: "right", + }; + expect(styleParser(`<${color}@r>`)).toEqual(expectStyle); + }); it('case: "<#fff*b>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, format: [ParsedStyleFormat.Bold], - } - expect(styleParser(`<${color}*b>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*b>`)).toEqual(expectStyle); + }); it('case: "<#fff*bu>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, format: [ParsedStyleFormat.Bold, ParsedStyleFormat.Underline], - } - expect(styleParser(`<${color}*bu>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*bu>`)).toEqual(expectStyle); + }); it('case: "<#fff*bui>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, @@ -107,12 +107,12 @@ describe('function styleParser', async () => { ParsedStyleFormat.Underline, ParsedStyleFormat.Italic, ], - } - expect(styleParser(`<${color}*bui>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*bui>`)).toEqual(expectStyle); + }); it('case: "<#fff*buis>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, @@ -122,12 +122,12 @@ describe('function styleParser', async () => { ParsedStyleFormat.Italic, ParsedStyleFormat.Strikethrough, ], - } - expect(styleParser(`<${color}*buis>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*buis>`)).toEqual(expectStyle); + }); it('case: "<#fff*bis>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, @@ -136,87 +136,87 @@ describe('function styleParser', async () => { ParsedStyleFormat.Italic, ParsedStyleFormat.Strikethrough, ], - } - expect(styleParser(`<${color}*bis>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*bis>`)).toEqual(expectStyle); + }); it('case: "<#fff*is>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, format: [ParsedStyleFormat.Italic, ParsedStyleFormat.Strikethrough], - } - expect(styleParser(`<${color}*is>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*is>`)).toEqual(expectStyle); + }); it('case: "<#fff*s>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, format: [ParsedStyleFormat.Strikethrough], - } - expect(styleParser(`<${color}*s>`)).toEqual(expectStyle) - }) + }; + expect(styleParser(`<${color}*s>`)).toEqual(expectStyle); + }); it('case: "<#fff&>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, breakLine: 0, - } + }; expect(styleParser(`<${color}&>`)).toEqual({ ...expectStyle, - }) - }) + }); + }); it('case: "<#fff&~>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, breakLine: 2, - } + }; expect(styleParser(`<${color}&~>`)).toEqual({ ...expectStyle, - }) - }) + }); + }); it('case: "<#fff~~>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, breakLine: 3, - } + }; expect(styleParser(`<${color}~~>`)).toEqual({ ...expectStyle, - }) - }) + }); + }); it('case: "<~~#fff>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, breakLine: 3, - } + }; expect(styleParser(`<~~${color}>`)).toEqual({ ...expectStyle, - }) - }) + }); + }); it('case: "<@r#fff>"', () => { - const color = '#fff' + const color = "#fff"; const expectStyle = { ...DEFAULT_STYLE, color, alignment: ParsedStyleAlignment.Right, - } + }; expect(styleParser(`<@r${color}>`)).toEqual({ ...expectStyle, - }) - }) -}) + }); + }); +}); diff --git a/packages/spore/src/dob/render/test/traits-parser.test.ts b/packages/spore/src/dob/render/test/traits-parser.test.ts index 4d916e40..242b4ed3 100644 --- a/packages/spore/src/dob/render/test/traits-parser.test.ts +++ b/packages/spore/src/dob/render/test/traits-parser.test.ts @@ -1,28 +1,28 @@ -import { describe, expect, it } from 'vitest' -import { traitsParser } from '../traits-parser' +import { describe, expect, it } from "vitest"; +import { traitsParser } from "../traits-parser"; -describe('function traitsParser', async () => { - it('case: var', () => { - const varName = 'var' - const value = 3 +describe("function traitsParser", async () => { + it("case: var", () => { + const varName = "var"; + const value = 3; const traits = [ { - name: 'var', + name: "var", traits: [ { String: `${value}<_>`, }, ], }, - ] + ]; - const { indexVarRegister } = traitsParser(traits) - expect(indexVarRegister[varName]).toEqual(value) - }) + const { indexVarRegister } = traitsParser(traits); + expect(indexVarRegister[varName]).toEqual(value); + }); - it('case: array index', () => { - const varName = 'var' - const value = 3 + it("case: array index", () => { + const varName = "var"; + const value = 3; const { traits, indexVarRegister } = traitsParser([ { name: varName, @@ -33,22 +33,22 @@ describe('function traitsParser', async () => { ], }, { - name: 'prev.bgcolor', + name: "prev.bgcolor", traits: [ { String: `(%${varName}):['#FFFF00', '#0000FF', '#FF00FF', '#FF0000', '#000000']`, }, ], }, - ]) - const trait = traits.find(({ name }) => name === 'prev.bgcolor') - expect(indexVarRegister[varName]).toEqual(value) - expect(trait?.value).toEqual('#FF0000') - }) + ]); + const trait = traits.find(({ name }) => name === "prev.bgcolor"); + expect(indexVarRegister[varName]).toEqual(value); + expect(trait?.value).toEqual("#FF0000"); + }); - it('case: array with over index', () => { - const varName = 'var' - const value = 10 + it("case: array with over index", () => { + const varName = "var"; + const value = 10; const { traits, indexVarRegister } = traitsParser([ { name: varName, @@ -59,22 +59,22 @@ describe('function traitsParser', async () => { ], }, { - name: 'prev.bgcolor', + name: "prev.bgcolor", traits: [ { String: `(%${varName}):['#FFFF00', '#0000FF', '#FF00FF', '#FF0000', '#000000']`, }, ], }, - ]) - const trait = traits.find(({ name }) => name === 'prev.bgcolor') - expect(indexVarRegister[varName]).toEqual(value) - expect(trait?.value).toEqual('#FFFF00') - }) + ]); + const trait = traits.find(({ name }) => name === "prev.bgcolor"); + expect(indexVarRegister[varName]).toEqual(value); + expect(trait?.value).toEqual("#FFFF00"); + }); - it('case: number', () => { - const key = 'data' - const value = 1 + it("case: number", () => { + const key = "data"; + const value = 1; const { traits } = traitsParser([ { name: key, @@ -84,8 +84,8 @@ describe('function traitsParser', async () => { }, ], }, - ]) - const trait = traits.find(({ name }) => name === key) - expect(trait?.value).toEqual(value) - }) -}) + ]); + const trait = traits.find(({ name }) => name === key); + expect(trait?.value).toEqual(value); + }); +}); diff --git a/packages/spore/src/dob/render/traits-parser.ts b/packages/spore/src/dob/render/traits-parser.ts index bc928469..1deabe46 100644 --- a/packages/spore/src/dob/render/traits-parser.ts +++ b/packages/spore/src/dob/render/traits-parser.ts @@ -1,73 +1,73 @@ -import type { INode } from 'svgson' -import { ARRAY_INDEX_REG, ARRAY_REG } from './constants/regex' -import type { RenderPartialOutput } from './types' -import { parseStringToArray } from './utils/string' -import { resolveSvgTraits } from './resolve-svg-traits' +import type { INode } from "svgson"; +import { ARRAY_INDEX_REG, ARRAY_REG } from "./constants/regex"; +import { resolveSvgTraits } from "./resolve-svg-traits"; +import type { RenderPartialOutput } from "./types"; +import { parseStringToArray } from "./utils/string"; export interface ParsedTrait { - name: string - value: number | string | Date | Promise + name: string; + value: number | string | Date | Promise; } export function traitsParser(items: RenderPartialOutput[]): { - traits: ParsedTrait[] - indexVarRegister: Record + traits: ParsedTrait[]; + indexVarRegister: Record; } { const indexVarRegister = items.reduce>((acc, item) => { - if (!item.traits[0]?.String) return acc - const match = item.traits[0].String.match(ARRAY_INDEX_REG) - if (!match) return acc - const intIndex = parseInt(match[1], 10) - if (isNaN(intIndex)) return acc - acc[item.name] = intIndex - return acc - }, {}) + if (!item.traits[0]?.String) return acc; + const match = item.traits[0].String.match(ARRAY_INDEX_REG); + if (!match) return acc; + const intIndex = parseInt(match[1], 10); + if (isNaN(intIndex)) return acc; + acc[item.name] = intIndex; + return acc; + }, {}); const traits = items .map((item) => { - const { traits: trait } = item - if (!trait[0]) return null - if ('String' in trait[0] && typeof trait[0].String === 'string') { - let value = item.traits[0].String - const matchArray = value!.match(ARRAY_REG) + const { traits: trait } = item; + if (!trait[0]) return null; + if ("String" in trait[0] && typeof trait[0].String === "string") { + let value = item.traits[0].String; + const matchArray = value!.match(ARRAY_REG); if (matchArray) { - const varName = matchArray[1] - const array = parseStringToArray(matchArray[2]) - const index = indexVarRegister[varName] % array.length - value = array[index] + const varName = matchArray[1]; + const array = parseStringToArray(matchArray[2]); + const index = indexVarRegister[varName] % array.length; + value = array[index]; } return { value, name: item.name, - } as ParsedTrait + } as ParsedTrait; } - if ('Number' in trait[0] && typeof trait[0].Number === 'number') { + if ("Number" in trait[0] && typeof trait[0].Number === "number") { return { name: item.name, value: trait[0].Number, - } as ParsedTrait + } as ParsedTrait; } - if ('Timestamp' in trait[0] && typeof trait[0].Timestamp === 'number') { - let timestamp = trait[0].Timestamp as number + if ("Timestamp" in trait[0] && typeof trait[0].Timestamp === "number") { + let timestamp = trait[0].Timestamp as number; if (`${timestamp}`.length === 10) { - timestamp = timestamp * 1000 + timestamp = timestamp * 1000; } return { name: item.name, value: new Date(timestamp), - } as ParsedTrait + } as ParsedTrait; } - if ('SVG' in trait[0] && typeof trait[0].SVG === 'string') { + if ("SVG" in trait[0] && typeof trait[0].SVG === "string") { return { name: item.name, value: resolveSvgTraits(trait[0].SVG), - } + }; } - return null + return null; }) .map((e) => e!) - .filter((e) => e) + .filter((e) => e); return { traits, indexVarRegister, - } + }; } diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/spore/src/dob/render/types/index.ts index d3a533b1..4be210ac 100644 --- a/packages/spore/src/dob/render/types/index.ts +++ b/packages/spore/src/dob/render/types/index.ts @@ -1,20 +1,25 @@ export interface DobDecodeResponse { - jsonrpc: string - result: string - id: number + jsonrpc: string; + result: string; + id: number; } export interface DobDecodeResult { dob_content: { - dna: string - block_number: number - cell_id: number - id: string - } - render_output: RenderPartialOutput[] | string + dna: string; + block_number: number; + cell_id: number; + id: string; + }; + render_output: RenderPartialOutput[] | string; } export interface RenderPartialOutput { - name: string - traits: { String?: string; Number?: number; Timestamp?: Date; SVG?: string }[] + name: string; + traits: { + String?: string; + Number?: number; + Timestamp?: Date; + SVG?: string; + }[]; } diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/spore/src/dob/render/types/internal.ts index 73d5719a..832fc8b2 100644 --- a/packages/spore/src/dob/render/types/internal.ts +++ b/packages/spore/src/dob/render/types/internal.ts @@ -1,8 +1,8 @@ export interface RenderElement

{ - type: T + type: T; props: P & { - children: RenderElement | RenderElement[] - style: S - } - key: string | null + children: RenderElement | RenderElement[]; + style: S; + }; + key: string | null; } diff --git a/packages/spore/src/dob/render/utils/mime.ts b/packages/spore/src/dob/render/utils/mime.ts index 9d2e41b8..9457f551 100644 --- a/packages/spore/src/dob/render/utils/mime.ts +++ b/packages/spore/src/dob/render/utils/mime.ts @@ -1,67 +1,103 @@ -import type { FileServerResult } from '../config' -import { hexToBase64 } from './string' +import type { FileServerResult } from "../config"; +import { hexToBase64 } from "./string"; /** - * Detects the MIME type of an image from its hex-encoded content by examining file signatures - * @param hexContent Hex-encoded image content + * Detects MIME type from base64-encoded file header by examining file signatures + * @param base64Header Base64-encoded file header (should be at least 32 bytes worth) * @returns The detected MIME type or null if not recognized */ -export function detectImageMimeType(hexContent: string): string | null { - // Skip if string is too short to contain a signature and content - if (!hexContent || hexContent.length < 64) { - return null +function detectMimeTypeFromBase64Header(base64Header: string): string | null { + // JPEG: starts with /9j/ (ffd8ff in base64) + if (base64Header.startsWith("/9j/")) { + return "image/jpeg"; } - // Extract just the file header (first 32 bytes should be enough for most formats) - // and convert to lowercase for consistent comparison - const header = hexContent.substring(0, 64).toLowerCase() // 32 bytes = 64 hex chars - - // JPEG: starts with ffd8ff - if (header.startsWith('ffd8ff')) { - return 'image/jpeg' + // PNG: starts with iVBORw0KGgo (89504e47 in base64) + if (base64Header.startsWith("iVBORw0KGgo")) { + return "image/png"; } - - // PNG: starts with 89504e47 (‰PNG) - if (header.startsWith('89504e47')) { - return 'image/png' + + // GIF: starts with R0lGOD (474946 in base64) + if (base64Header.startsWith("R0lGOD")) { + return "image/gif"; + } + + // WebP: starts with UklGR (RIFF in base64) and contains WEBP + if (base64Header.startsWith("UklGR") && base64Header.includes("WEBP")) { + return "image/webp"; } - - // GIF: starts with 474946 (GIF) - if (header.startsWith('474946')) { - return 'image/gif' + + // BMP: starts with Qk0= (424d in base64) + if (base64Header.startsWith("Qk0=")) { + return "image/bmp"; } - - // WebP: RIFF....WEBP - if (header.startsWith('52494646') && header.substring(16, 24) === '57454250') { - return 'image/webp' + + // SVG: starts with PHN2ZyA= ( match[1]) + const regex = /'([^']*)'/g; + return [...str.matchAll(regex)].map((match) => match[1]); } export function base64ToArrayBuffer(base64: string): ArrayBuffer { - const binaryString = atob(base64) + const binaryString = atob(base64); - const uint8Array = new Uint8Array(binaryString.length) + const uint8Array = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) { - uint8Array[i] = binaryString.charCodeAt(i) + uint8Array[i] = binaryString.charCodeAt(i); } - return uint8Array.buffer + return uint8Array.buffer; } export function isBtcFs(uri: string): uri is BtcFsURI { - return uri.startsWith('btcfs://') + return uri.startsWith("btcfs://"); } export function isIpfs(uri: string): uri is IpfsURI { - return uri.startsWith('ipfs://') + return uri.startsWith("ipfs://"); } export function hexToBase64(hexstring: string): string { const str = hexstring .match(/\w{2}/g) ?.map((a) => String.fromCharCode(parseInt(a, 16))) - .join('') - return str ? btoa(str) : '' + .join(""); + return str ? btoa(str) : ""; } From a077bddfebecd172f7f331dfc63edcfa755af232 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Sat, 20 Sep 2025 11:37:28 +0800 Subject: [PATCH 03/14] chore: complete changeset info --- .changeset/mean-yaks-rescue.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/mean-yaks-rescue.md diff --git a/.changeset/mean-yaks-rescue.md b/.changeset/mean-yaks-rescue.md new file mode 100644 index 00000000..edbe3625 --- /dev/null +++ b/.changeset/mean-yaks-rescue.md @@ -0,0 +1,6 @@ +--- +"@ckb-ccc/spore": minor +--- + +Migrate dob-render-sdk directly into spore module + \ No newline at end of file From 694ae8375148de6acae7a756f6ac31a5764a1025 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Wed, 24 Sep 2025 13:00:43 +0800 Subject: [PATCH 04/14] chore: solve render-sdk lint errors --- .../spore/src/dob/render/api/dobDecode.ts | 2 +- .../src/dob/render/background-color-parser.ts | 2 +- packages/spore/src/dob/render/config.ts | 30 ++++++++----------- .../render/render-by-dob-decode-response.ts | 5 +++- .../spore/src/dob/render/render-dob-bit.ts | 2 +- .../spore/src/dob/render/render-dob1-svg.ts | 2 +- .../dob/render/render-text-params-parser.ts | 13 +++++--- .../spore/src/dob/render/render-text-svg.ts | 2 +- .../src/dob/render/resolve-svg-traits.ts | 2 +- .../spore/src/dob/render/types/internal.ts | 2 +- vitest.config.mts | 4 +-- 11 files changed, 35 insertions(+), 31 deletions(-) diff --git a/packages/spore/src/dob/render/api/dobDecode.ts b/packages/spore/src/dob/render/api/dobDecode.ts index e6d4a1d4..2cd96b0a 100644 --- a/packages/spore/src/dob/render/api/dobDecode.ts +++ b/packages/spore/src/dob/render/api/dobDecode.ts @@ -14,5 +14,5 @@ export async function dobDecode(tokenKey: string): Promise { params: [tokenKey], }), }); - return response.json(); + return response.json() as Promise; } diff --git a/packages/spore/src/dob/render/background-color-parser.ts b/packages/spore/src/dob/render/background-color-parser.ts index a792b058..113be8a2 100644 --- a/packages/spore/src/dob/render/background-color-parser.ts +++ b/packages/spore/src/dob/render/background-color-parser.ts @@ -4,7 +4,7 @@ import type { ParsedTrait } from "./traits-parser"; export function getBackgroundColorByTraits( traits: ParsedTrait[], ): ParsedTrait | undefined { - return traits.find((trait) => trait.name === Key.BgColor); + return traits.find((trait) => trait.name === (Key.BgColor as string)); } export function backgroundColorParser( diff --git a/packages/spore/src/dob/render/config.ts b/packages/spore/src/dob/render/config.ts index adc18396..30762138 100644 --- a/packages/spore/src/dob/render/config.ts +++ b/packages/spore/src/dob/render/config.ts @@ -29,24 +29,20 @@ export class Config { }; private _queryUrlFn = async (url: string) => { - try { - const response = await fetch(url); - const blob = await response.blob(); - return new Promise((resolve, reject) => { - const reader = new FileReader(); + const response = await fetch(url); + const blob = await response.blob(); + return new Promise((resolve, reject) => { + const reader = new FileReader(); - reader.onload = function () { - const base64 = this.result as string; - resolve(base64); - }; - reader.onerror = (error) => { - reject(error); - }; - reader.readAsDataURL(blob); - }); - } catch (error) { - throw error; - } + reader.onload = function () { + const base64 = this.result as string; + resolve(base64); + }; + reader.onerror = (error) => { + reject(new Error(`FileReader error: ${error.type}`)); + }; + reader.readAsDataURL(blob); + }); }; private _queryIpfsFn = async (uri: IpfsURI) => { diff --git a/packages/spore/src/dob/render/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/render-by-dob-decode-response.ts index 5b0883cb..fb22435b 100644 --- a/packages/spore/src/dob/render/render-by-dob-decode-response.ts +++ b/packages/spore/src/dob/render/render-by-dob-decode-response.ts @@ -27,7 +27,10 @@ export function renderByDobDecodeResponse( return renderImageSvg(traits); } // TODO: multiple images - if (trait.name === Key.Image && trait.value instanceof Promise) { + if ( + trait.name === (Key.Image as string) && + trait.value instanceof Promise + ) { return renderDob1Svg(trait.value); } } diff --git a/packages/spore/src/dob/render/render-dob-bit.ts b/packages/spore/src/dob/render/render-dob-bit.ts index 64b53be5..4c06e860 100644 --- a/packages/spore/src/dob/render/render-dob-bit.ts +++ b/packages/spore/src/dob/render/render-dob-bit.ts @@ -9,7 +9,7 @@ const iconBase64 = export function renderDobBit( dob0Data: DobDecodeResult | string, - props?: { + _props?: { outputType?: "svg"; }, ) { diff --git a/packages/spore/src/dob/render/render-dob1-svg.ts b/packages/spore/src/dob/render/render-dob1-svg.ts index 926a0a05..b3bc12ba 100644 --- a/packages/spore/src/dob/render/render-dob1-svg.ts +++ b/packages/spore/src/dob/render/render-dob1-svg.ts @@ -7,7 +7,7 @@ import { base64ToArrayBuffer } from "./utils/string"; export async function renderDob1Svg(nodePromise: Promise) { const node = await nodePromise; const str = stringify(node); - const base64 = await svgToBase64(str); + const base64 = svgToBase64(str); const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64); const width = parseInt(node.attributes.width, 10) || 500; const height = parseInt(node.attributes.height, 10) || 500; diff --git a/packages/spore/src/dob/render/render-text-params-parser.ts b/packages/spore/src/dob/render/render-text-params-parser.ts index 0716b731..9682020f 100644 --- a/packages/spore/src/dob/render/render-text-params-parser.ts +++ b/packages/spore/src/dob/render/render-text-params-parser.ts @@ -40,7 +40,7 @@ export function renderTextParamsParser( !trait.name.startsWith(Key.Prev) && typeof trait.value !== "undefined" && !(trait.name in indexVarRegister) && - trait.name !== Key.Image, + trait.name !== (Key.Image as string), ) .map((trait) => { let currentTemplate = template; @@ -50,11 +50,13 @@ export function renderTextParamsParser( const currentLayoutMatch = value.match(TEMPLATE_REG); if (currentLayoutMatch) { if (currentLayoutMatch[1]) { - [, value] = currentLayoutMatch; + [, value] = currentLayoutMatch as [string, string, string]; } if (currentLayoutMatch[2]) { parsedStyle = styleParser(`<${currentLayoutMatch[2]}>`, { - baseStyle: JSON.parse(JSON.stringify(parsedStyle)), + baseStyle: JSON.parse( + JSON.stringify(parsedStyle), + ) as typeof parsedStyle, }); } } @@ -72,7 +74,10 @@ export function renderTextParamsParser( const text = currentTemplate .replace(/%k/g, name) - .replace(/%v/g, `${value}`) + .replace( + /%v/g, + typeof value === "object" ? JSON.stringify(value) : String(value), + ) .replace(/%%/g, "%"); const styleCss: { diff --git a/packages/spore/src/dob/render/render-text-svg.ts b/packages/spore/src/dob/render/render-text-svg.ts index 78837734..fd35fc3f 100644 --- a/packages/spore/src/dob/render/render-text-svg.ts +++ b/packages/spore/src/dob/render/render-text-svg.ts @@ -50,7 +50,7 @@ export async function renderTextSvg(props: RenderProps) { el.type = "span"; delete el.props.style.width; el.props.style.display = "block"; - lastEl.props.children.push(el); + (lastEl.props.children as RenderElement[]).push(el); return acc; } acc.push(el); diff --git a/packages/spore/src/dob/render/resolve-svg-traits.ts b/packages/spore/src/dob/render/resolve-svg-traits.ts index 3c227cc3..690a79e3 100644 --- a/packages/spore/src/dob/render/resolve-svg-traits.ts +++ b/packages/spore/src/dob/render/resolve-svg-traits.ts @@ -36,7 +36,7 @@ export async function resolveSvgTraits(svgStr: string): Promise { const svgAST = await parse(svgStr); await handleNodeHref(svgAST); return svgAST; - } catch (error) { + } catch (_error) { return { value: "", type: "element", diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/spore/src/dob/render/types/internal.ts index 832fc8b2..d61d8203 100644 --- a/packages/spore/src/dob/render/types/internal.ts +++ b/packages/spore/src/dob/render/types/internal.ts @@ -1,4 +1,4 @@ -export interface RenderElement

{ +export interface RenderElement

{ type: T; props: P & { children: RenderElement | RenderElement[]; diff --git a/vitest.config.mts b/vitest.config.mts index 36ee8aeb..7af3d4a8 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -2,9 +2,9 @@ import { defineConfig, coverageConfigDefaults } from "vitest/config"; export default defineConfig({ test: { - projects: ["packages/core", "packages/spore"], + projects: ["packages/core"], coverage: { - include: ["packages/core", "packages/spore"], + include: ["packages/core"], exclude: [ "**/dist/**", "**/dist.commonjs/**", From e2fba3dedc632afe1e6a66c07e9855e7a7510ec1 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Wed, 24 Sep 2025 15:03:53 +0800 Subject: [PATCH 05/14] fix: solve build issue --- packages/spore/src/dob/render/render-text-svg.ts | 8 ++++---- packages/spore/src/dob/render/types/internal.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/spore/src/dob/render/render-text-svg.ts b/packages/spore/src/dob/render/render-text-svg.ts index fd35fc3f..5b96b93b 100644 --- a/packages/spore/src/dob/render/render-text-svg.ts +++ b/packages/spore/src/dob/render/render-text-svg.ts @@ -34,7 +34,7 @@ export async function renderTextSvg(props: RenderProps) { key: item.name, type: "p", props: { - children: [item.text], + children: item.text, style: { ...item.style, display: "flex", @@ -48,8 +48,8 @@ export async function renderTextSvg(props: RenderProps) { if (item.parsedStyle.breakLine === 0 && acc[acc.length - 1]) { const lastEl = acc[acc.length - 1]; el.type = "span"; - delete el.props.style.width; - el.props.style.display = "block"; + delete (el.props.style as Record).width; + (el.props.style as Record).display = "block"; (lastEl.props.children as RenderElement[]).push(el); return acc; } @@ -59,7 +59,7 @@ export async function renderTextSvg(props: RenderProps) { key: `${item.name}${i}`, type: "p", props: { - children: ``, + children: "", style: { height: "36px", margin: 0, diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/spore/src/dob/render/types/internal.ts index d61d8203..8ef25f68 100644 --- a/packages/spore/src/dob/render/types/internal.ts +++ b/packages/spore/src/dob/render/types/internal.ts @@ -1,7 +1,7 @@ export interface RenderElement

{ type: T; props: P & { - children: RenderElement | RenderElement[]; + children: string | RenderElement | RenderElement[]; style: S; }; key: string | null; From 2204c4f38a163bd5d7ae7d35c44f47343d8c68e4 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Fri, 10 Oct 2025 11:55:41 +0800 Subject: [PATCH 06/14] chore: fix image header parse issue --- packages/examples/src/renderDob.ts | 7 ++++++ .../src/dob/render/background-color-parser.ts | 2 +- .../render/render-by-dob-decode-response.ts | 12 +++++----- .../spore/src/dob/render/render-dob-bit.ts | 9 +++++--- .../spore/src/dob/render/render-dob1-svg.ts | 2 +- .../dob/render/render-text-params-parser.ts | 17 +++++--------- .../spore/src/dob/render/render-text-svg.ts | 10 ++++---- .../src/dob/render/resolve-svg-traits.ts | 2 +- .../spore/src/dob/render/svg-to-base64.ts | 2 +- .../spore/src/dob/render/traits-parser.ts | 4 ++-- .../spore/src/dob/render/types/internal.ts | 4 ++-- packages/spore/src/dob/render/utils/mime.ts | 23 ++++++++----------- 12 files changed, 47 insertions(+), 47 deletions(-) create mode 100644 packages/examples/src/renderDob.ts diff --git a/packages/examples/src/renderDob.ts b/packages/examples/src/renderDob.ts new file mode 100644 index 00000000..8fdb8a99 --- /dev/null +++ b/packages/examples/src/renderDob.ts @@ -0,0 +1,7 @@ +import { spore } from "@ckb-ccc/ccc"; + +const sporeId = + "dc19e68af1793924845e2a4dbc23598ed919dcfe44d3f9cd90964fe590efb0e4"; + +const dobRender = await spore.dob.renderByTokenKey(sporeId); +console.log(dobRender); diff --git a/packages/spore/src/dob/render/background-color-parser.ts b/packages/spore/src/dob/render/background-color-parser.ts index 113be8a2..a792b058 100644 --- a/packages/spore/src/dob/render/background-color-parser.ts +++ b/packages/spore/src/dob/render/background-color-parser.ts @@ -4,7 +4,7 @@ import type { ParsedTrait } from "./traits-parser"; export function getBackgroundColorByTraits( traits: ParsedTrait[], ): ParsedTrait | undefined { - return traits.find((trait) => trait.name === (Key.BgColor as string)); + return traits.find((trait) => trait.name === Key.BgColor); } export function backgroundColorParser( diff --git a/packages/spore/src/dob/render/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/render-by-dob-decode-response.ts index fb22435b..c5435306 100644 --- a/packages/spore/src/dob/render/render-by-dob-decode-response.ts +++ b/packages/spore/src/dob/render/render-by-dob-decode-response.ts @@ -5,7 +5,10 @@ import { renderTextParamsParser } from "./render-text-params-parser"; import type { RenderProps } from "./render-text-svg"; import { renderTextSvg } from "./render-text-svg"; import { traitsParser } from "./traits-parser"; -import type { DobDecodeResult, RenderPartialOutput } from "./types"; +import type { + DobDecodeResult, + RenderPartialOutput as RenderOutput, +} from "./types"; export function renderByDobDecodeResponse( dob0Data: DobDecodeResult | string, @@ -19,7 +22,7 @@ export function renderByDobDecodeResponse( if (typeof dob0Data.render_output === "string") { dob0Data.render_output = JSON.parse( dob0Data.render_output, - ) as RenderPartialOutput[]; + ) as RenderOutput[]; } const { traits, indexVarRegister } = traitsParser(dob0Data.render_output); for (const trait of traits) { @@ -27,10 +30,7 @@ export function renderByDobDecodeResponse( return renderImageSvg(traits); } // TODO: multiple images - if ( - trait.name === (Key.Image as string) && - trait.value instanceof Promise - ) { + if (trait.name === Key.Image && trait.value instanceof Promise) { return renderDob1Svg(trait.value); } } diff --git a/packages/spore/src/dob/render/render-dob-bit.ts b/packages/spore/src/dob/render/render-dob-bit.ts index 4c06e860..cc72f3c3 100644 --- a/packages/spore/src/dob/render/render-dob-bit.ts +++ b/packages/spore/src/dob/render/render-dob-bit.ts @@ -1,7 +1,10 @@ import satori from "satori"; import SpaceGroteskBoldBase64 from "./fonts/SpaceGrotesk-Bold.base64"; import { traitsParser } from "./traits-parser"; -import type { DobDecodeResult, RenderPartialOutput } from "./types"; +import type { + DobDecodeResult, + RenderPartialOutput as RenderOutput, +} from "./types"; import { base64ToArrayBuffer } from "./utils/string"; const iconBase64 = @@ -9,7 +12,7 @@ const iconBase64 = export function renderDobBit( dob0Data: DobDecodeResult | string, - _props?: { + props?: { outputType?: "svg"; }, ) { @@ -19,7 +22,7 @@ export function renderDobBit( if (typeof dob0Data.render_output === "string") { dob0Data.render_output = JSON.parse( dob0Data.render_output, - ) as RenderPartialOutput[]; + ) as RenderOutput[]; } const { traits } = traitsParser(dob0Data.render_output); const account = diff --git a/packages/spore/src/dob/render/render-dob1-svg.ts b/packages/spore/src/dob/render/render-dob1-svg.ts index b3bc12ba..926a0a05 100644 --- a/packages/spore/src/dob/render/render-dob1-svg.ts +++ b/packages/spore/src/dob/render/render-dob1-svg.ts @@ -7,7 +7,7 @@ import { base64ToArrayBuffer } from "./utils/string"; export async function renderDob1Svg(nodePromise: Promise) { const node = await nodePromise; const str = stringify(node); - const base64 = svgToBase64(str); + const base64 = await svgToBase64(str); const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64); const width = parseInt(node.attributes.width, 10) || 500; const height = parseInt(node.attributes.height, 10) || 500; diff --git a/packages/spore/src/dob/render/render-text-params-parser.ts b/packages/spore/src/dob/render/render-text-params-parser.ts index 9682020f..84d9ccc5 100644 --- a/packages/spore/src/dob/render/render-text-params-parser.ts +++ b/packages/spore/src/dob/render/render-text-params-parser.ts @@ -40,7 +40,7 @@ export function renderTextParamsParser( !trait.name.startsWith(Key.Prev) && typeof trait.value !== "undefined" && !(trait.name in indexVarRegister) && - trait.name !== (Key.Image as string), + trait.name !== Key.Image, ) .map((trait) => { let currentTemplate = template; @@ -50,13 +50,11 @@ export function renderTextParamsParser( const currentLayoutMatch = value.match(TEMPLATE_REG); if (currentLayoutMatch) { if (currentLayoutMatch[1]) { - [, value] = currentLayoutMatch as [string, string, string]; + [, value] = currentLayoutMatch; } if (currentLayoutMatch[2]) { parsedStyle = styleParser(`<${currentLayoutMatch[2]}>`, { - baseStyle: JSON.parse( - JSON.stringify(parsedStyle), - ) as typeof parsedStyle, + baseStyle: JSON.parse(JSON.stringify(parsedStyle)), }); } } @@ -73,12 +71,9 @@ export function renderTextParamsParser( } const text = currentTemplate - .replace(/%k/g, name) - .replace( - /%v/g, - typeof value === "object" ? JSON.stringify(value) : String(value), - ) - .replace(/%%/g, "%"); + .replace("%k", name) + .replace("%v", `${value}`) + .replace("%%", "%"); const styleCss: { textAlign?: string; diff --git a/packages/spore/src/dob/render/render-text-svg.ts b/packages/spore/src/dob/render/render-text-svg.ts index 5b96b93b..78837734 100644 --- a/packages/spore/src/dob/render/render-text-svg.ts +++ b/packages/spore/src/dob/render/render-text-svg.ts @@ -34,7 +34,7 @@ export async function renderTextSvg(props: RenderProps) { key: item.name, type: "p", props: { - children: item.text, + children: [item.text], style: { ...item.style, display: "flex", @@ -48,9 +48,9 @@ export async function renderTextSvg(props: RenderProps) { if (item.parsedStyle.breakLine === 0 && acc[acc.length - 1]) { const lastEl = acc[acc.length - 1]; el.type = "span"; - delete (el.props.style as Record).width; - (el.props.style as Record).display = "block"; - (lastEl.props.children as RenderElement[]).push(el); + delete el.props.style.width; + el.props.style.display = "block"; + lastEl.props.children.push(el); return acc; } acc.push(el); @@ -59,7 +59,7 @@ export async function renderTextSvg(props: RenderProps) { key: `${item.name}${i}`, type: "p", props: { - children: "", + children: ``, style: { height: "36px", margin: 0, diff --git a/packages/spore/src/dob/render/resolve-svg-traits.ts b/packages/spore/src/dob/render/resolve-svg-traits.ts index 690a79e3..3c227cc3 100644 --- a/packages/spore/src/dob/render/resolve-svg-traits.ts +++ b/packages/spore/src/dob/render/resolve-svg-traits.ts @@ -36,7 +36,7 @@ export async function resolveSvgTraits(svgStr: string): Promise { const svgAST = await parse(svgStr); await handleNodeHref(svgAST); return svgAST; - } catch (_error) { + } catch (error) { return { value: "", type: "element", diff --git a/packages/spore/src/dob/render/svg-to-base64.ts b/packages/spore/src/dob/render/svg-to-base64.ts index f94f67ec..6173a449 100644 --- a/packages/spore/src/dob/render/svg-to-base64.ts +++ b/packages/spore/src/dob/render/svg-to-base64.ts @@ -1,4 +1,4 @@ -export function svgToBase64(svgCode: string) { +export async function svgToBase64(svgCode: string) { if (typeof window !== "undefined") { return `data:image/svg+xml;base64,${window.btoa(svgCode)}`; // browser } diff --git a/packages/spore/src/dob/render/traits-parser.ts b/packages/spore/src/dob/render/traits-parser.ts index 1deabe46..2ae3a5b1 100644 --- a/packages/spore/src/dob/render/traits-parser.ts +++ b/packages/spore/src/dob/render/traits-parser.ts @@ -1,7 +1,7 @@ import type { INode } from "svgson"; import { ARRAY_INDEX_REG, ARRAY_REG } from "./constants/regex"; import { resolveSvgTraits } from "./resolve-svg-traits"; -import type { RenderPartialOutput } from "./types"; +import type { RenderPartialOutput as RenderOutput } from "./types"; import { parseStringToArray } from "./utils/string"; export interface ParsedTrait { @@ -9,7 +9,7 @@ export interface ParsedTrait { value: number | string | Date | Promise; } -export function traitsParser(items: RenderPartialOutput[]): { +export function traitsParser(items: RenderOutput[]): { traits: ParsedTrait[]; indexVarRegister: Record; } { diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/spore/src/dob/render/types/internal.ts index 8ef25f68..832fc8b2 100644 --- a/packages/spore/src/dob/render/types/internal.ts +++ b/packages/spore/src/dob/render/types/internal.ts @@ -1,7 +1,7 @@ -export interface RenderElement

{ +export interface RenderElement

{ type: T; props: P & { - children: string | RenderElement | RenderElement[]; + children: RenderElement | RenderElement[]; style: S; }; key: string | null; diff --git a/packages/spore/src/dob/render/utils/mime.ts b/packages/spore/src/dob/render/utils/mime.ts index 9457f551..8e766f23 100644 --- a/packages/spore/src/dob/render/utils/mime.ts +++ b/packages/spore/src/dob/render/utils/mime.ts @@ -22,42 +22,37 @@ function detectMimeTypeFromBase64Header(base64Header: string): string | null { return "image/gif"; } - // WebP: starts with UklGR (RIFF in base64) and contains WEBP - if (base64Header.startsWith("UklGR") && base64Header.includes("WEBP")) { + // WebP: starts with UklGR (RIFF in base64) and contains V0VCUA== ("WEBP" in base64) + if (base64Header.startsWith("UklGRg") && base64Header.includes("V0VCUA")) { return "image/webp"; } // BMP: starts with Qk0= (424d in base64) - if (base64Header.startsWith("Qk0=")) { + if (base64Header.startsWith("Qk0")) { return "image/bmp"; } - // SVG: starts with PHN2ZyA= ( Date: Fri, 10 Oct 2025 13:44:48 +0800 Subject: [PATCH 07/14] feat: make changes on file structure for clean appearance --- packages/spore/src/dob/render/api/index.ts | 2 + .../render-by-dob-decode-response.ts | 18 +- .../render/{ => api}/render-by-token-key.ts | 4 +- .../regex.ts => config/constants.ts} | 6 + packages/spore/src/dob/render/config/fonts.ts | 9 + packages/spore/src/dob/render/config/index.ts | 3 + .../spore/src/dob/render/constants/key.ts | 5 - packages/spore/src/dob/render/core/index.ts | 2 + .../parsers}/background-color-parser.ts | 4 +- .../src/dob/render/core/parsers/index.ts | 4 + .../render/{ => core/parsers}/style-parser.ts | 0 .../parsers/text-params-parser.ts} | 12 +- .../{ => core/parsers}/traits-parser.ts | 8 +- .../renderers/bit-renderer.ts} | 12 +- .../renderers/dob1-renderer.ts} | 8 +- .../renderers/image-renderer.ts} | 10 +- .../src/dob/render/core/renderers/index.ts | 4 + .../renderers/text-renderer.ts} | 19 +- packages/spore/src/dob/render/index.ts | 14 +- .../api/dob-decode.ts} | 4 +- .../spore/src/dob/render/services/index.ts | 2 + .../svg-resolver.ts} | 9 +- .../test/background-color-parser.test.ts | 49 ---- .../test/render-text-params-parser.ts.test.ts | 144 ------------ .../src/dob/render/test/style-parser.test.ts | 222 ------------------ .../src/dob/render/test/traits-parser.test.ts | 91 ------- packages/spore/src/dob/render/types/api.ts | 25 ++ packages/spore/src/dob/render/types/index.ts | 27 +-- .../spore/src/dob/render/types/internal.ts | 12 +- packages/spore/src/dob/render/utils/index.ts | 3 + .../render/utils/{mime.ts => mime-utils.ts} | 2 +- .../utils/{string.ts => string-utils.ts} | 0 .../{svg-to-base64.ts => utils/svg-utils.ts} | 0 33 files changed, 135 insertions(+), 599 deletions(-) create mode 100644 packages/spore/src/dob/render/api/index.ts rename packages/spore/src/dob/render/{ => api}/render-by-dob-decode-response.ts (62%) rename packages/spore/src/dob/render/{ => api}/render-by-token-key.ts (73%) rename packages/spore/src/dob/render/{constants/regex.ts => config/constants.ts} (68%) create mode 100644 packages/spore/src/dob/render/config/fonts.ts create mode 100644 packages/spore/src/dob/render/config/index.ts delete mode 100644 packages/spore/src/dob/render/constants/key.ts create mode 100644 packages/spore/src/dob/render/core/index.ts rename packages/spore/src/dob/render/{ => core/parsers}/background-color-parser.ts (85%) create mode 100644 packages/spore/src/dob/render/core/parsers/index.ts rename packages/spore/src/dob/render/{ => core/parsers}/style-parser.ts (100%) rename packages/spore/src/dob/render/{render-text-params-parser.ts => core/parsers/text-params-parser.ts} (91%) rename packages/spore/src/dob/render/{ => core/parsers}/traits-parser.ts (88%) rename packages/spore/src/dob/render/{render-dob-bit.ts => core/renderers/bit-renderer.ts} (93%) rename packages/spore/src/dob/render/{render-dob1-svg.ts => core/renderers/dob1-renderer.ts} (81%) rename packages/spore/src/dob/render/{render-image-svg.ts => core/renderers/image-renderer.ts} (83%) create mode 100644 packages/spore/src/dob/render/core/renderers/index.ts rename packages/spore/src/dob/render/{render-text-svg.ts => core/renderers/text-renderer.ts} (82%) rename packages/spore/src/dob/render/{api/dobDecode.ts => services/api/dob-decode.ts} (81%) create mode 100644 packages/spore/src/dob/render/services/index.ts rename packages/spore/src/dob/render/{resolve-svg-traits.ts => services/svg-resolver.ts} (84%) delete mode 100644 packages/spore/src/dob/render/test/background-color-parser.test.ts delete mode 100644 packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts delete mode 100644 packages/spore/src/dob/render/test/style-parser.test.ts delete mode 100644 packages/spore/src/dob/render/test/traits-parser.test.ts create mode 100644 packages/spore/src/dob/render/types/api.ts create mode 100644 packages/spore/src/dob/render/utils/index.ts rename packages/spore/src/dob/render/utils/{mime.ts => mime-utils.ts} (98%) rename packages/spore/src/dob/render/utils/{string.ts => string-utils.ts} (100%) rename packages/spore/src/dob/render/{svg-to-base64.ts => utils/svg-utils.ts} (100%) diff --git a/packages/spore/src/dob/render/api/index.ts b/packages/spore/src/dob/render/api/index.ts new file mode 100644 index 00000000..c40f16f1 --- /dev/null +++ b/packages/spore/src/dob/render/api/index.ts @@ -0,0 +1,2 @@ +export * from "./render-by-dob-decode-response"; +export * from "./render-by-token-key"; diff --git a/packages/spore/src/dob/render/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts similarity index 62% rename from packages/spore/src/dob/render/render-by-dob-decode-response.ts rename to packages/spore/src/dob/render/api/render-by-dob-decode-response.ts index c5435306..801e6394 100644 --- a/packages/spore/src/dob/render/render-by-dob-decode-response.ts +++ b/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts @@ -1,14 +1,14 @@ -import { Key } from "./constants/key"; -import { renderDob1Svg } from "./render-dob1-svg"; -import { renderImageSvg } from "./render-image-svg"; -import { renderTextParamsParser } from "./render-text-params-parser"; -import type { RenderProps } from "./render-text-svg"; -import { renderTextSvg } from "./render-text-svg"; -import { traitsParser } from "./traits-parser"; +import { Key } from "../config/constants"; +import { renderTextParamsParser } from "../core/parsers/text-params-parser"; +import { traitsParser } from "../core/parsers/traits-parser"; +import { renderDob1Svg } from "../core/renderers/dob1-renderer"; +import { renderImageSvg } from "../core/renderers/image-renderer"; +import type { RenderProps } from "../core/renderers/text-renderer"; +import { renderTextSvg } from "../core/renderers/text-renderer"; import type { DobDecodeResult, RenderPartialOutput as RenderOutput, -} from "./types"; +} from "../types"; export function renderByDobDecodeResponse( dob0Data: DobDecodeResult | string, @@ -30,7 +30,7 @@ export function renderByDobDecodeResponse( return renderImageSvg(traits); } // TODO: multiple images - if (trait.name === Key.Image && trait.value instanceof Promise) { + if (trait.name === String(Key.Image) && trait.value instanceof Promise) { return renderDob1Svg(trait.value); } } diff --git a/packages/spore/src/dob/render/render-by-token-key.ts b/packages/spore/src/dob/render/api/render-by-token-key.ts similarity index 73% rename from packages/spore/src/dob/render/render-by-token-key.ts rename to packages/spore/src/dob/render/api/render-by-token-key.ts index 75795dcf..c99bee82 100644 --- a/packages/spore/src/dob/render/render-by-token-key.ts +++ b/packages/spore/src/dob/render/api/render-by-token-key.ts @@ -1,6 +1,6 @@ -import { dobDecode } from "./api/dobDecode"; +import type { RenderProps } from "../core/renderers/text-renderer"; +import { dobDecode } from "../services/api/dob-decode"; import { renderByDobDecodeResponse } from "./render-by-dob-decode-response"; -import type { RenderProps } from "./render-text-svg"; export async function renderByTokenKey( tokenKey: string, diff --git a/packages/spore/src/dob/render/constants/regex.ts b/packages/spore/src/dob/render/config/constants.ts similarity index 68% rename from packages/spore/src/dob/render/constants/regex.ts rename to packages/spore/src/dob/render/config/constants.ts index af1e89fc..ce3098e8 100644 --- a/packages/spore/src/dob/render/constants/regex.ts +++ b/packages/spore/src/dob/render/config/constants.ts @@ -1,3 +1,9 @@ +export enum Key { + BgColor = "prev.bgcolor", + Prev = "prev", + Image = "IMAGE", +} + export const ARRAY_REG = /\(%(.*?)\):(\[.*?\])/; export const ARRAY_INDEX_REG = /(\d+)<_>$/; export const GLOBAL_TEMPLATE_REG = /^prev<(.*?)>/; diff --git a/packages/spore/src/dob/render/config/fonts.ts b/packages/spore/src/dob/render/config/fonts.ts new file mode 100644 index 00000000..b21dd8be --- /dev/null +++ b/packages/spore/src/dob/render/config/fonts.ts @@ -0,0 +1,9 @@ +import SpaceGroteskBoldBase64 from "../fonts/SpaceGrotesk-Bold.base64"; +import TurretRoadBoldBase64 from "../fonts/TurretRoad-Bold.base64"; +import TurretRoadMediumBase64 from "../fonts/TurretRoad-Medium.base64"; + +export const FONTS = { + SpaceGroteskBold: SpaceGroteskBoldBase64, + TurretRoadBold: TurretRoadBoldBase64, + TurretRoadMedium: TurretRoadMediumBase64, +} as const; diff --git a/packages/spore/src/dob/render/config/index.ts b/packages/spore/src/dob/render/config/index.ts new file mode 100644 index 00000000..da4e4c33 --- /dev/null +++ b/packages/spore/src/dob/render/config/index.ts @@ -0,0 +1,3 @@ +export { config } from "../config"; +export * from "./constants"; +export * from "./fonts"; diff --git a/packages/spore/src/dob/render/constants/key.ts b/packages/spore/src/dob/render/constants/key.ts deleted file mode 100644 index 8468784c..00000000 --- a/packages/spore/src/dob/render/constants/key.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum Key { - BgColor = "prev.bgcolor", - Prev = "prev", - Image = "IMAGE", -} diff --git a/packages/spore/src/dob/render/core/index.ts b/packages/spore/src/dob/render/core/index.ts new file mode 100644 index 00000000..3d132bec --- /dev/null +++ b/packages/spore/src/dob/render/core/index.ts @@ -0,0 +1,2 @@ +export * from "./parsers"; +export * from "./renderers"; diff --git a/packages/spore/src/dob/render/background-color-parser.ts b/packages/spore/src/dob/render/core/parsers/background-color-parser.ts similarity index 85% rename from packages/spore/src/dob/render/background-color-parser.ts rename to packages/spore/src/dob/render/core/parsers/background-color-parser.ts index a792b058..f2ad9439 100644 --- a/packages/spore/src/dob/render/background-color-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/background-color-parser.ts @@ -1,10 +1,10 @@ -import { Key } from "./constants/key"; +import { Key } from "../../config/constants"; import type { ParsedTrait } from "./traits-parser"; export function getBackgroundColorByTraits( traits: ParsedTrait[], ): ParsedTrait | undefined { - return traits.find((trait) => trait.name === Key.BgColor); + return traits.find((trait) => trait.name === String(Key.BgColor)); } export function backgroundColorParser( diff --git a/packages/spore/src/dob/render/core/parsers/index.ts b/packages/spore/src/dob/render/core/parsers/index.ts new file mode 100644 index 00000000..0a8b7ff1 --- /dev/null +++ b/packages/spore/src/dob/render/core/parsers/index.ts @@ -0,0 +1,4 @@ +export * from "./background-color-parser"; +export * from "./style-parser"; +export * from "./text-params-parser"; +export * from "./traits-parser"; diff --git a/packages/spore/src/dob/render/style-parser.ts b/packages/spore/src/dob/render/core/parsers/style-parser.ts similarity index 100% rename from packages/spore/src/dob/render/style-parser.ts rename to packages/spore/src/dob/render/core/parsers/style-parser.ts diff --git a/packages/spore/src/dob/render/render-text-params-parser.ts b/packages/spore/src/dob/render/core/parsers/text-params-parser.ts similarity index 91% rename from packages/spore/src/dob/render/render-text-params-parser.ts rename to packages/spore/src/dob/render/core/parsers/text-params-parser.ts index 84d9ccc5..95653fb8 100644 --- a/packages/spore/src/dob/render/render-text-params-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/text-params-parser.ts @@ -1,6 +1,5 @@ +import { GLOBAL_TEMPLATE_REG, Key, TEMPLATE_REG } from "../../config/constants"; import { backgroundColorParser } from "./background-color-parser"; -import { Key } from "./constants/key"; -import { GLOBAL_TEMPLATE_REG, TEMPLATE_REG } from "./constants/regex"; import { ParsedStyleFormat, styleParser } from "./style-parser"; import type { ParsedTrait } from "./traits-parser"; @@ -40,7 +39,7 @@ export function renderTextParamsParser( !trait.name.startsWith(Key.Prev) && typeof trait.value !== "undefined" && !(trait.name in indexVarRegister) && - trait.name !== Key.Image, + trait.name !== String(Key.Image), ) .map((trait) => { let currentTemplate = template; @@ -54,7 +53,7 @@ export function renderTextParamsParser( } if (currentLayoutMatch[2]) { parsedStyle = styleParser(`<${currentLayoutMatch[2]}>`, { - baseStyle: JSON.parse(JSON.stringify(parsedStyle)), + baseStyle: { ...parsedStyle }, }); } } @@ -72,7 +71,10 @@ export function renderTextParamsParser( const text = currentTemplate .replace("%k", name) - .replace("%v", `${value}`) + .replace( + "%v", + typeof value === "object" ? JSON.stringify(value) : String(value), + ) .replace("%%", "%"); const styleCss: { diff --git a/packages/spore/src/dob/render/traits-parser.ts b/packages/spore/src/dob/render/core/parsers/traits-parser.ts similarity index 88% rename from packages/spore/src/dob/render/traits-parser.ts rename to packages/spore/src/dob/render/core/parsers/traits-parser.ts index 2ae3a5b1..0fe78474 100644 --- a/packages/spore/src/dob/render/traits-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/traits-parser.ts @@ -1,8 +1,8 @@ import type { INode } from "svgson"; -import { ARRAY_INDEX_REG, ARRAY_REG } from "./constants/regex"; -import { resolveSvgTraits } from "./resolve-svg-traits"; -import type { RenderPartialOutput as RenderOutput } from "./types"; -import { parseStringToArray } from "./utils/string"; +import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants"; +import { resolveSvgTraits } from "../../services/svg-resolver"; +import type { RenderPartialOutput as RenderOutput } from "../../types"; +import { parseStringToArray } from "../../utils/string-utils"; export interface ParsedTrait { name: string; diff --git a/packages/spore/src/dob/render/render-dob-bit.ts b/packages/spore/src/dob/render/core/renderers/bit-renderer.ts similarity index 93% rename from packages/spore/src/dob/render/render-dob-bit.ts rename to packages/spore/src/dob/render/core/renderers/bit-renderer.ts index cc72f3c3..cdd18ced 100644 --- a/packages/spore/src/dob/render/render-dob-bit.ts +++ b/packages/spore/src/dob/render/core/renderers/bit-renderer.ts @@ -1,18 +1,18 @@ import satori from "satori"; -import SpaceGroteskBoldBase64 from "./fonts/SpaceGrotesk-Bold.base64"; -import { traitsParser } from "./traits-parser"; +import { FONTS } from "../../config/fonts"; import type { DobDecodeResult, RenderPartialOutput as RenderOutput, -} from "./types"; -import { base64ToArrayBuffer } from "./utils/string"; +} from "../../types"; +import { base64ToArrayBuffer } from "../../utils/string-utils"; +import { traitsParser } from "../parsers/traits-parser"; const iconBase64 = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNTA0XzI4OCkiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAwMCAwSDBWMTAwMEgxMDAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTAwIDY0NS42NjlDNjE1LjE1NyA2NDUuNjY5IDcwOC42NjEgNTUyLjE2NSA3MDguNjYxIDQzNy4wMDhDNzA4LjY2MSAzOTAuMDkyIDY5My4yNDIgMzQ2Ljc4NSA2NjYuOTk1IDMxMi4wMDhDNjkyLjI1NyAyOTIuNjUxIDcwOC42NjEgMjYyLjQ2NyA3MDguNjYxIDIyOC4zNDZINTAwQzM4NC44NDMgMjI4LjM0NiAyOTEuMzM5IDMyMS44NSAyOTEuMzM5IDQzNy4wMDhDMjkxLjMzOSA1NTEuODM3IDM4NS4xNzEgNjQ1LjY2OSA1MDAgNjQ1LjY2OVpNNTAwIDMyMy44MTlDNTYyLjMzNiAzMjMuODE5IDYxMy4xODkgMzc0LjY3MiA2MTMuMTg5IDQzNy4wMDhDNjEzLjE4OSA0OTkuMzQ0IDU2Mi4zMzYgNTUwLjE5NyA1MDAgNTUwLjE5N0M0MzcuNjY0IDU1MC4xOTcgMzg2LjgxMSA0OTkuMzQ0IDM4Ni44MTEgNDM3LjAwOEMzODYuODExIDM3NC42NzIgNDM3LjY2NCAzMjMuODE5IDUwMCAzMjMuODE5WiIgZmlsbD0iIzAwREY5QiIvPgo8cGF0aCBkPSJNNTAwIDgxMS4zNTJDNDA0LjE5OSA4MTEuMzUyIDMwOC4zOTkgNzc0LjkzNCAyMzUuMjM2IDcwMS43NzJDMjQ2LjcxOSA2NzEuNTg4IDI3MS45ODIgNjQ2LjY1NCAzMDUuNzc0IDYzNy4xMzlDMzU5LjkwOCA2ODkuNjMzIDQyOS43OSA3MTUuODc5IDUwMCA3MTUuODc5QzU3MC4yMSA3MTUuODc5IDY0MC4wOTIgNjg5LjYzMyA2OTQuMjI2IDYzNy4xMzlDNzI4LjAxOCA2NDYuNjU0IDc1My4yODEgNjcxLjI2IDc2NC43NjQgNzAxLjc3MkM2OTEuOTI5IDc3NC42MDYgNTk1LjgwMSA4MTEuMzUyIDUwMCA4MTEuMzUyWiIgZmlsbD0iIzI0NzFGRSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzUwNF8yODgiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="; export function renderDobBit( dob0Data: DobDecodeResult | string, - props?: { + _props?: { outputType?: "svg"; }, ) { @@ -39,7 +39,7 @@ export function renderDobBit( fontSize = fontSize * 0.75; } } - const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64); + const spaceGroteskBoldFont = base64ToArrayBuffer(FONTS.SpaceGroteskBold); return satori( { key: "container", diff --git a/packages/spore/src/dob/render/render-dob1-svg.ts b/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts similarity index 81% rename from packages/spore/src/dob/render/render-dob1-svg.ts rename to packages/spore/src/dob/render/core/renderers/dob1-renderer.ts index 926a0a05..552adda8 100644 --- a/packages/spore/src/dob/render/render-dob1-svg.ts +++ b/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts @@ -1,14 +1,14 @@ import satori from "satori"; import { type INode, stringify } from "svgson"; -import SpaceGroteskBoldBase64 from "./fonts/SpaceGrotesk-Bold.base64"; -import { svgToBase64 } from "./svg-to-base64"; -import { base64ToArrayBuffer } from "./utils/string"; +import { FONTS } from "../../config/fonts"; +import { base64ToArrayBuffer } from "../../utils/string-utils"; +import { svgToBase64 } from "../../utils/svg-utils"; export async function renderDob1Svg(nodePromise: Promise) { const node = await nodePromise; const str = stringify(node); const base64 = await svgToBase64(str); - const spaceGroteskBoldFont = base64ToArrayBuffer(SpaceGroteskBoldBase64); + const spaceGroteskBoldFont = base64ToArrayBuffer(FONTS.SpaceGroteskBold); const width = parseInt(node.attributes.width, 10) || 500; const height = parseInt(node.attributes.height, 10) || 500; diff --git a/packages/spore/src/dob/render/render-image-svg.ts b/packages/spore/src/dob/render/core/renderers/image-renderer.ts similarity index 83% rename from packages/spore/src/dob/render/render-image-svg.ts rename to packages/spore/src/dob/render/core/renderers/image-renderer.ts index e6e31bea..2312d9ca 100644 --- a/packages/spore/src/dob/render/render-image-svg.ts +++ b/packages/spore/src/dob/render/core/renderers/image-renderer.ts @@ -1,9 +1,9 @@ import satori from "satori"; -import { backgroundColorParser } from "./background-color-parser"; -import { config } from "./config"; -import type { ParsedTrait } from "./traits-parser"; -import { processFileServerResult } from "./utils/mime"; -import { isBtcFs, isIpfs } from "./utils/string"; +import { config } from "../../config"; +import { processFileServerResult } from "../../utils/mime-utils"; +import { isBtcFs, isIpfs } from "../../utils/string-utils"; +import { backgroundColorParser } from "../parsers/background-color-parser"; +import type { ParsedTrait } from "../parsers/traits-parser"; export async function renderImageSvg(traits: ParsedTrait[]): Promise { const prevBg = traits.find((trait) => trait.name === "prev.bg"); diff --git a/packages/spore/src/dob/render/core/renderers/index.ts b/packages/spore/src/dob/render/core/renderers/index.ts new file mode 100644 index 00000000..c7b47086 --- /dev/null +++ b/packages/spore/src/dob/render/core/renderers/index.ts @@ -0,0 +1,4 @@ +export * from "./bit-renderer"; +export * from "./dob1-renderer"; +export * from "./image-renderer"; +export * from "./text-renderer"; diff --git a/packages/spore/src/dob/render/render-text-svg.ts b/packages/spore/src/dob/render/core/renderers/text-renderer.ts similarity index 82% rename from packages/spore/src/dob/render/render-text-svg.ts rename to packages/spore/src/dob/render/core/renderers/text-renderer.ts index 78837734..eaa91828 100644 --- a/packages/spore/src/dob/render/render-text-svg.ts +++ b/packages/spore/src/dob/render/core/renderers/text-renderer.ts @@ -1,12 +1,11 @@ import satori from "satori"; -import TurretRoadBoldBase64 from "./fonts/TurretRoad-Bold.base64"; -import TurretRoadMediumBase64 from "./fonts/TurretRoad-Medium.base64"; -import type { renderTextParamsParser } from "./render-text-params-parser"; -import type { RenderElement } from "./types/internal"; -import { base64ToArrayBuffer } from "./utils/string"; +import { FONTS } from "../../config/fonts"; +import type { RenderElement } from "../../types/internal"; +import { base64ToArrayBuffer } from "../../utils/string-utils"; +import type { renderTextParamsParser } from "../parsers/text-params-parser"; -const TurretRoadMediumFont = base64ToArrayBuffer(TurretRoadMediumBase64); -const TurretRoadBoldFont = base64ToArrayBuffer(TurretRoadBoldBase64); +const TurretRoadMediumFont = base64ToArrayBuffer(FONTS.TurretRoadMedium); +const TurretRoadBoldFont = base64ToArrayBuffer(FONTS.TurretRoadBold); export interface RenderProps extends ReturnType { font?: { @@ -50,7 +49,11 @@ export async function renderTextSvg(props: RenderProps) { el.type = "span"; delete el.props.style.width; el.props.style.display = "block"; - lastEl.props.children.push(el); + if (Array.isArray(lastEl.props.children)) { + lastEl.props.children.push(el); + } else { + lastEl.props.children = [lastEl.props.children, el]; + } return acc; } acc.push(el); diff --git a/packages/spore/src/dob/render/index.ts b/packages/spore/src/dob/render/index.ts index 460ce56f..c533ecfc 100644 --- a/packages/spore/src/dob/render/index.ts +++ b/packages/spore/src/dob/render/index.ts @@ -1,10 +1,6 @@ -export { config } from "./config"; -export * from "./render-by-dob-decode-response"; -export * from "./render-by-token-key"; -export * from "./render-dob-bit"; -export * from "./render-image-svg"; -export * from "./render-text-params-parser"; -export * from "./render-text-svg"; -export * from "./svg-to-base64"; -export * from "./traits-parser"; +export * from "./api"; +export * from "./config"; +export * from "./core"; +export * from "./services"; export * from "./types"; +export * from "./utils"; diff --git a/packages/spore/src/dob/render/api/dobDecode.ts b/packages/spore/src/dob/render/services/api/dob-decode.ts similarity index 81% rename from packages/spore/src/dob/render/api/dobDecode.ts rename to packages/spore/src/dob/render/services/api/dob-decode.ts index 2cd96b0a..1b09c0c7 100644 --- a/packages/spore/src/dob/render/api/dobDecode.ts +++ b/packages/spore/src/dob/render/services/api/dob-decode.ts @@ -1,5 +1,5 @@ -import { config } from "../config"; -import type { DobDecodeResponse } from "../types"; +import { config } from "../../config"; +import type { DobDecodeResponse } from "../../types"; export async function dobDecode(tokenKey: string): Promise { const response = await fetch(config.dobDecodeServerURL, { diff --git a/packages/spore/src/dob/render/services/index.ts b/packages/spore/src/dob/render/services/index.ts new file mode 100644 index 00000000..13188645 --- /dev/null +++ b/packages/spore/src/dob/render/services/index.ts @@ -0,0 +1,2 @@ +export * from "./api/dob-decode"; +export * from "./svg-resolver"; diff --git a/packages/spore/src/dob/render/resolve-svg-traits.ts b/packages/spore/src/dob/render/services/svg-resolver.ts similarity index 84% rename from packages/spore/src/dob/render/resolve-svg-traits.ts rename to packages/spore/src/dob/render/services/svg-resolver.ts index 3c227cc3..3e40e7e7 100644 --- a/packages/spore/src/dob/render/resolve-svg-traits.ts +++ b/packages/spore/src/dob/render/services/svg-resolver.ts @@ -1,8 +1,8 @@ import type { INode } from "svgson"; import { parse } from "svgson"; -import type { BtcFsURI, IpfsURI } from "./config"; -import { config } from "./config"; -import { processFileServerResult } from "./utils/mime"; +import type { BtcFsURI, IpfsURI } from "../config"; +import { config } from "../config"; +import { processFileServerResult } from "../utils/mime-utils"; async function handleNodeHref(node: INode) { if (node.name !== "image") { @@ -36,7 +36,8 @@ export async function resolveSvgTraits(svgStr: string): Promise { const svgAST = await parse(svgStr); await handleNodeHref(svgAST); return svgAST; - } catch (error) { + } catch (error: unknown) { + console.error(error); return { value: "", type: "element", diff --git a/packages/spore/src/dob/render/test/background-color-parser.test.ts b/packages/spore/src/dob/render/test/background-color-parser.test.ts deleted file mode 100644 index 6951920f..00000000 --- a/packages/spore/src/dob/render/test/background-color-parser.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { - backgroundColorParser, - getBackgroundColorByTraits, -} from "../background-color-parser"; -import { Key } from "../constants/key"; -import { traitsParser } from "../traits-parser"; - -describe("function backgroundColorParser", async () => { - it("case: normal", () => { - const { traits } = traitsParser([ - { - name: Key.BgColor, - traits: [ - { - String: `#FFF`, - }, - ], - }, - ]); - expect(backgroundColorParser(traits)).toEqual( - getBackgroundColorByTraits(traits), - ); - }); - - it("case: not found and default", () => { - const { traits } = traitsParser([]); - const defaultColor = "#fff"; - expect(backgroundColorParser(traits, { defaultColor })).toEqual( - defaultColor, - ); - }); - - it("case: linear-gradient", () => { - const { traits } = traitsParser([ - { - name: Key.BgColor, - traits: [ - { - String: `#(45deg, blue, pink)`, - }, - ], - }, - ]); - expect(backgroundColorParser(traits)).toEqual( - "linear-gradient(45deg, blue, pink)", - ); - }); -}); diff --git a/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts b/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts deleted file mode 100644 index 9c27330e..00000000 --- a/packages/spore/src/dob/render/test/render-text-params-parser.ts.test.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { Key } from "../constants/key"; -import { - DEFAULT_TEMPLATE, - renderTextParamsParser, -} from "../render-text-params-parser"; -import { DEFAULT_STYLE } from "../style-parser"; -import { traitsParser } from "../traits-parser"; - -describe("function renderTextParamsParser", () => { - it("case: default template", () => { - const { traits, indexVarRegister } = traitsParser([ - { - name: "Key", - traits: [ - { - String: "Value", - }, - ], - }, - ]); - const params = renderTextParamsParser(traits, indexVarRegister, { - defaultTemplate: DEFAULT_TEMPLATE, - }); - expect(params.items[0].text).toEqual("Key: Value"); - }); - - it("case: customized default template by options", () => { - const { traits, indexVarRegister } = traitsParser([ - { - name: "Key", - traits: [ - { - String: "Value", - }, - ], - }, - ]); - const params = renderTextParamsParser(traits, indexVarRegister, { - defaultTemplate: "%v", - }); - expect(params.items[0].text).toEqual("Value"); - }); - - it("case: customized default template by global traits", () => { - const { traits, indexVarRegister } = traitsParser([ - { - name: `${Key.Prev}`, - traits: [ - { - String: "#fff", - }, - ], - }, - { - name: "Key", - traits: [ - { - String: "Value", - }, - ], - }, - ]); - const params = renderTextParamsParser(traits, indexVarRegister); - expect(params.items[0].text).toEqual("ddd Value"); - }); - - it("case: customized default template by current traits", () => { - const { traits, indexVarRegister } = traitsParser([ - { - name: "Key<%k %k %v>", - traits: [ - { - String: "Value", - }, - ], - }, - ]); - const params = renderTextParamsParser(traits, indexVarRegister); - expect(params.items[0].text).toEqual("Key Key Value"); - }); - - it("case: customized default template and style by global traits", () => { - const { traits, indexVarRegister } = traitsParser([ - { - name: `${Key.Prev}`, - traits: [ - { - String: "<#ff0>", - }, - ], - }, - { - name: "Key", - traits: [ - { - String: "Value", - }, - ], - }, - { - name: "Key2<%k %k %v>", - traits: [ - { - String: "Value<#f00>", - }, - ], - }, - ]); - const params = renderTextParamsParser(traits, indexVarRegister); - expect(params.items[0].text).toEqual("ddd Value"); - const expectStyle = { - ...DEFAULT_STYLE, - color: "#ff0", - }; - expect(params.items[0].parsedStyle).toEqual(expectStyle); - expect(params.items[1].text).toEqual("Key2 Key2 Value"); - const expectStyle2 = { - ...DEFAULT_STYLE, - color: "#f00", - }; - expect(params.items[1].parsedStyle).toEqual(expectStyle2); - }); - - it("case: customized default template and style by current traits", () => { - const { traits, indexVarRegister } = traitsParser([ - { - name: "Key<%k %k %v>", - traits: [ - { - String: "Value<#f00>", - }, - ], - }, - ]); - const params = renderTextParamsParser(traits, indexVarRegister); - expect(params.items[0].text).toEqual("Key Key Value"); - const expectStyle = { - ...DEFAULT_STYLE, - color: "#f00", - }; - expect(params.items[0].parsedStyle).toEqual(expectStyle); - }); -}); diff --git a/packages/spore/src/dob/render/test/style-parser.test.ts b/packages/spore/src/dob/render/test/style-parser.test.ts deleted file mode 100644 index b9e12c7c..00000000 --- a/packages/spore/src/dob/render/test/style-parser.test.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { - DEFAULT_STYLE, - ParsedStyleAlignment, - ParsedStyleFormat, - styleParser, -} from "../style-parser"; - -describe("function styleParser", async () => { - it("case: empty string", () => { - expect(styleParser("")).toEqual(DEFAULT_STYLE); - }); - - it('case: "#fff"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - }; - expect(styleParser(color)).toEqual(expectStyle); - }); - - it('case: "#ffffff"', () => { - const color = "#ffffff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - }; - expect(styleParser(color)).toEqual(expectStyle); - }); - - it('case: "<#ffffff>"', () => { - const color = "#ffffff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - }; - expect(styleParser(color)).toEqual(expectStyle); - }); - - it('case: "<#fff>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - }; - expect(styleParser(color)).toEqual(expectStyle); - }); - - it('case: "<#fff@c>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - alignment: "center", - }; - expect(styleParser(`<${color}@c>`)).toEqual(expectStyle); - }); - - it('case: "<#fff@l>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - alignment: "left", - }; - expect(styleParser(`<${color}@l>`)).toEqual(expectStyle); - }); - - it('case: "<#fff@r>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - alignment: "right", - }; - expect(styleParser(`<${color}@r>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*b>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ParsedStyleFormat.Bold], - }; - expect(styleParser(`<${color}*b>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*bu>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ParsedStyleFormat.Bold, ParsedStyleFormat.Underline], - }; - expect(styleParser(`<${color}*bu>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*bui>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ - ParsedStyleFormat.Bold, - ParsedStyleFormat.Underline, - ParsedStyleFormat.Italic, - ], - }; - expect(styleParser(`<${color}*bui>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*buis>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ - ParsedStyleFormat.Bold, - ParsedStyleFormat.Underline, - ParsedStyleFormat.Italic, - ParsedStyleFormat.Strikethrough, - ], - }; - expect(styleParser(`<${color}*buis>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*bis>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ - ParsedStyleFormat.Bold, - ParsedStyleFormat.Italic, - ParsedStyleFormat.Strikethrough, - ], - }; - expect(styleParser(`<${color}*bis>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*is>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ParsedStyleFormat.Italic, ParsedStyleFormat.Strikethrough], - }; - expect(styleParser(`<${color}*is>`)).toEqual(expectStyle); - }); - - it('case: "<#fff*s>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - format: [ParsedStyleFormat.Strikethrough], - }; - expect(styleParser(`<${color}*s>`)).toEqual(expectStyle); - }); - - it('case: "<#fff&>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - breakLine: 0, - }; - expect(styleParser(`<${color}&>`)).toEqual({ - ...expectStyle, - }); - }); - - it('case: "<#fff&~>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - breakLine: 2, - }; - expect(styleParser(`<${color}&~>`)).toEqual({ - ...expectStyle, - }); - }); - - it('case: "<#fff~~>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - breakLine: 3, - }; - expect(styleParser(`<${color}~~>`)).toEqual({ - ...expectStyle, - }); - }); - - it('case: "<~~#fff>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - breakLine: 3, - }; - expect(styleParser(`<~~${color}>`)).toEqual({ - ...expectStyle, - }); - }); - - it('case: "<@r#fff>"', () => { - const color = "#fff"; - const expectStyle = { - ...DEFAULT_STYLE, - color, - alignment: ParsedStyleAlignment.Right, - }; - expect(styleParser(`<@r${color}>`)).toEqual({ - ...expectStyle, - }); - }); -}); diff --git a/packages/spore/src/dob/render/test/traits-parser.test.ts b/packages/spore/src/dob/render/test/traits-parser.test.ts deleted file mode 100644 index 242b4ed3..00000000 --- a/packages/spore/src/dob/render/test/traits-parser.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { traitsParser } from "../traits-parser"; - -describe("function traitsParser", async () => { - it("case: var", () => { - const varName = "var"; - const value = 3; - const traits = [ - { - name: "var", - traits: [ - { - String: `${value}<_>`, - }, - ], - }, - ]; - - const { indexVarRegister } = traitsParser(traits); - expect(indexVarRegister[varName]).toEqual(value); - }); - - it("case: array index", () => { - const varName = "var"; - const value = 3; - const { traits, indexVarRegister } = traitsParser([ - { - name: varName, - traits: [ - { - String: `${value}<_>`, - }, - ], - }, - { - name: "prev.bgcolor", - traits: [ - { - String: `(%${varName}):['#FFFF00', '#0000FF', '#FF00FF', '#FF0000', '#000000']`, - }, - ], - }, - ]); - const trait = traits.find(({ name }) => name === "prev.bgcolor"); - expect(indexVarRegister[varName]).toEqual(value); - expect(trait?.value).toEqual("#FF0000"); - }); - - it("case: array with over index", () => { - const varName = "var"; - const value = 10; - const { traits, indexVarRegister } = traitsParser([ - { - name: varName, - traits: [ - { - String: `${value}<_>`, - }, - ], - }, - { - name: "prev.bgcolor", - traits: [ - { - String: `(%${varName}):['#FFFF00', '#0000FF', '#FF00FF', '#FF0000', '#000000']`, - }, - ], - }, - ]); - const trait = traits.find(({ name }) => name === "prev.bgcolor"); - expect(indexVarRegister[varName]).toEqual(value); - expect(trait?.value).toEqual("#FFFF00"); - }); - - it("case: number", () => { - const key = "data"; - const value = 1; - const { traits } = traitsParser([ - { - name: key, - traits: [ - { - Number: value, - }, - ], - }, - ]); - const trait = traits.find(({ name }) => name === key); - expect(trait?.value).toEqual(value); - }); -}); diff --git a/packages/spore/src/dob/render/types/api.ts b/packages/spore/src/dob/render/types/api.ts new file mode 100644 index 00000000..4be210ac --- /dev/null +++ b/packages/spore/src/dob/render/types/api.ts @@ -0,0 +1,25 @@ +export interface DobDecodeResponse { + jsonrpc: string; + result: string; + id: number; +} + +export interface DobDecodeResult { + dob_content: { + dna: string; + block_number: number; + cell_id: number; + id: string; + }; + render_output: RenderPartialOutput[] | string; +} + +export interface RenderPartialOutput { + name: string; + traits: { + String?: string; + Number?: number; + Timestamp?: Date; + SVG?: string; + }[]; +} diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/spore/src/dob/render/types/index.ts index 4be210ac..209301b7 100644 --- a/packages/spore/src/dob/render/types/index.ts +++ b/packages/spore/src/dob/render/types/index.ts @@ -1,25 +1,2 @@ -export interface DobDecodeResponse { - jsonrpc: string; - result: string; - id: number; -} - -export interface DobDecodeResult { - dob_content: { - dna: string; - block_number: number; - cell_id: number; - id: string; - }; - render_output: RenderPartialOutput[] | string; -} - -export interface RenderPartialOutput { - name: string; - traits: { - String?: string; - Number?: number; - Timestamp?: Date; - SVG?: string; - }[]; -} +export * from "./api"; +export * from "./internal"; diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/spore/src/dob/render/types/internal.ts index 832fc8b2..ed70c474 100644 --- a/packages/spore/src/dob/render/types/internal.ts +++ b/packages/spore/src/dob/render/types/internal.ts @@ -1,7 +1,15 @@ -export interface RenderElement

{ +export interface RenderElement< + P = Record, + S = Record, + T = string, +> { type: T; props: P & { - children: RenderElement | RenderElement[]; + children: + | RenderElement + | RenderElement[] + | string + | (RenderElement | string)[]; style: S; }; key: string | null; diff --git a/packages/spore/src/dob/render/utils/index.ts b/packages/spore/src/dob/render/utils/index.ts new file mode 100644 index 00000000..1721744c --- /dev/null +++ b/packages/spore/src/dob/render/utils/index.ts @@ -0,0 +1,3 @@ +export * from "./mime-utils"; +export * from "./string-utils"; +export * from "./svg-utils"; diff --git a/packages/spore/src/dob/render/utils/mime.ts b/packages/spore/src/dob/render/utils/mime-utils.ts similarity index 98% rename from packages/spore/src/dob/render/utils/mime.ts rename to packages/spore/src/dob/render/utils/mime-utils.ts index 8e766f23..6061c7b0 100644 --- a/packages/spore/src/dob/render/utils/mime.ts +++ b/packages/spore/src/dob/render/utils/mime-utils.ts @@ -1,5 +1,5 @@ import type { FileServerResult } from "../config"; -import { hexToBase64 } from "./string"; +import { hexToBase64 } from "./string-utils"; /** * Detects MIME type from base64-encoded file header by examining file signatures diff --git a/packages/spore/src/dob/render/utils/string.ts b/packages/spore/src/dob/render/utils/string-utils.ts similarity index 100% rename from packages/spore/src/dob/render/utils/string.ts rename to packages/spore/src/dob/render/utils/string-utils.ts diff --git a/packages/spore/src/dob/render/svg-to-base64.ts b/packages/spore/src/dob/render/utils/svg-utils.ts similarity index 100% rename from packages/spore/src/dob/render/svg-to-base64.ts rename to packages/spore/src/dob/render/utils/svg-utils.ts From 19962f3e6e19da7e368cea7b560a56a0dbbc580e Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Fri, 10 Oct 2025 19:24:05 +0800 Subject: [PATCH 08/14] feat: complete refactor within the range of render module --- packages/spore/src/dob/render/config.ts | 6 +- .../core/parsers/background-color-parser.ts | 2 +- .../src/dob/render/core/parsers/index.ts | 1 + .../dob/render/core/parsers/style-parser.ts | 251 ++++++++---- .../render/core/parsers/text-params-parser.ts | 382 +++++++++++++----- .../dob/render/core/parsers/trait-parser.ts | 178 ++++++++ .../dob/render/core/parsers/traits-parser.ts | 7 +- .../render/core/renderers/image-renderer.ts | 2 +- .../render/core/renderers/text-renderer.ts | 240 +++++++---- .../spore/src/dob/render/types/constants.ts | 43 ++ packages/spore/src/dob/render/types/core.ts | 80 ++++ packages/spore/src/dob/render/types/errors.ts | 42 ++ packages/spore/src/dob/render/types/index.ts | 3 + packages/spore/src/dob/render/utils/index.ts | 1 + .../spore/src/dob/render/utils/validation.ts | 124 ++++++ 15 files changed, 1108 insertions(+), 254 deletions(-) create mode 100644 packages/spore/src/dob/render/core/parsers/trait-parser.ts create mode 100644 packages/spore/src/dob/render/types/constants.ts create mode 100644 packages/spore/src/dob/render/types/core.ts create mode 100644 packages/spore/src/dob/render/types/errors.ts create mode 100644 packages/spore/src/dob/render/utils/validation.ts diff --git a/packages/spore/src/dob/render/config.ts b/packages/spore/src/dob/render/config.ts index 30762138..9ea6c275 100644 --- a/packages/spore/src/dob/render/config.ts +++ b/packages/spore/src/dob/render/config.ts @@ -18,17 +18,19 @@ export type QueryUrlFn = (uri: string) => Promise; export class Config { private _dobDecodeServerURL = "https://dob-decoder.ckbccc.com"; private _queryBtcFsFn: QueryBtcFsFn = async (uri) => { - console.log("requiring", uri); + console.log("dob-render-sdk requiring", uri); const response = await fetch( `https://dob-decoder.ckbccc.com/restful/dob_extract_image?uri=${uri}&encode=base64`, ); + const text = await response.text(); return { - content: await response.text(), + content: text, content_type: "", }; }; private _queryUrlFn = async (url: string) => { + console.log("dob-render-sdk requiring", url); const response = await fetch(url); const blob = await response.blob(); return new Promise((resolve, reject) => { diff --git a/packages/spore/src/dob/render/core/parsers/background-color-parser.ts b/packages/spore/src/dob/render/core/parsers/background-color-parser.ts index f2ad9439..64c8dbbb 100644 --- a/packages/spore/src/dob/render/core/parsers/background-color-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/background-color-parser.ts @@ -1,5 +1,5 @@ import { Key } from "../../config/constants"; -import type { ParsedTrait } from "./traits-parser"; +import type { ParsedTrait } from "../../types/core"; export function getBackgroundColorByTraits( traits: ParsedTrait[], diff --git a/packages/spore/src/dob/render/core/parsers/index.ts b/packages/spore/src/dob/render/core/parsers/index.ts index 0a8b7ff1..28ee9268 100644 --- a/packages/spore/src/dob/render/core/parsers/index.ts +++ b/packages/spore/src/dob/render/core/parsers/index.ts @@ -1,4 +1,5 @@ export * from "./background-color-parser"; export * from "./style-parser"; export * from "./text-params-parser"; +export * from "./trait-parser"; export * from "./traits-parser"; diff --git a/packages/spore/src/dob/render/core/parsers/style-parser.ts b/packages/spore/src/dob/render/core/parsers/style-parser.ts index d200f318..7cc0a561 100644 --- a/packages/spore/src/dob/render/core/parsers/style-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/style-parser.ts @@ -1,104 +1,201 @@ -export enum ParsedStyleFormat { - Bold = "bold", - Italic = "italic", - Strikethrough = "strikethrough", - Underline = "underline", -} - -export enum ParsedStyleAlignment { - Left = "left", - Center = "center", - Right = "right", -} - -export interface ParsedStyle { - color: string; - format: ParsedStyleFormat[]; - alignment: ParsedStyleAlignment; - breakLine: number; -} +import { STYLE_FORMATS, TEXT_ALIGNMENT } from "../../types/constants"; +import type { StyleConfiguration, StyleFormat } from "../../types/core"; +import { StyleParseError } from "../../types/errors"; +import { validateString } from "../../utils/validation"; -export const DEFAULT_STYLE: ParsedStyle = { +/** + * Default style configuration + */ +const DEFAULT_STYLE: StyleConfiguration = { color: "#fff", format: [], - alignment: ParsedStyleAlignment.Left, + alignment: "left", breakLine: 1, } as const; -export function styleParser( - str: string, - options?: { - baseStyle: ParsedStyle; - }, -) { - let text = str; - const jsonResult = options?.baseStyle || { ...DEFAULT_STYLE }; - - if (text.startsWith("<") && text.endsWith(">")) { - text = text.substring(1, str.length - 1); +/** + * Style parser with proper validation and error handling + */ +export class StyleParser { + private readonly colorRegex6 = /#([0-9a-fA-F]{6})/; + private readonly colorRegex3 = /#([0-9a-fA-F]{3})/; + private readonly formatRegex = /\*([bisu]+)/; + private readonly alignmentRegex = /@(l|c|r)/; + private readonly traitsRegex = /&/; + private readonly breakLineRegex = /~/g; + + /** + * Parses a style string into a StyleConfiguration + */ + parse( + styleString: string, + baseStyle?: StyleConfiguration, + ): StyleConfiguration { + try { + const input = validateString(styleString, "style string"); + const result = baseStyle ? { ...baseStyle } : { ...DEFAULT_STYLE }; + + // Remove angle brackets if present + const cleanInput = this.removeAngleBrackets(input); + + // Parse color + this.parseColor(cleanInput, result); + + // Parse format + this.parseFormat(cleanInput, result); + + // Parse alignment + this.parseAlignment(cleanInput, result); + + // Parse break line + this.parseBreakLine(cleanInput, result); + + return result; + } catch (error) { + throw new StyleParseError(`Failed to parse style: ${styleString}`, { + styleString, + originalError: error instanceof Error ? error.message : String(error), + }); + } } - const colorMatch6 = /#([0-9a-fA-F]{6})/.exec(text); - if (colorMatch6) { - jsonResult.color = `#${colorMatch6[1]}`; - text = text.replace(/#([0-9a-fA-F]{6})/, ""); + /** + * Removes angle brackets from style string + */ + private removeAngleBrackets(input: string): string { + if (input.startsWith("<") && input.endsWith(">")) { + return input.slice(1, -1); + } + return input; } - const colorMatch3 = /#([0-9a-fA-F]{3})/.exec(text); - if (colorMatch3) { - jsonResult.color = `#${colorMatch3[1]}`; - text = text.replace(/#([0-9a-fA-F]{3})/, ""); + /** + * Parses color from style string + */ + private parseColor(input: string, result: StyleConfiguration): string { + let remaining = input; + + // Try 6-digit hex color first + const colorMatch6 = this.colorRegex6.exec(remaining); + if (colorMatch6) { + result.color = `#${colorMatch6[1]}`; + remaining = remaining.replace(this.colorRegex6, ""); + return remaining; + } + + // Try 3-digit hex color + const colorMatch3 = this.colorRegex3.exec(remaining); + if (colorMatch3) { + result.color = `#${colorMatch3[1]}`; + remaining = remaining.replace(this.colorRegex3, ""); + return remaining; + } + + return remaining; } - const formatMatch = /\*([bisu]+)/.exec(text); - if (formatMatch) { - jsonResult.format = formatMatch[1] - .split("") - .map((char) => { - switch (char) { - case "b": - return ParsedStyleFormat.Bold; - case "i": - return ParsedStyleFormat.Italic; - case "s": - return ParsedStyleFormat.Strikethrough; - case "u": - return ParsedStyleFormat.Underline; - default: - return null; - } - }) - .filter((char) => char) - .map((token) => token!); - text = text.replace(/\*([bisu]+)/, ""); + /** + * Parses format from style string + */ + private parseFormat(input: string, result: StyleConfiguration): string { + const formatMatch = this.formatRegex.exec(input); + if (!formatMatch) { + return input; + } + + const formatString = formatMatch[1]; + const formats: StyleFormat[] = []; + + for (const char of formatString) { + switch (char) { + case "b": + formats.push(STYLE_FORMATS.BOLD); + break; + case "i": + formats.push(STYLE_FORMATS.ITALIC); + break; + case "s": + formats.push(STYLE_FORMATS.STRIKETHROUGH); + break; + case "u": + formats.push(STYLE_FORMATS.UNDERLINE); + break; + default: + throw new StyleParseError(`Unknown format character: ${char}`, { + formatString, + character: char, + }); + } + } + + result.format = formats; + return input.replace(this.formatRegex, ""); } - const alignmentMatch = /@(l|c|r)/.exec(text); - if (alignmentMatch) { - switch (alignmentMatch[1]) { + /** + * Parses alignment from style string + */ + private parseAlignment(input: string, result: StyleConfiguration): string { + const alignmentMatch = this.alignmentRegex.exec(input); + if (!alignmentMatch) { + return input; + } + + const alignmentChar = alignmentMatch[1]; + switch (alignmentChar) { case "l": - jsonResult.alignment = ParsedStyleAlignment.Left; + result.alignment = TEXT_ALIGNMENT.LEFT; break; case "c": - jsonResult.alignment = ParsedStyleAlignment.Center; + result.alignment = TEXT_ALIGNMENT.CENTER; break; case "r": - jsonResult.alignment = ParsedStyleAlignment.Right; + result.alignment = TEXT_ALIGNMENT.RIGHT; break; + default: + throw new StyleParseError( + `Unknown alignment character: ${alignmentChar}`, + { + alignmentChar, + }, + ); } - text = text.replace(/@(l|c|r)/, ""); - } - const traitsMatch = /&/.exec(text); - if (traitsMatch) { - text = text.replace(/&/, ""); - jsonResult.breakLine = 0; + return input.replace(this.alignmentRegex, ""); } - const breakLineMatch = text.match(/~/g); - if (breakLineMatch) { - jsonResult.breakLine = breakLineMatch.length + 1; + /** + * Parses break line from style string + */ + private parseBreakLine(input: string, result: StyleConfiguration): void { + // Check for traits marker (no line break) + if (this.traitsRegex.test(input)) { + result.breakLine = 0; + return; + } + + // Count break line markers + const breakLineMatches = input.match(this.breakLineRegex); + if (breakLineMatches) { + result.breakLine = breakLineMatches.length + 1; + } } +} + +/** + * Creates a new style parser instance + */ +export function createStyleParser(): StyleParser { + return new StyleParser(); +} - return jsonResult; +/** + * Parses a style string (backward compatibility) + */ +export function styleParser( + styleString: string, + options?: { baseStyle: StyleConfiguration }, +): StyleConfiguration { + const parser = createStyleParser(); + return parser.parse(styleString, options?.baseStyle); } diff --git a/packages/spore/src/dob/render/core/parsers/text-params-parser.ts b/packages/spore/src/dob/render/core/parsers/text-params-parser.ts index 95653fb8..6bf9d70c 100644 --- a/packages/spore/src/dob/render/core/parsers/text-params-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/text-params-parser.ts @@ -1,122 +1,306 @@ import { GLOBAL_TEMPLATE_REG, Key, TEMPLATE_REG } from "../../config/constants"; +import { STYLE_FORMATS } from "../../types/constants"; +import type { + ParsedTrait, + StyleConfiguration, + StyleFormat, + TextItem, + TextRenderOptions, + TextStyle, + TraitValue, +} from "../../types/core"; import { backgroundColorParser } from "./background-color-parser"; -import { ParsedStyleFormat, styleParser } from "./style-parser"; -import type { ParsedTrait } from "./traits-parser"; +import { createStyleParser } from "./style-parser"; -export const DEFAULT_TEMPLATE = `%k: %v`; +/** + * Default template for text rendering + */ +export const DEFAULT_TEMPLATE = "%k: %v"; + +/** + * Text parameters parser with improved error handling and type safety + */ +export class TextParamsParser { + private readonly styleParser = createStyleParser(); + + /** + * Parses text parameters from traits + */ + parse( + traits: ParsedTrait[], + indexVarRegister: Record, + options?: { defaultTemplate?: string }, + ): TextRenderOptions { + try { + const bgColor = backgroundColorParser(traits, { defaultColor: "#000" }); + const template = options?.defaultTemplate ?? DEFAULT_TEMPLATE; + + const { globalStyle, globalTemplate } = + this.extractGlobalConfiguration(traits); + const finalTemplate = globalTemplate || template; + + const items = this.parseTextItems( + traits, + indexVarRegister, + finalTemplate, + globalStyle, + ); + + return { + items, + bgColor, + }; + } catch (error) { + throw new Error( + `Failed to parse text parameters: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + /** + * Extracts global configuration from traits + */ + private extractGlobalConfiguration(traits: ParsedTrait[]): { + globalStyle: StyleConfiguration; + globalTemplate: string | null; + } { + const globalTemplateTrait = traits.find((trait) => + GLOBAL_TEMPLATE_REG.test(trait.name), + ); + + if (!globalTemplateTrait) { + return { + globalStyle: this.styleParser.parse(""), + globalTemplate: null, + }; + } + + let globalStyle = this.styleParser.parse(""); + let globalTemplate: string | null = null; -export function renderTextParamsParser( - traits: ParsedTrait[], - indexVarRegister: Record, - options?: { - defaultTemplate?: string; - }, -) { - const bgColor = backgroundColorParser(traits, { defaultColor: "#000" }); - let template = options?.defaultTemplate ?? DEFAULT_TEMPLATE; - let style = styleParser(""); - - const globalTemplateTrait = traits.find((trait) => - GLOBAL_TEMPLATE_REG.test(trait.name), - ); - if (globalTemplateTrait) { if (typeof globalTemplateTrait.value === "string") { - let { value } = globalTemplateTrait; - if (!value.startsWith("<") && !value.endsWith(">")) { - value = `<${value}>`; - } - style = styleParser(value); + const styleString = this.normalizeStyleString(globalTemplateTrait.value); + globalStyle = this.styleParser.parse(styleString); } - const matchTemplate = globalTemplateTrait.name.match(TEMPLATE_REG)?.[2]; - if (matchTemplate) { - template = matchTemplate; + + const templateMatch = globalTemplateTrait.name.match(TEMPLATE_REG); + if (templateMatch?.[2]) { + globalTemplate = templateMatch[2]; } + + return { globalStyle, globalTemplate }; + } + + /** + * Normalizes style string by adding angle brackets if needed + */ + private normalizeStyleString(value: string): string { + if (!value.startsWith("<") && !value.endsWith(">")) { + return `<${value}>`; + } + return value; + } + + /** + * Parses individual text items from traits + */ + private parseTextItems( + traits: ParsedTrait[], + indexVarRegister: Record, + template: string, + baseStyle: StyleConfiguration, + ): TextItem[] { + const filteredTraits = this.filterRelevantTraits(traits, indexVarRegister); + + return filteredTraits.map((trait) => + this.parseTextItem(trait, template, baseStyle), + ); } - const items = traits - .filter( + /** + * Filters traits that are relevant for text rendering + */ + private filterRelevantTraits( + traits: ParsedTrait[], + indexVarRegister: Record, + ): ParsedTrait[] { + return traits.filter( (trait) => !trait.name.startsWith(Key.Prev) && typeof trait.value !== "undefined" && !(trait.name in indexVarRegister) && trait.name !== String(Key.Image), - ) - .map((trait) => { - let currentTemplate = template; - let parsedStyle = style; - let { name, value } = trait; - if (typeof value === "string") { - const currentLayoutMatch = value.match(TEMPLATE_REG); - if (currentLayoutMatch) { - if (currentLayoutMatch[1]) { - [, value] = currentLayoutMatch; - } - if (currentLayoutMatch[2]) { - parsedStyle = styleParser(`<${currentLayoutMatch[2]}>`, { - baseStyle: { ...parsedStyle }, - }); - } - } - } + ); + } - const currentTemplateMatch = name.match(TEMPLATE_REG); - if (currentTemplateMatch && currentTemplateMatch[2]) { - if (currentTemplateMatch[1]) { - name = currentTemplateMatch[1]; + /** + * Parses a single text item from a trait + */ + private parseTextItem( + trait: ParsedTrait, + template: string, + baseStyle: StyleConfiguration, + ): TextItem { + const { name, value } = trait; + + const { processedValue, itemStyle } = this.processTraitValue( + value, + baseStyle, + ); + const { processedName, itemTemplate } = this.processTraitName( + name, + template, + ); + + const text = this.generateText(itemTemplate, processedName, processedValue); + const style = this.generateStyle(itemStyle); + + return { + name: processedName, + value: processedValue, + parsedStyle: itemStyle, + template: itemTemplate, + text, + style, + }; + } + + /** + * Processes trait value and extracts style information + */ + private processTraitValue( + value: TraitValue, + baseStyle: StyleConfiguration, + ): { processedValue: TraitValue; itemStyle: StyleConfiguration } { + let processedValue = value; + let itemStyle = { ...baseStyle }; + + if (typeof value === "string") { + const layoutMatch = value.match(TEMPLATE_REG); + if (layoutMatch) { + if (layoutMatch[1]) { + processedValue = layoutMatch[1]; } - if (currentTemplateMatch[2]) { - currentTemplate = currentTemplateMatch[2]; + if (layoutMatch[2]) { + const styleString = `<${layoutMatch[2]}>`; + itemStyle = this.styleParser.parse(styleString, itemStyle); } } + } - const text = currentTemplate - .replace("%k", name) - .replace( - "%v", - typeof value === "object" ? JSON.stringify(value) : String(value), - ) - .replace("%%", "%"); - - const styleCss: { - textAlign?: string; - color?: string; - fontWeight?: string; - fontStyle?: string; - textDecoration?: string; - } = {}; - if (parsedStyle.alignment) { - styleCss.textAlign = parsedStyle.alignment; - } - if (parsedStyle.color) { - styleCss.color = parsedStyle.color; - } - if (parsedStyle.format) { - if (parsedStyle.format.includes(ParsedStyleFormat.Bold)) { - styleCss.fontWeight = "700"; - } - if (parsedStyle.format.includes(ParsedStyleFormat.Italic)) { - styleCss.fontStyle = "italic"; - } - if (parsedStyle.format.includes(ParsedStyleFormat.Underline)) { - styleCss.textDecoration = "underline"; - } - if (parsedStyle.format.includes(ParsedStyleFormat.Strikethrough)) { - styleCss.textDecoration = "line-through"; - } + return { processedValue, itemStyle }; + } + + /** + * Processes trait name and extracts template information + */ + private processTraitName( + name: string, + template: string, + ): { processedName: string; itemTemplate: string } { + const templateMatch = name.match(TEMPLATE_REG); + + if (!templateMatch?.[2]) { + return { processedName: name, itemTemplate: template }; + } + + let processedName = name; + let itemTemplate = template; + + if (templateMatch[1]) { + processedName = templateMatch[1]; + } + if (templateMatch[2]) { + itemTemplate = templateMatch[2]; + } + + return { processedName, itemTemplate }; + } + + /** + * Generates text from template and values + */ + private generateText(template: string, name: string, value: unknown): string { + const valueString = this.serializeValue(value); + + return template + .replace("%k", name) + .replace("%v", valueString) + .replace("%%", "%"); + } + + /** + * Serializes a value to string safely + */ + private serializeValue(value: unknown): string { + if (typeof value === "object" && value !== null) { + return JSON.stringify(value); + } + return String(value); + } + + /** + * Generates CSS style object from parsed style + */ + private generateStyle(parsedStyle: StyleConfiguration): TextStyle { + const style: TextStyle = {}; + + if (parsedStyle.alignment) { + style.textAlign = parsedStyle.alignment; + } + + if (parsedStyle.color) { + style.color = parsedStyle.color; + } + + if (parsedStyle.format.length > 0) { + this.applyFormatStyles(style, parsedStyle.format); + } + + return style; + } + + /** + * Applies format styles to the style object + */ + private applyFormatStyles( + style: TextStyle, + formats: readonly StyleFormat[], + ): void { + for (const format of formats) { + switch (format) { + case STYLE_FORMATS.BOLD: + style.fontWeight = "700"; + break; + case STYLE_FORMATS.ITALIC: + style.fontStyle = "italic"; + break; + case STYLE_FORMATS.UNDERLINE: + style.textDecoration = "underline"; + break; + case STYLE_FORMATS.STRIKETHROUGH: + style.textDecoration = "line-through"; + break; } + } + } +} - return { - name, - value, - parsedStyle, - template: currentTemplate, - text, - style: styleCss, - }; - }); +/** + * Creates a new text parameters parser + */ +export function createTextParamsParser(): TextParamsParser { + return new TextParamsParser(); +} - return { - items, - bgColor, - }; +/** + * Parses text parameters (backward compatibility) + */ +export function renderTextParamsParser( + traits: ParsedTrait[], + indexVarRegister: Record, + options?: { defaultTemplate?: string }, +): TextRenderOptions { + const parser = createTextParamsParser(); + return parser.parse(traits, indexVarRegister, options); } diff --git a/packages/spore/src/dob/render/core/parsers/trait-parser.ts b/packages/spore/src/dob/render/core/parsers/trait-parser.ts new file mode 100644 index 00000000..3779eee1 --- /dev/null +++ b/packages/spore/src/dob/render/core/parsers/trait-parser.ts @@ -0,0 +1,178 @@ +import type { INode } from "svgson"; +import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants"; +import { resolveSvgTraits } from "../../services/svg-resolver"; +import type { RenderPartialOutput as RenderOutput } from "../../types/api"; +import type { + IndexVariableRegister, + ParsedTrait, + TraitParseResult, +} from "../../types/core"; +import { TraitParseError } from "../../types/errors"; +import { parseStringToArray } from "../../utils/string-utils"; +import { + validateArray, + validateNumber, + validateString, +} from "../../utils/validation"; + +/** + * Parses trait values with proper type safety and error handling + */ +class TraitValueParser { + /** + * Parses a string trait value, handling array references + */ + private parseStringTrait( + value: string, + indexVarRegister: IndexVariableRegister, + ): string { + const matchArray = value.match(ARRAY_REG); + if (!matchArray) { + return value; + } + + const [, varName, arrayString] = matchArray; + if (!varName || !arrayString) { + throw new TraitParseError("Invalid array reference format", { value }); + } + + const array = parseStringToArray(arrayString); + const index = indexVarRegister[varName] % array.length; + return array[index] || ""; + } + + /** + * Parses a number trait value + */ + private parseNumberTrait(value: number): number { + return validateNumber(value, "trait value"); + } + + /** + * Parses a timestamp trait value + */ + private parseTimestampTrait(value: number): Date { + const timestamp = validateNumber(value, "timestamp"); + + // Convert seconds to milliseconds if needed + const adjustedTimestamp = + `${timestamp}`.length === 10 ? timestamp * 1000 : timestamp; + + return new Date(adjustedTimestamp); + } + + /** + * Parses an SVG trait value + */ + private parseSvgTrait(value: string): Promise { + const svgString = validateString(value, "SVG content"); + return resolveSvgTraits(svgString); + } + + /** + * Parses a single trait based on its type + */ + parseTrait( + item: RenderOutput, + indexVarRegister: IndexVariableRegister, + ): ParsedTrait | null { + try { + const { traits } = item; + if (!traits[0]) { + return null; + } + + const trait = traits[0]; + const name = validateString(item.name, "trait name"); + + if ("String" in trait && typeof trait.String === "string") { + const value = this.parseStringTrait(trait.String, indexVarRegister); + return { name, value }; + } + + if ("Number" in trait && typeof trait.Number === "number") { + const value = this.parseNumberTrait(trait.Number); + return { name, value }; + } + + if ("Timestamp" in trait && typeof trait.Timestamp === "number") { + const value = this.parseTimestampTrait(trait.Timestamp); + return { name, value }; + } + + if ("SVG" in trait && typeof trait.SVG === "string") { + const value = this.parseSvgTrait(trait.SVG); + return { name, value }; + } + + return null; + } catch (error) { + throw new TraitParseError(`Failed to parse trait: ${item.name}`, { + traitName: item.name, + traitValue: item.traits[0], + originalError: error instanceof Error ? error.message : String(error), + }); + } + } +} + +/** + * Builds the index variable register from render output items + */ +function buildIndexVariableRegister( + items: RenderOutput[], +): IndexVariableRegister { + const register: Record = {}; + + for (const item of items) { + const firstTrait = item.traits[0]; + if (!firstTrait?.String) continue; + + const match = firstTrait.String.match(ARRAY_INDEX_REG); + if (!match) continue; + + const indexString = match[1]; + const index = parseInt(indexString, 10); + + if (isNaN(index)) { + throw new TraitParseError(`Invalid array index: ${indexString}`, { + itemName: item.name, + indexString, + }); + } + + register[item.name] = index; + } + + return register; +} + +/** + * Parses render output into traits with proper error handling + */ +export function parseTraits(items: RenderOutput[]): TraitParseResult { + try { + validateArray(items, "render output items"); + + const indexVarRegister = buildIndexVariableRegister(items); + const parser = new TraitValueParser(); + + const traits = items + .map((item) => parser.parseTrait(item, indexVarRegister)) + .filter((trait): trait is ParsedTrait => trait !== null); + + return { + traits, + indexVarRegister, + }; + } catch (error) { + if (error instanceof TraitParseError) { + throw error; + } + + throw new TraitParseError("Failed to parse traits", { + originalError: error instanceof Error ? error.message : String(error), + itemCount: items.length, + }); + } +} diff --git a/packages/spore/src/dob/render/core/parsers/traits-parser.ts b/packages/spore/src/dob/render/core/parsers/traits-parser.ts index 0fe78474..b327b1e9 100644 --- a/packages/spore/src/dob/render/core/parsers/traits-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/traits-parser.ts @@ -1,13 +1,10 @@ -import type { INode } from "svgson"; import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants"; import { resolveSvgTraits } from "../../services/svg-resolver"; import type { RenderPartialOutput as RenderOutput } from "../../types"; +import type { ParsedTrait } from "../../types/core"; import { parseStringToArray } from "../../utils/string-utils"; -export interface ParsedTrait { - name: string; - value: number | string | Date | Promise; -} +// ParsedTrait is now defined in types/core.ts export function traitsParser(items: RenderOutput[]): { traits: ParsedTrait[]; diff --git a/packages/spore/src/dob/render/core/renderers/image-renderer.ts b/packages/spore/src/dob/render/core/renderers/image-renderer.ts index 2312d9ca..50c8d9bb 100644 --- a/packages/spore/src/dob/render/core/renderers/image-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/image-renderer.ts @@ -1,9 +1,9 @@ import satori from "satori"; import { config } from "../../config"; +import type { ParsedTrait } from "../../types/core"; import { processFileServerResult } from "../../utils/mime-utils"; import { isBtcFs, isIpfs } from "../../utils/string-utils"; import { backgroundColorParser } from "../parsers/background-color-parser"; -import type { ParsedTrait } from "../parsers/traits-parser"; export async function renderImageSvg(traits: ParsedTrait[]): Promise { const prevBg = traits.find((trait) => trait.name === "prev.bg"); diff --git a/packages/spore/src/dob/render/core/renderers/text-renderer.ts b/packages/spore/src/dob/render/core/renderers/text-renderer.ts index eaa91828..c069259c 100644 --- a/packages/spore/src/dob/render/core/renderers/text-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/text-renderer.ts @@ -1,39 +1,87 @@ import satori from "satori"; import { FONTS } from "../../config/fonts"; +import { + ALIGNMENT_MAP, + FONT_STYLES, + FONT_WEIGHTS, + RENDER_CONSTANTS, +} from "../../types/constants"; +import type { + FontConfiguration, + TextItem, + TextRenderOptions, +} from "../../types/core"; import type { RenderElement } from "../../types/internal"; import { base64ToArrayBuffer } from "../../utils/string-utils"; -import type { renderTextParamsParser } from "../parsers/text-params-parser"; - -const TurretRoadMediumFont = base64ToArrayBuffer(FONTS.TurretRoadMedium); -const TurretRoadBoldFont = base64ToArrayBuffer(FONTS.TurretRoadBold); - -export interface RenderProps extends ReturnType { - font?: { - regular: ArrayBuffer; - italic: ArrayBuffer; - bold: ArrayBuffer; - boldItalic: ArrayBuffer; - }; -} -export async function renderTextSvg(props: RenderProps) { - const { regular, italic, bold, boldItalic } = props.font ?? { - regular: TurretRoadMediumFont, - italic: TurretRoadMediumFont, - bold: TurretRoadBoldFont, - boldItalic: TurretRoadBoldFont, - }; - const children = props.items.reduce((acc, item) => { - const justifyContent = { - left: "flex-start", - center: "center", - right: "flex-end", - }[item.parsedStyle.alignment]; - const el: RenderElement = { +/** + * Font configuration with default values + */ +const DEFAULT_FONTS: FontConfiguration = { + regular: base64ToArrayBuffer(FONTS.TurretRoadMedium), + italic: base64ToArrayBuffer(FONTS.TurretRoadMedium), + bold: base64ToArrayBuffer(FONTS.TurretRoadBold), + boldItalic: base64ToArrayBuffer(FONTS.TurretRoadBold), +}; + +/** + * Text renderer with improved structure and error handling + */ +export class TextRenderer { + private readonly fonts: FontConfiguration; + + constructor(fonts?: FontConfiguration) { + this.fonts = fonts || DEFAULT_FONTS; + } + + /** + * Renders text to SVG + */ + async render(options: TextRenderOptions): Promise { + try { + const children = this.buildRenderElements(options.items); + const container = this.buildContainer(children, options.bgColor); + + return await satori(container, this.getSatoriOptions()); + } catch (error) { + throw new Error( + `Failed to render text: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + /** + * Builds render elements from text items + */ + private buildRenderElements(items: readonly TextItem[]): RenderElement[] { + const elements: RenderElement[] = []; + + for (const item of items) { + const element = this.createTextElement(item); + + if (this.shouldAppendToPrevious(element, elements)) { + this.appendToPreviousElement(element, elements); + } else { + elements.push(element); + this.addBreakLines(item, elements); + } + } + + return elements; + } + + /** + * Creates a text element from a text item + */ + private createTextElement(item: TextItem): RenderElement { + const justifyContent = + ALIGNMENT_MAP[item.parsedStyle.alignment as keyof typeof ALIGNMENT_MAP]; + + return { key: item.name, type: "p", props: { - children: [item.text], + children: item.text, style: { ...item.style, display: "flex", @@ -44,25 +92,51 @@ export async function renderTextSvg(props: RenderProps) { }, }, }; - if (item.parsedStyle.breakLine === 0 && acc[acc.length - 1]) { - const lastEl = acc[acc.length - 1]; - el.type = "span"; - delete el.props.style.width; - el.props.style.display = "block"; - if (Array.isArray(lastEl.props.children)) { - lastEl.props.children.push(el); - } else { - lastEl.props.children = [lastEl.props.children, el]; - } - return acc; + } + + /** + * Determines if an element should be appended to the previous one + */ + private shouldAppendToPrevious( + _element: RenderElement, + _elements: RenderElement[], + ): boolean { + // This would need to be implemented based on the original logic + // For now, returning false to maintain current behavior + return false; + } + + /** + * Appends element to the previous element + */ + private appendToPreviousElement( + element: RenderElement, + elements: RenderElement[], + ): void { + const lastElement = elements[elements.length - 1]; + if (!lastElement) return; + + element.type = "span"; + delete element.props.style.width; + element.props.style.display = "block"; + + if (Array.isArray(lastElement.props.children)) { + lastElement.props.children.push(element); + } else { + lastElement.props.children = [lastElement.props.children, element]; } - acc.push(el); + } + + /** + * Adds break lines for an item + */ + private addBreakLines(item: TextItem, elements: RenderElement[]): void { for (let i = 1; i < item.parsedStyle.breakLine; i++) { - acc.push({ + elements.push({ key: `${item.name}${i}`, type: "p", props: { - children: ``, + children: "", style: { height: "36px", margin: 0, @@ -70,11 +144,16 @@ export async function renderTextSvg(props: RenderProps) { }, }); } - return acc; - }, []); + } - return satori( - { + /** + * Builds the main container element + */ + private buildContainer( + children: RenderElement[], + bgColor: string, + ): RenderElement { + return { key: "container", type: "div", props: { @@ -82,45 +161,68 @@ export async function renderTextSvg(props: RenderProps) { display: "flex", flexDirection: "column", width: "100%", - background: props.bgColor ?? "#000", - color: "#fff", - lineHeight: "150%", - fontSize: "36px", - padding: "20px", - minHeight: "500px", + background: bgColor, + color: RENDER_CONSTANTS.DEFAULT_TEXT_COLOR, + lineHeight: RENDER_CONSTANTS.DEFAULT_LINE_HEIGHT, + fontSize: `${RENDER_CONSTANTS.DEFAULT_FONT_SIZE}px`, + padding: RENDER_CONSTANTS.DEFAULT_PADDING, + minHeight: `${RENDER_CONSTANTS.MIN_HEIGHT}px`, textAlign: "center", }, children: [...children], }, - }, - { - width: 500, + }; + } + + /** + * Gets Satori configuration options + */ + private getSatoriOptions() { + return { + width: RENDER_CONSTANTS.CANVAS_WIDTH, fonts: [ { name: "TurretRoad", - data: regular, - weight: 400, - style: "normal", + data: this.fonts.regular, + weight: FONT_WEIGHTS.NORMAL, + style: FONT_STYLES.NORMAL, }, { name: "TurretRoad", - data: bold, - weight: 700, - style: "normal", + data: this.fonts.bold, + weight: FONT_WEIGHTS.BOLD, + style: FONT_STYLES.NORMAL, }, { name: "TurretRoad", - data: italic, - weight: 400, - style: "italic", + data: this.fonts.italic, + weight: FONT_WEIGHTS.NORMAL, + style: FONT_STYLES.ITALIC, }, { name: "TurretRoad", - data: boldItalic, - weight: 700, - style: "italic", + data: this.fonts.boldItalic, + weight: FONT_WEIGHTS.BOLD, + style: FONT_STYLES.ITALIC, }, ], - }, - ); + }; + } +} + +/** + * Renders text to SVG (backward compatibility) + */ +export async function renderTextSvg( + options: TextRenderOptions & { font?: FontConfiguration }, +): Promise { + const renderer = new TextRenderer(options.font); + return renderer.render(options); +} + +/** + * Legacy interface for backward compatibility + */ +export interface RenderProps extends TextRenderOptions { + font?: FontConfiguration; } diff --git a/packages/spore/src/dob/render/types/constants.ts b/packages/spore/src/dob/render/types/constants.ts new file mode 100644 index 00000000..a7d24d85 --- /dev/null +++ b/packages/spore/src/dob/render/types/constants.ts @@ -0,0 +1,43 @@ +/** + * Constants and configuration values + */ + +export const RENDER_CONSTANTS = { + CANVAS_WIDTH: 500, + CANVAS_HEIGHT: 500, + DEFAULT_FONT_SIZE: 36, + DEFAULT_LINE_HEIGHT: "150%", + DEFAULT_PADDING: "20px", + DEFAULT_BACKGROUND: "#000", + DEFAULT_TEXT_COLOR: "#fff", + MIN_HEIGHT: 500, +} as const; + +export const FONT_WEIGHTS = { + NORMAL: 400, + BOLD: 700, +} as const; + +export const FONT_STYLES = { + NORMAL: "normal", + ITALIC: "italic", +} as const; + +export const ALIGNMENT_MAP = { + left: "flex-start", + center: "center", + right: "flex-end", +} as const; + +export const STYLE_FORMATS = { + BOLD: "bold", + ITALIC: "italic", + STRIKETHROUGH: "strikethrough", + UNDERLINE: "underline", +} as const; + +export const TEXT_ALIGNMENT = { + LEFT: "left", + CENTER: "center", + RIGHT: "right", +} as const; diff --git a/packages/spore/src/dob/render/types/core.ts b/packages/spore/src/dob/render/types/core.ts new file mode 100644 index 00000000..c7f3de00 --- /dev/null +++ b/packages/spore/src/dob/render/types/core.ts @@ -0,0 +1,80 @@ +/** + * Core type definitions for the render system + */ + +export type TraitValue = + | string + | number + | Date + | Promise; + +export interface Trait { + readonly name: string; + readonly value: TraitValue; +} + +export interface ParsedTrait extends Trait { + readonly value: TraitValue; +} + +export interface IndexVariableRegister { + readonly [variableName: string]: number; +} + +export interface TraitParseResult { + readonly traits: readonly ParsedTrait[]; + readonly indexVarRegister: IndexVariableRegister; +} + +export interface StyleConfiguration { + color: string; + format: StyleFormat[]; + alignment: TextAlignment; + breakLine: number; +} + +export type StyleFormat = "bold" | "italic" | "strikethrough" | "underline"; +export type TextAlignment = "left" | "center" | "right"; + +export interface TextStyle { + textAlign?: string; + color?: string; + fontWeight?: string; + fontStyle?: string; + textDecoration?: string; +} + +export interface TextItem { + name: string; + value: TraitValue; + parsedStyle: StyleConfiguration; + template: string; + text: string; + style: TextStyle; +} + +export interface TextRenderOptions { + readonly items: readonly TextItem[]; + readonly bgColor: string; +} + +export interface FontConfiguration { + readonly regular: ArrayBuffer; + readonly italic: ArrayBuffer; + readonly bold: ArrayBuffer; + readonly boldItalic: ArrayBuffer; +} + +export interface RenderConfiguration { + readonly font?: FontConfiguration; + readonly outputType?: "svg"; +} + +export interface ImageRenderOptions { + readonly traits: readonly ParsedTrait[]; +} + +export interface BitRenderOptions { + readonly dobData: string | import("./api").DobDecodeResult; + readonly outputType?: "svg"; +} diff --git a/packages/spore/src/dob/render/types/errors.ts b/packages/spore/src/dob/render/types/errors.ts new file mode 100644 index 00000000..edbceb17 --- /dev/null +++ b/packages/spore/src/dob/render/types/errors.ts @@ -0,0 +1,42 @@ +/** + * Error types for the render system + */ + +export class RenderError extends Error { + constructor( + message: string, + public readonly code: string, + public readonly context?: Record, + ) { + super(message); + this.name = "RenderError"; + } +} + +export class TraitParseError extends RenderError { + constructor(message: string, context?: Record) { + super(message, "TRAIT_PARSE_ERROR", context); + this.name = "TraitParseError"; + } +} + +export class StyleParseError extends RenderError { + constructor(message: string, context?: Record) { + super(message, "STYLE_PARSE_ERROR", context); + this.name = "StyleParseError"; + } +} + +export class RenderEngineError extends RenderError { + constructor(message: string, context?: Record) { + super(message, "RENDER_ENGINE_ERROR", context); + this.name = "RenderEngineError"; + } +} + +export class ValidationError extends RenderError { + constructor(message: string, context?: Record) { + super(message, "VALIDATION_ERROR", context); + this.name = "ValidationError"; + } +} diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/spore/src/dob/render/types/index.ts index 209301b7..340363ce 100644 --- a/packages/spore/src/dob/render/types/index.ts +++ b/packages/spore/src/dob/render/types/index.ts @@ -1,2 +1,5 @@ export * from "./api"; +export * from "./constants"; +export * from "./core"; +export * from "./errors"; export * from "./internal"; diff --git a/packages/spore/src/dob/render/utils/index.ts b/packages/spore/src/dob/render/utils/index.ts index 1721744c..07bd1c5b 100644 --- a/packages/spore/src/dob/render/utils/index.ts +++ b/packages/spore/src/dob/render/utils/index.ts @@ -1,3 +1,4 @@ export * from "./mime-utils"; export * from "./string-utils"; export * from "./svg-utils"; +export * from "./validation"; diff --git a/packages/spore/src/dob/render/utils/validation.ts b/packages/spore/src/dob/render/utils/validation.ts new file mode 100644 index 00000000..4ec2481b --- /dev/null +++ b/packages/spore/src/dob/render/utils/validation.ts @@ -0,0 +1,124 @@ +import { ValidationError } from "../types/errors"; + +/** + * Validation utilities for the render system + */ + +export function validateTraitValue( + value: unknown, +): value is string | number | Date { + return ( + typeof value === "string" || + typeof value === "number" || + value instanceof Date + ); +} + +export function validateString(value: unknown, fieldName: string): string { + if (typeof value !== "string") { + throw new ValidationError( + `Expected string for ${fieldName}, got ${typeof value}`, + { + fieldName, + value, + expectedType: "string", + }, + ); + } + return value; +} + +export function validateNumber(value: unknown, fieldName: string): number { + if (typeof value !== "number" || isNaN(value)) { + throw new ValidationError( + `Expected number for ${fieldName}, got ${typeof value}`, + { + fieldName, + value, + expectedType: "number", + }, + ); + } + return value; +} + +export function validateArray( + value: unknown, + fieldName: string, + itemValidator?: (item: unknown) => item is T, +): T[] { + if (!Array.isArray(value)) { + throw new ValidationError( + `Expected array for ${fieldName}, got ${typeof value}`, + { + fieldName, + value, + expectedType: "array", + }, + ); + } + + if (itemValidator) { + for (let i = 0; i < value.length; i++) { + if (!itemValidator(value[i])) { + throw new ValidationError( + `Invalid item at index ${i} in ${fieldName}`, + { + fieldName, + index: i, + item: value[i], + }, + ); + } + } + } + + return value as T[]; +} + +export function validateObject( + value: unknown, + fieldName: string, + requiredKeys: string[], +): Record { + if (typeof value !== "object" || value === null) { + throw new ValidationError( + `Expected object for ${fieldName}, got ${typeof value}`, + { + fieldName, + value, + expectedType: "object", + }, + ); + } + + const obj = value as Record; + for (const key of requiredKeys) { + if (!(key in obj)) { + throw new ValidationError( + `Missing required key '${key}' in ${fieldName}`, + { + fieldName, + missingKey: key, + availableKeys: Object.keys(obj), + }, + ); + } + } + + return obj; +} + +export function validateNonEmptyString( + value: unknown, + fieldName: string, +): string { + const str = validateString(value, fieldName); + if (str.trim().length === 0) { + throw new ValidationError(`Expected non-empty string for ${fieldName}`, { + fieldName, + value: str, + }); + } + return str; +} From 4d0934d954302de8b9cf66a89bc2ab363a084d31 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Fri, 10 Oct 2025 20:16:25 +0800 Subject: [PATCH 09/14] refact: use previous RenderOutput to replace with the same one from dob-render-sdk --- .../api/render-by-dob-decode-response.ts | 36 +++++++-------- .../src/dob/render/api/render-by-token-key.ts | 15 ++++--- packages/spore/src/dob/render/config/fonts.ts | 6 +-- .../core/parsers/background-color-parser.ts | 4 +- .../dob/render/core/parsers/style-parser.ts | 8 ++-- .../render/core/parsers/text-params-parser.ts | 12 +++-- .../dob/render/core/parsers/trait-parser.ts | 20 ++++----- .../dob/render/core/parsers/traits-parser.ts | 45 +++++++++++-------- .../dob/render/core/renderers/bit-renderer.ts | 32 +++++-------- .../render/core/renderers/dob1-renderer.ts | 6 +-- .../render/core/renderers/image-renderer.ts | 10 ++--- .../render/core/renderers/text-renderer.ts | 10 ++--- .../src/dob/render/services/api/dob-decode.ts | 18 -------- .../spore/src/dob/render/services/index.ts | 1 - .../src/dob/render/services/svg-resolver.ts | 6 +-- packages/spore/src/dob/render/types/api.ts | 25 ----------- packages/spore/src/dob/render/types/core.ts | 11 +++-- packages/spore/src/dob/render/types/index.ts | 1 - .../spore/src/dob/render/utils/mime-utils.ts | 4 +- .../src/dob/render/utils/string-utils.ts | 2 +- .../spore/src/dob/render/utils/validation.ts | 2 +- 21 files changed, 115 insertions(+), 159 deletions(-) delete mode 100644 packages/spore/src/dob/render/services/api/dob-decode.ts delete mode 100644 packages/spore/src/dob/render/types/api.ts diff --git a/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts index 801e6394..fa7828b9 100644 --- a/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts +++ b/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts @@ -1,30 +1,26 @@ -import { Key } from "../config/constants"; -import { renderTextParamsParser } from "../core/parsers/text-params-parser"; -import { traitsParser } from "../core/parsers/traits-parser"; -import { renderDob1Svg } from "../core/renderers/dob1-renderer"; -import { renderImageSvg } from "../core/renderers/image-renderer"; -import type { RenderProps } from "../core/renderers/text-renderer"; -import { renderTextSvg } from "../core/renderers/text-renderer"; -import type { - DobDecodeResult, - RenderPartialOutput as RenderOutput, -} from "../types"; +import type { RenderOutput } from "../../helper/object.js"; +import { Key } from "../config/constants.js"; +import { renderTextParamsParser } from "../core/parsers/text-params-parser.js"; +import { traitsParser } from "../core/parsers/traits-parser.js"; +import { renderDob1Svg } from "../core/renderers/dob1-renderer.js"; +import { renderImageSvg } from "../core/renderers/image-renderer.js"; +import type { RenderProps } from "../core/renderers/text-renderer.js"; +import { renderTextSvg } from "../core/renderers/text-renderer.js"; export function renderByDobDecodeResponse( - dob0Data: DobDecodeResult | string, + renderOutput: RenderOutput | string, props?: Pick & { outputType?: "svg"; }, ) { - if (typeof dob0Data === "string") { - dob0Data = JSON.parse(dob0Data) as DobDecodeResult; + let renderData: RenderOutput; + if (typeof renderOutput === "string") { + renderData = JSON.parse(renderOutput) as RenderOutput; + } else { + renderData = renderOutput; } - if (typeof dob0Data.render_output === "string") { - dob0Data.render_output = JSON.parse( - dob0Data.render_output, - ) as RenderOutput[]; - } - const { traits, indexVarRegister } = traitsParser(dob0Data.render_output); + + const { traits, indexVarRegister } = traitsParser(renderData); for (const trait of traits) { if (trait.name === "prev.type" && trait.value === "image") { return renderImageSvg(traits); diff --git a/packages/spore/src/dob/render/api/render-by-token-key.ts b/packages/spore/src/dob/render/api/render-by-token-key.ts index c99bee82..b0bca587 100644 --- a/packages/spore/src/dob/render/api/render-by-token-key.ts +++ b/packages/spore/src/dob/render/api/render-by-token-key.ts @@ -1,6 +1,7 @@ -import type { RenderProps } from "../core/renderers/text-renderer"; -import { dobDecode } from "../services/api/dob-decode"; -import { renderByDobDecodeResponse } from "./render-by-dob-decode-response"; +import { decodeDobBySporeId } from "../../api/decode.js"; +import { config } from "../config.js"; +import type { RenderProps } from "../core/renderers/text-renderer.js"; +import { renderByDobDecodeResponse } from "./render-by-dob-decode-response.js"; export async function renderByTokenKey( tokenKey: string, @@ -8,6 +9,10 @@ export async function renderByTokenKey( outputType?: "svg"; }, ) { - const dobDecodeResponse = await dobDecode(tokenKey); - return renderByDobDecodeResponse(dobDecodeResponse.result, options); + const renderOutput = await decodeDobBySporeId( + tokenKey, + config.dobDecodeServerURL, + ); + + return renderByDobDecodeResponse(renderOutput, options); } diff --git a/packages/spore/src/dob/render/config/fonts.ts b/packages/spore/src/dob/render/config/fonts.ts index b21dd8be..226864a8 100644 --- a/packages/spore/src/dob/render/config/fonts.ts +++ b/packages/spore/src/dob/render/config/fonts.ts @@ -1,6 +1,6 @@ -import SpaceGroteskBoldBase64 from "../fonts/SpaceGrotesk-Bold.base64"; -import TurretRoadBoldBase64 from "../fonts/TurretRoad-Bold.base64"; -import TurretRoadMediumBase64 from "../fonts/TurretRoad-Medium.base64"; +import SpaceGroteskBoldBase64 from "../fonts/SpaceGrotesk-Bold.base64.js"; +import TurretRoadBoldBase64 from "../fonts/TurretRoad-Bold.base64.js"; +import TurretRoadMediumBase64 from "../fonts/TurretRoad-Medium.base64.js"; export const FONTS = { SpaceGroteskBold: SpaceGroteskBoldBase64, diff --git a/packages/spore/src/dob/render/core/parsers/background-color-parser.ts b/packages/spore/src/dob/render/core/parsers/background-color-parser.ts index 64c8dbbb..a02c1520 100644 --- a/packages/spore/src/dob/render/core/parsers/background-color-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/background-color-parser.ts @@ -1,5 +1,5 @@ -import { Key } from "../../config/constants"; -import type { ParsedTrait } from "../../types/core"; +import { Key } from "../../config/constants.js"; +import type { ParsedTrait } from "../../types/core.js"; export function getBackgroundColorByTraits( traits: ParsedTrait[], diff --git a/packages/spore/src/dob/render/core/parsers/style-parser.ts b/packages/spore/src/dob/render/core/parsers/style-parser.ts index 7cc0a561..a31af973 100644 --- a/packages/spore/src/dob/render/core/parsers/style-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/style-parser.ts @@ -1,7 +1,7 @@ -import { STYLE_FORMATS, TEXT_ALIGNMENT } from "../../types/constants"; -import type { StyleConfiguration, StyleFormat } from "../../types/core"; -import { StyleParseError } from "../../types/errors"; -import { validateString } from "../../utils/validation"; +import { STYLE_FORMATS, TEXT_ALIGNMENT } from "../../types/constants.js"; +import type { StyleConfiguration, StyleFormat } from "../../types/core.js"; +import { StyleParseError } from "../../types/errors.js"; +import { validateString } from "../../utils/validation.js"; /** * Default style configuration diff --git a/packages/spore/src/dob/render/core/parsers/text-params-parser.ts b/packages/spore/src/dob/render/core/parsers/text-params-parser.ts index 6bf9d70c..5c943f58 100644 --- a/packages/spore/src/dob/render/core/parsers/text-params-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/text-params-parser.ts @@ -1,5 +1,9 @@ -import { GLOBAL_TEMPLATE_REG, Key, TEMPLATE_REG } from "../../config/constants"; -import { STYLE_FORMATS } from "../../types/constants"; +import { + GLOBAL_TEMPLATE_REG, + Key, + TEMPLATE_REG, +} from "../../config/constants.js"; +import { STYLE_FORMATS } from "../../types/constants.js"; import type { ParsedTrait, StyleConfiguration, @@ -9,8 +13,8 @@ import type { TextStyle, TraitValue, } from "../../types/core"; -import { backgroundColorParser } from "./background-color-parser"; -import { createStyleParser } from "./style-parser"; +import { backgroundColorParser } from "./background-color-parser.js"; +import { createStyleParser } from "./style-parser.js"; /** * Default template for text rendering diff --git a/packages/spore/src/dob/render/core/parsers/trait-parser.ts b/packages/spore/src/dob/render/core/parsers/trait-parser.ts index 3779eee1..2fc9c240 100644 --- a/packages/spore/src/dob/render/core/parsers/trait-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/trait-parser.ts @@ -1,14 +1,14 @@ import type { INode } from "svgson"; -import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants"; -import { resolveSvgTraits } from "../../services/svg-resolver"; -import type { RenderPartialOutput as RenderOutput } from "../../types/api"; +import type { DecodeElement, RenderOutput } from "../../../helper/object.js"; +import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; +import { resolveSvgTraits } from "../../services/svg-resolver.js"; import type { IndexVariableRegister, ParsedTrait, TraitParseResult, } from "../../types/core"; -import { TraitParseError } from "../../types/errors"; -import { parseStringToArray } from "../../utils/string-utils"; +import { TraitParseError } from "../../types/errors.js"; +import { parseStringToArray } from "../../utils/string-utils.js"; import { validateArray, validateNumber, @@ -73,7 +73,7 @@ class TraitValueParser { * Parses a single trait based on its type */ parseTrait( - item: RenderOutput, + item: DecodeElement, indexVarRegister: IndexVariableRegister, ): ParsedTrait | null { try { @@ -120,15 +120,15 @@ class TraitValueParser { * Builds the index variable register from render output items */ function buildIndexVariableRegister( - items: RenderOutput[], + items: RenderOutput, ): IndexVariableRegister { const register: Record = {}; for (const item of items) { const firstTrait = item.traits[0]; - if (!firstTrait?.String) continue; + if (!firstTrait?.value) continue; - const match = firstTrait.String.match(ARRAY_INDEX_REG); + const match = String(firstTrait.value).match(ARRAY_INDEX_REG); if (!match) continue; const indexString = match[1]; @@ -150,7 +150,7 @@ function buildIndexVariableRegister( /** * Parses render output into traits with proper error handling */ -export function parseTraits(items: RenderOutput[]): TraitParseResult { +export function parseTraits(items: RenderOutput): TraitParseResult { try { validateArray(items, "render output items"); diff --git a/packages/spore/src/dob/render/core/parsers/traits-parser.ts b/packages/spore/src/dob/render/core/parsers/traits-parser.ts index b327b1e9..1ce97a01 100644 --- a/packages/spore/src/dob/render/core/parsers/traits-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/traits-parser.ts @@ -1,18 +1,18 @@ -import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants"; -import { resolveSvgTraits } from "../../services/svg-resolver"; -import type { RenderPartialOutput as RenderOutput } from "../../types"; -import type { ParsedTrait } from "../../types/core"; -import { parseStringToArray } from "../../utils/string-utils"; +import type { RenderOutput } from "../../../helper/object.js"; +import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; +import { resolveSvgTraits } from "../../services/svg-resolver.js"; +import type { ParsedTrait } from "../../types/core.js"; +import { parseStringToArray } from "../../utils/string-utils.js"; // ParsedTrait is now defined in types/core.ts -export function traitsParser(items: RenderOutput[]): { +export function traitsParser(items: RenderOutput): { traits: ParsedTrait[]; indexVarRegister: Record; } { const indexVarRegister = items.reduce>((acc, item) => { - if (!item.traits[0]?.String) return acc; - const match = item.traits[0].String.match(ARRAY_INDEX_REG); + if (!item.traits[0]?.value) return acc; + const match = String(item.traits[0].value).match(ARRAY_INDEX_REG); if (!match) return acc; const intIndex = parseInt(match[1], 10); if (isNaN(intIndex)) return acc; @@ -23,28 +23,33 @@ export function traitsParser(items: RenderOutput[]): { .map((item) => { const { traits: trait } = item; if (!trait[0]) return null; - if ("String" in trait[0] && typeof trait[0].String === "string") { - let value = item.traits[0].String; - const matchArray = value!.match(ARRAY_REG); + + const traitData = trait[0]; + + if ("String" in traitData && typeof traitData.String === "string") { + let stringValue = traitData.String; + const matchArray = stringValue.match(ARRAY_REG); if (matchArray) { const varName = matchArray[1]; const array = parseStringToArray(matchArray[2]); const index = indexVarRegister[varName] % array.length; - value = array[index]; + stringValue = array[index]; } return { - value, + value: stringValue, name: item.name, } as ParsedTrait; } - if ("Number" in trait[0] && typeof trait[0].Number === "number") { + + if ("Number" in traitData && typeof traitData.Number === "number") { return { name: item.name, - value: trait[0].Number, + value: traitData.Number, } as ParsedTrait; } - if ("Timestamp" in trait[0] && typeof trait[0].Timestamp === "number") { - let timestamp = trait[0].Timestamp as number; + + if ("Timestamp" in traitData && typeof traitData.Timestamp === "number") { + let timestamp = traitData.Timestamp; if (`${timestamp}`.length === 10) { timestamp = timestamp * 1000; } @@ -53,12 +58,14 @@ export function traitsParser(items: RenderOutput[]): { value: new Date(timestamp), } as ParsedTrait; } - if ("SVG" in trait[0] && typeof trait[0].SVG === "string") { + + if ("SVG" in traitData && typeof traitData.SVG === "string") { return { name: item.name, - value: resolveSvgTraits(trait[0].SVG), + value: resolveSvgTraits(traitData.SVG), }; } + return null; }) .map((e) => e!) diff --git a/packages/spore/src/dob/render/core/renderers/bit-renderer.ts b/packages/spore/src/dob/render/core/renderers/bit-renderer.ts index cdd18ced..e3584999 100644 --- a/packages/spore/src/dob/render/core/renderers/bit-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/bit-renderer.ts @@ -1,30 +1,20 @@ import satori from "satori"; -import { FONTS } from "../../config/fonts"; -import type { - DobDecodeResult, - RenderPartialOutput as RenderOutput, -} from "../../types"; -import { base64ToArrayBuffer } from "../../utils/string-utils"; -import { traitsParser } from "../parsers/traits-parser"; +import type { RenderOutput } from "../../../helper/object.js"; +import { FONTS } from "../../config/fonts.js"; +import { base64ToArrayBuffer } from "../../utils/string-utils.js"; +import { traitsParser } from "../parsers/traits-parser.js"; const iconBase64 = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNTA0XzI4OCkiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAwMCAwSDBWMTAwMEgxMDAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTAwIDY0NS42NjlDNjE1LjE1NyA2NDUuNjY5IDcwOC42NjEgNTUyLjE2NSA3MDguNjYxIDQzNy4wMDhDNzA4LjY2MSAzOTAuMDkyIDY5My4yNDIgMzQ2Ljc4NSA2NjYuOTk1IDMxMi4wMDhDNjkyLjI1NyAyOTIuNjUxIDcwOC42NjEgMjYyLjQ2NyA3MDguNjYxIDIyOC4zNDZINTAwQzM4NC44NDMgMjI4LjM0NiAyOTEuMzM5IDMyMS44NSAyOTEuMzM5IDQzNy4wMDhDMjkxLjMzOSA1NTEuODM3IDM4NS4xNzEgNjQ1LjY2OSA1MDAgNjQ1LjY2OVpNNTAwIDMyMy44MTlDNTYyLjMzNiAzMjMuODE5IDYxMy4xODkgMzc0LjY3MiA2MTMuMTg5IDQzNy4wMDhDNjEzLjE4OSA0OTkuMzQ0IDU2Mi4zMzYgNTUwLjE5NyA1MDAgNTUwLjE5N0M0MzcuNjY0IDU1MC4xOTcgMzg2LjgxMSA0OTkuMzQ0IDM4Ni44MTEgNDM3LjAwOEMzODYuODExIDM3NC42NzIgNDM3LjY2NCAzMjMuODE5IDUwMCAzMjMuODE5WiIgZmlsbD0iIzAwREY5QiIvPgo8cGF0aCBkPSJNNTAwIDgxMS4zNTJDNDA0LjE5OSA4MTEuMzUyIDMwOC4zOTkgNzc0LjkzNCAyMzUuMjM2IDcwMS43NzJDMjQ2LjcxOSA2NzEuNTg4IDI3MS45ODIgNjQ2LjY1NCAzMDUuNzc0IDYzNy4xMzlDMzU5LjkwOCA2ODkuNjMzIDQyOS43OSA3MTUuODc5IDUwMCA3MTUuODc5QzU3MC4yMSA3MTUuODc5IDY0MC4wOTIgNjg5LjYzMyA2OTQuMjI2IDYzNy4xMzlDNzI4LjAxOCA2NDYuNjU0IDc1My4yODEgNjcxLjI2IDc2NC43NjQgNzAxLjc3MkM2OTEuOTI5IDc3NC42MDYgNTk1LjgwMSA4MTEuMzUyIDUwMCA4MTEuMzUyWiIgZmlsbD0iIzI0NzFGRSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzUwNF8yODgiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="; -export function renderDobBit( - dob0Data: DobDecodeResult | string, - _props?: { - outputType?: "svg"; - }, -) { - if (typeof dob0Data === "string") { - dob0Data = JSON.parse(dob0Data) as DobDecodeResult; +export function renderDobBit(renderOutput: RenderOutput | string) { + let renderData: RenderOutput; + if (typeof renderOutput === "string") { + renderData = JSON.parse(renderOutput) as RenderOutput; + } else { + renderData = renderOutput; } - if (typeof dob0Data.render_output === "string") { - dob0Data.render_output = JSON.parse( - dob0Data.render_output, - ) as RenderOutput[]; - } - const { traits } = traitsParser(dob0Data.render_output); + const { traits } = traitsParser(renderData); const account = traits.find((trait) => trait.name === "Account")?.value ?? "-"; let fontSize = 76; diff --git a/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts b/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts index 552adda8..68394ed0 100644 --- a/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts @@ -1,8 +1,8 @@ import satori from "satori"; import { type INode, stringify } from "svgson"; -import { FONTS } from "../../config/fonts"; -import { base64ToArrayBuffer } from "../../utils/string-utils"; -import { svgToBase64 } from "../../utils/svg-utils"; +import { FONTS } from "../../config/fonts.js"; +import { base64ToArrayBuffer } from "../../utils/string-utils.js"; +import { svgToBase64 } from "../../utils/svg-utils.js"; export async function renderDob1Svg(nodePromise: Promise) { const node = await nodePromise; diff --git a/packages/spore/src/dob/render/core/renderers/image-renderer.ts b/packages/spore/src/dob/render/core/renderers/image-renderer.ts index 50c8d9bb..2ddfdd3d 100644 --- a/packages/spore/src/dob/render/core/renderers/image-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/image-renderer.ts @@ -1,9 +1,9 @@ import satori from "satori"; -import { config } from "../../config"; -import type { ParsedTrait } from "../../types/core"; -import { processFileServerResult } from "../../utils/mime-utils"; -import { isBtcFs, isIpfs } from "../../utils/string-utils"; -import { backgroundColorParser } from "../parsers/background-color-parser"; +import { config } from "../../config.js"; +import type { ParsedTrait } from "../../types/core.js"; +import { processFileServerResult } from "../../utils/mime-utils.js"; +import { isBtcFs, isIpfs } from "../../utils/string-utils.js"; +import { backgroundColorParser } from "../parsers/background-color-parser.js"; export async function renderImageSvg(traits: ParsedTrait[]): Promise { const prevBg = traits.find((trait) => trait.name === "prev.bg"); diff --git a/packages/spore/src/dob/render/core/renderers/text-renderer.ts b/packages/spore/src/dob/render/core/renderers/text-renderer.ts index c069259c..06114e40 100644 --- a/packages/spore/src/dob/render/core/renderers/text-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/text-renderer.ts @@ -1,18 +1,18 @@ import satori from "satori"; -import { FONTS } from "../../config/fonts"; +import { FONTS } from "../../config/fonts.js"; import { ALIGNMENT_MAP, FONT_STYLES, FONT_WEIGHTS, RENDER_CONSTANTS, -} from "../../types/constants"; +} from "../../types/constants.js"; import type { FontConfiguration, TextItem, TextRenderOptions, -} from "../../types/core"; -import type { RenderElement } from "../../types/internal"; -import { base64ToArrayBuffer } from "../../utils/string-utils"; +} from "../../types/core.js"; +import type { RenderElement } from "../../types/internal.js"; +import { base64ToArrayBuffer } from "../../utils/string-utils.js"; /** * Font configuration with default values diff --git a/packages/spore/src/dob/render/services/api/dob-decode.ts b/packages/spore/src/dob/render/services/api/dob-decode.ts deleted file mode 100644 index 1b09c0c7..00000000 --- a/packages/spore/src/dob/render/services/api/dob-decode.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { config } from "../../config"; -import type { DobDecodeResponse } from "../../types"; - -export async function dobDecode(tokenKey: string): Promise { - const response = await fetch(config.dobDecodeServerURL, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - id: 2, - jsonrpc: "2.0", - method: "dob_decode", - params: [tokenKey], - }), - }); - return response.json() as Promise; -} diff --git a/packages/spore/src/dob/render/services/index.ts b/packages/spore/src/dob/render/services/index.ts index 13188645..ba3251fd 100644 --- a/packages/spore/src/dob/render/services/index.ts +++ b/packages/spore/src/dob/render/services/index.ts @@ -1,2 +1 @@ -export * from "./api/dob-decode"; export * from "./svg-resolver"; diff --git a/packages/spore/src/dob/render/services/svg-resolver.ts b/packages/spore/src/dob/render/services/svg-resolver.ts index 3e40e7e7..d6b7bb18 100644 --- a/packages/spore/src/dob/render/services/svg-resolver.ts +++ b/packages/spore/src/dob/render/services/svg-resolver.ts @@ -1,8 +1,8 @@ import type { INode } from "svgson"; import { parse } from "svgson"; -import type { BtcFsURI, IpfsURI } from "../config"; -import { config } from "../config"; -import { processFileServerResult } from "../utils/mime-utils"; +import type { BtcFsURI, IpfsURI } from "../config.js"; +import { config } from "../config.js"; +import { processFileServerResult } from "../utils/mime-utils.js"; async function handleNodeHref(node: INode) { if (node.name !== "image") { diff --git a/packages/spore/src/dob/render/types/api.ts b/packages/spore/src/dob/render/types/api.ts deleted file mode 100644 index 4be210ac..00000000 --- a/packages/spore/src/dob/render/types/api.ts +++ /dev/null @@ -1,25 +0,0 @@ -export interface DobDecodeResponse { - jsonrpc: string; - result: string; - id: number; -} - -export interface DobDecodeResult { - dob_content: { - dna: string; - block_number: number; - cell_id: number; - id: string; - }; - render_output: RenderPartialOutput[] | string; -} - -export interface RenderPartialOutput { - name: string; - traits: { - String?: string; - Number?: number; - Timestamp?: Date; - SVG?: string; - }[]; -} diff --git a/packages/spore/src/dob/render/types/core.ts b/packages/spore/src/dob/render/types/core.ts index c7f3de00..c699bc04 100644 --- a/packages/spore/src/dob/render/types/core.ts +++ b/packages/spore/src/dob/render/types/core.ts @@ -2,11 +2,10 @@ * Core type definitions for the render system */ -export type TraitValue = - | string - | number - | Date - | Promise; +import { INode } from "svgson"; +import { RenderOutput } from "../../helper/object.js"; + +export type TraitValue = string | number | Date | Promise; export interface Trait { readonly name: string; @@ -75,6 +74,6 @@ export interface ImageRenderOptions { } export interface BitRenderOptions { - readonly dobData: string | import("./api").DobDecodeResult; + readonly dobData: string | RenderOutput[]; readonly outputType?: "svg"; } diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/spore/src/dob/render/types/index.ts index 340363ce..493d4083 100644 --- a/packages/spore/src/dob/render/types/index.ts +++ b/packages/spore/src/dob/render/types/index.ts @@ -1,4 +1,3 @@ -export * from "./api"; export * from "./constants"; export * from "./core"; export * from "./errors"; diff --git a/packages/spore/src/dob/render/utils/mime-utils.ts b/packages/spore/src/dob/render/utils/mime-utils.ts index 6061c7b0..46181f47 100644 --- a/packages/spore/src/dob/render/utils/mime-utils.ts +++ b/packages/spore/src/dob/render/utils/mime-utils.ts @@ -1,5 +1,5 @@ -import type { FileServerResult } from "../config"; -import { hexToBase64 } from "./string-utils"; +import type { FileServerResult } from "../config.js"; +import { hexToBase64 } from "./string-utils.js"; /** * Detects MIME type from base64-encoded file header by examining file signatures diff --git a/packages/spore/src/dob/render/utils/string-utils.ts b/packages/spore/src/dob/render/utils/string-utils.ts index 6b7819c3..3d2479ba 100644 --- a/packages/spore/src/dob/render/utils/string-utils.ts +++ b/packages/spore/src/dob/render/utils/string-utils.ts @@ -1,4 +1,4 @@ -import type { BtcFsURI, IpfsURI } from "../config"; +import type { BtcFsURI, IpfsURI } from "../config.js"; export function parseStringToArray(str: string): string[] { const regex = /'([^']*)'/g; diff --git a/packages/spore/src/dob/render/utils/validation.ts b/packages/spore/src/dob/render/utils/validation.ts index 4ec2481b..302c0aad 100644 --- a/packages/spore/src/dob/render/utils/validation.ts +++ b/packages/spore/src/dob/render/utils/validation.ts @@ -1,4 +1,4 @@ -import { ValidationError } from "../types/errors"; +import { ValidationError } from "../types/errors.js"; /** * Validation utilities for the render system From 04a9592d637763e7d414def81cd0159cffd386c5 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Fri, 10 Oct 2025 21:58:30 +0800 Subject: [PATCH 10/14] feat: purge unused files and change file name format --- packages/spore/src/dob/render/api/index.ts | 4 +- ...-decode-response.ts => renderDobDecode.ts} | 14 +- ...{render-by-token-key.ts => renderToken.ts} | 4 +- .../spore/src/dob/render/config/constants.ts | 2 + packages/spore/src/dob/render/config/fonts.ts | 6 +- packages/spore/src/dob/render/config/index.ts | 6 +- packages/spore/src/dob/render/core/index.ts | 4 +- ...lor-parser.ts => backgroundColorParser.ts} | 0 .../src/dob/render/core/parsers/index.ts | 9 +- .../{style-parser.ts => styleParser.ts} | 0 ...t-params-parser.ts => textParamsParser.ts} | 6 +- .../dob/render/core/parsers/trait-parser.ts | 178 ------------------ .../{traits-parser.ts => traitsParser.ts} | 4 +- .../dob/render/core/renderers/bit-renderer.ts | 102 ---------- .../{dob1-renderer.ts => dob1Render.ts} | 11 +- .../{image-renderer.ts => imageRender.ts} | 16 +- .../src/dob/render/core/renderers/index.ts | 7 +- .../{text-renderer.ts => textRender.ts} | 2 +- ...d.base64.ts => spaceGroteskBold.base64.ts} | 0 ...old.base64.ts => turretRoadBold.base64.ts} | 0 ...m.base64.ts => turretRoadMedium.base64.ts} | 0 packages/spore/src/dob/render/index.ts | 11 +- .../spore/src/dob/render/services/index.ts | 1 - packages/spore/src/dob/render/types/index.ts | 8 +- packages/spore/src/dob/render/utils/index.ts | 8 +- .../render/utils/{mime-utils.ts => mime.ts} | 2 +- .../utils/{string-utils.ts => string.ts} | 0 .../spore/src/dob/render/utils/svg-utils.ts | 6 - .../svg-resolver.ts => utils/svg.ts} | 9 +- 29 files changed, 74 insertions(+), 346 deletions(-) rename packages/spore/src/dob/render/api/{render-by-dob-decode-response.ts => renderDobDecode.ts} (64%) rename packages/spore/src/dob/render/api/{render-by-token-key.ts => renderToken.ts} (72%) rename packages/spore/src/dob/render/core/parsers/{background-color-parser.ts => backgroundColorParser.ts} (100%) rename packages/spore/src/dob/render/core/parsers/{style-parser.ts => styleParser.ts} (100%) rename packages/spore/src/dob/render/core/parsers/{text-params-parser.ts => textParamsParser.ts} (98%) delete mode 100644 packages/spore/src/dob/render/core/parsers/trait-parser.ts rename packages/spore/src/dob/render/core/parsers/{traits-parser.ts => traitsParser.ts} (94%) delete mode 100644 packages/spore/src/dob/render/core/renderers/bit-renderer.ts rename packages/spore/src/dob/render/core/renderers/{dob1-renderer.ts => dob1Render.ts} (75%) rename packages/spore/src/dob/render/core/renderers/{image-renderer.ts => imageRender.ts} (75%) rename packages/spore/src/dob/render/core/renderers/{text-renderer.ts => textRender.ts} (98%) rename packages/spore/src/dob/render/fonts/{SpaceGrotesk-Bold.base64.ts => spaceGroteskBold.base64.ts} (100%) rename packages/spore/src/dob/render/fonts/{TurretRoad-Bold.base64.ts => turretRoadBold.base64.ts} (100%) rename packages/spore/src/dob/render/fonts/{TurretRoad-Medium.base64.ts => turretRoadMedium.base64.ts} (100%) delete mode 100644 packages/spore/src/dob/render/services/index.ts rename packages/spore/src/dob/render/utils/{mime-utils.ts => mime.ts} (98%) rename packages/spore/src/dob/render/utils/{string-utils.ts => string.ts} (100%) delete mode 100644 packages/spore/src/dob/render/utils/svg-utils.ts rename packages/spore/src/dob/render/{services/svg-resolver.ts => utils/svg.ts} (79%) diff --git a/packages/spore/src/dob/render/api/index.ts b/packages/spore/src/dob/render/api/index.ts index c40f16f1..e941ade3 100644 --- a/packages/spore/src/dob/render/api/index.ts +++ b/packages/spore/src/dob/render/api/index.ts @@ -1,2 +1,2 @@ -export * from "./render-by-dob-decode-response"; -export * from "./render-by-token-key"; +export * from "./renderDobDecode.js"; +export * from "./renderToken.js"; diff --git a/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts b/packages/spore/src/dob/render/api/renderDobDecode.ts similarity index 64% rename from packages/spore/src/dob/render/api/render-by-dob-decode-response.ts rename to packages/spore/src/dob/render/api/renderDobDecode.ts index fa7828b9..34670e6e 100644 --- a/packages/spore/src/dob/render/api/render-by-dob-decode-response.ts +++ b/packages/spore/src/dob/render/api/renderDobDecode.ts @@ -1,11 +1,11 @@ import type { RenderOutput } from "../../helper/object.js"; import { Key } from "../config/constants.js"; -import { renderTextParamsParser } from "../core/parsers/text-params-parser.js"; -import { traitsParser } from "../core/parsers/traits-parser.js"; -import { renderDob1Svg } from "../core/renderers/dob1-renderer.js"; -import { renderImageSvg } from "../core/renderers/image-renderer.js"; -import type { RenderProps } from "../core/renderers/text-renderer.js"; -import { renderTextSvg } from "../core/renderers/text-renderer.js"; +import { renderTextParamsParser } from "../core/parsers/textParamsParser.js"; +import { traitsParser } from "../core/parsers/traitsParser.js"; +import { renderDob1Svg } from "../core/renderers/dob1Render.js"; +import { renderImageSvg } from "../core/renderers/imageRender.js"; +import type { RenderProps } from "../core/renderers/textRender.js"; +import { renderTextSvg } from "../core/renderers/textRender.js"; export function renderByDobDecodeResponse( renderOutput: RenderOutput | string, @@ -22,7 +22,7 @@ export function renderByDobDecodeResponse( const { traits, indexVarRegister } = traitsParser(renderData); for (const trait of traits) { - if (trait.name === "prev.type" && trait.value === "image") { + if (trait.name === String(Key.Type) && trait.value === "image") { return renderImageSvg(traits); } // TODO: multiple images diff --git a/packages/spore/src/dob/render/api/render-by-token-key.ts b/packages/spore/src/dob/render/api/renderToken.ts similarity index 72% rename from packages/spore/src/dob/render/api/render-by-token-key.ts rename to packages/spore/src/dob/render/api/renderToken.ts index b0bca587..297c4e42 100644 --- a/packages/spore/src/dob/render/api/render-by-token-key.ts +++ b/packages/spore/src/dob/render/api/renderToken.ts @@ -1,7 +1,7 @@ import { decodeDobBySporeId } from "../../api/decode.js"; import { config } from "../config.js"; -import type { RenderProps } from "../core/renderers/text-renderer.js"; -import { renderByDobDecodeResponse } from "./render-by-dob-decode-response.js"; +import type { RenderProps } from "../core/renderers/textRender.js"; +import { renderByDobDecodeResponse } from "./renderDobDecode.js"; export async function renderByTokenKey( tokenKey: string, diff --git a/packages/spore/src/dob/render/config/constants.ts b/packages/spore/src/dob/render/config/constants.ts index ce3098e8..be5018b9 100644 --- a/packages/spore/src/dob/render/config/constants.ts +++ b/packages/spore/src/dob/render/config/constants.ts @@ -1,4 +1,6 @@ export enum Key { + Bg = "prev.bg", + Type = "prev.type", BgColor = "prev.bgcolor", Prev = "prev", Image = "IMAGE", diff --git a/packages/spore/src/dob/render/config/fonts.ts b/packages/spore/src/dob/render/config/fonts.ts index 226864a8..a896c2bf 100644 --- a/packages/spore/src/dob/render/config/fonts.ts +++ b/packages/spore/src/dob/render/config/fonts.ts @@ -1,6 +1,6 @@ -import SpaceGroteskBoldBase64 from "../fonts/SpaceGrotesk-Bold.base64.js"; -import TurretRoadBoldBase64 from "../fonts/TurretRoad-Bold.base64.js"; -import TurretRoadMediumBase64 from "../fonts/TurretRoad-Medium.base64.js"; +import SpaceGroteskBoldBase64 from "../fonts/spaceGroteskBold.base64.js"; +import TurretRoadBoldBase64 from "../fonts/turretRoadBold.base64.js"; +import TurretRoadMediumBase64 from "../fonts/turretRoadMedium.base64.js"; export const FONTS = { SpaceGroteskBold: SpaceGroteskBoldBase64, diff --git a/packages/spore/src/dob/render/config/index.ts b/packages/spore/src/dob/render/config/index.ts index da4e4c33..2d0c8624 100644 --- a/packages/spore/src/dob/render/config/index.ts +++ b/packages/spore/src/dob/render/config/index.ts @@ -1,3 +1,3 @@ -export { config } from "../config"; -export * from "./constants"; -export * from "./fonts"; +export { config } from "../config.js"; +export * from "./constants.js"; +export * from "./fonts.js"; diff --git a/packages/spore/src/dob/render/core/index.ts b/packages/spore/src/dob/render/core/index.ts index 3d132bec..6deae3b9 100644 --- a/packages/spore/src/dob/render/core/index.ts +++ b/packages/spore/src/dob/render/core/index.ts @@ -1,2 +1,2 @@ -export * from "./parsers"; -export * from "./renderers"; +export * from "./parsers/index.js"; +export * from "./renderers/index.js"; diff --git a/packages/spore/src/dob/render/core/parsers/background-color-parser.ts b/packages/spore/src/dob/render/core/parsers/backgroundColorParser.ts similarity index 100% rename from packages/spore/src/dob/render/core/parsers/background-color-parser.ts rename to packages/spore/src/dob/render/core/parsers/backgroundColorParser.ts diff --git a/packages/spore/src/dob/render/core/parsers/index.ts b/packages/spore/src/dob/render/core/parsers/index.ts index 28ee9268..bdf0e16a 100644 --- a/packages/spore/src/dob/render/core/parsers/index.ts +++ b/packages/spore/src/dob/render/core/parsers/index.ts @@ -1,5 +1,4 @@ -export * from "./background-color-parser"; -export * from "./style-parser"; -export * from "./text-params-parser"; -export * from "./trait-parser"; -export * from "./traits-parser"; +export * from "./backgroundColorParser.js"; +export * from "./styleParser.js"; +export * from "./textParamsParser.js"; +export * from "./traitsParser.js"; diff --git a/packages/spore/src/dob/render/core/parsers/style-parser.ts b/packages/spore/src/dob/render/core/parsers/styleParser.ts similarity index 100% rename from packages/spore/src/dob/render/core/parsers/style-parser.ts rename to packages/spore/src/dob/render/core/parsers/styleParser.ts diff --git a/packages/spore/src/dob/render/core/parsers/text-params-parser.ts b/packages/spore/src/dob/render/core/parsers/textParamsParser.ts similarity index 98% rename from packages/spore/src/dob/render/core/parsers/text-params-parser.ts rename to packages/spore/src/dob/render/core/parsers/textParamsParser.ts index 5c943f58..ab855051 100644 --- a/packages/spore/src/dob/render/core/parsers/text-params-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/textParamsParser.ts @@ -12,9 +12,9 @@ import type { TextRenderOptions, TextStyle, TraitValue, -} from "../../types/core"; -import { backgroundColorParser } from "./background-color-parser.js"; -import { createStyleParser } from "./style-parser.js"; +} from "../../types/core.js"; +import { backgroundColorParser } from "./backgroundColorParser.js"; +import { createStyleParser } from "./styleParser.js"; /** * Default template for text rendering diff --git a/packages/spore/src/dob/render/core/parsers/trait-parser.ts b/packages/spore/src/dob/render/core/parsers/trait-parser.ts deleted file mode 100644 index 2fc9c240..00000000 --- a/packages/spore/src/dob/render/core/parsers/trait-parser.ts +++ /dev/null @@ -1,178 +0,0 @@ -import type { INode } from "svgson"; -import type { DecodeElement, RenderOutput } from "../../../helper/object.js"; -import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; -import { resolveSvgTraits } from "../../services/svg-resolver.js"; -import type { - IndexVariableRegister, - ParsedTrait, - TraitParseResult, -} from "../../types/core"; -import { TraitParseError } from "../../types/errors.js"; -import { parseStringToArray } from "../../utils/string-utils.js"; -import { - validateArray, - validateNumber, - validateString, -} from "../../utils/validation"; - -/** - * Parses trait values with proper type safety and error handling - */ -class TraitValueParser { - /** - * Parses a string trait value, handling array references - */ - private parseStringTrait( - value: string, - indexVarRegister: IndexVariableRegister, - ): string { - const matchArray = value.match(ARRAY_REG); - if (!matchArray) { - return value; - } - - const [, varName, arrayString] = matchArray; - if (!varName || !arrayString) { - throw new TraitParseError("Invalid array reference format", { value }); - } - - const array = parseStringToArray(arrayString); - const index = indexVarRegister[varName] % array.length; - return array[index] || ""; - } - - /** - * Parses a number trait value - */ - private parseNumberTrait(value: number): number { - return validateNumber(value, "trait value"); - } - - /** - * Parses a timestamp trait value - */ - private parseTimestampTrait(value: number): Date { - const timestamp = validateNumber(value, "timestamp"); - - // Convert seconds to milliseconds if needed - const adjustedTimestamp = - `${timestamp}`.length === 10 ? timestamp * 1000 : timestamp; - - return new Date(adjustedTimestamp); - } - - /** - * Parses an SVG trait value - */ - private parseSvgTrait(value: string): Promise { - const svgString = validateString(value, "SVG content"); - return resolveSvgTraits(svgString); - } - - /** - * Parses a single trait based on its type - */ - parseTrait( - item: DecodeElement, - indexVarRegister: IndexVariableRegister, - ): ParsedTrait | null { - try { - const { traits } = item; - if (!traits[0]) { - return null; - } - - const trait = traits[0]; - const name = validateString(item.name, "trait name"); - - if ("String" in trait && typeof trait.String === "string") { - const value = this.parseStringTrait(trait.String, indexVarRegister); - return { name, value }; - } - - if ("Number" in trait && typeof trait.Number === "number") { - const value = this.parseNumberTrait(trait.Number); - return { name, value }; - } - - if ("Timestamp" in trait && typeof trait.Timestamp === "number") { - const value = this.parseTimestampTrait(trait.Timestamp); - return { name, value }; - } - - if ("SVG" in trait && typeof trait.SVG === "string") { - const value = this.parseSvgTrait(trait.SVG); - return { name, value }; - } - - return null; - } catch (error) { - throw new TraitParseError(`Failed to parse trait: ${item.name}`, { - traitName: item.name, - traitValue: item.traits[0], - originalError: error instanceof Error ? error.message : String(error), - }); - } - } -} - -/** - * Builds the index variable register from render output items - */ -function buildIndexVariableRegister( - items: RenderOutput, -): IndexVariableRegister { - const register: Record = {}; - - for (const item of items) { - const firstTrait = item.traits[0]; - if (!firstTrait?.value) continue; - - const match = String(firstTrait.value).match(ARRAY_INDEX_REG); - if (!match) continue; - - const indexString = match[1]; - const index = parseInt(indexString, 10); - - if (isNaN(index)) { - throw new TraitParseError(`Invalid array index: ${indexString}`, { - itemName: item.name, - indexString, - }); - } - - register[item.name] = index; - } - - return register; -} - -/** - * Parses render output into traits with proper error handling - */ -export function parseTraits(items: RenderOutput): TraitParseResult { - try { - validateArray(items, "render output items"); - - const indexVarRegister = buildIndexVariableRegister(items); - const parser = new TraitValueParser(); - - const traits = items - .map((item) => parser.parseTrait(item, indexVarRegister)) - .filter((trait): trait is ParsedTrait => trait !== null); - - return { - traits, - indexVarRegister, - }; - } catch (error) { - if (error instanceof TraitParseError) { - throw error; - } - - throw new TraitParseError("Failed to parse traits", { - originalError: error instanceof Error ? error.message : String(error), - itemCount: items.length, - }); - } -} diff --git a/packages/spore/src/dob/render/core/parsers/traits-parser.ts b/packages/spore/src/dob/render/core/parsers/traitsParser.ts similarity index 94% rename from packages/spore/src/dob/render/core/parsers/traits-parser.ts rename to packages/spore/src/dob/render/core/parsers/traitsParser.ts index 1ce97a01..a2b5e480 100644 --- a/packages/spore/src/dob/render/core/parsers/traits-parser.ts +++ b/packages/spore/src/dob/render/core/parsers/traitsParser.ts @@ -1,8 +1,8 @@ import type { RenderOutput } from "../../../helper/object.js"; import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; -import { resolveSvgTraits } from "../../services/svg-resolver.js"; import type { ParsedTrait } from "../../types/core.js"; -import { parseStringToArray } from "../../utils/string-utils.js"; +import { parseStringToArray } from "../../utils/string.js"; +import { resolveSvgTraits } from "../../utils/svg.js"; // ParsedTrait is now defined in types/core.ts diff --git a/packages/spore/src/dob/render/core/renderers/bit-renderer.ts b/packages/spore/src/dob/render/core/renderers/bit-renderer.ts deleted file mode 100644 index e3584999..00000000 --- a/packages/spore/src/dob/render/core/renderers/bit-renderer.ts +++ /dev/null @@ -1,102 +0,0 @@ -import satori from "satori"; -import type { RenderOutput } from "../../../helper/object.js"; -import { FONTS } from "../../config/fonts.js"; -import { base64ToArrayBuffer } from "../../utils/string-utils.js"; -import { traitsParser } from "../parsers/traits-parser.js"; - -const iconBase64 = - "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNTA0XzI4OCkiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAwMCAwSDBWMTAwMEgxMDAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTAwIDY0NS42NjlDNjE1LjE1NyA2NDUuNjY5IDcwOC42NjEgNTUyLjE2NSA3MDguNjYxIDQzNy4wMDhDNzA4LjY2MSAzOTAuMDkyIDY5My4yNDIgMzQ2Ljc4NSA2NjYuOTk1IDMxMi4wMDhDNjkyLjI1NyAyOTIuNjUxIDcwOC42NjEgMjYyLjQ2NyA3MDguNjYxIDIyOC4zNDZINTAwQzM4NC44NDMgMjI4LjM0NiAyOTEuMzM5IDMyMS44NSAyOTEuMzM5IDQzNy4wMDhDMjkxLjMzOSA1NTEuODM3IDM4NS4xNzEgNjQ1LjY2OSA1MDAgNjQ1LjY2OVpNNTAwIDMyMy44MTlDNTYyLjMzNiAzMjMuODE5IDYxMy4xODkgMzc0LjY3MiA2MTMuMTg5IDQzNy4wMDhDNjEzLjE4OSA0OTkuMzQ0IDU2Mi4zMzYgNTUwLjE5NyA1MDAgNTUwLjE5N0M0MzcuNjY0IDU1MC4xOTcgMzg2LjgxMSA0OTkuMzQ0IDM4Ni44MTEgNDM3LjAwOEMzODYuODExIDM3NC42NzIgNDM3LjY2NCAzMjMuODE5IDUwMCAzMjMuODE5WiIgZmlsbD0iIzAwREY5QiIvPgo8cGF0aCBkPSJNNTAwIDgxMS4zNTJDNDA0LjE5OSA4MTEuMzUyIDMwOC4zOTkgNzc0LjkzNCAyMzUuMjM2IDcwMS43NzJDMjQ2LjcxOSA2NzEuNTg4IDI3MS45ODIgNjQ2LjY1NCAzMDUuNzc0IDYzNy4xMzlDMzU5LjkwOCA2ODkuNjMzIDQyOS43OSA3MTUuODc5IDUwMCA3MTUuODc5QzU3MC4yMSA3MTUuODc5IDY0MC4wOTIgNjg5LjYzMyA2OTQuMjI2IDYzNy4xMzlDNzI4LjAxOCA2NDYuNjU0IDc1My4yODEgNjcxLjI2IDc2NC43NjQgNzAxLjc3MkM2OTEuOTI5IDc3NC42MDYgNTk1LjgwMSA4MTEuMzUyIDUwMCA4MTEuMzUyWiIgZmlsbD0iIzI0NzFGRSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzUwNF8yODgiPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="; - -export function renderDobBit(renderOutput: RenderOutput | string) { - let renderData: RenderOutput; - if (typeof renderOutput === "string") { - renderData = JSON.parse(renderOutput) as RenderOutput; - } else { - renderData = renderOutput; - } - const { traits } = traitsParser(renderData); - const account = - traits.find((trait) => trait.name === "Account")?.value ?? "-"; - let fontSize = 76; - if (typeof account === "string") { - if (account.length > 10) { - fontSize = fontSize / 2; - } - if (account.length > 20) { - fontSize = fontSize / 2; - } - if (account.length > 30) { - fontSize = fontSize * 0.75; - } - } - const spaceGroteskBoldFont = base64ToArrayBuffer(FONTS.SpaceGroteskBold); - return satori( - { - key: "container", - type: "div", - props: { - style: { - display: "flex", - flexDirection: "column", - justifyContent: "center", - alignItems: "center", - width: "500px", - background: "#3A3A43", - color: "#fff", - height: "500px", - textAlign: "center", - }, - children: [ - { - type: "img", - props: { - src: iconBase64, - width: 100, - height: 100, - style: { - width: "100px", - height: "100px", - borderRadius: "100%", - marginBottom: "40px", - }, - }, - }, - { - type: "div", - props: { - children: account, - style: { - marginBottom: "20px", - fontSize: `${fontSize}px`, - textAlign: "center", - }, - }, - }, - { - type: "div", - props: { - children: ".bit", - style: { - fontSize: "44px", - padding: "4px 40px", - borderRadius: "200px", - background: "rgba(255, 255, 255, 0.10)", - }, - }, - }, - ], - }, - }, - { - width: 500, - height: 500, - fonts: [ - { - name: "SpaceGrotesk", - data: spaceGroteskBoldFont, - weight: 700, - }, - ], - }, - ); -} diff --git a/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts b/packages/spore/src/dob/render/core/renderers/dob1Render.ts similarity index 75% rename from packages/spore/src/dob/render/core/renderers/dob1-renderer.ts rename to packages/spore/src/dob/render/core/renderers/dob1Render.ts index 68394ed0..ae4051a3 100644 --- a/packages/spore/src/dob/render/core/renderers/dob1-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/dob1Render.ts @@ -1,16 +1,19 @@ import satori from "satori"; import { type INode, stringify } from "svgson"; import { FONTS } from "../../config/fonts.js"; -import { base64ToArrayBuffer } from "../../utils/string-utils.js"; -import { svgToBase64 } from "../../utils/svg-utils.js"; +import { RENDER_CONSTANTS } from "../../types/constants.js"; +import { base64ToArrayBuffer } from "../../utils/string.js"; +import { svgToBase64 } from "../../utils/svg.js"; export async function renderDob1Svg(nodePromise: Promise) { const node = await nodePromise; const str = stringify(node); const base64 = await svgToBase64(str); const spaceGroteskBoldFont = base64ToArrayBuffer(FONTS.SpaceGroteskBold); - const width = parseInt(node.attributes.width, 10) || 500; - const height = parseInt(node.attributes.height, 10) || 500; + const width = + parseInt(node.attributes.width, 10) || RENDER_CONSTANTS.CANVAS_WIDTH; + const height = + parseInt(node.attributes.height, 10) || RENDER_CONSTANTS.CANVAS_HEIGHT; return satori( { diff --git a/packages/spore/src/dob/render/core/renderers/image-renderer.ts b/packages/spore/src/dob/render/core/renderers/imageRender.ts similarity index 75% rename from packages/spore/src/dob/render/core/renderers/image-renderer.ts rename to packages/spore/src/dob/render/core/renderers/imageRender.ts index 2ddfdd3d..05a531c1 100644 --- a/packages/spore/src/dob/render/core/renderers/image-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/imageRender.ts @@ -1,12 +1,14 @@ import satori from "satori"; import { config } from "../../config.js"; +import { Key } from "../../config/constants.js"; +import { RENDER_CONSTANTS } from "../../types/constants.js"; import type { ParsedTrait } from "../../types/core.js"; -import { processFileServerResult } from "../../utils/mime-utils.js"; -import { isBtcFs, isIpfs } from "../../utils/string-utils.js"; -import { backgroundColorParser } from "../parsers/background-color-parser.js"; +import { processFileServerResult } from "../../utils/mime.js"; +import { isBtcFs, isIpfs } from "../../utils/string.js"; +import { backgroundColorParser } from "../parsers/backgroundColorParser.js"; export async function renderImageSvg(traits: ParsedTrait[]): Promise { - const prevBg = traits.find((trait) => trait.name === "prev.bg"); + const prevBg = traits.find((trait) => trait.name === String(Key.Bg)); const bgColor = backgroundColorParser(traits, { defaultColor: "#FFFFFF00" }); let bgImage = ""; @@ -55,6 +57,10 @@ export async function renderImageSvg(traits: ParsedTrait[]): Promise { ], }, }, - { width: 500, height: 500, fonts: [] }, + { + width: RENDER_CONSTANTS.CANVAS_WIDTH, + height: RENDER_CONSTANTS.CANVAS_HEIGHT, + fonts: [], + }, ); } diff --git a/packages/spore/src/dob/render/core/renderers/index.ts b/packages/spore/src/dob/render/core/renderers/index.ts index c7b47086..586ff53d 100644 --- a/packages/spore/src/dob/render/core/renderers/index.ts +++ b/packages/spore/src/dob/render/core/renderers/index.ts @@ -1,4 +1,3 @@ -export * from "./bit-renderer"; -export * from "./dob1-renderer"; -export * from "./image-renderer"; -export * from "./text-renderer"; +export * from "./dob1Render.js"; +export * from "./imageRender.js"; +export * from "./textRender.js"; diff --git a/packages/spore/src/dob/render/core/renderers/text-renderer.ts b/packages/spore/src/dob/render/core/renderers/textRender.ts similarity index 98% rename from packages/spore/src/dob/render/core/renderers/text-renderer.ts rename to packages/spore/src/dob/render/core/renderers/textRender.ts index 06114e40..dbad8c86 100644 --- a/packages/spore/src/dob/render/core/renderers/text-renderer.ts +++ b/packages/spore/src/dob/render/core/renderers/textRender.ts @@ -12,7 +12,7 @@ import type { TextRenderOptions, } from "../../types/core.js"; import type { RenderElement } from "../../types/internal.js"; -import { base64ToArrayBuffer } from "../../utils/string-utils.js"; +import { base64ToArrayBuffer } from "../../utils/string.js"; /** * Font configuration with default values diff --git a/packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts b/packages/spore/src/dob/render/fonts/spaceGroteskBold.base64.ts similarity index 100% rename from packages/spore/src/dob/render/fonts/SpaceGrotesk-Bold.base64.ts rename to packages/spore/src/dob/render/fonts/spaceGroteskBold.base64.ts diff --git a/packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts b/packages/spore/src/dob/render/fonts/turretRoadBold.base64.ts similarity index 100% rename from packages/spore/src/dob/render/fonts/TurretRoad-Bold.base64.ts rename to packages/spore/src/dob/render/fonts/turretRoadBold.base64.ts diff --git a/packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts b/packages/spore/src/dob/render/fonts/turretRoadMedium.base64.ts similarity index 100% rename from packages/spore/src/dob/render/fonts/TurretRoad-Medium.base64.ts rename to packages/spore/src/dob/render/fonts/turretRoadMedium.base64.ts diff --git a/packages/spore/src/dob/render/index.ts b/packages/spore/src/dob/render/index.ts index c533ecfc..615cf4b9 100644 --- a/packages/spore/src/dob/render/index.ts +++ b/packages/spore/src/dob/render/index.ts @@ -1,6 +1,5 @@ -export * from "./api"; -export * from "./config"; -export * from "./core"; -export * from "./services"; -export * from "./types"; -export * from "./utils"; +export * from "./api/index.js"; +export * from "./config/index.js"; +export * from "./core/index.js"; +export * from "./types/index.js"; +export * from "./utils/index.js"; diff --git a/packages/spore/src/dob/render/services/index.ts b/packages/spore/src/dob/render/services/index.ts deleted file mode 100644 index ba3251fd..00000000 --- a/packages/spore/src/dob/render/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./svg-resolver"; diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/spore/src/dob/render/types/index.ts index 493d4083..a9ad49dc 100644 --- a/packages/spore/src/dob/render/types/index.ts +++ b/packages/spore/src/dob/render/types/index.ts @@ -1,4 +1,4 @@ -export * from "./constants"; -export * from "./core"; -export * from "./errors"; -export * from "./internal"; +export * from "./constants.js"; +export * from "./core.js"; +export * from "./errors.js"; +export * from "./internal.js"; diff --git a/packages/spore/src/dob/render/utils/index.ts b/packages/spore/src/dob/render/utils/index.ts index 07bd1c5b..7ad8733b 100644 --- a/packages/spore/src/dob/render/utils/index.ts +++ b/packages/spore/src/dob/render/utils/index.ts @@ -1,4 +1,4 @@ -export * from "./mime-utils"; -export * from "./string-utils"; -export * from "./svg-utils"; -export * from "./validation"; +export * from "./mime.js"; +export * from "./string.js"; +export * from "./svg.js"; +export * from "./validation.js"; diff --git a/packages/spore/src/dob/render/utils/mime-utils.ts b/packages/spore/src/dob/render/utils/mime.ts similarity index 98% rename from packages/spore/src/dob/render/utils/mime-utils.ts rename to packages/spore/src/dob/render/utils/mime.ts index 46181f47..1c76bd88 100644 --- a/packages/spore/src/dob/render/utils/mime-utils.ts +++ b/packages/spore/src/dob/render/utils/mime.ts @@ -1,5 +1,5 @@ import type { FileServerResult } from "../config.js"; -import { hexToBase64 } from "./string-utils.js"; +import { hexToBase64 } from "./string.js"; /** * Detects MIME type from base64-encoded file header by examining file signatures diff --git a/packages/spore/src/dob/render/utils/string-utils.ts b/packages/spore/src/dob/render/utils/string.ts similarity index 100% rename from packages/spore/src/dob/render/utils/string-utils.ts rename to packages/spore/src/dob/render/utils/string.ts diff --git a/packages/spore/src/dob/render/utils/svg-utils.ts b/packages/spore/src/dob/render/utils/svg-utils.ts deleted file mode 100644 index 6173a449..00000000 --- a/packages/spore/src/dob/render/utils/svg-utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -export async function svgToBase64(svgCode: string) { - if (typeof window !== "undefined") { - return `data:image/svg+xml;base64,${window.btoa(svgCode)}`; // browser - } - return `data:image/svg+xml;base64,${Buffer.from(svgCode).toString("base64")}`; // nodejs -} diff --git a/packages/spore/src/dob/render/services/svg-resolver.ts b/packages/spore/src/dob/render/utils/svg.ts similarity index 79% rename from packages/spore/src/dob/render/services/svg-resolver.ts rename to packages/spore/src/dob/render/utils/svg.ts index d6b7bb18..2a74ac61 100644 --- a/packages/spore/src/dob/render/services/svg-resolver.ts +++ b/packages/spore/src/dob/render/utils/svg.ts @@ -2,7 +2,14 @@ import type { INode } from "svgson"; import { parse } from "svgson"; import type { BtcFsURI, IpfsURI } from "../config.js"; import { config } from "../config.js"; -import { processFileServerResult } from "../utils/mime-utils.js"; +import { processFileServerResult } from "./mime.js"; + +export async function svgToBase64(svgCode: string) { + if (typeof window !== "undefined") { + return `data:image/svg+xml;base64,${window.btoa(svgCode)}`; // browser + } + return `data:image/svg+xml;base64,${Buffer.from(svgCode).toString("base64")}`; // nodejs +} async function handleNodeHref(node: INode) { if (node.name !== "image") { From cc3f59ab60353a20bbcdda9bc552c2acc8215e74 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Sun, 12 Oct 2025 21:57:12 +0800 Subject: [PATCH 11/14] refact: move render directory out of spore --- packages/ccc/package.json | 3 +- packages/ccc/src/barrel.ts | 1 + packages/dob-render/README.md | 42 +++++++++++ packages/dob-render/eslint.config.mjs | 62 +++++++++++++++++ packages/dob-render/package.json | 58 ++++++++++++++++ packages/dob-render/prettier.config.cjs | 11 +++ .../render => dob-render/src}/api/index.ts | 0 .../src}/api/renderDobDecode.ts | 2 +- .../src}/api/renderToken.ts | 4 +- .../index.ts => dob-render/src/barrel.ts} | 0 .../dob/render => dob-render/src}/config.ts | 0 .../src}/config/constants.ts | 0 .../render => dob-render/src}/config/fonts.ts | 0 .../render => dob-render/src}/config/index.ts | 0 .../render => dob-render/src}/core/index.ts | 0 .../core/parsers/backgroundColorParser.ts | 0 .../src}/core/parsers/index.ts | 0 .../src}/core/parsers/styleParser.ts | 0 .../src}/core/parsers/textParamsParser.ts | 0 .../src}/core/parsers/traitsParser.ts | 2 +- .../src}/core/renderers/dob1Render.ts | 0 .../src}/core/renderers/imageRender.ts | 0 .../src}/core/renderers/index.ts | 0 .../src}/core/renderers/textRender.ts | 0 .../src}/fonts/spaceGroteskBold.base64.ts | 0 .../src}/fonts/turretRoadBold.base64.ts | 0 .../src}/fonts/turretRoadMedium.base64.ts | 0 packages/dob-render/src/index.ts | 2 + .../src}/types/constants.ts | 0 .../render => dob-render/src}/types/core.ts | 2 +- .../render => dob-render/src}/types/errors.ts | 0 packages/dob-render/src/types/external.ts | 69 +++++++++++++++++++ .../render => dob-render/src}/types/index.ts | 1 + .../src}/types/internal.ts | 0 .../render => dob-render/src}/utils/index.ts | 0 .../render => dob-render/src}/utils/mime.ts | 0 .../render => dob-render/src}/utils/string.ts | 0 .../render => dob-render/src}/utils/svg.ts | 0 .../src}/utils/validation.ts | 0 packages/dob-render/tsconfig.base.json | 22 ++++++ packages/dob-render/tsconfig.commonjs.json | 8 +++ packages/dob-render/tsconfig.json | 8 +++ packages/examples/src/renderDob.ts | 4 +- packages/spore/package.json | 4 +- .../spore/src/__examples__/renderDob.test.ts | 14 ---- packages/spore/src/dob/index.ts | 1 - pnpm-lock.yaml | 54 +++++++++++++-- 47 files changed, 344 insertions(+), 30 deletions(-) create mode 100644 packages/dob-render/README.md create mode 100644 packages/dob-render/eslint.config.mjs create mode 100644 packages/dob-render/package.json create mode 100644 packages/dob-render/prettier.config.cjs rename packages/{spore/src/dob/render => dob-render/src}/api/index.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/api/renderDobDecode.ts (95%) rename packages/{spore/src/dob/render => dob-render/src}/api/renderToken.ts (79%) rename packages/{spore/src/dob/render/index.ts => dob-render/src/barrel.ts} (100%) rename packages/{spore/src/dob/render => dob-render/src}/config.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/config/constants.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/config/fonts.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/config/index.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/index.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/parsers/backgroundColorParser.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/parsers/index.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/parsers/styleParser.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/parsers/textParamsParser.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/parsers/traitsParser.ts (97%) rename packages/{spore/src/dob/render => dob-render/src}/core/renderers/dob1Render.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/renderers/imageRender.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/renderers/index.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/core/renderers/textRender.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/fonts/spaceGroteskBold.base64.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/fonts/turretRoadBold.base64.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/fonts/turretRoadMedium.base64.ts (100%) create mode 100644 packages/dob-render/src/index.ts rename packages/{spore/src/dob/render => dob-render/src}/types/constants.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/types/core.ts (96%) rename packages/{spore/src/dob/render => dob-render/src}/types/errors.ts (100%) create mode 100644 packages/dob-render/src/types/external.ts rename packages/{spore/src/dob/render => dob-render/src}/types/index.ts (79%) rename packages/{spore/src/dob/render => dob-render/src}/types/internal.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/utils/index.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/utils/mime.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/utils/string.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/utils/svg.ts (100%) rename packages/{spore/src/dob/render => dob-render/src}/utils/validation.ts (100%) create mode 100644 packages/dob-render/tsconfig.base.json create mode 100644 packages/dob-render/tsconfig.commonjs.json create mode 100644 packages/dob-render/tsconfig.json delete mode 100644 packages/spore/src/__examples__/renderDob.test.ts diff --git a/packages/ccc/package.json b/packages/ccc/package.json index a3443f61..34587000 100644 --- a/packages/ccc/package.json +++ b/packages/ccc/package.json @@ -64,7 +64,8 @@ "@ckb-ccc/shell": "workspace:*", "@ckb-ccc/uni-sat": "workspace:*", "@ckb-ccc/utxo-global": "workspace:*", - "@ckb-ccc/xverse": "workspace:*" + "@ckb-ccc/xverse": "workspace:*", + "@ckb-ccc/dob-render": "workspace:*" }, "packageManager": "pnpm@10.8.1" } diff --git a/packages/ccc/src/barrel.ts b/packages/ccc/src/barrel.ts index 8b46c112..a14806e0 100644 --- a/packages/ccc/src/barrel.ts +++ b/packages/ccc/src/barrel.ts @@ -1,3 +1,4 @@ +export * from "@ckb-ccc/dob-render"; export * from "@ckb-ccc/eip6963"; export * from "@ckb-ccc/joy-id"; export * from "@ckb-ccc/nip07"; diff --git a/packages/dob-render/README.md b/packages/dob-render/README.md new file mode 100644 index 00000000..4834e8bd --- /dev/null +++ b/packages/dob-render/README.md @@ -0,0 +1,42 @@ +# @ckb-ccc/render + +CCC - CKBer's Codebase. Common Chains Connector's render SDK for DOB protocol. + +This package provides rendering capabilities for DOB (Decentralized Object) protocol, allowing you to render DOB tokens as SVG images. + +## Installation + +```bash +npm install @ckb-ccc/dob-render +``` + +## Usage + +```typescript +import { + renderByTokenKey, + renderByDobDecodeResponse, +} from "@ckb-ccc/dob-render"; + +// Render by token key +const svg = await renderByTokenKey("your-token-key"); + +// Render by DOB decode response +const svg = renderByDobDecodeResponse(renderOutput); +``` + +## API + +### `renderByTokenKey(tokenKey: string, options?: RenderOptions)` + +Renders a DOB token by its key. + +### `renderByDobDecodeResponse(renderOutput: RenderOutput | string, props?: RenderProps)` + +Renders a DOB token from a decoded response. + +## Dependencies + +- `satori` - SVG to image conversion +- `svgson` - SVG parsing +- `axios` - HTTP client for API calls diff --git a/packages/dob-render/eslint.config.mjs b/packages/dob-render/eslint.config.mjs new file mode 100644 index 00000000..b6132c27 --- /dev/null +++ b/packages/dob-render/eslint.config.mjs @@ -0,0 +1,62 @@ +// @ts-check + +import eslint from "@eslint/js"; +import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; +import tseslint from "typescript-eslint"; + +import { dirname } from "path"; +import { fileURLToPath } from "url"; + +export default [ + ...tseslint.config({ + files: ["**/*.ts"], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommendedTypeChecked, + ], + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/require-await": "off", + "@typescript-eslint/only-throw-error": [ + "error", + { + allowThrowingAny: true, + allowThrowingUnknown: true, + allowRethrowing: true, + }, + ], + "@typescript-eslint/prefer-promise-reject-errors": [ + "error", + { + allowThrowingAny: true, + allowThrowingUnknown: true, + }, + ], + "no-empty": "off", + "prefer-const": [ + "error", + { ignoreReadBeforeAssign: true, destructuring: "all" }, + ], + }, + languageOptions: { + parserOptions: { + project: true, + tsconfigRootDir: dirname(fileURLToPath(import.meta.url)), + }, + }, + }), + eslintPluginPrettierRecommended, +]; diff --git a/packages/dob-render/package.json b/packages/dob-render/package.json new file mode 100644 index 00000000..96693e10 --- /dev/null +++ b/packages/dob-render/package.json @@ -0,0 +1,58 @@ +{ + "name": "@ckb-ccc/dob-render", + "version": "1.0.1", + "description": "CCC - CKBer's Codebase. Common Chains Connector's render SDK for DOB protocol", + "author": "ashuralyk ", + "license": "MIT", + "private": false, + "homepage": "https://github.com/ckb-devrel/ccc", + "repository": { + "type": "git", + "url": "git://github.com/ckb-devrel/ccc.git" + }, + "sideEffects": false, + "main": "dist.commonjs/index.js", + "module": "dist/index.js", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist.commonjs/index.js", + "default": "./dist.commonjs/index.js" + }, + "./barrel": { + "import": "./dist/barrel.js", + "require": "./dist.commonjs/barrel.js", + "default": "./dist.commonjs/barrel.js" + } + }, + "scripts": { + "build": "rimraf ./dist && rimraf ./dist.commonjs && tsc && tsc --project tsconfig.commonjs.json", + "lint": "eslint ./src", + "format": "prettier --write . && eslint --fix ./src" + }, + "devDependencies": { + "@eslint/js": "^9.34.0", + "@types/node": "^24.3.0", + "eslint": "^9.34.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", + "prettier-plugin-organize-imports": "^4.2.0", + "rimraf": "^6.0.1", + "typescript": "^5.9.2", + "typescript-eslint": "^8.41.0" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@ckb-ccc/spore": "workspace:*", + "axios": "^1.11.0", + "satori": "^0.10.13", + "svgson": "^5.3.1" + }, + "peerDependencies": { + "satori": "^0.10.13" + }, + "packageManager": "pnpm@10.8.1" +} diff --git a/packages/dob-render/prettier.config.cjs b/packages/dob-render/prettier.config.cjs new file mode 100644 index 00000000..5e181036 --- /dev/null +++ b/packages/dob-render/prettier.config.cjs @@ -0,0 +1,11 @@ +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +const config = { + singleQuote: false, + trailingComma: "all", + plugins: [require.resolve("prettier-plugin-organize-imports")], +}; + +module.exports = config; diff --git a/packages/spore/src/dob/render/api/index.ts b/packages/dob-render/src/api/index.ts similarity index 100% rename from packages/spore/src/dob/render/api/index.ts rename to packages/dob-render/src/api/index.ts diff --git a/packages/spore/src/dob/render/api/renderDobDecode.ts b/packages/dob-render/src/api/renderDobDecode.ts similarity index 95% rename from packages/spore/src/dob/render/api/renderDobDecode.ts rename to packages/dob-render/src/api/renderDobDecode.ts index 34670e6e..277b5234 100644 --- a/packages/spore/src/dob/render/api/renderDobDecode.ts +++ b/packages/dob-render/src/api/renderDobDecode.ts @@ -1,4 +1,3 @@ -import type { RenderOutput } from "../../helper/object.js"; import { Key } from "../config/constants.js"; import { renderTextParamsParser } from "../core/parsers/textParamsParser.js"; import { traitsParser } from "../core/parsers/traitsParser.js"; @@ -6,6 +5,7 @@ import { renderDob1Svg } from "../core/renderers/dob1Render.js"; import { renderImageSvg } from "../core/renderers/imageRender.js"; import type { RenderProps } from "../core/renderers/textRender.js"; import { renderTextSvg } from "../core/renderers/textRender.js"; +import type { RenderOutput } from "../types/external.js"; export function renderByDobDecodeResponse( renderOutput: RenderOutput | string, diff --git a/packages/spore/src/dob/render/api/renderToken.ts b/packages/dob-render/src/api/renderToken.ts similarity index 79% rename from packages/spore/src/dob/render/api/renderToken.ts rename to packages/dob-render/src/api/renderToken.ts index 297c4e42..9a18c34e 100644 --- a/packages/spore/src/dob/render/api/renderToken.ts +++ b/packages/dob-render/src/api/renderToken.ts @@ -1,4 +1,4 @@ -import { decodeDobBySporeId } from "../../api/decode.js"; +import { dob } from "@ckb-ccc/spore"; import { config } from "../config.js"; import type { RenderProps } from "../core/renderers/textRender.js"; import { renderByDobDecodeResponse } from "./renderDobDecode.js"; @@ -9,7 +9,7 @@ export async function renderByTokenKey( outputType?: "svg"; }, ) { - const renderOutput = await decodeDobBySporeId( + const renderOutput = await dob.decodeDobBySporeId( tokenKey, config.dobDecodeServerURL, ); diff --git a/packages/spore/src/dob/render/index.ts b/packages/dob-render/src/barrel.ts similarity index 100% rename from packages/spore/src/dob/render/index.ts rename to packages/dob-render/src/barrel.ts diff --git a/packages/spore/src/dob/render/config.ts b/packages/dob-render/src/config.ts similarity index 100% rename from packages/spore/src/dob/render/config.ts rename to packages/dob-render/src/config.ts diff --git a/packages/spore/src/dob/render/config/constants.ts b/packages/dob-render/src/config/constants.ts similarity index 100% rename from packages/spore/src/dob/render/config/constants.ts rename to packages/dob-render/src/config/constants.ts diff --git a/packages/spore/src/dob/render/config/fonts.ts b/packages/dob-render/src/config/fonts.ts similarity index 100% rename from packages/spore/src/dob/render/config/fonts.ts rename to packages/dob-render/src/config/fonts.ts diff --git a/packages/spore/src/dob/render/config/index.ts b/packages/dob-render/src/config/index.ts similarity index 100% rename from packages/spore/src/dob/render/config/index.ts rename to packages/dob-render/src/config/index.ts diff --git a/packages/spore/src/dob/render/core/index.ts b/packages/dob-render/src/core/index.ts similarity index 100% rename from packages/spore/src/dob/render/core/index.ts rename to packages/dob-render/src/core/index.ts diff --git a/packages/spore/src/dob/render/core/parsers/backgroundColorParser.ts b/packages/dob-render/src/core/parsers/backgroundColorParser.ts similarity index 100% rename from packages/spore/src/dob/render/core/parsers/backgroundColorParser.ts rename to packages/dob-render/src/core/parsers/backgroundColorParser.ts diff --git a/packages/spore/src/dob/render/core/parsers/index.ts b/packages/dob-render/src/core/parsers/index.ts similarity index 100% rename from packages/spore/src/dob/render/core/parsers/index.ts rename to packages/dob-render/src/core/parsers/index.ts diff --git a/packages/spore/src/dob/render/core/parsers/styleParser.ts b/packages/dob-render/src/core/parsers/styleParser.ts similarity index 100% rename from packages/spore/src/dob/render/core/parsers/styleParser.ts rename to packages/dob-render/src/core/parsers/styleParser.ts diff --git a/packages/spore/src/dob/render/core/parsers/textParamsParser.ts b/packages/dob-render/src/core/parsers/textParamsParser.ts similarity index 100% rename from packages/spore/src/dob/render/core/parsers/textParamsParser.ts rename to packages/dob-render/src/core/parsers/textParamsParser.ts diff --git a/packages/spore/src/dob/render/core/parsers/traitsParser.ts b/packages/dob-render/src/core/parsers/traitsParser.ts similarity index 97% rename from packages/spore/src/dob/render/core/parsers/traitsParser.ts rename to packages/dob-render/src/core/parsers/traitsParser.ts index a2b5e480..fdd138d2 100644 --- a/packages/spore/src/dob/render/core/parsers/traitsParser.ts +++ b/packages/dob-render/src/core/parsers/traitsParser.ts @@ -1,6 +1,6 @@ -import type { RenderOutput } from "../../../helper/object.js"; import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; import type { ParsedTrait } from "../../types/core.js"; +import type { RenderOutput } from "../../types/external.js"; import { parseStringToArray } from "../../utils/string.js"; import { resolveSvgTraits } from "../../utils/svg.js"; diff --git a/packages/spore/src/dob/render/core/renderers/dob1Render.ts b/packages/dob-render/src/core/renderers/dob1Render.ts similarity index 100% rename from packages/spore/src/dob/render/core/renderers/dob1Render.ts rename to packages/dob-render/src/core/renderers/dob1Render.ts diff --git a/packages/spore/src/dob/render/core/renderers/imageRender.ts b/packages/dob-render/src/core/renderers/imageRender.ts similarity index 100% rename from packages/spore/src/dob/render/core/renderers/imageRender.ts rename to packages/dob-render/src/core/renderers/imageRender.ts diff --git a/packages/spore/src/dob/render/core/renderers/index.ts b/packages/dob-render/src/core/renderers/index.ts similarity index 100% rename from packages/spore/src/dob/render/core/renderers/index.ts rename to packages/dob-render/src/core/renderers/index.ts diff --git a/packages/spore/src/dob/render/core/renderers/textRender.ts b/packages/dob-render/src/core/renderers/textRender.ts similarity index 100% rename from packages/spore/src/dob/render/core/renderers/textRender.ts rename to packages/dob-render/src/core/renderers/textRender.ts diff --git a/packages/spore/src/dob/render/fonts/spaceGroteskBold.base64.ts b/packages/dob-render/src/fonts/spaceGroteskBold.base64.ts similarity index 100% rename from packages/spore/src/dob/render/fonts/spaceGroteskBold.base64.ts rename to packages/dob-render/src/fonts/spaceGroteskBold.base64.ts diff --git a/packages/spore/src/dob/render/fonts/turretRoadBold.base64.ts b/packages/dob-render/src/fonts/turretRoadBold.base64.ts similarity index 100% rename from packages/spore/src/dob/render/fonts/turretRoadBold.base64.ts rename to packages/dob-render/src/fonts/turretRoadBold.base64.ts diff --git a/packages/spore/src/dob/render/fonts/turretRoadMedium.base64.ts b/packages/dob-render/src/fonts/turretRoadMedium.base64.ts similarity index 100% rename from packages/spore/src/dob/render/fonts/turretRoadMedium.base64.ts rename to packages/dob-render/src/fonts/turretRoadMedium.base64.ts diff --git a/packages/dob-render/src/index.ts b/packages/dob-render/src/index.ts new file mode 100644 index 00000000..e8ba22dc --- /dev/null +++ b/packages/dob-render/src/index.ts @@ -0,0 +1,2 @@ +export * from "./barrel.js"; +export * as render from "./barrel.js"; diff --git a/packages/spore/src/dob/render/types/constants.ts b/packages/dob-render/src/types/constants.ts similarity index 100% rename from packages/spore/src/dob/render/types/constants.ts rename to packages/dob-render/src/types/constants.ts diff --git a/packages/spore/src/dob/render/types/core.ts b/packages/dob-render/src/types/core.ts similarity index 96% rename from packages/spore/src/dob/render/types/core.ts rename to packages/dob-render/src/types/core.ts index c699bc04..53588328 100644 --- a/packages/spore/src/dob/render/types/core.ts +++ b/packages/dob-render/src/types/core.ts @@ -3,7 +3,7 @@ */ import { INode } from "svgson"; -import { RenderOutput } from "../../helper/object.js"; +import { RenderOutput } from "./external.js"; export type TraitValue = string | number | Date | Promise; diff --git a/packages/spore/src/dob/render/types/errors.ts b/packages/dob-render/src/types/errors.ts similarity index 100% rename from packages/spore/src/dob/render/types/errors.ts rename to packages/dob-render/src/types/errors.ts diff --git a/packages/dob-render/src/types/external.ts b/packages/dob-render/src/types/external.ts new file mode 100644 index 00000000..0c087e0e --- /dev/null +++ b/packages/dob-render/src/types/external.ts @@ -0,0 +1,69 @@ +// External types that the render module depends on +// These are copied from the spore module to make render standalone + +export type DNA = string | { dna: string } | string[]; + +export interface Decoder { + type: "code_hash" | "type_id" | "type_script"; + hash?: string; // required if `type` is `code_hash` or `type_id` + script?: { + code_hash: string; + hash_type: string; + args: string; + }; // required if `type` is `type_script` +} + +export interface PatternElementDob0 { + traitName: string; + dobType: string; // String | Number + dnaOffset: number; + dnaLength: number; + patternType: "options" | "range" | "rawNumber" | "rawString" | "utf8"; + traitArgs?: string[] | number[]; // can only be `undefined` in case that `patternType` is `rawNumber` or `rawString` + toJSON?: () => unknown; +} + +export interface PatternDob0 { + ver: 0; + decoder: Decoder; + pattern: PatternElementDob0[]; +} + +export interface Dob0 { + description: string; + dob: PatternDob0; +} + +export type Dob1PatternArgs = string | number[] | ["*"]; + +export interface PatternElementDob1 { + imageName: string; + svgFields: "attributes" | "elements"; + traitName: string; // can only be empty in case that `patternType` is `raw` + patternType: "options" | "raw"; + traitArgs: Dob1PatternArgs[][] | string; // can only be `string` in case that `patternType` is `raw` + toJSON?: () => unknown; +} + +export interface PatternDob1 { + ver: 1; + decoders: { + decoder: Decoder; + pattern: PatternElementDob0[] | PatternElementDob1[]; + }[]; +} + +export interface Dob1 { + description: string; + dob: PatternDob1; +} + +export interface DecodeElement { + name: string; + traits: { + type: string; + value: number | string; + }[]; +} + +export type RenderOutput = DecodeElement[]; diff --git a/packages/spore/src/dob/render/types/index.ts b/packages/dob-render/src/types/index.ts similarity index 79% rename from packages/spore/src/dob/render/types/index.ts rename to packages/dob-render/src/types/index.ts index a9ad49dc..81a81728 100644 --- a/packages/spore/src/dob/render/types/index.ts +++ b/packages/dob-render/src/types/index.ts @@ -1,4 +1,5 @@ export * from "./constants.js"; export * from "./core.js"; export * from "./errors.js"; +export * from "./external.js"; export * from "./internal.js"; diff --git a/packages/spore/src/dob/render/types/internal.ts b/packages/dob-render/src/types/internal.ts similarity index 100% rename from packages/spore/src/dob/render/types/internal.ts rename to packages/dob-render/src/types/internal.ts diff --git a/packages/spore/src/dob/render/utils/index.ts b/packages/dob-render/src/utils/index.ts similarity index 100% rename from packages/spore/src/dob/render/utils/index.ts rename to packages/dob-render/src/utils/index.ts diff --git a/packages/spore/src/dob/render/utils/mime.ts b/packages/dob-render/src/utils/mime.ts similarity index 100% rename from packages/spore/src/dob/render/utils/mime.ts rename to packages/dob-render/src/utils/mime.ts diff --git a/packages/spore/src/dob/render/utils/string.ts b/packages/dob-render/src/utils/string.ts similarity index 100% rename from packages/spore/src/dob/render/utils/string.ts rename to packages/dob-render/src/utils/string.ts diff --git a/packages/spore/src/dob/render/utils/svg.ts b/packages/dob-render/src/utils/svg.ts similarity index 100% rename from packages/spore/src/dob/render/utils/svg.ts rename to packages/dob-render/src/utils/svg.ts diff --git a/packages/spore/src/dob/render/utils/validation.ts b/packages/dob-render/src/utils/validation.ts similarity index 100% rename from packages/spore/src/dob/render/utils/validation.ts rename to packages/dob-render/src/utils/validation.ts diff --git a/packages/dob-render/tsconfig.base.json b/packages/dob-render/tsconfig.base.json new file mode 100644 index 00000000..7e5ac952 --- /dev/null +++ b/packages/dob-render/tsconfig.base.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "es2020", + "incremental": true, + "allowJs": true, + "importHelpers": false, + "declaration": true, + "declarationMap": true, + "experimentalDecorators": true, + "useDefineForClassFields": false, + "esModuleInterop": true, + "strict": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "strictNullChecks": true, + "alwaysStrict": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true + }, + "include": ["src/**/*"] +} diff --git a/packages/dob-render/tsconfig.commonjs.json b/packages/dob-render/tsconfig.commonjs.json new file mode 100644 index 00000000..76a25e98 --- /dev/null +++ b/packages/dob-render/tsconfig.commonjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist.commonjs" + } +} diff --git a/packages/dob-render/tsconfig.json b/packages/dob-render/tsconfig.json new file mode 100644 index 00000000..16f78d28 --- /dev/null +++ b/packages/dob-render/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Bundler", + "outDir": "./dist" + } +} diff --git a/packages/examples/src/renderDob.ts b/packages/examples/src/renderDob.ts index 8fdb8a99..35f06910 100644 --- a/packages/examples/src/renderDob.ts +++ b/packages/examples/src/renderDob.ts @@ -1,7 +1,7 @@ -import { spore } from "@ckb-ccc/ccc"; +import { render } from "@ckb-ccc/ccc"; const sporeId = "dc19e68af1793924845e2a4dbc23598ed919dcfe44d3f9cd90964fe590efb0e4"; -const dobRender = await spore.dob.renderByTokenKey(sporeId); +const dobRender = await render.renderByTokenKey(sporeId); console.log(dobRender); diff --git a/packages/spore/package.json b/packages/spore/package.json index ffe8ed14..3778cc98 100644 --- a/packages/spore/package.json +++ b/packages/spore/package.json @@ -60,9 +60,7 @@ }, "dependencies": { "@ckb-ccc/core": "workspace:*", - "axios": "^1.11.0", - "satori": "^0.10.13", - "svgson": "^5.3.1" + "axios": "^1.11.0" }, "peerDependencies": { "satori": "^0.10.13" diff --git a/packages/spore/src/__examples__/renderDob.test.ts b/packages/spore/src/__examples__/renderDob.test.ts deleted file mode 100644 index 33314340..00000000 --- a/packages/spore/src/__examples__/renderDob.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { describe, it } from "vitest"; -import { renderByTokenKey } from "../dob/index.js"; - -describe("decodeDob [testnet]", () => { - it("should respose a decoded dob render data from a spore id", async () => { - // The spore id that you want to decode (must be a valid spore dob) - const sporeId = - "dc19e68af1793924845e2a4dbc23598ed919dcfe44d3f9cd90964fe590efb0e4"; - - // Decode from spore id - const dob = await renderByTokenKey(sporeId); - console.log(dob); - }, 60000); -}); diff --git a/packages/spore/src/dob/index.ts b/packages/spore/src/dob/index.ts index e2edf74c..68d17aa1 100644 --- a/packages/spore/src/dob/index.ts +++ b/packages/spore/src/dob/index.ts @@ -1,4 +1,3 @@ export * from "./api/index.js"; export * from "./config/index.js"; export * from "./helper/index.js"; -export * from "./render/index.js"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2f68214..a816f468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,6 +52,9 @@ importers: packages/ccc: dependencies: + '@ckb-ccc/dob-render': + specifier: workspace:* + version: link:../dob-render '@ckb-ccc/eip6963': specifier: workspace:* version: link:../eip6963 @@ -404,6 +407,52 @@ importers: specifier: ^5.9.2 version: 5.9.2 + packages/dob-render: + dependencies: + '@ckb-ccc/spore': + specifier: workspace:* + version: link:../spore + axios: + specifier: ^1.11.0 + version: 1.11.0 + satori: + specifier: ^0.10.13 + version: 0.10.14 + svgson: + specifier: ^5.3.1 + version: 5.3.1 + devDependencies: + '@eslint/js': + specifier: ^9.34.0 + version: 9.34.0 + '@types/node': + specifier: ^24.3.0 + version: 24.3.0 + eslint: + specifier: ^9.34.0 + version: 9.34.0(jiti@2.5.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-prettier: + specifier: ^5.5.4 + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(prettier@3.6.2) + prettier: + specifier: ^3.6.2 + version: 3.6.2 + prettier-plugin-organize-imports: + specifier: ^4.2.0 + version: 4.2.0(prettier@3.6.2)(typescript@5.9.2) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + typescript-eslint: + specifier: ^8.41.0 + version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + packages/docs: dependencies: '@docusaurus/core': @@ -1005,9 +1054,6 @@ importers: satori: specifier: ^0.10.13 version: 0.10.14 - svgson: - specifier: ^5.3.1 - version: 5.3.1 devDependencies: '@eslint/js': specifier: ^9.34.0 @@ -14425,7 +14471,7 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 24.3.0 '@types/semver@7.7.0': {} From 7c4e4f0f48299ad5acb41788ca8f2245a35de151 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Tue, 14 Oct 2025 11:33:13 +0800 Subject: [PATCH 12/14] chore: support ckbfs protocol (only in interface) --- packages/dob-render/src/config.ts | 16 ++++++++++++++++ .../dob-render/src/core/renderers/imageRender.ts | 5 ++++- packages/dob-render/src/utils/string.ts | 6 +++++- packages/dob-render/src/utils/svg.ts | 4 +++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/dob-render/src/config.ts b/packages/dob-render/src/config.ts index 9ea6c275..fcc182cf 100644 --- a/packages/dob-render/src/config.ts +++ b/packages/dob-render/src/config.ts @@ -7,16 +7,20 @@ export type FileServerResult = export type BtcFsResult = FileServerResult; export type IpfsResult = FileServerResult; +export type CkbFsResult = FileServerResult; export type BtcFsURI = `btcfs://${string}`; export type IpfsURI = `ipfs://${string}`; +export type CkbFsURI = `ckbfs://${string}`; export type QueryBtcFsFn = (uri: BtcFsURI) => Promise; export type QueryIpfsFn = (uri: IpfsURI) => Promise; +export type QueryCkbFsFn = (uri: CkbFsURI) => Promise; export type QueryUrlFn = (uri: string) => Promise; export class Config { private _dobDecodeServerURL = "https://dob-decoder.ckbccc.com"; + private _queryBtcFsFn: QueryBtcFsFn = async (uri) => { console.log("dob-render-sdk requiring", uri); const response = await fetch( @@ -53,6 +57,10 @@ export class Config { return this._queryUrlFn(url); }; + private _queryCkbFsFn: QueryCkbFsFn = async (_uri: CkbFsURI) => { + throw new Error("CkbFs is not supported"); + }; + get dobDecodeServerURL() { return this._dobDecodeServerURL; } @@ -69,6 +77,10 @@ export class Config { this._queryIpfsFn = fn; } + setQueryCkbFsFn(fn: QueryCkbFsFn): void { + this._queryCkbFsFn = fn; + } + get queryBtcFsFn(): QueryBtcFsFn { return this._queryBtcFsFn; } @@ -80,6 +92,10 @@ export class Config { get queryUrlFn(): QueryUrlFn { return this._queryUrlFn; } + + get queryCkbFsFn(): QueryCkbFsFn { + return this._queryCkbFsFn; + } } export const config = new Config(); diff --git a/packages/dob-render/src/core/renderers/imageRender.ts b/packages/dob-render/src/core/renderers/imageRender.ts index 05a531c1..8ba46929 100644 --- a/packages/dob-render/src/core/renderers/imageRender.ts +++ b/packages/dob-render/src/core/renderers/imageRender.ts @@ -4,7 +4,7 @@ import { Key } from "../../config/constants.js"; import { RENDER_CONSTANTS } from "../../types/constants.js"; import type { ParsedTrait } from "../../types/core.js"; import { processFileServerResult } from "../../utils/mime.js"; -import { isBtcFs, isIpfs } from "../../utils/string.js"; +import { isBtcFs, isCkbFs, isIpfs } from "../../utils/string.js"; import { backgroundColorParser } from "../parsers/backgroundColorParser.js"; export async function renderImageSvg(traits: ParsedTrait[]): Promise { @@ -19,6 +19,9 @@ export async function renderImageSvg(traits: ParsedTrait[]): Promise { } else if (isIpfs(prevBg.value)) { const ipfsFsResult = await config.queryIpfsFn(prevBg.value); bgImage = processFileServerResult(ipfsFsResult); + } else if (isCkbFs(prevBg.value)) { + const ckbFsResult = await config.queryCkbFsFn(prevBg.value); + bgImage = processFileServerResult(ckbFsResult); } else if (prevBg.value.startsWith("https://")) { bgImage = prevBg.value; } diff --git a/packages/dob-render/src/utils/string.ts b/packages/dob-render/src/utils/string.ts index 3d2479ba..533e5f20 100644 --- a/packages/dob-render/src/utils/string.ts +++ b/packages/dob-render/src/utils/string.ts @@ -1,4 +1,4 @@ -import type { BtcFsURI, IpfsURI } from "../config.js"; +import type { BtcFsURI, CkbFsURI, IpfsURI } from "../config.js"; export function parseStringToArray(str: string): string[] { const regex = /'([^']*)'/g; @@ -24,6 +24,10 @@ export function isIpfs(uri: string): uri is IpfsURI { return uri.startsWith("ipfs://"); } +export function isCkbFs(uri: string): uri is CkbFsURI { + return uri.startsWith("ckbfs://"); +} + export function hexToBase64(hexstring: string): string { const str = hexstring .match(/\w{2}/g) diff --git a/packages/dob-render/src/utils/svg.ts b/packages/dob-render/src/utils/svg.ts index 2a74ac61..69cd343c 100644 --- a/packages/dob-render/src/utils/svg.ts +++ b/packages/dob-render/src/utils/svg.ts @@ -1,6 +1,6 @@ import type { INode } from "svgson"; import { parse } from "svgson"; -import type { BtcFsURI, IpfsURI } from "../config.js"; +import type { BtcFsURI, CkbFsURI, IpfsURI } from "../config.js"; import { config } from "../config.js"; import { processFileServerResult } from "./mime.js"; @@ -28,6 +28,8 @@ async function handleNodeHref(node: INode) { result = await config.queryBtcFsFn(node.attributes.href as BtcFsURI); } else if (href.startsWith("ipfs://")) { result = await config.queryIpfsFn(node.attributes.href as IpfsURI); + } else if (href.startsWith("ckbfs://")) { + result = await config.queryCkbFsFn(node.attributes.href as CkbFsURI); } else { result = await config.queryUrlFn(node.attributes.href); } From 5260933523eb94d35453e30c3742e599148f1f55 Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Fri, 17 Oct 2025 19:22:37 +0800 Subject: [PATCH 13/14] feat: refact config module --- .../dob-render/src/api/renderDobDecode.ts | 30 ++--- packages/dob-render/src/api/renderToken.ts | 14 +-- packages/dob-render/src/config.ts | 101 --------------- packages/dob-render/src/config/index.ts | 1 - .../src/core/parsers/styleParser.ts | 8 +- .../src/core/parsers/traitsParser.ts | 11 +- .../src/core/renderers/dob1Render.ts | 2 +- .../src/core/renderers/imageRender.ts | 31 +++-- .../src/core/renderers/textRender.ts | 6 +- packages/dob-render/src/types/errors.ts | 68 ++++++++--- packages/dob-render/src/types/index.ts | 1 + packages/dob-render/src/types/query.ts | 91 ++++++++++++++ packages/dob-render/src/utils/mime.ts | 2 +- packages/dob-render/src/utils/string.ts | 77 +++++++++++- packages/dob-render/src/utils/svg.ts | 115 +++++++++++++----- 15 files changed, 362 insertions(+), 196 deletions(-) delete mode 100644 packages/dob-render/src/config.ts create mode 100644 packages/dob-render/src/types/query.ts diff --git a/packages/dob-render/src/api/renderDobDecode.ts b/packages/dob-render/src/api/renderDobDecode.ts index 277b5234..16bcd8ce 100644 --- a/packages/dob-render/src/api/renderDobDecode.ts +++ b/packages/dob-render/src/api/renderDobDecode.ts @@ -3,27 +3,29 @@ import { renderTextParamsParser } from "../core/parsers/textParamsParser.js"; import { traitsParser } from "../core/parsers/traitsParser.js"; import { renderDob1Svg } from "../core/renderers/dob1Render.js"; import { renderImageSvg } from "../core/renderers/imageRender.js"; -import type { RenderProps } from "../core/renderers/textRender.js"; import { renderTextSvg } from "../core/renderers/textRender.js"; import type { RenderOutput } from "../types/external.js"; +import type { RenderOptions } from "../types/query.js"; +import { + defaultQueryBtcFsFn, + defaultQueryCkbFsFn, + defaultQueryIpfsFn, + defaultQueryUrlFn, +} from "../types/query.js"; export function renderByDobDecodeResponse( - renderOutput: RenderOutput | string, - props?: Pick & { - outputType?: "svg"; - }, + renderOutput: RenderOutput, + props?: RenderOptions, ) { - let renderData: RenderOutput; - if (typeof renderOutput === "string") { - renderData = JSON.parse(renderOutput) as RenderOutput; - } else { - renderData = renderOutput; - } - - const { traits, indexVarRegister } = traitsParser(renderData); + const { traits, indexVarRegister } = traitsParser(renderOutput); for (const trait of traits) { if (trait.name === String(Key.Type) && trait.value === "image") { - return renderImageSvg(traits); + return renderImageSvg(traits, { + queryBtcFsFn: props?.queryBtcFsFn || defaultQueryBtcFsFn, + queryIpfsFn: props?.queryIpfsFn || defaultQueryIpfsFn, + queryCkbFsFn: props?.queryCkbFsFn || defaultQueryCkbFsFn, + queryUrlFn: props?.queryUrlFn || defaultQueryUrlFn, + }); } // TODO: multiple images if (trait.name === String(Key.Image) && trait.value instanceof Promise) { diff --git a/packages/dob-render/src/api/renderToken.ts b/packages/dob-render/src/api/renderToken.ts index 9a18c34e..e3ad4f8f 100644 --- a/packages/dob-render/src/api/renderToken.ts +++ b/packages/dob-render/src/api/renderToken.ts @@ -1,18 +1,14 @@ import { dob } from "@ckb-ccc/spore"; -import { config } from "../config.js"; -import type { RenderProps } from "../core/renderers/textRender.js"; +import type { RenderOptions } from "../types/query.js"; import { renderByDobDecodeResponse } from "./renderDobDecode.js"; export async function renderByTokenKey( tokenKey: string, - options?: Pick & { - outputType?: "svg"; - }, + options?: RenderOptions & { dobDecodeServerURL?: string }, ) { - const renderOutput = await dob.decodeDobBySporeId( - tokenKey, - config.dobDecodeServerURL, - ); + const serverURL = + options?.dobDecodeServerURL || "https://dob-decoder.ckbccc.com"; + const renderOutput = await dob.decodeDobBySporeId(tokenKey, serverURL); return renderByDobDecodeResponse(renderOutput, options); } diff --git a/packages/dob-render/src/config.ts b/packages/dob-render/src/config.ts deleted file mode 100644 index fcc182cf..00000000 --- a/packages/dob-render/src/config.ts +++ /dev/null @@ -1,101 +0,0 @@ -export type FileServerResult = - | string - | { - content: string; - content_type: string; - }; - -export type BtcFsResult = FileServerResult; -export type IpfsResult = FileServerResult; -export type CkbFsResult = FileServerResult; - -export type BtcFsURI = `btcfs://${string}`; -export type IpfsURI = `ipfs://${string}`; -export type CkbFsURI = `ckbfs://${string}`; - -export type QueryBtcFsFn = (uri: BtcFsURI) => Promise; -export type QueryIpfsFn = (uri: IpfsURI) => Promise; -export type QueryCkbFsFn = (uri: CkbFsURI) => Promise; -export type QueryUrlFn = (uri: string) => Promise; - -export class Config { - private _dobDecodeServerURL = "https://dob-decoder.ckbccc.com"; - - private _queryBtcFsFn: QueryBtcFsFn = async (uri) => { - console.log("dob-render-sdk requiring", uri); - const response = await fetch( - `https://dob-decoder.ckbccc.com/restful/dob_extract_image?uri=${uri}&encode=base64`, - ); - const text = await response.text(); - return { - content: text, - content_type: "", - }; - }; - - private _queryUrlFn = async (url: string) => { - console.log("dob-render-sdk requiring", url); - const response = await fetch(url); - const blob = await response.blob(); - return new Promise((resolve, reject) => { - const reader = new FileReader(); - - reader.onload = function () { - const base64 = this.result as string; - resolve(base64); - }; - reader.onerror = (error) => { - reject(new Error(`FileReader error: ${error.type}`)); - }; - reader.readAsDataURL(blob); - }); - }; - - private _queryIpfsFn = async (uri: IpfsURI) => { - const key = uri.substring("ipfs://".length); - const url = `https://ipfs.io/ipfs/${key}`; - return this._queryUrlFn(url); - }; - - private _queryCkbFsFn: QueryCkbFsFn = async (_uri: CkbFsURI) => { - throw new Error("CkbFs is not supported"); - }; - - get dobDecodeServerURL() { - return this._dobDecodeServerURL; - } - - setDobDecodeServerURL(dobDecodeServerURL: string): void { - this._dobDecodeServerURL = dobDecodeServerURL; - } - - setQueryBtcFsFn(fn: QueryBtcFsFn): void { - this._queryBtcFsFn = fn; - } - - setQueryIpfsFn(fn: QueryIpfsFn): void { - this._queryIpfsFn = fn; - } - - setQueryCkbFsFn(fn: QueryCkbFsFn): void { - this._queryCkbFsFn = fn; - } - - get queryBtcFsFn(): QueryBtcFsFn { - return this._queryBtcFsFn; - } - - get queryIpfsFn(): QueryIpfsFn { - return this._queryIpfsFn; - } - - get queryUrlFn(): QueryUrlFn { - return this._queryUrlFn; - } - - get queryCkbFsFn(): QueryCkbFsFn { - return this._queryCkbFsFn; - } -} - -export const config = new Config(); diff --git a/packages/dob-render/src/config/index.ts b/packages/dob-render/src/config/index.ts index 2d0c8624..d134b48a 100644 --- a/packages/dob-render/src/config/index.ts +++ b/packages/dob-render/src/config/index.ts @@ -1,3 +1,2 @@ -export { config } from "../config.js"; export * from "./constants.js"; export * from "./fonts.js"; diff --git a/packages/dob-render/src/core/parsers/styleParser.ts b/packages/dob-render/src/core/parsers/styleParser.ts index a31af973..316926f7 100644 --- a/packages/dob-render/src/core/parsers/styleParser.ts +++ b/packages/dob-render/src/core/parsers/styleParser.ts @@ -36,16 +36,16 @@ export class StyleParser { const result = baseStyle ? { ...baseStyle } : { ...DEFAULT_STYLE }; // Remove angle brackets if present - const cleanInput = this.removeAngleBrackets(input); + let cleanInput = this.removeAngleBrackets(input); // Parse color - this.parseColor(cleanInput, result); + cleanInput = this.parseColor(cleanInput, result); // Parse format - this.parseFormat(cleanInput, result); + cleanInput = this.parseFormat(cleanInput, result); // Parse alignment - this.parseAlignment(cleanInput, result); + cleanInput = this.parseAlignment(cleanInput, result); // Parse break line this.parseBreakLine(cleanInput, result); diff --git a/packages/dob-render/src/core/parsers/traitsParser.ts b/packages/dob-render/src/core/parsers/traitsParser.ts index fdd138d2..8783ab44 100644 --- a/packages/dob-render/src/core/parsers/traitsParser.ts +++ b/packages/dob-render/src/core/parsers/traitsParser.ts @@ -1,12 +1,16 @@ import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; import type { ParsedTrait } from "../../types/core.js"; import type { RenderOutput } from "../../types/external.js"; +import type { QueryOptions } from "../../types/query.js"; import { parseStringToArray } from "../../utils/string.js"; import { resolveSvgTraits } from "../../utils/svg.js"; // ParsedTrait is now defined in types/core.ts -export function traitsParser(items: RenderOutput): { +export function traitsParser( + items: RenderOutput, + options?: QueryOptions, +): { traits: ParsedTrait[]; indexVarRegister: Record; } { @@ -62,14 +66,13 @@ export function traitsParser(items: RenderOutput): { if ("SVG" in traitData && typeof traitData.SVG === "string") { return { name: item.name, - value: resolveSvgTraits(traitData.SVG), + value: resolveSvgTraits(traitData.SVG, options), }; } return null; }) - .map((e) => e!) - .filter((e) => e); + .filter((e): e is ParsedTrait => e !== null); return { traits, indexVarRegister, diff --git a/packages/dob-render/src/core/renderers/dob1Render.ts b/packages/dob-render/src/core/renderers/dob1Render.ts index ae4051a3..074ecfef 100644 --- a/packages/dob-render/src/core/renderers/dob1Render.ts +++ b/packages/dob-render/src/core/renderers/dob1Render.ts @@ -23,7 +23,7 @@ export async function renderDob1Svg(nodePromise: Promise) { style: { display: "flex", width: `${width}px`, - height: `${width}px`, + height: `${height}px`, }, children: [ { diff --git a/packages/dob-render/src/core/renderers/imageRender.ts b/packages/dob-render/src/core/renderers/imageRender.ts index 8ba46929..b2fbc791 100644 --- a/packages/dob-render/src/core/renderers/imageRender.ts +++ b/packages/dob-render/src/core/renderers/imageRender.ts @@ -1,28 +1,37 @@ import satori from "satori"; -import { config } from "../../config.js"; import { Key } from "../../config/constants.js"; import { RENDER_CONSTANTS } from "../../types/constants.js"; import type { ParsedTrait } from "../../types/core.js"; +import type { QueryOptions } from "../../types/query.js"; import { processFileServerResult } from "../../utils/mime.js"; -import { isBtcFs, isCkbFs, isIpfs } from "../../utils/string.js"; +import { isBtcFs, isCkbFs, isIpfs, isUrl } from "../../utils/string.js"; import { backgroundColorParser } from "../parsers/backgroundColorParser.js"; -export async function renderImageSvg(traits: ParsedTrait[]): Promise { +export async function renderImageSvg( + traits: ParsedTrait[], + options?: QueryOptions, +): Promise { const prevBg = traits.find((trait) => trait.name === String(Key.Bg)); const bgColor = backgroundColorParser(traits, { defaultColor: "#FFFFFF00" }); let bgImage = ""; if (prevBg?.value && typeof prevBg.value === "string") { if (isBtcFs(prevBg.value)) { - const btcFsResult = await config.queryBtcFsFn(prevBg.value); - bgImage = processFileServerResult(btcFsResult); + if (options?.queryBtcFsFn) { + const btcFsResult = await options.queryBtcFsFn(prevBg.value); + bgImage = processFileServerResult(btcFsResult); + } } else if (isIpfs(prevBg.value)) { - const ipfsFsResult = await config.queryIpfsFn(prevBg.value); - bgImage = processFileServerResult(ipfsFsResult); + if (options?.queryIpfsFn) { + const ipfsFsResult = await options.queryIpfsFn(prevBg.value); + bgImage = processFileServerResult(ipfsFsResult); + } } else if (isCkbFs(prevBg.value)) { - const ckbFsResult = await config.queryCkbFsFn(prevBg.value); - bgImage = processFileServerResult(ckbFsResult); - } else if (prevBg.value.startsWith("https://")) { + if (options?.queryCkbFsFn) { + const ckbFsResult = await options.queryCkbFsFn(prevBg.value); + bgImage = processFileServerResult(ckbFsResult); + } + } else if (isUrl(prevBg.value)) { bgImage = prevBg.value; } } @@ -35,7 +44,7 @@ export async function renderImageSvg(traits: ParsedTrait[]): Promise { style: { display: "flex", width: "500px", - background: bgColor ?? "#000", + background: bgColor, color: "#fff", height: "500px", justifyContent: "center", diff --git a/packages/dob-render/src/core/renderers/textRender.ts b/packages/dob-render/src/core/renderers/textRender.ts index dbad8c86..c60b0fc5 100644 --- a/packages/dob-render/src/core/renderers/textRender.ts +++ b/packages/dob-render/src/core/renderers/textRender.ts @@ -11,6 +11,7 @@ import type { TextItem, TextRenderOptions, } from "../../types/core.js"; +import { RenderEngineError } from "../../types/errors.js"; import type { RenderElement } from "../../types/internal.js"; import { base64ToArrayBuffer } from "../../utils/string.js"; @@ -44,8 +45,11 @@ export class TextRenderer { return await satori(container, this.getSatoriOptions()); } catch (error) { - throw new Error( + throw new RenderEngineError( `Failed to render text: ${error instanceof Error ? error.message : String(error)}`, + "text", + options, + error instanceof Error ? error : new Error(String(error)), ); } } diff --git a/packages/dob-render/src/types/errors.ts b/packages/dob-render/src/types/errors.ts index edbceb17..b30a6888 100644 --- a/packages/dob-render/src/types/errors.ts +++ b/packages/dob-render/src/types/errors.ts @@ -1,42 +1,74 @@ -/** - * Error types for the render system - */ +// Custom error types for the dob-render package export class RenderError extends Error { constructor( message: string, - public readonly code: string, + public readonly cause?: Error, public readonly context?: Record, ) { super(message); this.name = "RenderError"; + + // Maintain proper stack trace for where our error was thrown + if (Error.captureStackTrace) { + Error.captureStackTrace(this, RenderError); + } } } -export class TraitParseError extends RenderError { - constructor(message: string, context?: Record) { - super(message, "TRAIT_PARSE_ERROR", context); - this.name = "TraitParseError"; +export class SvgParseError extends RenderError { + constructor( + message: string, + public readonly svgContent?: string, + cause?: Error, + ) { + super(message, cause, { svgContent }); + this.name = "SvgParseError"; } } -export class StyleParseError extends RenderError { - constructor(message: string, context?: Record) { - super(message, "STYLE_PARSE_ERROR", context); - this.name = "StyleParseError"; +export class SvgResolveError extends RenderError { + constructor( + message: string, + public readonly svgContent?: string, + public readonly nodeHref?: string, + cause?: Error, + ) { + super(message, cause, { svgContent, nodeHref }); + this.name = "SvgResolveError"; } } -export class RenderEngineError extends RenderError { - constructor(message: string, context?: Record) { - super(message, "RENDER_ENGINE_ERROR", context); - this.name = "RenderEngineError"; +export class StyleParseError extends RenderError { + constructor( + message: string, + context?: Record, + cause?: Error, + ) { + super(message, cause, context); + this.name = "StyleParseError"; } } export class ValidationError extends RenderError { - constructor(message: string, context?: Record) { - super(message, "VALIDATION_ERROR", context); + constructor( + message: string, + context?: Record, + cause?: Error, + ) { + super(message, cause, context); this.name = "ValidationError"; } } + +export class RenderEngineError extends RenderError { + constructor( + message: string, + public readonly renderType?: string, + public readonly renderData?: unknown, + cause?: Error, + ) { + super(message, cause, { renderType, renderData }); + this.name = "RenderEngineError"; + } +} diff --git a/packages/dob-render/src/types/index.ts b/packages/dob-render/src/types/index.ts index 81a81728..90545c25 100644 --- a/packages/dob-render/src/types/index.ts +++ b/packages/dob-render/src/types/index.ts @@ -3,3 +3,4 @@ export * from "./core.js"; export * from "./errors.js"; export * from "./external.js"; export * from "./internal.js"; +export * from "./query.js"; diff --git a/packages/dob-render/src/types/query.ts b/packages/dob-render/src/types/query.ts new file mode 100644 index 00000000..3cffc545 --- /dev/null +++ b/packages/dob-render/src/types/query.ts @@ -0,0 +1,91 @@ +// Import RenderProps type for font configuration +import type { RenderProps } from "../core/renderers/textRender.js"; + +export type FileServerResult = + | string + | { + content: string; + content_type: string; + }; + +export type BtcFsResult = FileServerResult; +export type IpfsResult = FileServerResult; +export type CkbFsResult = FileServerResult; + +export type BtcFsURI = `btcfs://${string}`; +export type IpfsURI = `ipfs://${string}`; +export type CkbFsURI = `ckbfs://${string}`; + +export type QueryBtcFsFn = (uri: BtcFsURI) => Promise; +export type QueryIpfsFn = (uri: IpfsURI) => Promise; +export type QueryCkbFsFn = (uri: CkbFsURI) => Promise; +export type QueryUrlFn = (uri: string) => Promise; + +// Default query functions +export const defaultQueryBtcFsFn: QueryBtcFsFn = async (uri) => { + console.log("dob-render-sdk requiring", uri); + const response = await fetch( + `https://dob-decoder.ckbccc.com/restful/dob_extract_image?uri=${uri}&encode=base64`, + ); + const text = await response.text(); + return { + content: text, + content_type: "", + }; +}; + +export const defaultQueryUrlFn: QueryUrlFn = async (url: string) => { + console.log("dob-render-sdk requiring", url); + const response = await fetch(url); + const blob = await response.blob(); + + // Environment-agnostic blob to base64 conversion + if (typeof window !== "undefined" && typeof FileReader !== "undefined") { + // Browser environment - use FileReader + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = function () { + const base64 = this.result as string; + resolve(base64); + }; + reader.onerror = (error) => { + reject(new Error(`FileReader error: ${error.type}`)); + }; + reader.readAsDataURL(blob); + }); + } else { + // Node.js environment - use Buffer + try { + const arrayBuffer = await blob.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + const base64 = buffer.toString("base64"); + const mimeType = blob.type || "application/octet-stream"; + return `data:${mimeType};base64,${base64}`; + } catch (error) { + throw new Error(`Buffer conversion error: ${String(error)}`); + } + } +}; + +export const defaultQueryIpfsFn: QueryIpfsFn = async (uri: IpfsURI) => { + console.log("dob-render-sdk requiring", uri); + const key = uri.substring("ipfs://".length); + const url = `https://ipfs.io/ipfs/${key}`; + return defaultQueryUrlFn(url); +}; + +export const defaultQueryCkbFsFn: QueryCkbFsFn = async (_uri: CkbFsURI) => { + throw new Error("CkbFs is not supported"); +}; + +export interface QueryOptions { + queryBtcFsFn?: QueryBtcFsFn; + queryIpfsFn?: QueryIpfsFn; + queryCkbFsFn?: QueryCkbFsFn; + queryUrlFn?: QueryUrlFn; +} + +export type RenderOptions = QueryOptions & { + font?: RenderProps["font"]; + outputType?: "svg"; +}; diff --git a/packages/dob-render/src/utils/mime.ts b/packages/dob-render/src/utils/mime.ts index 1c76bd88..4bde8261 100644 --- a/packages/dob-render/src/utils/mime.ts +++ b/packages/dob-render/src/utils/mime.ts @@ -1,4 +1,4 @@ -import type { FileServerResult } from "../config.js"; +import type { FileServerResult } from "../types/query.js"; import { hexToBase64 } from "./string.js"; /** diff --git a/packages/dob-render/src/utils/string.ts b/packages/dob-render/src/utils/string.ts index 533e5f20..74bf17fd 100644 --- a/packages/dob-render/src/utils/string.ts +++ b/packages/dob-render/src/utils/string.ts @@ -1,12 +1,47 @@ -import type { BtcFsURI, CkbFsURI, IpfsURI } from "../config.js"; +import type { BtcFsURI, CkbFsURI, IpfsURI } from "../types/query.js"; export function parseStringToArray(str: string): string[] { const regex = /'([^']*)'/g; return [...str.matchAll(regex)].map((match) => match[1]); } +// Environment-agnostic base64 decoding +export function base64Decode(base64: string): string { + if (typeof window !== "undefined" && typeof window.atob === "function") { + // Browser environment + return window.atob(base64); + } else if (typeof Buffer !== "undefined") { + // Node.js environment + return Buffer.from(base64, "base64").toString("binary"); + } else { + // Fallback implementation + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + let result = ""; + let i = 0; + + base64 = base64.replace(/[^A-Za-z0-9+/]/g, ""); + + while (i < base64.length) { + const encoded1 = chars.indexOf(base64.charAt(i++)); + const encoded2 = chars.indexOf(base64.charAt(i++)); + const encoded3 = chars.indexOf(base64.charAt(i++)); + const encoded4 = chars.indexOf(base64.charAt(i++)); + + const bitmap = + (encoded1 << 18) | (encoded2 << 12) | (encoded3 << 6) | encoded4; + + result += String.fromCharCode((bitmap >> 16) & 255); + if (encoded3 !== 64) result += String.fromCharCode((bitmap >> 8) & 255); + if (encoded4 !== 64) result += String.fromCharCode(bitmap & 255); + } + + return result; + } +} + export function base64ToArrayBuffer(base64: string): ArrayBuffer { - const binaryString = atob(base64); + const binaryString = base64Decode(base64); const uint8Array = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) { @@ -28,10 +63,46 @@ export function isCkbFs(uri: string): uri is CkbFsURI { return uri.startsWith("ckbfs://"); } +export function isUrl(uri: string): boolean { + return uri.startsWith("https://") || uri.startsWith("http://"); +} + +// Environment-agnostic base64 encoding +export function base64Encode(str: string): string { + if (typeof window !== "undefined" && typeof window.btoa === "function") { + // Browser environment + return window.btoa(str); + } else if (typeof Buffer !== "undefined") { + // Node.js environment + return Buffer.from(str, "binary").toString("base64"); + } else { + // Fallback implementation + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + let result = ""; + let i = 0; + + while (i < str.length) { + const a = str.charCodeAt(i++); + const b = i < str.length ? str.charCodeAt(i++) : 0; + const c = i < str.length ? str.charCodeAt(i++) : 0; + + const bitmap = (a << 16) | (b << 8) | c; + + result += chars.charAt((bitmap >> 18) & 63); + result += chars.charAt((bitmap >> 12) & 63); + result += i - 2 < str.length ? chars.charAt((bitmap >> 6) & 63) : "="; + result += i - 1 < str.length ? chars.charAt(bitmap & 63) : "="; + } + + return result; + } +} + export function hexToBase64(hexstring: string): string { const str = hexstring .match(/\w{2}/g) ?.map((a) => String.fromCharCode(parseInt(a, 16))) .join(""); - return str ? btoa(str) : ""; + return str ? base64Encode(str) : ""; } diff --git a/packages/dob-render/src/utils/svg.ts b/packages/dob-render/src/utils/svg.ts index 69cd343c..48f68118 100644 --- a/packages/dob-render/src/utils/svg.ts +++ b/packages/dob-render/src/utils/svg.ts @@ -1,21 +1,46 @@ import type { INode } from "svgson"; import { parse } from "svgson"; -import type { BtcFsURI, CkbFsURI, IpfsURI } from "../config.js"; -import { config } from "../config.js"; +import { SvgParseError, SvgResolveError } from "../types/errors.js"; +import { + defaultQueryBtcFsFn, + defaultQueryCkbFsFn, + defaultQueryIpfsFn, + defaultQueryUrlFn, + type BtcFsURI, + type CkbFsURI, + type IpfsURI, + type QueryBtcFsFn, + type QueryCkbFsFn, + type QueryIpfsFn, + type QueryOptions, + type QueryUrlFn, +} from "../types/query.js"; import { processFileServerResult } from "./mime.js"; +import { base64Encode } from "./string.js"; export async function svgToBase64(svgCode: string) { - if (typeof window !== "undefined") { - return `data:image/svg+xml;base64,${window.btoa(svgCode)}`; // browser - } - return `data:image/svg+xml;base64,${Buffer.from(svgCode).toString("base64")}`; // nodejs + return `data:image/svg+xml;base64,${base64Encode(svgCode)}`; } -async function handleNodeHref(node: INode) { +async function handleNodeHref( + node: INode, + queryBtcFsFn?: QueryBtcFsFn, + queryIpfsFn?: QueryIpfsFn, + queryCkbFsFn?: QueryCkbFsFn, + queryUrlFn?: QueryUrlFn, +) { if (node.name !== "image") { if (node.children.length) { node.children = await Promise.all( - node.children.map((n) => handleNodeHref(n)), + node.children.map((n) => + handleNodeHref( + n, + queryBtcFsFn, + queryIpfsFn, + queryCkbFsFn, + queryUrlFn, + ), + ), ); } return node; @@ -24,35 +49,69 @@ async function handleNodeHref(node: INode) { const href = node.attributes.href; let result; - if (href.startsWith("btcfs://")) { - result = await config.queryBtcFsFn(node.attributes.href as BtcFsURI); - } else if (href.startsWith("ipfs://")) { - result = await config.queryIpfsFn(node.attributes.href as IpfsURI); - } else if (href.startsWith("ckbfs://")) { - result = await config.queryCkbFsFn(node.attributes.href as CkbFsURI); - } else { - result = await config.queryUrlFn(node.attributes.href); - } + try { + if (href.startsWith("btcfs://") && queryBtcFsFn) { + result = await queryBtcFsFn(node.attributes.href as BtcFsURI); + } else if (href.startsWith("ipfs://") && queryIpfsFn) { + result = await queryIpfsFn(node.attributes.href as IpfsURI); + } else if (href.startsWith("ckbfs://") && queryCkbFsFn) { + result = await queryCkbFsFn(node.attributes.href as CkbFsURI); + } else if (queryUrlFn) { + result = await queryUrlFn(node.attributes.href); + } else { + return node; // No query function available, skip processing + } - node.attributes.href = processFileServerResult(result); + node.attributes.href = processFileServerResult(result); + } catch (error: unknown) { + if (error instanceof Error) { + throw new SvgResolveError( + `Failed to resolve href "${href}": ${error.message}`, + undefined, + href, + error, + ); + } else { + throw new SvgResolveError( + `Failed to resolve href "${href}": Unknown error`, + undefined, + href, + new Error(String(error)), + ); + } + } } return node; } -export async function resolveSvgTraits(svgStr: string): Promise { +export async function resolveSvgTraits( + svgStr: string, + options?: QueryOptions, +): Promise { try { const svgAST = await parse(svgStr); - await handleNodeHref(svgAST); + await handleNodeHref( + svgAST, + options?.queryBtcFsFn || defaultQueryBtcFsFn, + options?.queryIpfsFn || defaultQueryIpfsFn, + options?.queryCkbFsFn || defaultQueryCkbFsFn, + options?.queryUrlFn || defaultQueryUrlFn, + ); return svgAST; } catch (error: unknown) { - console.error(error); - return { - value: "", - type: "element", - name: "svg", - children: [], - attributes: {}, - }; + if (error instanceof Error) { + throw new SvgParseError( + `Failed to parse or resolve SVG content: ${error.message}`, + svgStr, + error, + ); + } else { + throw new SvgParseError( + "Failed to parse or resolve SVG content: Unknown error", + svgStr, + new Error(String(error)), + ); + } } } From f3a303b07559957b35827e3ecc8b6933518f7e9f Mon Sep 17 00:00:00 2001 From: ashuralyk Date: Sat, 18 Oct 2025 13:36:29 +0800 Subject: [PATCH 14/14] chore: solve suggestions from gemini --- .changeset/tall-parrots-occur.md | 7 ++ packages/dob-render/README.md | 4 +- packages/dob-render/package.json | 3 - .../dob-render/src/api/renderDobDecode.ts | 4 +- .../src/core/parsers/textParamsParser.ts | 6 +- .../src/core/parsers/traitsParser.ts | 13 ++-- .../src/core/renderers/imageRender.ts | 6 +- .../src/core/renderers/textRender.ts | 2 +- packages/dob-render/src/types/core.ts | 47 +++++-------- packages/dob-render/src/types/external.ts | 69 ------------------- packages/dob-render/src/types/index.ts | 2 - packages/dob-render/src/types/internal.ts | 16 ----- packages/spore/src/dob/helper/object.ts | 12 ++-- 13 files changed, 52 insertions(+), 139 deletions(-) create mode 100644 .changeset/tall-parrots-occur.md delete mode 100644 packages/dob-render/src/types/external.ts delete mode 100644 packages/dob-render/src/types/internal.ts diff --git a/.changeset/tall-parrots-occur.md b/.changeset/tall-parrots-occur.md new file mode 100644 index 00000000..e03a52f0 --- /dev/null +++ b/.changeset/tall-parrots-occur.md @@ -0,0 +1,7 @@ +--- +"@ckb-ccc/dob-render": patch +"@ckb-ccc/spore": patch +--- + +Fix decoder responsed value type mismatch and migrate dob-render-sdk to ccc + \ No newline at end of file diff --git a/packages/dob-render/README.md b/packages/dob-render/README.md index 4834e8bd..304e65fb 100644 --- a/packages/dob-render/README.md +++ b/packages/dob-render/README.md @@ -1,4 +1,4 @@ -# @ckb-ccc/render +# @ckb-ccc/dob-render CCC - CKBer's Codebase. Common Chains Connector's render SDK for DOB protocol. @@ -31,7 +31,7 @@ const svg = renderByDobDecodeResponse(renderOutput); Renders a DOB token by its key. -### `renderByDobDecodeResponse(renderOutput: RenderOutput | string, props?: RenderProps)` +### `renderByDobDecodeResponse(renderOutput: RenderOutput, props?: RenderProps)` Renders a DOB token from a decoded response. diff --git a/packages/dob-render/package.json b/packages/dob-render/package.json index 96693e10..98631d51 100644 --- a/packages/dob-render/package.json +++ b/packages/dob-render/package.json @@ -51,8 +51,5 @@ "satori": "^0.10.13", "svgson": "^5.3.1" }, - "peerDependencies": { - "satori": "^0.10.13" - }, "packageManager": "pnpm@10.8.1" } diff --git a/packages/dob-render/src/api/renderDobDecode.ts b/packages/dob-render/src/api/renderDobDecode.ts index 16bcd8ce..8a7d6762 100644 --- a/packages/dob-render/src/api/renderDobDecode.ts +++ b/packages/dob-render/src/api/renderDobDecode.ts @@ -1,10 +1,10 @@ +import { dob } from "@ckb-ccc/spore"; import { Key } from "../config/constants.js"; import { renderTextParamsParser } from "../core/parsers/textParamsParser.js"; import { traitsParser } from "../core/parsers/traitsParser.js"; import { renderDob1Svg } from "../core/renderers/dob1Render.js"; import { renderImageSvg } from "../core/renderers/imageRender.js"; import { renderTextSvg } from "../core/renderers/textRender.js"; -import type { RenderOutput } from "../types/external.js"; import type { RenderOptions } from "../types/query.js"; import { defaultQueryBtcFsFn, @@ -14,7 +14,7 @@ import { } from "../types/query.js"; export function renderByDobDecodeResponse( - renderOutput: RenderOutput, + renderOutput: dob.RenderOutput, props?: RenderOptions, ) { const { traits, indexVarRegister } = traitsParser(renderOutput); diff --git a/packages/dob-render/src/core/parsers/textParamsParser.ts b/packages/dob-render/src/core/parsers/textParamsParser.ts index ab855051..b6b51191 100644 --- a/packages/dob-render/src/core/parsers/textParamsParser.ts +++ b/packages/dob-render/src/core/parsers/textParamsParser.ts @@ -13,6 +13,7 @@ import type { TextStyle, TraitValue, } from "../../types/core.js"; +import { RenderEngineError } from "../../types/errors.js"; import { backgroundColorParser } from "./backgroundColorParser.js"; import { createStyleParser } from "./styleParser.js"; @@ -55,8 +56,11 @@ export class TextParamsParser { bgColor, }; } catch (error) { - throw new Error( + throw new RenderEngineError( `Failed to parse text parameters: ${error instanceof Error ? error.message : String(error)}`, + "text", + { traits, indexVarRegister, options }, + error instanceof Error ? error : undefined, ); } } diff --git a/packages/dob-render/src/core/parsers/traitsParser.ts b/packages/dob-render/src/core/parsers/traitsParser.ts index 8783ab44..3c07a6a9 100644 --- a/packages/dob-render/src/core/parsers/traitsParser.ts +++ b/packages/dob-render/src/core/parsers/traitsParser.ts @@ -1,22 +1,21 @@ +import { dob } from "@ckb-ccc/spore"; import { ARRAY_INDEX_REG, ARRAY_REG } from "../../config/constants.js"; import type { ParsedTrait } from "../../types/core.js"; -import type { RenderOutput } from "../../types/external.js"; import type { QueryOptions } from "../../types/query.js"; import { parseStringToArray } from "../../utils/string.js"; import { resolveSvgTraits } from "../../utils/svg.js"; -// ParsedTrait is now defined in types/core.ts - export function traitsParser( - items: RenderOutput, + items: dob.RenderOutput, options?: QueryOptions, ): { traits: ParsedTrait[]; indexVarRegister: Record; } { const indexVarRegister = items.reduce>((acc, item) => { - if (!item.traits[0]?.value) return acc; - const match = String(item.traits[0].value).match(ARRAY_INDEX_REG); + if (!("String" in item.traits[0])) return acc; + if (typeof item.traits[0].String !== "string") return acc; + const match = item.traits[0].String.match(ARRAY_INDEX_REG); if (!match) return acc; const intIndex = parseInt(match[1], 10); if (isNaN(intIndex)) return acc; @@ -67,7 +66,7 @@ export function traitsParser( return { name: item.name, value: resolveSvgTraits(traitData.SVG, options), - }; + } as ParsedTrait; } return null; diff --git a/packages/dob-render/src/core/renderers/imageRender.ts b/packages/dob-render/src/core/renderers/imageRender.ts index b2fbc791..aff35ac3 100644 --- a/packages/dob-render/src/core/renderers/imageRender.ts +++ b/packages/dob-render/src/core/renderers/imageRender.ts @@ -43,10 +43,10 @@ export async function renderImageSvg( props: { style: { display: "flex", - width: "500px", + width: `${RENDER_CONSTANTS.CANVAS_WIDTH}px`, background: bgColor, - color: "#fff", - height: "500px", + color: `${RENDER_CONSTANTS.DEFAULT_TEXT_COLOR}`, + height: `${RENDER_CONSTANTS.CANVAS_HEIGHT}px`, justifyContent: "center", alignItems: "center", overflow: "hidden", diff --git a/packages/dob-render/src/core/renderers/textRender.ts b/packages/dob-render/src/core/renderers/textRender.ts index c60b0fc5..5ced5eb5 100644 --- a/packages/dob-render/src/core/renderers/textRender.ts +++ b/packages/dob-render/src/core/renderers/textRender.ts @@ -8,11 +8,11 @@ import { } from "../../types/constants.js"; import type { FontConfiguration, + RenderElement, TextItem, TextRenderOptions, } from "../../types/core.js"; import { RenderEngineError } from "../../types/errors.js"; -import type { RenderElement } from "../../types/internal.js"; import { base64ToArrayBuffer } from "../../utils/string.js"; /** diff --git a/packages/dob-render/src/types/core.ts b/packages/dob-render/src/types/core.ts index 53588328..5762a1be 100644 --- a/packages/dob-render/src/types/core.ts +++ b/packages/dob-render/src/types/core.ts @@ -3,28 +3,31 @@ */ import { INode } from "svgson"; -import { RenderOutput } from "./external.js"; + +export interface RenderElement< + P = Record, + S = Record, + T = string, +> { + type: T; + props: P & { + children: + | RenderElement + | RenderElement[] + | string + | (RenderElement | string)[]; + style: S; + }; + key: string | null; +} export type TraitValue = string | number | Date | Promise; -export interface Trait { +export interface ParsedTrait { readonly name: string; readonly value: TraitValue; } -export interface ParsedTrait extends Trait { - readonly value: TraitValue; -} - -export interface IndexVariableRegister { - readonly [variableName: string]: number; -} - -export interface TraitParseResult { - readonly traits: readonly ParsedTrait[]; - readonly indexVarRegister: IndexVariableRegister; -} - export interface StyleConfiguration { color: string; format: StyleFormat[]; @@ -63,17 +66,3 @@ export interface FontConfiguration { readonly bold: ArrayBuffer; readonly boldItalic: ArrayBuffer; } - -export interface RenderConfiguration { - readonly font?: FontConfiguration; - readonly outputType?: "svg"; -} - -export interface ImageRenderOptions { - readonly traits: readonly ParsedTrait[]; -} - -export interface BitRenderOptions { - readonly dobData: string | RenderOutput[]; - readonly outputType?: "svg"; -} diff --git a/packages/dob-render/src/types/external.ts b/packages/dob-render/src/types/external.ts deleted file mode 100644 index 0c087e0e..00000000 --- a/packages/dob-render/src/types/external.ts +++ /dev/null @@ -1,69 +0,0 @@ -// External types that the render module depends on -// These are copied from the spore module to make render standalone - -export type DNA = string | { dna: string } | string[]; - -export interface Decoder { - type: "code_hash" | "type_id" | "type_script"; - hash?: string; // required if `type` is `code_hash` or `type_id` - script?: { - code_hash: string; - hash_type: string; - args: string; - }; // required if `type` is `type_script` -} - -export interface PatternElementDob0 { - traitName: string; - dobType: string; // String | Number - dnaOffset: number; - dnaLength: number; - patternType: "options" | "range" | "rawNumber" | "rawString" | "utf8"; - traitArgs?: string[] | number[]; // can only be `undefined` in case that `patternType` is `rawNumber` or `rawString` - toJSON?: () => unknown; -} - -export interface PatternDob0 { - ver: 0; - decoder: Decoder; - pattern: PatternElementDob0[]; -} - -export interface Dob0 { - description: string; - dob: PatternDob0; -} - -export type Dob1PatternArgs = string | number[] | ["*"]; - -export interface PatternElementDob1 { - imageName: string; - svgFields: "attributes" | "elements"; - traitName: string; // can only be empty in case that `patternType` is `raw` - patternType: "options" | "raw"; - traitArgs: Dob1PatternArgs[][] | string; // can only be `string` in case that `patternType` is `raw` - toJSON?: () => unknown; -} - -export interface PatternDob1 { - ver: 1; - decoders: { - decoder: Decoder; - pattern: PatternElementDob0[] | PatternElementDob1[]; - }[]; -} - -export interface Dob1 { - description: string; - dob: PatternDob1; -} - -export interface DecodeElement { - name: string; - traits: { - type: string; - value: number | string; - }[]; -} - -export type RenderOutput = DecodeElement[]; diff --git a/packages/dob-render/src/types/index.ts b/packages/dob-render/src/types/index.ts index 90545c25..084d50bc 100644 --- a/packages/dob-render/src/types/index.ts +++ b/packages/dob-render/src/types/index.ts @@ -1,6 +1,4 @@ export * from "./constants.js"; export * from "./core.js"; export * from "./errors.js"; -export * from "./external.js"; -export * from "./internal.js"; export * from "./query.js"; diff --git a/packages/dob-render/src/types/internal.ts b/packages/dob-render/src/types/internal.ts deleted file mode 100644 index ed70c474..00000000 --- a/packages/dob-render/src/types/internal.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface RenderElement< - P = Record, - S = Record, - T = string, -> { - type: T; - props: P & { - children: - | RenderElement - | RenderElement[] - | string - | (RenderElement | string)[]; - style: S; - }; - key: string | null; -} diff --git a/packages/spore/src/dob/helper/object.ts b/packages/spore/src/dob/helper/object.ts index 636bfd82..b64528df 100644 --- a/packages/spore/src/dob/helper/object.ts +++ b/packages/spore/src/dob/helper/object.ts @@ -55,12 +55,16 @@ export interface Dob1 { dob: PatternDob1; } +export type ElementTrait = + | { String: string } + | { Number: number } + | { Timestamp: number } + | { SVG: string } + | { [key: string]: string | number }; + export interface DecodeElement { name: string; - traits: { - type: string; - value: number | string; - }[]; + traits: ElementTrait[]; } export type RenderOutput = DecodeElement[];