social bookmarking for atproto

[appview] reformat repo to separate root folders for lexicon docs and package

hexmani.ac 1887fd1a 73124b96

verified
Changed files
+361 -234
.idea
backend
src
lexicons
lib
lexicons
types
social
clippr
frontend
lex-src
clippr
lexicons
+1 -1
.gitignore
··· 1 .DS_Store 2 - backend/node_modules
··· 1 .DS_Store 2 + node_modules
+1
.idea/clippr.iml
··· 9 <excludeFolder url="file://$MODULE_DIR$/backend/.pub" /> 10 <excludeFolder url="file://$MODULE_DIR$/backend/build" /> 11 <excludeFolder url="file://$MODULE_DIR$/.idea/dataSources" /> 12 </content> 13 <orderEntry type="inheritedJdk" /> 14 <orderEntry type="sourceFolder" forTests="false" />
··· 9 <excludeFolder url="file://$MODULE_DIR$/backend/.pub" /> 10 <excludeFolder url="file://$MODULE_DIR$/backend/build" /> 11 <excludeFolder url="file://$MODULE_DIR$/.idea/dataSources" /> 12 + <excludeFolder url="file://$MODULE_DIR$/lexicons/dist" /> 13 </content> 14 <orderEntry type="inheritedJdk" /> 15 <orderEntry type="sourceFolder" forTests="false" />
+6 -2
README.md
··· 1 # clippr 2 social bookmarking for atproto 3 4 ## what's in here? 5 - the project is sorted into two main directories, comprised of: 6 7 * ``backend`` - the reference appview written using node and hono 8 - * ``frontend`` - the reference frontend written in astro and typescript
··· 1 # clippr 2 + 3 social bookmarking for atproto 4 5 ## what's in here? 6 + 7 + the project is sorted into four directories, comprised of: 8 9 * ``backend`` - the reference appview written using node and hono 10 + * ``frontend`` - the reference frontend written in astro and typescript 11 + * ``lex-src`` - the original lexicon files 12 + * ``lexicons`` - an atcute package for the clippr lexicon
backend/lexicons/social/clippr/actor/defs.json lex-src/clippr/social/clippr/actor/defs.json
backend/lexicons/social/clippr/actor/getProfile.json lex-src/clippr/social/clippr/actor/getProfile.json
backend/lexicons/social/clippr/actor/profile.json lex-src/clippr/social/clippr/actor/profile.json
backend/lexicons/social/clippr/feed/clip.json lex-src/clippr/social/clippr/feed/clip.json
backend/lexicons/social/clippr/feed/tag.json lex-src/clippr/social/clippr/feed/tag.json
+2 -3
backend/package.json
··· 1 { 2 - "name": "clippr-be", 3 "version": "0.1.0", 4 - "private": "true", 5 "repository": "https://tangled.sh/@hexmani.ac/clippr", 6 "license": "AGPL-3.0-only", 7 "scripts": { ··· 22 "@atcute/atproto": "^3.1.0", 23 "@atcute/lexicon-doc": "^1.0.3", 24 "@atcute/lexicons": "^1.1.0", 25 "@eslint/eslintrc": "^3.3.1", 26 "@hono/node-server": "^1.15.0", 27 "@libsql/client": "^0.15.9", 28 "@skyware/jetstream": "^0.2.2", 29 - "@clippr/lexicons": "^0.1.0", 30 "drizzle-orm": "^0.44.2", 31 "hono": "^4.8.4", 32 "hono-pino": "^0.9.1",
··· 1 { 2 + "name": "@clipprjs/server", 3 "version": "0.1.0", 4 "repository": "https://tangled.sh/@hexmani.ac/clippr", 5 "license": "AGPL-3.0-only", 6 "scripts": { ··· 21 "@atcute/atproto": "^3.1.0", 22 "@atcute/lexicon-doc": "^1.0.3", 23 "@atcute/lexicons": "^1.1.0", 24 + "@clipprjs/lexicons": "^0.1.1", 25 "@eslint/eslintrc": "^3.3.1", 26 "@hono/node-server": "^1.15.0", 27 "@libsql/client": "^0.15.9", 28 "@skyware/jetstream": "^0.2.2", 29 "drizzle-orm": "^0.44.2", 30 "hono": "^4.8.4", 31 "hono-pino": "^0.9.1",
+11
backend/pnpm-lock.yaml
··· 17 '@atcute/lexicons': 18 specifier: ^1.1.0 19 version: 1.1.0 20 '@eslint/eslintrc': 21 specifier: ^3.3.1 22 version: 3.3.1 ··· 120 '@badrap/valita@0.4.5': 121 resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 122 engines: {node: '>= 18'} 123 124 '@drizzle-team/brocli@0.10.2': 125 resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} ··· 1814 esm-env: 1.2.2 1815 1816 '@badrap/valita@0.4.5': {} 1817 1818 '@drizzle-team/brocli@0.10.2': {} 1819
··· 17 '@atcute/lexicons': 18 specifier: ^1.1.0 19 version: 1.1.0 20 + '@clipprjs/lexicons': 21 + specifier: ^0.1.1 22 + version: 0.1.1 23 '@eslint/eslintrc': 24 specifier: ^3.3.1 25 version: 3.3.1 ··· 123 '@badrap/valita@0.4.5': 124 resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 125 engines: {node: '>= 18'} 126 + 127 + '@clipprjs/lexicons@0.1.1': 128 + resolution: {integrity: sha512-/TONuKi8ASHJe5ycg4wKj9m9paAQCcufEB+XJcnvSCLMM3MArAJpg4bmU1epRE3xuSLtkLnOTsmv8xJm8fjSpg==} 129 130 '@drizzle-team/brocli@0.10.2': 131 resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} ··· 1820 esm-env: 1.2.2 1821 1822 '@badrap/valita@0.4.5': {} 1823 + 1824 + '@clipprjs/lexicons@0.1.1': 1825 + dependencies: 1826 + '@atcute/atproto': 3.1.0 1827 + '@atcute/lexicons': 1.1.0 1828 1829 '@drizzle-team/brocli@0.10.2': {} 1830
+2 -2
backend/src/lexicons/lex.config.ts lexicons/lex.config.ts
··· 4 * SPDX-License-Identifier: AGPL-3.0-only 5 */ 6 7 - import { defineLexiconConfig } from "@atcute/lex-cli"; 8 9 export default defineLexiconConfig({ 10 - files: ["../../lexicons/**/*.json"], 11 outdir: "lib/lexicons", 12 mappings: [ 13 {
··· 4 * SPDX-License-Identifier: AGPL-3.0-only 5 */ 6 7 + import {defineLexiconConfig} from "@atcute/lex-cli"; 8 9 export default defineLexiconConfig({ 10 + files: ["../lexdocs/**/*.json"], 11 outdir: "lib/lexicons", 12 mappings: [ 13 {
backend/src/lexicons/lib/index.ts lexicons/lib/index.ts
backend/src/lexicons/lib/lexicons/index.ts lexicons/lib/lexicons/index.ts
-37
backend/src/lexicons/lib/lexicons/types/social/clippr/actor/defs.ts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - import * as v from "@atcute/lexicons/validations"; 8 - 9 - const _profileViewSchema = /*#__PURE__*/ v.object({ 10 - $type: /*#__PURE__*/ v.optional( 11 - /*#__PURE__*/ v.literal("social.clippr.actor.defs#profileView"), 12 - ), 13 - avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 14 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 5000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 500), 19 - ]), 20 - ), 21 - did: /*#__PURE__*/ v.didString(), 22 - displayName: /*#__PURE__*/ v.optional( 23 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 24 - /*#__PURE__*/ v.stringLength(0, 640), 25 - /*#__PURE__*/ v.stringGraphemes(0, 64), 26 - ]), 27 - ), 28 - handle: /*#__PURE__*/ v.handleString(), 29 - }); 30 - 31 - type profileView$schematype = typeof _profileViewSchema; 32 - 33 - export interface profileViewSchema extends profileView$schematype {} 34 - 35 - export const profileViewSchema = _profileViewSchema as profileViewSchema; 36 - 37 - export interface ProfileView extends v.InferInput<typeof profileViewSchema> {}
···
+12 -13
backend/src/lexicons/lib/lexicons/types/social/clippr/actor/getProfile.ts lexicons/lib/lexicons/types/social/clippr/actor/getProfile.ts
··· 8 import * as SocialClipprActorDefs from "./defs.js"; 9 10 const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.getProfile", { 11 - params: /*#__PURE__*/ v.object({ 12 - actor: /*#__PURE__*/ v.actorIdentifierString(), 13 - }), 14 - output: { 15 - type: "lex", 16 - get schema() { 17 - return SocialClipprActorDefs.profileViewSchema; 18 - }, 19 - }, 20 }); 21 22 type main$schematype = typeof _mainSchema; ··· 26 export const mainSchema = _mainSchema as mainSchema; 27 28 export interface $params extends v.InferInput<mainSchema["params"]> {} 29 - 30 export type $output = v.InferXRPCBodyInput<mainSchema["output"]>; 31 32 declare module "@atcute/lexicons/ambient" { 33 - interface XRPCQueries { 34 - "social.clippr.actor.getProfile": mainSchema; 35 - } 36 }
··· 8 import * as SocialClipprActorDefs from "./defs.js"; 9 10 const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.getProfile", { 11 + params: /*#__PURE__*/ v.object({ 12 + actor: /*#__PURE__*/ v.actorIdentifierString(), 13 + }), 14 + output: { 15 + type: "lex", 16 + get schema() { 17 + return SocialClipprActorDefs.profileViewSchema; 18 + }, 19 + }, 20 }); 21 22 type main$schematype = typeof _mainSchema; ··· 26 export const mainSchema = _mainSchema as mainSchema; 27 28 export interface $params extends v.InferInput<mainSchema["params"]> {} 29 export type $output = v.InferXRPCBodyInput<mainSchema["output"]>; 30 31 declare module "@atcute/lexicons/ambient" { 32 + interface XRPCQueries { 33 + "social.clippr.actor.getProfile": mainSchema; 34 + } 35 }
-42
backend/src/lexicons/lib/lexicons/types/social/clippr/actor/profile.ts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - import * as v from "@atcute/lexicons/validations"; 8 - 9 - const _mainSchema = /*#__PURE__*/ v.record( 10 - /*#__PURE__*/ v.literal("self"), 11 - /*#__PURE__*/ v.object({ 12 - $type: /*#__PURE__*/ v.literal("social.clippr.actor.profile"), 13 - avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 14 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 5000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 500), 19 - ]), 20 - ), 21 - displayName: /*#__PURE__*/ v.optional( 22 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 23 - /*#__PURE__*/ v.stringLength(0, 640), 24 - /*#__PURE__*/ v.stringGraphemes(0, 64), 25 - ]), 26 - ), 27 - }), 28 - ); 29 - 30 - type main$schematype = typeof _mainSchema; 31 - 32 - export interface mainSchema extends main$schematype {} 33 - 34 - export const mainSchema = _mainSchema as mainSchema; 35 - 36 - export interface Main extends v.InferInput<typeof mainSchema> {} 37 - 38 - declare module "@atcute/lexicons/ambient" { 39 - interface Records { 40 - "social.clippr.actor.profile": mainSchema; 41 - } 42 - }
···
-61
backend/src/lexicons/lib/lexicons/types/social/clippr/feed/clip.ts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - import * as v from "@atcute/lexicons/validations"; 8 - import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 9 - 10 - const _mainSchema = /*#__PURE__*/ v.record( 11 - /*#__PURE__*/ v.string(), 12 - /*#__PURE__*/ v.object({ 13 - $type: /*#__PURE__*/ v.literal("social.clippr.feed.clip"), 14 - createdAt: /*#__PURE__*/ v.datetimeString(), 15 - description: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 16 - /*#__PURE__*/ v.stringLength(0, 40960), 17 - /*#__PURE__*/ v.stringGraphemes(0, 4096), 18 - ]), 19 - languages: /*#__PURE__*/ v.optional( 20 - /*#__PURE__*/ v.constrain( 21 - /*#__PURE__*/ v.array(/*#__PURE__*/ v.languageCodeString()), 22 - [/*#__PURE__*/ v.arrayLength(0, 5)], 23 - ), 24 - ), 25 - notes: /*#__PURE__*/ v.optional( 26 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 27 - /*#__PURE__*/ v.stringLength(0, 100000), 28 - /*#__PURE__*/ v.stringGraphemes(0, 10000), 29 - ]), 30 - ), 31 - get tags() { 32 - return /*#__PURE__*/ v.optional( 33 - /*#__PURE__*/ v.array(ComAtprotoRepoStrongRef.mainSchema), 34 - ); 35 - }, 36 - title: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 - /*#__PURE__*/ v.stringLength(0, 20480), 38 - /*#__PURE__*/ v.stringGraphemes(0, 2048), 39 - ]), 40 - unlisted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), false), 41 - unread: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), true), 42 - url: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 - /*#__PURE__*/ v.stringLength(0, 20000), 44 - /*#__PURE__*/ v.stringGraphemes(0, 2000), 45 - ]), 46 - }), 47 - ); 48 - 49 - type main$schematype = typeof _mainSchema; 50 - 51 - export interface mainSchema extends main$schematype {} 52 - 53 - export const mainSchema = _mainSchema as mainSchema; 54 - 55 - export interface Main extends v.InferInput<typeof mainSchema> {} 56 - 57 - declare module "@atcute/lexicons/ambient" { 58 - interface Records { 59 - "social.clippr.feed.clip": mainSchema; 60 - } 61 - }
···
-39
backend/src/lexicons/lib/lexicons/types/social/clippr/feed/tag.ts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - import * as v from "@atcute/lexicons/validations"; 8 - 9 - const _mainSchema = /*#__PURE__*/ v.record( 10 - /*#__PURE__*/ v.string(), 11 - /*#__PURE__*/ v.object({ 12 - $type: /*#__PURE__*/ v.literal("social.clippr.feed.tag"), 13 - color: /*#__PURE__*/ v.optional( 14 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 15 - /*#__PURE__*/ v.stringLength(0, 70), 16 - /*#__PURE__*/ v.stringGraphemes(0, 7), 17 - ]), 18 - ), 19 - createdAt: /*#__PURE__*/ v.datetimeString(), 20 - name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 - /*#__PURE__*/ v.stringLength(0, 640), 22 - /*#__PURE__*/ v.stringGraphemes(0, 64), 23 - ]), 24 - }), 25 - ); 26 - 27 - type main$schematype = typeof _mainSchema; 28 - 29 - export interface mainSchema extends main$schematype {} 30 - 31 - export const mainSchema = _mainSchema as mainSchema; 32 - 33 - export interface Main extends v.InferInput<typeof mainSchema> {} 34 - 35 - declare module "@atcute/lexicons/ambient" { 36 - interface Records { 37 - "social.clippr.feed.tag": mainSchema; 38 - } 39 - }
···
+9 -7
backend/src/lexicons/package.json lexicons/package.json
··· 1 { 2 "type": "module", 3 - "name": "@clippr/lexicons", 4 - "version": "0.1.0", 5 "description": "Clippr schema definitions", 6 "license": "AGPL-3.0-only", 7 "repository": { 8 "url": "https://tangled.sh/@hexmani.ac/clippr", 9 - "directory": "backend/src/lexicons" 10 }, 11 "files": [ 12 "dist/", ··· 20 }, 21 "scripts": { 22 "build": "tsc --project tsconfig.json", 23 - "generate": "rm -r ./lib/lexicons/; lex-cli generate -c ./lex.config.ts", 24 "prepublish": "rm -rf dist; pnpm run build" 25 }, 26 "dependencies": { 27 - "@atcute/atproto": "workspace:^", 28 - "@atcute/lexicons": "workspace:^" 29 }, 30 "devDependencies": { 31 - "@atcute/lex-cli": "workspace:^" 32 } 33 }
··· 1 { 2 "type": "module", 3 + "name": "@clipprjs/lexicons", 4 + "version": "0.1.1", 5 "description": "Clippr schema definitions", 6 "license": "AGPL-3.0-only", 7 + "private": false, 8 "repository": { 9 "url": "https://tangled.sh/@hexmani.ac/clippr", 10 + "directory": "lexicons" 11 }, 12 "files": [ 13 "dist/", ··· 21 }, 22 "scripts": { 23 "build": "tsc --project tsconfig.json", 24 + "generate": "rm -r lib/lexicons; lex-cli generate -c ./lex.config.ts", 25 "prepublish": "rm -rf dist; pnpm run build" 26 }, 27 "dependencies": { 28 + "@atcute/atproto": "^3.1.0", 29 + "@atcute/lexicons": "^1.1.0" 30 }, 31 "devDependencies": { 32 + "@atcute/lex-cli": "^2.1.1", 33 + "typescript": "^5.8.3" 34 } 35 }
-24
backend/src/lexicons/tsconfig.json
··· 1 - { 2 - "compilerOptions": { 3 - "outDir": "dist/", 4 - "esModuleInterop": true, 5 - "skipLibCheck": true, 6 - "target": "ESNext", 7 - "allowJs": true, 8 - "resolveJsonModule": true, 9 - "moduleDetection": "force", 10 - "isolatedModules": true, 11 - "verbatimModuleSyntax": true, 12 - "strict": true, 13 - "noImplicitOverride": true, 14 - "noUnusedLocals": true, 15 - "noUnusedParameters": true, 16 - "noFallthroughCasesInSwitch": true, 17 - "module": "NodeNext", 18 - "sourceMap": true, 19 - "declaration": true 20 - }, 21 - "include": [ 22 - "lib" 23 - ] 24 - }
···
+1 -1
backend/tsconfig.json
··· 21 "noEmit": true, 22 "jsx": "react-jsx", 23 "jsxImportSource": "hono/jsx", 24 - "outDir": "./dist", 25 "lib": [ 26 "ESNext" 27 ]
··· 21 "noEmit": true, 22 "jsx": "react-jsx", 23 "jsxImportSource": "hono/jsx", 24 + "outDir": "dist/", 25 "lib": [ 26 "ESNext" 27 ]
+1 -2
frontend/package.json
··· 1 { 2 - "name": "clippr-fe", 3 - "private": true, 4 "type": "module", 5 "version": "0.1.0", 6 "scripts": {
··· 1 { 2 + "name": "@clipprjs/client", 3 "type": "module", 4 "version": "0.1.0", 5 "scripts": {
+2
lexicons/.gitignore
···
··· 1 + node_modules/ 2 + dist/
+3
lexicons/README.md
···
··· 1 + # @clipprjs/lexicons 2 + 3 + lexicon package auto-generated with `@atcute/lex-cli`
+37
lexicons/lib/lexicons/types/social/clippr/actor/defs.ts
···
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import * as v from "@atcute/lexicons/validations"; 8 + 9 + const _profileViewSchema = /*#__PURE__*/ v.object({ 10 + $type: /*#__PURE__*/ v.optional( 11 + /*#__PURE__*/ v.literal("social.clippr.actor.defs#profileView"), 12 + ), 13 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 14 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 15 + description: /*#__PURE__*/ v.optional( 16 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 + /*#__PURE__*/ v.stringLength(0, 5000), 18 + /*#__PURE__*/ v.stringGraphemes(0, 500), 19 + ]), 20 + ), 21 + did: /*#__PURE__*/ v.didString(), 22 + displayName: /*#__PURE__*/ v.optional( 23 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 24 + /*#__PURE__*/ v.stringLength(0, 640), 25 + /*#__PURE__*/ v.stringGraphemes(0, 64), 26 + ]), 27 + ), 28 + handle: /*#__PURE__*/ v.handleString(), 29 + }); 30 + 31 + type profileView$schematype = typeof _profileViewSchema; 32 + 33 + export interface profileViewSchema extends profileView$schematype {} 34 + 35 + export const profileViewSchema = _profileViewSchema as profileViewSchema; 36 + 37 + export interface ProfileView extends v.InferInput<typeof profileViewSchema> {}
+42
lexicons/lib/lexicons/types/social/clippr/actor/profile.ts
···
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import * as v from "@atcute/lexicons/validations"; 8 + 9 + const _mainSchema = /*#__PURE__*/ v.record( 10 + /*#__PURE__*/ v.literal("self"), 11 + /*#__PURE__*/ v.object({ 12 + $type: /*#__PURE__*/ v.literal("social.clippr.actor.profile"), 13 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 14 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 15 + description: /*#__PURE__*/ v.optional( 16 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 + /*#__PURE__*/ v.stringLength(0, 5000), 18 + /*#__PURE__*/ v.stringGraphemes(0, 500), 19 + ]), 20 + ), 21 + displayName: /*#__PURE__*/ v.optional( 22 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 23 + /*#__PURE__*/ v.stringLength(0, 640), 24 + /*#__PURE__*/ v.stringGraphemes(0, 64), 25 + ]), 26 + ), 27 + }), 28 + ); 29 + 30 + type main$schematype = typeof _mainSchema; 31 + 32 + export interface mainSchema extends main$schematype {} 33 + 34 + export const mainSchema = _mainSchema as mainSchema; 35 + 36 + export interface Main extends v.InferInput<typeof mainSchema> {} 37 + 38 + declare module "@atcute/lexicons/ambient" { 39 + interface Records { 40 + "social.clippr.actor.profile": mainSchema; 41 + } 42 + }
+61
lexicons/lib/lexicons/types/social/clippr/feed/clip.ts
···
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import * as v from "@atcute/lexicons/validations"; 8 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 9 + 10 + const _mainSchema = /*#__PURE__*/ v.record( 11 + /*#__PURE__*/ v.string(), 12 + /*#__PURE__*/ v.object({ 13 + $type: /*#__PURE__*/ v.literal("social.clippr.feed.clip"), 14 + createdAt: /*#__PURE__*/ v.datetimeString(), 15 + description: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 16 + /*#__PURE__*/ v.stringLength(0, 40960), 17 + /*#__PURE__*/ v.stringGraphemes(0, 4096), 18 + ]), 19 + languages: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain( 21 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.languageCodeString()), 22 + [/*#__PURE__*/ v.arrayLength(0, 5)], 23 + ), 24 + ), 25 + notes: /*#__PURE__*/ v.optional( 26 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 27 + /*#__PURE__*/ v.stringLength(0, 100000), 28 + /*#__PURE__*/ v.stringGraphemes(0, 10000), 29 + ]), 30 + ), 31 + get tags() { 32 + return /*#__PURE__*/ v.optional( 33 + /*#__PURE__*/ v.array(ComAtprotoRepoStrongRef.mainSchema), 34 + ); 35 + }, 36 + title: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 + /*#__PURE__*/ v.stringLength(0, 20480), 38 + /*#__PURE__*/ v.stringGraphemes(0, 2048), 39 + ]), 40 + unlisted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), false), 41 + unread: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), true), 42 + url: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 20000), 44 + /*#__PURE__*/ v.stringGraphemes(0, 2000), 45 + ]), 46 + }), 47 + ); 48 + 49 + type main$schematype = typeof _mainSchema; 50 + 51 + export interface mainSchema extends main$schematype {} 52 + 53 + export const mainSchema = _mainSchema as mainSchema; 54 + 55 + export interface Main extends v.InferInput<typeof mainSchema> {} 56 + 57 + declare module "@atcute/lexicons/ambient" { 58 + interface Records { 59 + "social.clippr.feed.clip": mainSchema; 60 + } 61 + }
+39
lexicons/lib/lexicons/types/social/clippr/feed/tag.ts
···
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import * as v from "@atcute/lexicons/validations"; 8 + 9 + const _mainSchema = /*#__PURE__*/ v.record( 10 + /*#__PURE__*/ v.string(), 11 + /*#__PURE__*/ v.object({ 12 + $type: /*#__PURE__*/ v.literal("social.clippr.feed.tag"), 13 + color: /*#__PURE__*/ v.optional( 14 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 15 + /*#__PURE__*/ v.stringLength(0, 70), 16 + /*#__PURE__*/ v.stringGraphemes(0, 7), 17 + ]), 18 + ), 19 + createdAt: /*#__PURE__*/ v.datetimeString(), 20 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 + /*#__PURE__*/ v.stringLength(0, 640), 22 + /*#__PURE__*/ v.stringGraphemes(0, 64), 23 + ]), 24 + }), 25 + ); 26 + 27 + type main$schematype = typeof _mainSchema; 28 + 29 + export interface mainSchema extends main$schematype {} 30 + 31 + export const mainSchema = _mainSchema as mainSchema; 32 + 33 + export interface Main extends v.InferInput<typeof mainSchema> {} 34 + 35 + declare module "@atcute/lexicons/ambient" { 36 + interface Records { 37 + "social.clippr.feed.tag": mainSchema; 38 + } 39 + }
+99
lexicons/pnpm-lock.yaml
···
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@atcute/atproto': 12 + specifier: ^3.1.0 13 + version: 3.1.0 14 + '@atcute/lexicons': 15 + specifier: ^1.1.0 16 + version: 1.1.0 17 + devDependencies: 18 + '@atcute/lex-cli': 19 + specifier: ^2.1.1 20 + version: 2.1.1 21 + typescript: 22 + specifier: ^5.8.3 23 + version: 5.8.3 24 + 25 + packages: 26 + 27 + '@atcute/atproto@3.1.0': 28 + resolution: {integrity: sha512-aJbDsY7FcIh8APWKAimBtshPwqoRE056tc0UV6vw4TW4e3nYaHedoJmKhlh/k8KQWxyw64MQThNGMaC89HNoTg==} 29 + 30 + '@atcute/lex-cli@2.1.1': 31 + resolution: {integrity: sha512-QaR0sOP8Z24opGHKsSfleDbP/ahUb6HECkVaOqSwG7ORZzbLK1w0265o1BRjCVr2dT6FxlsMUa2Ge85JMA9bxg==} 32 + hasBin: true 33 + 34 + '@atcute/lexicon-doc@1.0.3': 35 + resolution: {integrity: sha512-U7rinsTOwXGGcrF6/s7GzTXargcQpDr4BTrj5ci/XTK+POEK5jpcI+Ag1fF932pBX3k97em6y4TWwTSO8M/McQ==} 36 + 37 + '@atcute/lexicons@1.1.0': 38 + resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 39 + 40 + '@badrap/valita@0.4.5': 41 + resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 42 + engines: {node: '>= 18'} 43 + 44 + '@externdefs/collider@0.3.0': 45 + resolution: {integrity: sha512-x5CpeZ4c8n+1wMFthUMWSQKqCGcQo52/Qbda5ES+JFRRg/D8Ep6/JOvUUq5HExFuv/wW+6UYG2U/mXzw0IAd8Q==} 46 + peerDependencies: 47 + '@badrap/valita': ^0.4.4 48 + 49 + esm-env@1.2.2: 50 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 51 + 52 + picocolors@1.1.1: 53 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 54 + 55 + prettier@3.6.2: 56 + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 57 + engines: {node: '>=14'} 58 + hasBin: true 59 + 60 + typescript@5.8.3: 61 + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 62 + engines: {node: '>=14.17'} 63 + hasBin: true 64 + 65 + snapshots: 66 + 67 + '@atcute/atproto@3.1.0': 68 + dependencies: 69 + '@atcute/lexicons': 1.1.0 70 + 71 + '@atcute/lex-cli@2.1.1': 72 + dependencies: 73 + '@atcute/lexicon-doc': 1.0.3 74 + '@badrap/valita': 0.4.5 75 + '@externdefs/collider': 0.3.0(@badrap/valita@0.4.5) 76 + picocolors: 1.1.1 77 + prettier: 3.6.2 78 + 79 + '@atcute/lexicon-doc@1.0.3': 80 + dependencies: 81 + '@badrap/valita': 0.4.5 82 + 83 + '@atcute/lexicons@1.1.0': 84 + dependencies: 85 + esm-env: 1.2.2 86 + 87 + '@badrap/valita@0.4.5': {} 88 + 89 + '@externdefs/collider@0.3.0(@badrap/valita@0.4.5)': 90 + dependencies: 91 + '@badrap/valita': 0.4.5 92 + 93 + esm-env@1.2.2: {} 94 + 95 + picocolors@1.1.1: {} 96 + 97 + prettier@3.6.2: {} 98 + 99 + typescript@5.8.3: {}
+32
lexicons/tsconfig.json
···
··· 1 + { 2 + "compilerOptions": { 3 + "allowImportingTsExtensions": true, 4 + "esModuleInterop": true, 5 + "skipLibCheck": true, 6 + "target": "ESNext", 7 + "module": "NodeNext", 8 + "moduleResolution": "NodeNext", 9 + "allowJs": true, 10 + "resolveJsonModule": true, 11 + "moduleDetection": "force", 12 + "isolatedModules": true, 13 + "verbatimModuleSyntax": true, 14 + "types": [ 15 + "node", 16 + "@atcute/atproto" 17 + ], 18 + "strict": true, 19 + "noUncheckedIndexedAccess": true, 20 + "noImplicitOverride": true, 21 + "noEmit": true, 22 + "jsx": "react-jsx", 23 + "jsxImportSource": "hono/jsx", 24 + "outDir": "dist/", 25 + "lib": [ 26 + "ESNext" 27 + ] 28 + }, 29 + "exclude": [ 30 + "node_modules" 31 + ] 32 + }