diff --git a/.env b/.env new file mode 100644 index 0000000..163714d --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +DATE_START = 2025-04-15 +PDS_URL = https://pds.witchcraft.systems +PORT = 3000 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b9ed5c4..0000000 --- a/.gitignore +++ /dev/null @@ -1,136 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index e9cd8ac..0000000 --- a/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Alpine.js Test - - - $POSTSPLACEHOLDER - - \ No newline at end of file diff --git a/node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts b/node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts new file mode 100644 index 0000000..0c08d71 --- /dev/null +++ b/node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts @@ -0,0 +1,32 @@ +declare namespace svelteNative.JSX { + + // Every namespace eligible for use needs to implement the following two functions + function mapElementTag( + tag: string + ): any; + + function createElement( + element: Key | undefined | null, attrs: Elements[Key] + ): any; + function createElement( + element: Key | undefined | null, attrEnhancers: T, attrs: Elements[Key] & T + ): any; + + + /* svelte specific */ + interface ElementClass { + $$prop_def: any; + } + + interface ElementAttributesProperty { + $$prop_def: any; // specify the property name to use + } + + // Add empty IntrinsicAttributes to prevent fallback to the one in the JSX namespace + interface IntrinsicAttributes { + } + + interface IntrinsicElements { + [name: string]: { [name: string]: any }; + } +} \ No newline at end of file diff --git a/node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts b/node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts new file mode 100644 index 0000000..fcaf92f --- /dev/null +++ b/node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts @@ -0,0 +1,287 @@ +// Whenever a ambient declaration changes, its number should be increased +// This way, we avoid the situation where multiple ambient versions of svelte2tsx +// are loaded and their declarations conflict each other +// See https://github.com/sveltejs/language-tools/issues/1059 for an example bug that stems from it +// If you change anything in this file, think about whether or not it should be backported to svelte-shims.d.ts + +type AConstructorTypeOf = new (...args: U) => T; + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteActionReturnType = { + update?: (args: any) => void, + destroy?: () => void +} | void + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteTransitionConfig = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteTransitionReturnType = SvelteTransitionConfig | (() => SvelteTransitionConfig) + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteAnimationReturnType = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteWithOptionalProps = Omit & Partial>; +/** @internal PRIVATE API, DO NOT USE */ +type SvelteAllProps = { [index: string]: any } +/** @internal PRIVATE API, DO NOT USE */ +type SveltePropsAnyFallback = {[K in keyof Props]: Props[K] extends never ? never : Props[K] extends undefined ? any : Props[K]} +/** @internal PRIVATE API, DO NOT USE */ +type SvelteSlotsAnyFallback = {[K in keyof Slots]: {[S in keyof Slots[K]]: Slots[K][S] extends undefined ? any : Slots[K][S]}} +/** @internal PRIVATE API, DO NOT USE */ +type SvelteRestProps = { [index: string]: any } +/** @internal PRIVATE API, DO NOT USE */ +type SvelteSlots = { [index: string]: any } +/** @internal PRIVATE API, DO NOT USE */ +type SvelteStore = { subscribe: (run: (value: T) => any, invalidate?: any) => any } + +// Forces TypeScript to look into the type which results in a better representation of it +// which helps for error messages and is necessary for d.ts file transformation so that +// no ambient type references are left in the output +/** @internal PRIVATE API, DO NOT USE */ +type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; + +/** @internal PRIVATE API, DO NOT USE */ +type KeysMatching = {[K in keyof Obj]-?: Obj[K] extends V ? K : never}[keyof Obj] +/** @internal PRIVATE API, DO NOT USE */ +declare type __sveltets_2_CustomEvents = {[K in KeysMatching]: T[K] extends CustomEvent ? T[K]['detail']: T[K]} + +declare function __sveltets_2_ensureRightProps(props: Props): {}; +declare function __sveltets_2_instanceOf(type: AConstructorTypeOf): T; +declare function __sveltets_2_allPropsType(): SvelteAllProps +declare function __sveltets_2_restPropsType(): SvelteRestProps +declare function __sveltets_2_slotsType(slots: Slots): Record; + +// Overload of the following two functions is necessary. +// An empty array of optionalProps makes OptionalProps type any, which means we lose the prop typing. +// optionalProps need to be first or its type cannot be infered correctly. + +declare function __sveltets_2_partial( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } +declare function __sveltets_2_partial( + optionalProps: OptionalProps[], + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand, OptionalProps>>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } + +declare function __sveltets_2_partial_with_any( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand & SvelteAllProps>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } +declare function __sveltets_2_partial_with_any( + optionalProps: OptionalProps[], + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand, OptionalProps> & SvelteAllProps>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } + + +declare function __sveltets_2_with_any( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } + +declare function __sveltets_2_with_any_event( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Props, events: Events & {[evt: string]: CustomEvent;}, slots: Slots, exports?: Exports, bindings?: Bindings } + +declare function __sveltets_2_store_get(store: SvelteStore): T +declare function __sveltets_2_store_get | undefined | null>(store: Store): Store extends SvelteStore ? T : Store; +declare function __sveltets_2_any(dummy: any): any; +declare function __sveltets_2_invalidate(getValue: () => T): T + +declare function __sveltets_2_mapWindowEvent( + event: K +): HTMLBodyElementEventMap[K]; +declare function __sveltets_2_mapBodyEvent( + event: K +): WindowEventMap[K]; +declare function __sveltets_2_mapElementEvent( + event: K +): HTMLElementEventMap[K]; + +declare function __sveltets_2_bubbleEventDef( + events: Events, eventKey: K +): Events[K]; +declare function __sveltets_2_bubbleEventDef( + events: any, eventKey: string +): any; + +declare const __sveltets_2_customEvent: CustomEvent; +declare function __sveltets_2_toEventTypings(): {[Key in keyof Typings]: CustomEvent}; + +declare function __sveltets_2_unionType(t1: T1, t2: T2): T1 | T2; +declare function __sveltets_2_unionType(t1: T1, t2: T2, t3: T3): T1 | T2 | T3; +declare function __sveltets_2_unionType(t1: T1, t2: T2, t3: T3, t4: T4): T1 | T2 | T3 | T4; +declare function __sveltets_2_unionType(...types: any[]): any; + +declare function __sveltets_2_createSvelte2TsxComponent( + render: {props: Props, events: Events, slots: Slots } +): typeof import("svelte").SvelteComponent; + +declare function __sveltets_2_unwrapArr(arr: ArrayLike): T +declare function __sveltets_2_unwrapPromiseLike(promise: PromiseLike | T): T + +// v2 +declare function __sveltets_2_createCreateSlot>>(): (slotName: SlotName, attrs: Slots[SlotName]) => Record; +declare function __sveltets_2_createComponentAny(props: Record): import("svelte").SvelteComponent; + +declare function __sveltets_2_any(...dummy: any[]): any; +declare function __sveltets_2_empty(...dummy: any[]): {}; +declare function __sveltets_2_union(t1:T1,t2?:T2,t3?:T3,t4?:T4,t5?:T5,t6?:T6,t7?:T7,t8?:T8,t9?:T9,t10?:T10): T1 & T2 & T3 & T4 & T5 & T6 & T7 & T8 & T9 & T10; +declare function __sveltets_2_nonNullable(type: T): NonNullable; + +declare function __sveltets_2_cssProp(prop: Record): {}; + +// @ts-ignore Svelte v3/v4 don't have this +declare function __sveltets_2_ensureSnippet(val: ReturnType | undefined | null): any; + +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteAnimationReturnType = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} +declare var __sveltets_2_AnimationMove: { from: DOMRect, to: DOMRect } +declare function __sveltets_2_ensureAnimation(animationCall: __sveltets_2_SvelteAnimationReturnType): {}; + +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteActionReturnType = { + update?: (args: any) => void, + destroy?: () => void, + $$_attributes?: Record, +} | void +declare function __sveltets_2_ensureAction(actionCall: T): T extends {$$_attributes?: any} ? T['$$_attributes'] : {}; + +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteTransitionConfig = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteTransitionReturnType = __sveltets_2_SvelteTransitionConfig | (() => __sveltets_2_SvelteTransitionConfig) +declare function __sveltets_2_ensureTransition(transitionCall: __sveltets_2_SvelteTransitionReturnType): {}; + +// Includes undefined and null for all types as all usages also allow these +declare function __sveltets_2_ensureType(type: AConstructorTypeOf, el: T | undefined | null): {}; +declare function __sveltets_2_ensureType(type1: AConstructorTypeOf, type2: AConstructorTypeOf, el: T1 | T2 | undefined | null): {}; + +// The following is necessary because there are two clashing errors that can't be solved at the same time +// when using Svelte2TsxComponent, more precisely the event typings in +// __sveltets_2_ensureComponent _SvelteComponent>(type: T): T; +// If we type it as "any", we have an error when using sth like {a: CustomEvent} +// If we type it as "{}", we have an error when using sth like {[evt: string]: CustomEvent} +// If we type it as "unknown", we get all kinds of follow up errors which we want to avoid +// Therefore introduce two more base classes just for this case. +/** + * Ambient type only used for intellisense, DO NOT USE IN YOUR PROJECT + */ +declare type ATypedSvelteComponent = { + /** + * @internal This is for type checking capabilities only + * and does not exist at runtime. Don't use this property. + */ + $$prop_def: any; + /** + * @internal This is for type checking capabilities only + * and does not exist at runtime. Don't use this property. + */ + $$events_def: any; + /** + * @internal This is for type checking capabilities only + * and does not exist at runtime. Don't use this property. + */ + $$slot_def: any; + + $on(event: string, handler: any): () => void; +} +/** + * Ambient type only used for intellisense, DO NOT USE IN YOUR PROJECT. + * + * If you're looking for the type of a Svelte Component, use `SvelteComponent` and `ComponentType` instead: + * + * ```ts + * import type { ComponentType, SvelteComponent } from "svelte"; + * let myComponentConstructor: ComponentType = ..; + * ``` + */ +declare type ConstructorOfATypedSvelteComponent = new (args: {target: any, props?: any}) => ATypedSvelteComponent +// Usage note: Cannot properly transform generic function components to class components due to TypeScript limitations +declare function __sveltets_2_ensureComponent< + T extends + | ConstructorOfATypedSvelteComponent + | (typeof import('svelte') extends { mount: any } + ? // @ts-ignore svelte.Component doesn't exist in Svelte 4 + import('svelte').Component + : never) + | null + | undefined +>( + type: T +): NonNullable< + T extends ConstructorOfATypedSvelteComponent + ? T + : typeof import('svelte') extends { mount: any } + ? // @ts-ignore svelte.Component doesn't exist in Svelte 4 + T extends import('svelte').Component< + infer Props extends Record, + infer Exports extends Record, + infer Bindings extends string + > + ? new ( + options: import('svelte').ComponentConstructorOptions + ) => import('svelte').SvelteComponent & + Exports & { $$bindings: Bindings } + : never + : never +>; + +declare function __sveltets_2_ensureArray | Iterable>(array: T): T extends ArrayLike ? U[] : T extends Iterable ? Iterable : any[]; + +type __sveltets_2_PropsWithChildren = Props & + (Slots extends { default: any } + // This is unfortunate because it means "accepts no props" turns into "accepts any prop" + // but the alternative is non-fixable type errors because of the way TypeScript index + // signatures work (they will always take precedence and make an impossible-to-satisfy children type). + ? Props extends Record + ? any + : { children?: any } + : {}); +declare function __sveltets_2_runes_constructor(render: {props: Props }): import("svelte").ComponentConstructorOptions; + +declare function __sveltets_2_get_set_binding(get: (() => T) | null | undefined, set: (t: T) => void): T; + +declare function __sveltets_$$bindings(...bindings: Bindings): Bindings[number]; + +declare function __sveltets_2_fn_component< + Props extends Record, Exports extends Record, Bindings extends string + // @ts-ignore Svelte 5 only +>(klass: {props: Props, exports?: Exports, bindings?: Bindings }): import('svelte').Component; + +interface __sveltets_2_IsomorphicComponent = any, Events extends Record = any, Slots extends Record = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions): import('svelte').SvelteComponent & { $$bindings?: Bindings } & Exports; + (internal: unknown, props: Props extends Record ? {$$events?: Events, $$slots?: Slots} : Props & {$$events?: Events, $$slots?: Slots}): Exports & { $set?: any, $on?: any }; + z_$$bindings?: Bindings; +} + +declare function __sveltets_2_isomorphic_component< + Props extends Record, Events extends Record, Slots extends Record, Exports extends Record, Bindings extends string +>(klass: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings }): __sveltets_2_IsomorphicComponent; + +declare function __sveltets_2_isomorphic_component_slots< + Props extends Record, Events extends Record, Slots extends Record, Exports extends Record, Bindings extends string +>(klass: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings }): __sveltets_2_IsomorphicComponent<__sveltets_2_PropsWithChildren, Events, Slots, Exports, Bindings>; diff --git a/node_modules/.vite/_svelte_metadata.json b/node_modules/.vite/_svelte_metadata.json new file mode 100644 index 0000000..57cd1d8 --- /dev/null +++ b/node_modules/.vite/_svelte_metadata.json @@ -0,0 +1 @@ +{"compilerOptions":{"css":"external","dev":true,"hmr":true},"extensions":[".svelte"]} \ No newline at end of file diff --git a/node_modules/.vite/deps/_metadata.json b/node_modules/.vite/deps/_metadata.json new file mode 100644 index 0000000..0411d82 --- /dev/null +++ b/node_modules/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "cc57f64c", + "configHash": "97f4d997", + "lockfileHash": "e3b0c442", + "browserHash": "6470842e", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/node_modules/.vite/deps/package.json b/node_modules/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/node_modules/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/web/README.md b/web/README_VITE.md similarity index 100% rename from web/README.md rename to web/README_VITE.md diff --git a/web/index.html b/web/index.html index 3eb2a08..f71d006 100644 --- a/web/index.html +++ b/web/index.html @@ -2,7 +2,6 @@ - ATProto PDS diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000..1d8448e Binary files /dev/null and b/web/public/favicon.ico differ diff --git a/web/public/witchcraft.ico b/web/public/witchcraft.ico deleted file mode 100644 index af539bb..0000000 Binary files a/web/public/witchcraft.ico and /dev/null differ diff --git a/web/src/lib/PostComponent.svelte b/web/src/lib/PostComponent.svelte index 6a4cd16..8f78f0f 100644 --- a/web/src/lib/PostComponent.svelte +++ b/web/src/lib/PostComponent.svelte @@ -1,21 +1,53 @@ -
-

{post.displayName} | {post.timenotstamp}

-

{post.text}

- {#if post.replyingDid} -

Replying to: {post.replyingDid}

- {/if} - {#if post.imagesLinksCid} - {#each post.imagesLinksCid as imageLink} - - {/each} - {/if} - {#if post.videosLinkCid} -
\ No newline at end of file +
+
+ {#if post.authorAvatarCid} + + {/if} +

{post.displayName} | {post.timenotstamp}

+
+
+

{post.text}

+ {#if post.replyingDid} +

Replying to: {post.replyingDid}

+ {/if} + {#if post.imagesLinksCid} + {#each post.imagesLinksCid as imageLink} + + {/each} + {/if} + {#if post.videosLinkCid} +
+
+ + diff --git a/web/src/lib/pdsfetch.ts b/web/src/lib/pdsfetch.ts index e2ae36d..4efe622 100644 --- a/web/src/lib/pdsfetch.ts +++ b/web/src/lib/pdsfetch.ts @@ -1,6 +1,6 @@ import { simpleFetchHandler, XRPC } from "@atcute/client"; import "@atcute/bluesky/lexicons"; -// import { ComAtprotoRepoListRecords } from "@atcute/client/lexicons"; +// import { ComAtprotoRepoListRecords.Record } from "@atcute/client/lexicons"; // import { AppBskyFeedPost } from "@atcute/client/lexicons"; // import { AppBskyActorDefs } from "@atcute/client/lexicons"; @@ -11,6 +11,7 @@ interface AccountMetadata { } class Post { authorDid: string; + authorAvatarCid: string | null; displayName : string; text: string; timestamp: number; @@ -18,12 +19,11 @@ class Post { quotingDid: string | null; replyingDid: string | null; imagesLinksCid: string[] | null; - imagesAltText: string[] | null; videosLinkCid: string | null; - videosLinksUrls: string[] | null; constructor(record: ComAtprotoRepoListRecords.Record, account : AccountMetadata) { this.authorDid = account.did; + this.authorAvatarCid = account.avatarCid; this.displayName = account.displayName; const post = record.value as AppBskyFeedPost.Record; this.timenotstamp = post.createdAt; @@ -42,7 +42,6 @@ class Post { this.imagesLinksCid = post.embed.images.map((imageRecord) => imageRecord.image.ref.$link ); - this.imagesAltText = post.embed.images.map((imageRecord) => imageRecord.alt || "no alt text :(") break; case "app.bsky.embed.video": this.videosLinkCid = post.embed.video.ref.$link; @@ -57,12 +56,11 @@ class Post { this.imagesLinksCid = post.embed.media.images.map((imageRecord) => imageRecord.image.ref.$link ); - this.imagesAltText = post.embed.images.map((imageRecord) => imageRecord.alt || "no alt text :(") break; case "app.bsky.embed.video": this.videosLinkCid = post.embed.media.video.ref.$link; - + break; } break;