@bryanguffey/astro-standard-site 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * site.standard.* lexicon schemas
3
+ *
4
+ * Based on https://standard.site/ specification
5
+ * These schemas provide unified metadata for longform publishing on ATProto,
6
+ * enabling interoperability between Leaflet, WhiteWind, and other platforms.
7
+ */
8
+ import { z } from 'zod';
9
+ // ============================================================================
10
+ // site.standard.theme.color
11
+ // Color definitions for themes
12
+ // ============================================================================
13
+ export const ThemeColorRgbSchema = z.object({
14
+ r: z.number().int().min(0).max(255),
15
+ g: z.number().int().min(0).max(255),
16
+ b: z.number().int().min(0).max(255),
17
+ });
18
+ export const ThemeColorRgbaSchema = z.object({
19
+ r: z.number().int().min(0).max(255),
20
+ g: z.number().int().min(0).max(255),
21
+ b: z.number().int().min(0).max(255),
22
+ a: z.number().int().min(0).max(100),
23
+ });
24
+ export const ThemeColorSchema = z.union([ThemeColorRgbSchema, ThemeColorRgbaSchema]);
25
+ // ============================================================================
26
+ // site.standard.theme.basic
27
+ // Simplified publication theme for tools or apps to easily implement
28
+ // ============================================================================
29
+ export const ThemeBasicPreferencesSchema = z.object({
30
+ showInDiscover: z.boolean().default(true).optional(),
31
+ }).passthrough(); // Allow additional platform-specific preferences
32
+ export const ThemeBasicSchema = z.object({
33
+ background: ThemeColorRgbSchema,
34
+ foreground: ThemeColorRgbSchema,
35
+ accent: ThemeColorRgbSchema,
36
+ accentForeground: ThemeColorRgbSchema,
37
+ preferences: ThemeBasicPreferencesSchema.optional(),
38
+ });
39
+ // ============================================================================
40
+ // site.standard.publication
41
+ // Represents a publication (blog, newsletter, etc.)
42
+ // Key: tid (timestamp-based identifier)
43
+ // ============================================================================
44
+ export const PublicationPreferencesSchema = z.object({
45
+ showInDiscover: z.boolean().default(true).optional(),
46
+ });
47
+ export const PublicationSchema = z.object({
48
+ $type: z.literal('site.standard.publication').optional(),
49
+ /** Base publication URL (e.g., https://standard.site) - REQUIRED */
50
+ url: z.string().url(),
51
+ /** Square image to identify the publication (at least 256x256, max 1MB) */
52
+ icon: z.object({
53
+ $type: z.literal('blob').optional(),
54
+ ref: z.object({
55
+ $link: z.string(),
56
+ }),
57
+ mimeType: z.string(),
58
+ size: z.number().max(1000000),
59
+ }).optional(),
60
+ /** The name of the publication (max 128 graphemes) - REQUIRED */
61
+ name: z.string().max(1280),
62
+ /** Brief description of the publication (max 300 graphemes) */
63
+ description: z.string().max(3000).optional(),
64
+ /** Simplified publication theme for tools/apps */
65
+ basicTheme: ThemeBasicSchema.optional(),
66
+ /** Publication preferences */
67
+ preferences: PublicationPreferencesSchema.optional(),
68
+ });
69
+ // ============================================================================
70
+ // site.standard.document
71
+ // Represents a document/post in a publication
72
+ // Key: tid (timestamp-based identifier)
73
+ // ============================================================================
74
+ /** Strong reference to another ATProto record */
75
+ export const StrongRefSchema = z.object({
76
+ uri: z.string(),
77
+ cid: z.string(),
78
+ });
79
+ export const DocumentSchema = z.object({
80
+ $type: z.literal('site.standard.document').optional(),
81
+ /** URI to the site or publication this document belongs to (https or at-uri) */
82
+ site: z.string(),
83
+ /** Document title (max 128 graphemes) */
84
+ title: z.string().max(1280),
85
+ /** When the document was published */
86
+ publishedAt: z.string().datetime(),
87
+ /** Path to combine with site URL to construct full document URL */
88
+ path: z.string().optional(),
89
+ /** Tags/categories for the document (max 50 graphemes each) */
90
+ tags: z.array(z.string().max(100)).optional(),
91
+ /** Platform-specific content (open union - can be any type) */
92
+ content: z.unknown().optional(),
93
+ /** When the document was last updated */
94
+ updatedAt: z.string().datetime().optional(),
95
+ /** Cover/hero image (max 1MB, image/*) */
96
+ coverImage: z.object({
97
+ $type: z.literal('blob').optional(),
98
+ ref: z.object({
99
+ $link: z.string(),
100
+ }),
101
+ mimeType: z.string(),
102
+ size: z.number().max(1000000),
103
+ }).optional(),
104
+ /** Reference to associated Bluesky post */
105
+ bskyPostRef: StrongRefSchema.optional(),
106
+ /** Document description/excerpt (max 300 graphemes) */
107
+ description: z.string().max(3000).optional(),
108
+ /** Plain text content for indexing/search */
109
+ textContent: z.string().optional(),
110
+ });
111
+ // ============================================================================
112
+ // AT-URI and Record Types
113
+ // ============================================================================
114
+ export const AtUriSchema = z.string().regex(/^at:\/\/[a-zA-Z0-9._:%-]+\/[a-zA-Z0-9.]+\/[a-zA-Z0-9._~:@!$&'()*+,;=-]+$/, 'Invalid AT-URI format');
115
+ /** Record returned from a PDS with full metadata */
116
+ export const StandardSiteRecordSchema = z.object({
117
+ uri: AtUriSchema,
118
+ cid: z.string(),
119
+ value: z.union([PublicationSchema, DocumentSchema]),
120
+ });
121
+ // ============================================================================
122
+ // Loader Configuration
123
+ // ============================================================================
124
+ export const LoaderConfigSchema = z.object({
125
+ /** DID or handle of the account to load documents from */
126
+ repo: z.string(),
127
+ /** PDS service URL (defaults to public.api.bsky.app for reads) */
128
+ service: z.string().url().default('https://public.api.bsky.app'),
129
+ /** Only load documents from a specific site/publication URI */
130
+ publication: z.string().optional(),
131
+ /** Maximum number of documents to load */
132
+ limit: z.number().positive().default(100),
133
+ });
134
+ // ============================================================================
135
+ // Publisher Configuration
136
+ // ============================================================================
137
+ export const PublisherConfigSchema = z.object({
138
+ /** PDS service URL (auto-resolved from DID if not provided) */
139
+ service: z.string().url().optional(),
140
+ /** Handle or DID for authentication */
141
+ identifier: z.string(),
142
+ /** App password for authentication */
143
+ password: z.string(),
144
+ /** Publication AT-URI to publish documents to */
145
+ publication: z.string().optional(),
146
+ });
147
+ // ============================================================================
148
+ // Collection Names
149
+ // ============================================================================
150
+ export const COLLECTIONS = {
151
+ PUBLICATION: 'site.standard.publication',
152
+ DOCUMENT: 'site.standard.document',
153
+ };
154
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Verification utilities for standard.site
3
+ *
4
+ * Helpers for implementing the verification endpoints described at https://standard.site/
5
+ * - Publication verification via /.well-known/site.standard.publication
6
+ * - Document verification via <link rel="site.standard.document"> tags
7
+ */
8
+ export interface VerificationConfig {
9
+ /** Your ATProto DID */
10
+ did: string;
11
+ /** Publication record key */
12
+ publicationRkey: string;
13
+ }
14
+ /**
15
+ * Generate the content for /.well-known/site.standard.publication
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // Astro endpoint: src/pages/.well-known/site.standard.publication.ts
20
+ * import { generatePublicationWellKnown } from 'astro-standard-site';
21
+ *
22
+ * export const GET = () => {
23
+ * return new Response(
24
+ * generatePublicationWellKnown({
25
+ * did: 'did:plc:abc123',
26
+ * publicationRkey: 'my-blog',
27
+ * }),
28
+ * { headers: { 'Content-Type': 'text/plain' } }
29
+ * );
30
+ * };
31
+ * ```
32
+ */
33
+ export declare function generatePublicationWellKnown(config: VerificationConfig): string;
34
+ /**
35
+ * Generate the <link> tag for document verification
36
+ *
37
+ * @example
38
+ * ```astro
39
+ * ---
40
+ * import { generateDocumentLinkTag } from 'astro-standard-site';
41
+ *
42
+ * const linkTag = generateDocumentLinkTag({
43
+ * did: 'did:plc:abc123',
44
+ * documentRkey: 'my-post',
45
+ * });
46
+ * ---
47
+ * <head>
48
+ * <Fragment set:html={linkTag} />
49
+ * </head>
50
+ * ```
51
+ */
52
+ export declare function generateDocumentLinkTag(config: {
53
+ did: string;
54
+ documentRkey: string;
55
+ }): string;
56
+ /**
57
+ * Generate the AT-URI for a document
58
+ */
59
+ export declare function getDocumentAtUri(did: string, rkey: string): string;
60
+ /**
61
+ * Generate the AT-URI for a publication
62
+ */
63
+ export declare function getPublicationAtUri(did: string, rkey: string): string;
64
+ /**
65
+ * Parse an AT-URI into its components
66
+ */
67
+ export declare function parseAtUri(uri: string): {
68
+ did: string;
69
+ collection: string;
70
+ rkey: string;
71
+ } | null;
72
+ /**
73
+ * Astro integration for verification endpoints
74
+ *
75
+ * Automatically sets up the /.well-known/site.standard.publication endpoint
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * // astro.config.mjs
80
+ * import { standardSiteVerification } from 'astro-standard-site';
81
+ *
82
+ * export default defineConfig({
83
+ * integrations: [
84
+ * standardSiteVerification({
85
+ * did: 'did:plc:abc123',
86
+ * publicationRkey: 'my-blog',
87
+ * }),
88
+ * ],
89
+ * });
90
+ * ```
91
+ */
92
+ export declare function standardSiteVerification(config: VerificationConfig): {
93
+ name: string;
94
+ hooks: {
95
+ 'astro:config:setup': ({ injectRoute }: {
96
+ injectRoute: (config: {
97
+ pattern: string;
98
+ entrypoint: string;
99
+ }) => void;
100
+ }) => void;
101
+ };
102
+ };
103
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE/E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAGT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAQP;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB;;;gDAIrB;YAAE,WAAW,EAAE,CAAC,MAAM,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,UAAU,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAA;SAAE;;EAWvH"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Verification utilities for standard.site
3
+ *
4
+ * Helpers for implementing the verification endpoints described at https://standard.site/
5
+ * - Publication verification via /.well-known/site.standard.publication
6
+ * - Document verification via <link rel="site.standard.document"> tags
7
+ */
8
+ /**
9
+ * Generate the content for /.well-known/site.standard.publication
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Astro endpoint: src/pages/.well-known/site.standard.publication.ts
14
+ * import { generatePublicationWellKnown } from 'astro-standard-site';
15
+ *
16
+ * export const GET = () => {
17
+ * return new Response(
18
+ * generatePublicationWellKnown({
19
+ * did: 'did:plc:abc123',
20
+ * publicationRkey: 'my-blog',
21
+ * }),
22
+ * { headers: { 'Content-Type': 'text/plain' } }
23
+ * );
24
+ * };
25
+ * ```
26
+ */
27
+ export function generatePublicationWellKnown(config) {
28
+ return `at://${config.did}/site.standard.publication/${config.publicationRkey}`;
29
+ }
30
+ /**
31
+ * Generate the <link> tag for document verification
32
+ *
33
+ * @example
34
+ * ```astro
35
+ * ---
36
+ * import { generateDocumentLinkTag } from 'astro-standard-site';
37
+ *
38
+ * const linkTag = generateDocumentLinkTag({
39
+ * did: 'did:plc:abc123',
40
+ * documentRkey: 'my-post',
41
+ * });
42
+ * ---
43
+ * <head>
44
+ * <Fragment set:html={linkTag} />
45
+ * </head>
46
+ * ```
47
+ */
48
+ export function generateDocumentLinkTag(config) {
49
+ const atUri = `at://${config.did}/site.standard.document/${config.documentRkey}`;
50
+ return `<link rel="site.standard.document" href="${atUri}">`;
51
+ }
52
+ /**
53
+ * Generate the AT-URI for a document
54
+ */
55
+ export function getDocumentAtUri(did, rkey) {
56
+ return `at://${did}/site.standard.document/${rkey}`;
57
+ }
58
+ /**
59
+ * Generate the AT-URI for a publication
60
+ */
61
+ export function getPublicationAtUri(did, rkey) {
62
+ return `at://${did}/site.standard.publication/${rkey}`;
63
+ }
64
+ /**
65
+ * Parse an AT-URI into its components
66
+ */
67
+ export function parseAtUri(uri) {
68
+ const match = uri.match(/^at:\/\/([^/]+)\/([^/]+)\/(.+)$/);
69
+ if (!match)
70
+ return null;
71
+ return {
72
+ did: match[1],
73
+ collection: match[2],
74
+ rkey: match[3],
75
+ };
76
+ }
77
+ /**
78
+ * Astro integration for verification endpoints
79
+ *
80
+ * Automatically sets up the /.well-known/site.standard.publication endpoint
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * // astro.config.mjs
85
+ * import { standardSiteVerification } from 'astro-standard-site';
86
+ *
87
+ * export default defineConfig({
88
+ * integrations: [
89
+ * standardSiteVerification({
90
+ * did: 'did:plc:abc123',
91
+ * publicationRkey: 'my-blog',
92
+ * }),
93
+ * ],
94
+ * });
95
+ * ```
96
+ */
97
+ export function standardSiteVerification(config) {
98
+ return {
99
+ name: 'standard-site-verification',
100
+ hooks: {
101
+ 'astro:config:setup': ({ injectRoute }) => {
102
+ // We can't actually inject routes with custom content this way,
103
+ // but we provide the helper functions for manual setup
104
+ console.log('[standard-site-verification] To complete setup, create:\n' +
105
+ ' src/pages/.well-known/site.standard.publication.ts\n' +
106
+ 'With content: ' + generatePublicationWellKnown(config));
107
+ },
108
+ },
109
+ };
110
+ }
111
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAA0B;IACrE,OAAO,QAAQ,MAAM,CAAC,GAAG,8BAA8B,MAAM,CAAC,eAAe,EAAE,CAAC;AAClF,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAGvC;IACC,MAAM,KAAK,GAAG,QAAQ,MAAM,CAAC,GAAG,2BAA2B,MAAM,CAAC,YAAY,EAAE,CAAC;IACjF,OAAO,4CAA4C,KAAK,IAAI,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAY;IACxD,OAAO,QAAQ,GAAG,2BAA2B,IAAI,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,IAAY;IAC3D,OAAO,QAAQ,GAAG,8BAA8B,IAAI,EAAE,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IAKpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACb,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACpB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;KACf,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IACjE,OAAO;QACL,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE;YACL,oBAAoB,EAAE,CAAC,EAAE,WAAW,EAA8E,EAAE,EAAE;gBACpH,gEAAgE;gBAChE,uDAAuD;gBACvD,OAAO,CAAC,GAAG,CACT,2DAA2D;oBAC3D,wDAAwD;oBACxD,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,CAAC,CACxD,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@bryanguffey/astro-standard-site",
3
+ "version": "1.0.0",
4
+ "description": "Astro integration for standard.site - unified ATProto longform publishing",
5
+ "keywords": [
6
+ "astro",
7
+ "astro-integration",
8
+ "atproto",
9
+ "bluesky",
10
+ "standard.site",
11
+ "leaflet",
12
+ "whitewind",
13
+ "blog",
14
+ "ssg",
15
+ "comments",
16
+ "federation"
17
+ ],
18
+ "homepage": "https://github.com/musicjunkieg/astro-standard-site#readme",
19
+ "bugs": {
20
+ "url": "https://github.com/musicjunkieg/astro-standard-site/issues"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/musicjunkieg/astro-standard-site.git"
25
+ },
26
+ "license": "MIT",
27
+ "author": "Bryan Guffey <bryan@makeworkbetter.io> (https://bryanguffey.com)",
28
+ "type": "module",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js"
33
+ },
34
+ "./loader": {
35
+ "types": "./dist/loader.d.ts",
36
+ "import": "./dist/loader.js"
37
+ },
38
+ "./publisher": {
39
+ "types": "./dist/publisher.d.ts",
40
+ "import": "./dist/publisher.js"
41
+ },
42
+ "./content": {
43
+ "types": "./dist/content.d.ts",
44
+ "import": "./dist/content.js"
45
+ },
46
+ "./comments": {
47
+ "types": "./dist/comments.d.ts",
48
+ "import": "./dist/comments.js"
49
+ },
50
+ "./components/*": "./components/*"
51
+ },
52
+ "main": "./dist/index.js",
53
+ "types": "./dist/index.d.ts",
54
+ "files": [
55
+ "dist",
56
+ "components",
57
+ "README.md"
58
+ ],
59
+ "scripts": {
60
+ "build": "tsc",
61
+ "test": "vitest run",
62
+ "test:watch": "vitest",
63
+ "prepublishOnly": "npm run build && npm test"
64
+ },
65
+ "dependencies": {
66
+ "@atproto/api": "^0.15.0",
67
+ "zod": "^3.24.0"
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^22.0.0",
71
+ "typescript": "^5.7.0",
72
+ "vitest": "^4.0.16"
73
+ },
74
+ "peerDependencies": {
75
+ "astro": "^5.0.0"
76
+ }
77
+ }