@styleflow.app/flowpress-astro-core 0.2.0-beta.0 → 0.2.0-beta.10

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,143 @@
1
+ import {
2
+ resolveDynamicStyleflowProps,
3
+ type StyleflowContract
4
+ } from "../../styleflow.js";
5
+ import type { FlowpressBlock } from "../../types.js";
6
+
7
+ export const DEFAULT_SEMANTIC_PROPS = {
8
+ surface: "default",
9
+ layoutRole: "stack",
10
+ density: "md"
11
+ };
12
+
13
+ export function blockHtmlAttributes(
14
+ attributes: Record<string, unknown>,
15
+ baseClass = ""
16
+ ): { id?: string; class?: string } {
17
+ const anchor = typeof attributes.anchor === "string"
18
+ ? attributes.anchor.trim()
19
+ : "";
20
+ const customClass = typeof attributes.className === "string"
21
+ ? attributes.className.trim()
22
+ : "";
23
+ const className = [baseClass.trim(), customClass]
24
+ .filter(Boolean)
25
+ .join(" ")
26
+ .replace(/\s+/g, " ");
27
+
28
+ return {
29
+ ...(anchor ? { id: anchor } : {}),
30
+ ...(className ? { class: className } : {})
31
+ };
32
+ }
33
+
34
+ const SEMANTIC_KEYS = [
35
+ "tone",
36
+ "intensity",
37
+ "surface",
38
+ "layoutRole",
39
+ "density",
40
+ "ty",
41
+ "v",
42
+ "w",
43
+ "foreground",
44
+ "interactivePriority",
45
+ "noBackground",
46
+ "noBorder",
47
+ "noPadding",
48
+ "noGap",
49
+ "noRadius",
50
+ "noForeground"
51
+ ] as const;
52
+
53
+ export function semanticProps(
54
+ attributes: Record<string, unknown>,
55
+ contract?: StyleflowContract,
56
+ defaults: Record<string, unknown> = DEFAULT_SEMANTIC_PROPS
57
+ ): Record<string, unknown> {
58
+ const input = Object.fromEntries(
59
+ SEMANTIC_KEYS
60
+ .filter((key) => attributes[key] !== undefined)
61
+ .map((key) => [key, attributes[key]])
62
+ );
63
+ return contract
64
+ ? resolveDynamicStyleflowProps(input, defaults, contract)
65
+ : { ...defaults, ...input };
66
+ }
67
+
68
+ export function objectValue(
69
+ block: FlowpressBlock,
70
+ key: string
71
+ ): Record<string, unknown> {
72
+ const value = block.attributes[key];
73
+ return value && typeof value === "object" && !Array.isArray(value)
74
+ ? value as Record<string, unknown>
75
+ : {};
76
+ }
77
+
78
+ export function textValue(block: FlowpressBlock, key = "text"): string {
79
+ return String(block.attributes[key] ?? "");
80
+ }
81
+
82
+ /**
83
+ * Keep intentional blank lines visible across current and legacy RichText
84
+ * serializations. Gutenberg can represent them either as repeated `<br>` tags,
85
+ * empty paragraph elements, or literal newlines in an attribute value.
86
+ */
87
+ export function preserveRichTextSpacing(html: string): string {
88
+ const visibleEmptyBlocks = html
89
+ .replace(/\r\n?/g, "\n")
90
+ .replace(
91
+ /<(p|div)(\s[^>]*)?>(?:\s|&nbsp;|&#160;)*<\/\1>/gi,
92
+ (_match, tag: string, attributes = "") =>
93
+ `<${tag}${attributes}><br aria-hidden="true"></${tag}>`
94
+ );
95
+
96
+ return visibleEmptyBlocks
97
+ .split(/(<[^>]+>)/g)
98
+ .map((part) => {
99
+ if (part.startsWith("<") || part.trim() === "") {
100
+ return part;
101
+ }
102
+ return part.replace(/\n(?:[ \t]*\n)+/g, (newlines) =>
103
+ "<br>".repeat((newlines.match(/\n/g) || []).length)
104
+ );
105
+ })
106
+ .join("");
107
+ }
108
+
109
+ export function linkValue(block: FlowpressBlock, key = "link"): string {
110
+ const value = block.attributes[key];
111
+ const href = typeof value === "string"
112
+ ? value
113
+ : String(objectValue(block, key).url ?? "");
114
+ return /^(?:\/(?!\/)|#|https?:\/\/|mailto:|tel:)/i.test(href) ? href : "";
115
+ }
116
+
117
+ export function responsiveValues(
118
+ attributes: Record<string, unknown>,
119
+ prefix: "columns" | "span",
120
+ fallback: number
121
+ ): Record<"base" | "sm" | "md" | "lg" | "xl" | "2xl", number> {
122
+ const keys = ["base", "sm", "md", "lg", "xl", "2xl"] as const;
123
+ const result = {} as Record<(typeof keys)[number], number>;
124
+ let inherited = fallback;
125
+ for (const key of keys) {
126
+ const suffix = key === "base"
127
+ ? "Base"
128
+ : key === "2xl" ? "2xl" : key.charAt(0).toUpperCase() + key.slice(1);
129
+ const candidate = Number(attributes[`${prefix}${suffix}`]);
130
+ if (Number.isInteger(candidate) && candidate >= 1 && candidate <= 12) {
131
+ inherited = candidate;
132
+ }
133
+ result[key] = inherited;
134
+ }
135
+ return result;
136
+ }
137
+
138
+ export function unwrapCoreHtml(html: string): string {
139
+ const match = html.trim().match(
140
+ /^<(p|h[1-6]|ul|ol|li|blockquote)(?:\s[^>]*)?>([\s\S]*)<\/\1>$/
141
+ );
142
+ return match?.[2] ?? html;
143
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGnC;IACA;IACA;IACA;IALX,YACE,OAAe,EACN,MAAe,EACf,MAAgC,EAChC,aAAsB,EACtB,QAAiB,EAC1B,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QANnD,WAAM,GAAN,MAAM,CAAS;QACf,WAAM,GAAN,MAAM,CAA0B;QAChC,kBAAa,GAAb,aAAa,CAAS;QACtB,aAAQ,GAAR,QAAQ,CAAS;QAI1B,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACjB,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,OAAO,CAAyB;IAChC,KAAK,CAAU;IAExB,YAAY,OAA+B;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAa,EACb,YAAqC,EAAE;QAEvC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAErD,IAAI,CAAC;YACH,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;oBACpC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,GAAG,IAAI,CAAC,OAAO;qBAChB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBAC1C,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3C,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO;oBACpD,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;oBACrB,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,IAAI,qBAAqB,CAC7B,QAAQ;oBACN,CAAC,CAAC,qBAAqB,aAAa,oBAAoB,IAAI,CAAC,SAAS,SAAS,YAAY,GAAG;oBAC9F,CAAC,CAAC,qBAAqB,aAAa,oBAAoB,YAAY,IAAI,MAAM,EAAE,EAClF,SAAS,EACT,SAAS,EACT,aAAa,EACb,YAAY,EACZ,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,OAA2B,CAAC;YAChC,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,sBAAsB,CAAC;gBACnF,MAAM,IAAI,qBAAqB,CAC7B,qBAAqB,aAAa,aAAa,QAAQ,CAAC,MAAM,GAAG;sBAC7D,QAAQ,WAAW,oBAAoB,YAAY,GAAG,EAC1D,QAAQ,CAAC,MAAM,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,KAAK,CACN,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACzE,MAAM,MAAM,GAAwC,OAAO,CAAC,MAAM,EAAE,GAAG,CACrE,CAAC,KAAK,EAAE,EAAE;oBACR,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,CAAC,CACF,CAAC;gBACF,MAAM,QAAQ,GAAG,MAAM;oBACrB,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;oBACnB,KAAK,CAAC,OAAO;oBACb,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS;iBACxD,CAAC;qBACD,MAAM,CAAC,CAAC,OAAO,EAAqB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5D,MAAM,IAAI,qBAAqB,CAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;uBACf,qBAAqB,aAAa,gBAAgB,QAAQ,CAAC,MAAM,OAAO,YAAY,GAAG,EAC5F,QAAQ,CAAC,MAAM,EACf,MAAM,EACN,aAAa,EACb,YAAY,CACb,CAAC;YACJ,CAAC;YAED,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B;;;;;;;;;;;;;QAaE,CACH,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,MAAe;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAK7B;;;;;;;;;;;;;;QAcE,EACF,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAChC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,GAAG,IAAI,CAAC,YAAY;YACpB,GAAG,EAAE,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAe;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAK7B;;;;;;;;;;;;;;QAcE,EACF,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAC3B,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,KAAK;YACR,GAAG,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAc,EACd,SAAkC;QAElC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAM7B;;;;;;;;;;;;;;;;QAgBE,EACF;YACE,MAAM;YACN,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,IAAI;YACxC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,IAAI;YAChC,GAAG,EAAE,SAAS,CAAC,GAAG,IAAI,IAAI;YAC1B,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,IAAI;SACjC,CACF,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAClE,OAAO;YACL,GAAG,IAAI;YACP,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC/C,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,KAAK,CAChB,8DAA8D,CAC/D,EAAE,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAoBD,SAAS,mBAAmB,CAAC,GAAuB;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,KAA4B,EAAE,EAAE,CAAC,KAAK;QACpD,CAAC,CAAC;YACE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACtC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAChB,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE;gBAC5D,CAAC,CAAC,IAAI;SACT;QACH,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;QACxB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;QACpC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;QACtC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;QAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACxC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;QAC9B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAI,KAAgC,EAAE,QAAW;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["import type {\n FlowpressCapabilities,\n FlowpressContent,\n FlowpressRoute\n} from \"./types.js\";\n\nexport interface FlowpressGraphqlIssue {\n message?: string;\n extensions?: {\n debugMessage?: string;\n category?: string;\n [key: string]: unknown;\n };\n}\n\ninterface GraphqlResponse<T> {\n data?: T;\n errors?: FlowpressGraphqlIssue[];\n}\n\nexport interface FlowpressClientOptions {\n endpoint: string;\n timeoutMs?: number;\n headers?: Record<string, string>;\n debug?: boolean;\n}\n\nexport class FlowpressGraphqlError extends Error {\n constructor(\n message: string,\n readonly status?: number,\n readonly errors?: FlowpressGraphqlIssue[],\n readonly operationName?: string,\n readonly endpoint?: string,\n cause?: unknown\n ) {\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"FlowpressGraphqlError\";\n }\n}\n\nexport class FlowpressClient {\n readonly endpoint: string;\n readonly timeoutMs: number;\n readonly headers: Record<string, string>;\n readonly debug: boolean;\n\n constructor(options: FlowpressClientOptions) {\n const endpoint = options.endpoint.trim();\n if (!endpoint) {\n throw new Error(\"FlowPress GraphQL endpoint is required.\");\n }\n\n new URL(endpoint);\n this.endpoint = endpoint;\n this.timeoutMs = options.timeoutMs ?? 15_000;\n this.headers = { ...options.headers };\n this.debug = options.debug ?? false;\n }\n\n async request<T>(\n query: string,\n variables: Record<string, unknown> = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const operationName = getOperationName(query);\n const safeEndpoint = sanitizeEndpoint(this.endpoint);\n\n try {\n let response: Response;\n try {\n response = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...this.headers\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal\n });\n } catch (error) {\n const timedOut = controller.signal.aborted;\n const detail = error instanceof Error && error.message\n ? ` ${error.message}`\n : \"\";\n throw new FlowpressGraphqlError(\n timedOut\n ? `FlowPress GraphQL ${operationName} timed out after ${this.timeoutMs}ms at ${safeEndpoint}.`\n : `FlowPress GraphQL ${operationName} could not reach ${safeEndpoint}.${detail}`,\n undefined,\n undefined,\n operationName,\n safeEndpoint,\n error\n );\n }\n\n const body = await response.text();\n let payload: GraphqlResponse<T>;\n try {\n payload = JSON.parse(body) as GraphqlResponse<T>;\n } catch (error) {\n const contentType = response.headers.get(\"content-type\") || \"unknown content type\";\n throw new FlowpressGraphqlError(\n `FlowPress GraphQL ${operationName} returned ${response.status} `\n + `with ${contentType}, not JSON, from ${safeEndpoint}.`,\n response.status,\n undefined,\n operationName,\n safeEndpoint,\n error\n );\n }\n\n if (!response.ok || payload.errors?.length || payload.data === undefined) {\n const errors: FlowpressGraphqlIssue[] | undefined = payload.errors?.map(\n (error) => {\n if (this.debug) {\n return error;\n }\n return error.message ? { message: error.message } : {};\n }\n );\n const messages = errors\n ?.flatMap((error) => [\n error.message,\n this.debug ? error.extensions?.debugMessage : undefined\n ])\n .filter((message): message is string => Boolean(message));\n throw new FlowpressGraphqlError(\n messages?.join(\"; \")\n || `FlowPress GraphQL ${operationName} failed with ${response.status} at ${safeEndpoint}.`,\n response.status,\n errors,\n operationName,\n safeEndpoint\n );\n }\n\n return payload.data;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async getCapabilities(): Promise<FlowpressCapabilities> {\n const data = await this.request<{ styleflowCapabilities: FlowpressCapabilities }>(\n `query FlowpressCapabilities {\n styleflowCapabilities {\n schemaVersion\n wpGraphql\n acfPro\n wpGraphqlAcf\n rankMath\n wpml\n woocommerce\n contactForm7\n defaultLocale\n locales { code slug homeUrl }\n }\n }`\n );\n return data.styleflowCapabilities;\n }\n\n async getRoute(uri: string, locale?: string): Promise<FlowpressRoute | null> {\n const data = await this.request<{\n sfRouteByUri: (Omit<FlowpressRoute, \"seo\"> & {\n seo?: GraphqlSeo | null;\n }) | null;\n }>(\n `query FlowpressRoute($uri: String!, $locale: String) {\n sfRouteByUri(uri: $uri, locale: $locale) {\n uri status queryType locale isFrontPage isPostsPage frontPageMode\n postType taxonomy slug term databaseId termId authorNicename authorId\n pageTemplate mimeType postFormat templateCandidates\n content { loader databaseId termId }\n seo {\n title description canonicalUrl robots headHtml\n hreflang { locale url }\n jsonLd { raw }\n openGraph { title description image { url altText } }\n twitterMeta { title description image { url altText } }\n }\n }\n }`,\n { uri, locale: locale ?? null }\n );\n if (!data.sfRouteByUri) {\n return null;\n }\n return {\n ...data.sfRouteByUri,\n seo: normalizeGraphqlSeo(data.sfRouteByUri.seo)\n };\n }\n\n async getRoutes(locale?: string): Promise<FlowpressRoute[]> {\n const data = await this.request<{\n sfRoutes: Array<Omit<FlowpressRoute, \"seo\"> & {\n seo?: GraphqlSeo | null;\n }>;\n }>(\n `query FlowpressRoutes($locale: String) {\n sfRoutes(locale: $locale) {\n uri status queryType locale isFrontPage isPostsPage frontPageMode\n postType taxonomy slug term databaseId termId authorNicename authorId\n pageTemplate mimeType postFormat templateCandidates\n content { loader databaseId termId }\n seo {\n title description canonicalUrl robots headHtml\n hreflang { locale url }\n jsonLd { raw }\n openGraph { title description image { url altText } }\n twitterMeta { title description image { url altText } }\n }\n }\n }`,\n { locale: locale ?? null }\n );\n return data.sfRoutes.map((route) => ({\n ...route,\n seo: normalizeGraphqlSeo(route.seo)\n }));\n }\n\n async getContent(\n loader: string,\n variables: Record<string, unknown>\n ): Promise<FlowpressContent | null> {\n const data = await this.request<{\n sfContentByLoader: (Omit<FlowpressContent, \"contentBlocks\"> & {\n contentBlocksJson?: string | null;\n projectFieldsJson?: string | null;\n }) | null;\n }>(\n `query FlowpressContent(\n $loader: String!,\n $databaseId: Int,\n $termId: Int,\n $uri: String,\n $locale: String\n ) {\n sfContentByLoader(\n loader: $loader,\n databaseId: $databaseId,\n termId: $termId,\n uri: $uri,\n locale: $locale\n ) {\n title excerpt content contentBlocksJson projectFieldsJson\n }\n }`,\n {\n loader,\n databaseId: variables.databaseId ?? null,\n termId: variables.termId ?? null,\n uri: variables.uri ?? null,\n locale: variables.locale ?? null\n }\n );\n const content = data.sfContentByLoader;\n if (!content) {\n return null;\n }\n const { contentBlocksJson, projectFieldsJson, ...rest } = content;\n return {\n ...rest,\n contentBlocks: parseJson(contentBlocksJson, []),\n projectFields: parseJson(projectFieldsJson, {})\n };\n }\n}\n\nfunction getOperationName(query: string): string {\n return query.match(\n /\\b(?:query|mutation|subscription)\\s+([_A-Za-z][_0-9A-Za-z]*)/\n )?.[1] || \"AnonymousOperation\";\n}\n\nfunction sanitizeEndpoint(endpoint: string): string {\n const url = new URL(endpoint);\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\ninterface GraphqlSeo {\n title?: string | null;\n description?: string | null;\n canonicalUrl?: string | null;\n robots?: string[] | null;\n headHtml?: string | null;\n jsonLd?: { raw?: string | null } | null;\n openGraph?: GraphqlSocial | null;\n twitterMeta?: GraphqlSocial | null;\n hreflang?: Array<{ locale: string; url: string }> | null;\n}\n\ninterface GraphqlSocial {\n title?: string | null;\n description?: string | null;\n image?: { url: string; altText?: string | null } | null;\n}\n\nfunction normalizeGraphqlSeo(seo?: GraphqlSeo | null) {\n if (!seo) return null;\n const social = (value?: GraphqlSocial | null) => value\n ? {\n title: value.title ?? null,\n description: value.description ?? null,\n image: value.image\n ? { url: value.image.url, alt: value.image.altText ?? null }\n : null\n }\n : null;\n\n return {\n title: seo.title ?? null,\n description: seo.description ?? null,\n canonicalUrl: seo.canonicalUrl ?? null,\n robots: seo.robots ?? null,\n headHtml: seo.headHtml ?? null,\n jsonLd: parseJson(seo.jsonLd?.raw, null),\n hreflang: seo.hreflang ?? null,\n openGraph: social(seo.openGraph),\n twitter: social(seo.twitterMeta)\n };\n}\n\nfunction parseJson<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n"]}
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAaA,SAAS,QAAQ,CAAC,GAAsB,EAAE,GAAW;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,2BAA2B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,GAAW;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,4BAA4B,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACtD,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QAChC,WAAW,EAAE,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;QAC1C,WAAW,EAAE,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;QAC1C,UAAU;QACV,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC;QACxD,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,aAAa,CAAC;QACjE,UAAU,EAAE,QAAQ,CAClB,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,EACpC,qBAAqB,CACtB;QACD,cAAc,EAAE,IAAI,CAClB,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,EACjC,kBAAkB,CACnB;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAaA,SAAS,QAAQ,CAAC,GAAsB,EAAE,GAAW;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,2BAA2B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,GAAW;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,4BAA4B,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACtD,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QAChC,WAAW,EAAE,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;QAC1C,WAAW,EAAE,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;QAC1C,UAAU;QACV,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC;QACxD,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,aAAa,CAAC;QACjE,UAAU,EAAE,QAAQ,CAClB,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,EACpC,qBAAqB,CACtB;QACD,cAAc,EAAE,IAAI,CAClB,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,EACjC,kBAAkB,CACnB;KACF,CAAC;AACJ,CAAC","sourcesContent":["export type AstroOutputMode = \"static\" | \"server\";\n\nexport interface FlowpressEnvironment {\n appEnv: string;\n projectName: string;\n projectSlug: string;\n outputMode: AstroOutputMode;\n siteUrl: string;\n backendUrl: string;\n graphqlUrl: string;\n localAstroPort: number;\n}\n\nfunction required(env: NodeJS.ProcessEnv, key: string): string {\n const value = env[key]?.trim();\n if (!value) {\n throw new Error(`Missing required environment variable ${key}.`);\n }\n return value;\n}\n\nfunction validUrl(value: string, key: string): string {\n try {\n return new URL(value).toString().replace(/\\/$/, \"\");\n } catch {\n throw new Error(`${key} must be an absolute URL.`);\n }\n}\n\nfunction port(value: string, key: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65_535) {\n throw new Error(`${key} must be a valid TCP port.`);\n }\n return parsed;\n}\n\nexport function readFlowpressEnvironment(\n env: NodeJS.ProcessEnv = process.env\n): FlowpressEnvironment {\n const outputMode = required(env, \"ASTRO_OUTPUT_MODE\");\n if (outputMode !== \"static\" && outputMode !== \"server\") {\n throw new Error(\"ASTRO_OUTPUT_MODE must be static or server.\");\n }\n\n return {\n appEnv: required(env, \"APP_ENV\"),\n projectName: required(env, \"PROJECT_NAME\"),\n projectSlug: required(env, \"PROJECT_SLUG\"),\n outputMode,\n siteUrl: validUrl(required(env, \"SITE_URL\"), \"SITE_URL\"),\n backendUrl: validUrl(required(env, \"BACKEND_URL\"), \"BACKEND_URL\"),\n graphqlUrl: validUrl(\n required(env, \"BACKEND_GRAPHQL_URL\"),\n \"BACKEND_GRAPHQL_URL\"\n ),\n localAstroPort: port(\n required(env, \"LOCAL_ASTRO_PORT\"),\n \"LOCAL_ASTRO_PORT\"\n )\n };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./client.js";
2
2
  export * from "./env.js";
3
3
  export * from "./styleflow.js";
4
+ export * from "./style-classes.js";
4
5
  export * from "./template-hierarchy.js";
5
6
  export * from "./types.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./client.js";
2
2
  export * from "./env.js";
3
3
  export * from "./styleflow.js";
4
+ export * from "./style-classes.js";
4
5
  export * from "./template-hierarchy.js";
5
6
  export * from "./types.js";
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC","sourcesContent":["export * from \"./client.js\";\nexport * from \"./env.js\";\nexport * from \"./styleflow.js\";\nexport * from \"./style-classes.js\";\nexport * from \"./template-hierarchy.js\";\nexport * from \"./types.js\";\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Collect class names authored in Gutenberg from serialized FlowPress blocks.
3
+ *
4
+ * The traversal includes resolved template/list blocks stored inside
5
+ * attributes as well as ordinary inner blocks. Tokens that could terminate a
6
+ * generated Tailwind `@source inline()` directive are discarded.
7
+ */
8
+ export declare function collectFlowpressClassNames(blocks: unknown): string[];
9
+ //# sourceMappingURL=style-classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-classes.d.ts","sourceRoot":"","sources":["../src/style-classes.ts"],"names":[],"mappings":"AAoBA;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CA8BpE"}
@@ -0,0 +1,47 @@
1
+ const MAX_CLASS_LENGTH = 256;
2
+ const UNSAFE_CLASS_CHARACTERS = /[\s\\{};\u0000-\u001f\u007f]/;
3
+ function classTokens(value) {
4
+ if (typeof value !== "string") {
5
+ return [];
6
+ }
7
+ return value
8
+ .split(/\s+/)
9
+ .map((token) => token.trim())
10
+ .filter((token) => (token.length > 0
11
+ && token.length <= MAX_CLASS_LENGTH
12
+ && !UNSAFE_CLASS_CHARACTERS.test(token)));
13
+ }
14
+ /**
15
+ * Collect class names authored in Gutenberg from serialized FlowPress blocks.
16
+ *
17
+ * The traversal includes resolved template/list blocks stored inside
18
+ * attributes as well as ordinary inner blocks. Tokens that could terminate a
19
+ * generated Tailwind `@source inline()` directive are discarded.
20
+ */
21
+ export function collectFlowpressClassNames(blocks) {
22
+ const classes = new Set();
23
+ const visited = new WeakSet();
24
+ const visit = (value) => {
25
+ if (!value || typeof value !== "object") {
26
+ return;
27
+ }
28
+ if (visited.has(value)) {
29
+ return;
30
+ }
31
+ visited.add(value);
32
+ if (Array.isArray(value)) {
33
+ value.forEach(visit);
34
+ return;
35
+ }
36
+ const block = value;
37
+ if (block.attributes && typeof block.attributes === "object") {
38
+ for (const token of classTokens(block.attributes.className)) {
39
+ classes.add(token);
40
+ }
41
+ }
42
+ Object.values(value).forEach(visit);
43
+ };
44
+ visit(blocks);
45
+ return [...classes].sort((left, right) => left.localeCompare(right));
46
+ }
47
+ //# sourceMappingURL=style-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-classes.js","sourceRoot":"","sources":["../src/style-classes.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAE/D,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACjB,KAAK,CAAC,MAAM,GAAG,CAAC;WACb,KAAK,CAAC,MAAM,IAAI,gBAAgB;WAChC,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CACxC,CAAC,CAAC;AACP,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAe;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAU,CAAC;IAEtC,MAAM,KAAK,GAAG,CAAC,KAAc,EAAQ,EAAE;QACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,KAAgC,CAAC;QAC/C,IAAI,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,KAAK,CAAC,MAAM,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import type { FlowpressBlock } from \"./types.js\";\n\nconst MAX_CLASS_LENGTH = 256;\nconst UNSAFE_CLASS_CHARACTERS = /[\\s\\\\{};\\u0000-\\u001f\\u007f]/;\n\nfunction classTokens(value: unknown): string[] {\n if (typeof value !== \"string\") {\n return [];\n }\n\n return value\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter((token) => (\n token.length > 0\n && token.length <= MAX_CLASS_LENGTH\n && !UNSAFE_CLASS_CHARACTERS.test(token)\n ));\n}\n\n/**\n * Collect class names authored in Gutenberg from serialized FlowPress blocks.\n *\n * The traversal includes resolved template/list blocks stored inside\n * attributes as well as ordinary inner blocks. Tokens that could terminate a\n * generated Tailwind `@source inline()` directive are discarded.\n */\nexport function collectFlowpressClassNames(blocks: unknown): string[] {\n const classes = new Set<string>();\n const visited = new WeakSet<object>();\n\n const visit = (value: unknown): void => {\n if (!value || typeof value !== \"object\") {\n return;\n }\n if (visited.has(value)) {\n return;\n }\n visited.add(value);\n\n if (Array.isArray(value)) {\n value.forEach(visit);\n return;\n }\n\n const block = value as Partial<FlowpressBlock>;\n if (block.attributes && typeof block.attributes === \"object\") {\n for (const token of classTokens(block.attributes.className)) {\n classes.add(token);\n }\n }\n\n Object.values(value).forEach(visit);\n };\n\n visit(blocks);\n return [...classes].sort((left, right) => left.localeCompare(right));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"styleflow.d.ts","sourceRoot":"","sources":["../src/styleflow.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,WAAW,EAAE;QACX,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAkB5D;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,iBAAiB,GAC1B,qBAAqB,CAmCvB"}
1
+ {"version":3,"file":"styleflow.d.ts","sourceRoot":"","sources":["../src/styleflow.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,WAAW,EAAE;QACX,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAqB5D;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,iBAAiB,GAC1B,qBAAqB,CA+CvB"}
package/dist/styleflow.js CHANGED
@@ -1,3 +1,5 @@
1
+ const INHERITED_COLOR_PROPS = new Set(["tone", "intensity"]);
2
+ const FOREGROUND_ROLES = ["primary", "secondary", "tertiary", "muted", "accent"];
1
3
  const AXIS_BY_PROP = {
2
4
  tone: ["color", "tones"],
3
5
  intensity: ["color", "intensities"],
@@ -22,6 +24,10 @@ export function resolveDynamicStyleflowProps(input, defaults, contract) {
22
24
  if (value === undefined || value === null || value === "") {
23
25
  continue;
24
26
  }
27
+ if (INHERITED_COLOR_PROPS.has(key) && value === "inherit") {
28
+ delete resolved[key];
29
+ continue;
30
+ }
25
31
  if (key === "v") {
26
32
  const type = String(input.ty ?? defaults.ty ?? "");
27
33
  const variants = contract.axes.typography.variants[type] ?? [];
@@ -30,6 +36,12 @@ export function resolveDynamicStyleflowProps(input, defaults, contract) {
30
36
  : defaults.v;
31
37
  continue;
32
38
  }
39
+ if (key === "foreground") {
40
+ resolved.foreground = FOREGROUND_ROLES.includes(String(value))
41
+ ? value
42
+ : defaults.foreground;
43
+ continue;
44
+ }
33
45
  const axisPath = AXIS_BY_PROP[key];
34
46
  if (!axisPath) {
35
47
  resolved[key] = value;
@@ -1 +1 @@
1
- {"version":3,"file":"styleflow.js","sourceRoot":"","sources":["../src/styleflow.ts"],"names":[],"mappings":"AA2BA,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;IACnC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;IAC9B,UAAU,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IAChC,EAAE,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;IAC3B,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;IAC5B,mBAAmB,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC;IAClD,gBAAgB,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC;CACnC,CAAC;AAEX,SAAS,aAAa,CAAC,SAAkB,EAAE,OAAgB;IACzD,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAA4B,EAC5B,QAA+B,EAC/B,QAA2B;IAE3B,MAAM,QAAQ,GAA0B,EAAE,GAAG,QAAQ,EAAE,CAAC;IAExD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/D,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACpE,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAgC,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAGvB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAChE,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"styleflow.js","sourceRoot":"","sources":["../src/styleflow.ts"],"names":[],"mappings":"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","sourcesContent":["export interface StyleflowContractAxes {\n color: {\n tones: string[];\n intensities: Array<string | number>;\n surfaces: string[];\n };\n layout: {\n roles: string[];\n densities: string[];\n };\n typography: {\n types: string[];\n variants: Record<string, string[]>;\n weights: string[];\n };\n interaction: {\n priorities: string[];\n states: string[];\n };\n}\n\nexport interface StyleflowContract {\n axes: StyleflowContractAxes;\n}\n\nexport type DynamicStyleflowProps = Record<string, unknown>;\n\nconst INHERITED_COLOR_PROPS = new Set([\"tone\", \"intensity\"]);\nconst FOREGROUND_ROLES = [\"primary\", \"secondary\", \"tertiary\", \"muted\", \"accent\"];\n\nconst AXIS_BY_PROP = {\n tone: [\"color\", \"tones\"],\n intensity: [\"color\", \"intensities\"],\n surface: [\"color\", \"surfaces\"],\n layoutRole: [\"layout\", \"roles\"],\n density: [\"layout\", \"densities\"],\n ty: [\"typography\", \"types\"],\n w: [\"typography\", \"weights\"],\n interactivePriority: [\"interaction\", \"priorities\"],\n interactionState: [\"interaction\", \"states\"]\n} as const;\n\nfunction sameAxisValue(candidate: unknown, allowed: unknown): boolean {\n return String(candidate) === String(allowed);\n}\n\n/**\n * CMS values can outlive a contract revision. Invalid values fail closed to\n * component defaults before reaching Styleflow's Astro runtime.\n */\nexport function resolveDynamicStyleflowProps(\n input: DynamicStyleflowProps,\n defaults: DynamicStyleflowProps,\n contract: StyleflowContract\n): DynamicStyleflowProps {\n const resolved: DynamicStyleflowProps = { ...defaults };\n\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined || value === null || value === \"\") {\n continue;\n }\n\n if (INHERITED_COLOR_PROPS.has(key) && value === \"inherit\") {\n delete resolved[key];\n continue;\n }\n\n if (key === \"v\") {\n const type = String(input.ty ?? defaults.ty ?? \"\");\n const variants = contract.axes.typography.variants[type] ?? [];\n resolved.v = variants.some((variant) => sameAxisValue(value, variant))\n ? value\n : defaults.v;\n continue;\n }\n\n if (key === \"foreground\") {\n resolved.foreground = FOREGROUND_ROLES.includes(String(value))\n ? value\n : defaults.foreground;\n continue;\n }\n\n const axisPath = AXIS_BY_PROP[key as keyof typeof AXIS_BY_PROP];\n if (!axisPath) {\n resolved[key] = value;\n continue;\n }\n\n const [group, axis] = axisPath;\n const groups = contract.axes as unknown as Record<\n string,\n Record<string, unknown[]>\n >;\n const allowed = groups[group]?.[axis] ?? [];\n resolved[key] = allowed.some((item) => sameAxisValue(value, item))\n ? value\n : defaults[key];\n }\n\n return resolved;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"template-hierarchy.js","sourceRoot":"","sources":["../src/template-hierarchy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-hierarchy.js","sourceRoot":"","sources":["../src/template-hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TemplateContext } from \"./types.js\";\n\nfunction slugPart(value: string | number | null | undefined): string {\n return String(value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/\\.php$/i, \"\")\n .replace(/[^a-z0-9_%\\-\\u0080-\\uFFFF]+/gu, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction assignedTemplatePart(value: string | null | undefined): string {\n return String(value ?? \"\")\n .trim()\n .replace(/\\.php$/i, \"\")\n .split(\"/\")\n .map((part) => slugPart(part))\n .filter(Boolean)\n .join(\"/\");\n}\n\nfunction unique(values: Array<string | null | undefined>): string[] {\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\n}\n\nfunction pageCandidates(context: TemplateContext): string[] {\n return unique([\n context.pageTemplate && context.pageTemplate !== \"default\"\n ? assignedTemplatePart(context.pageTemplate)\n : null,\n context.slug ? `page-${slugPart(context.slug)}` : null,\n context.databaseId ? `page-${context.databaseId}` : null,\n \"page\",\n \"singular\",\n \"index\"\n ]);\n}\n\nfunction attachmentMimeCandidates(mimeType?: string | null): string[] {\n const [type = \"\", subtype = \"\"] = String(mimeType ?? \"\")\n .toLowerCase()\n .split(\"/\", 2);\n const normalizedType = slugPart(type);\n const normalizedSubtype = slugPart(subtype);\n\n return unique([\n normalizedType && normalizedSubtype\n ? `${normalizedType}-${normalizedSubtype}`\n : null,\n normalizedSubtype || null,\n normalizedType || null\n ]);\n}\n\n/**\n * Mirrors the WordPress classic template hierarchy, without file extensions.\n * WordPress is still the source of truth at runtime and may filter candidates\n * before returning them to Astro; this pure function powers tests and offline\n * scaffolding.\n */\nexport function getTemplateCandidates(context: TemplateContext): string[] {\n switch (context.queryType) {\n case \"front-page\":\n return unique([\n \"front-page\",\n ...(context.frontPageMode === \"posts\"\n ? [\"home\", \"index\"]\n : pageCandidates(context))\n ]);\n case \"home\":\n return [\"home\", \"index\"];\n case \"privacy-policy\":\n return unique([\"privacy-policy\", ...pageCandidates(context)]);\n case \"page\":\n return pageCandidates(context);\n case \"single\":\n return unique([\n context.postType && context.slug\n ? `single-${slugPart(context.postType)}-${slugPart(context.slug)}`\n : null,\n context.postType ? `single-${slugPart(context.postType)}` : null,\n \"single\",\n \"singular\",\n \"index\"\n ]);\n case \"attachment\":\n return unique([\n ...attachmentMimeCandidates(context.mimeType),\n \"attachment\",\n context.slug ? `single-attachment-${slugPart(context.slug)}` : null,\n \"single-attachment\",\n \"single\",\n \"singular\",\n \"index\"\n ]);\n case \"post-type-archive\":\n return unique([\n context.postType ? `archive-${slugPart(context.postType)}` : null,\n \"archive\",\n \"index\"\n ]);\n case \"category\":\n return unique([\n context.slug ? `category-${slugPart(context.slug)}` : null,\n context.termId ? `category-${context.termId}` : null,\n \"category\",\n \"archive\",\n \"index\"\n ]);\n case \"tag\":\n return unique([\n context.slug ? `tag-${slugPart(context.slug)}` : null,\n context.termId ? `tag-${context.termId}` : null,\n \"tag\",\n \"archive\",\n \"index\"\n ]);\n case \"taxonomy\":\n return unique([\n context.taxonomy && context.term\n ? `taxonomy-${slugPart(context.taxonomy)}-${slugPart(context.term)}`\n : null,\n context.taxonomy ? `taxonomy-${slugPart(context.taxonomy)}` : null,\n \"taxonomy\",\n \"archive\",\n \"index\"\n ]);\n case \"author\":\n return unique([\n context.authorNicename\n ? `author-${slugPart(context.authorNicename)}`\n : null,\n context.authorId ? `author-${context.authorId}` : null,\n \"author\",\n \"archive\",\n \"index\"\n ]);\n case \"date\":\n return [\"date\", \"archive\", \"index\"];\n case \"search\":\n return [\"search\", \"index\"];\n case \"embed\":\n return unique([\n context.postType && context.postFormat\n ? `embed-${slugPart(context.postType)}-${slugPart(context.postFormat)}`\n : null,\n context.postType ? `embed-${slugPart(context.postType)}` : null,\n \"embed\"\n ]);\n case \"archive\":\n return [\"archive\", \"index\"];\n case \"404\":\n return [\"404\", \"index\"];\n }\n}\n\nexport interface TemplateResolution<T> {\n name: string;\n component: T;\n candidates: string[];\n source: \"project\" | \"core\";\n}\n\nexport function resolveTemplate<T>(\n candidates: string[],\n projectTemplates: Readonly<Record<string, T>>,\n coreTemplates: Readonly<Record<string, T>>\n): TemplateResolution<T> {\n for (const candidate of candidates) {\n const project = projectTemplates[candidate];\n if (project) {\n return { name: candidate, component: project, candidates, source: \"project\" };\n }\n\n const core = coreTemplates[candidate];\n if (core) {\n return { name: candidate, component: core, candidates, source: \"core\" };\n }\n }\n\n const projectIndex = projectTemplates.index;\n if (projectIndex) {\n return { name: \"index\", component: projectIndex, candidates, source: \"project\" };\n }\n\n const coreIndex = coreTemplates.index;\n if (!coreIndex) {\n throw new Error(\"FlowPress requires a core index template.\");\n }\n\n return { name: \"index\", component: coreIndex, candidates, source: \"core\" };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAE5D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,eAAe;IACxB,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,eAAe;IACzB,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;IACrB,UAAU,EAAE,eAAe;IAC3B,KAAK,EAAE,eAAe;IACtB,gBAAgB,EAAE,eAAe;IACjC,KAAK,EAAE,eAAe;CACd,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAE5D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,eAAe;IACxB,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,eAAe;IACzB,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;IACrB,UAAU,EAAE,eAAe;IAC3B,KAAK,EAAE,eAAe;IACtB,gBAAgB,EAAE,eAAe;IACjC,KAAK,EAAE,eAAe;CACd,CAAC","sourcesContent":["import DefaultTemplate from \"./astro/DefaultTemplate.astro\";\n\nexport const coreTemplates = {\n index: DefaultTemplate,\n singular: DefaultTemplate,\n single: DefaultTemplate,\n page: DefaultTemplate,\n archive: DefaultTemplate,\n taxonomy: DefaultTemplate,\n category: DefaultTemplate,\n tag: DefaultTemplate,\n author: DefaultTemplate,\n date: DefaultTemplate,\n search: DefaultTemplate,\n home: DefaultTemplate,\n attachment: DefaultTemplate,\n embed: DefaultTemplate,\n \"privacy-policy\": DefaultTemplate,\n \"404\": DefaultTemplate\n} as const;\n"]}
@@ -1 +1 @@
1
- {"root":["../src/astro.d.ts","../src/client.ts","../src/env.ts","../src/index.ts","../src/styleflow.ts","../src/template-hierarchy.ts","../src/templates.ts","../src/types.ts"],"version":"5.9.3"}
1
+ {"root":["../src/astro.d.ts","../src/client.ts","../src/env.ts","../src/index.ts","../src/style-classes.ts","../src/styleflow.ts","../src/template-hierarchy.ts","../src/templates.ts","../src/types.ts","../src/astro/blocks/helpers.ts"],"version":"5.9.3"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export type FlowpressQueryType =\n | \"front-page\"\n | \"home\"\n | \"page\"\n | \"privacy-policy\"\n | \"single\"\n | \"attachment\"\n | \"post-type-archive\"\n | \"category\"\n | \"tag\"\n | \"taxonomy\"\n | \"author\"\n | \"date\"\n | \"search\"\n | \"embed\"\n | \"archive\"\n | \"404\";\n\nexport interface SfSeoImage {\n url: string;\n alt?: string | null;\n width?: number | null;\n height?: number | null;\n}\n\nexport interface SfSeoSocial {\n title?: string | null;\n description?: string | null;\n image?: SfSeoImage | null;\n}\n\nexport interface SfSeo {\n title?: string | null;\n description?: string | null;\n canonicalUrl?: string | null;\n robots?: string[] | null;\n openGraph?: SfSeoSocial | null;\n twitter?: SfSeoSocial | null;\n jsonLd?: unknown;\n headHtml?: string | null;\n hreflang?: Array<{ locale: string; url: string }> | null;\n}\n\nexport interface FlowpressContentReference {\n loader: string;\n databaseId?: number | null;\n termId?: number | null;\n}\n\nexport interface FlowpressRoute {\n uri: string;\n status: number;\n queryType: FlowpressQueryType;\n locale?: string | null;\n isFrontPage?: boolean;\n isPostsPage?: boolean;\n frontPageMode?: \"page\" | \"posts\" | null;\n postType?: string | null;\n taxonomy?: string | null;\n slug?: string | null;\n term?: string | null;\n databaseId?: number | null;\n termId?: number | null;\n authorNicename?: string | null;\n authorId?: number | null;\n pageTemplate?: string | null;\n mimeType?: string | null;\n postFormat?: string | null;\n templateCandidates: string[];\n content?: FlowpressContentReference | null;\n seo?: SfSeo | null;\n}\n\nexport interface FlowpressLocale {\n code: string;\n slug: string;\n homeUrl?: string | null;\n}\n\nexport interface FlowpressCapabilities {\n schemaVersion: string;\n wpGraphql: boolean;\n acfPro: boolean;\n wpGraphqlAcf: boolean;\n rankMath: boolean;\n wpml: boolean;\n woocommerce: boolean;\n contactForm7: boolean;\n defaultLocale?: string | null;\n locales: FlowpressLocale[];\n}\n\nexport interface FlowpressContent {\n title?: string | null;\n excerpt?: string | null;\n content?: string | null;\n contentBlocks?: unknown[] | null;\n projectFields?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport interface FlowpressBlock {\n name: string;\n attributes: Record<string, unknown>;\n innerHtml?: string | null;\n innerBlocks?: FlowpressBlock[];\n}\n\nexport interface FlowpressTemplateProps {\n route: FlowpressRoute;\n content: FlowpressContent | null;\n capabilities: FlowpressCapabilities;\n templateName: string;\n templateCandidates: string[];\n styleflowContract?: import(\"./styleflow.js\").StyleflowContract;\n}\n\nexport interface TemplateContext {\n queryType: FlowpressQueryType;\n frontPageMode?: \"page\" | \"posts\";\n postType?: string | null;\n taxonomy?: string | null;\n slug?: string | null;\n term?: string | null;\n databaseId?: number | null;\n termId?: number | null;\n authorNicename?: string | null;\n authorId?: number | null;\n pageTemplate?: string | null;\n mimeType?: string | null;\n postFormat?: string | null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@styleflow.app/flowpress-astro-core",
3
- "version": "0.2.0-beta.0",
3
+ "version": "0.2.0-beta.10",
4
4
  "description": "Project-agnostic WordPress routing, templates, SEO and GraphQL runtime for FlowPress Astro apps.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -35,7 +35,7 @@
35
35
  ],
36
36
  "scripts": {
37
37
  "build": "tsc -b && node ./scripts/copy-astro.mjs",
38
- "typecheck": "tsc -b --pretty false && node ./scripts/copy-astro.mjs",
38
+ "typecheck": "tsc -b --pretty false && node ./scripts/copy-astro.mjs && astro check",
39
39
  "test": "vitest run",
40
40
  "release:check": "npm run typecheck && npm test && npm pack --dry-run",
41
41
  "release:publish:next": "npm publish --access public --tag next",
@@ -43,12 +43,13 @@
43
43
  "prepublishOnly": "npm run typecheck && npm test && npm run build"
44
44
  },
45
45
  "dependencies": {
46
- "@styleflow.app/astro": "0.3.0-beta.0"
46
+ "@styleflow.app/astro": "0.3.0-beta.3"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "astro": ">=7.0.0"
50
50
  },
51
51
  "devDependencies": {
52
+ "@astrojs/check": "^0.9.9",
52
53
  "@types/node": "^22.19.3",
53
54
  "astro": "^7.0.4",
54
55
  "typescript": "^5.9.3",