@marvalt/wadapter 2.0.0 → 2.0.1

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.
package/README.md CHANGED
@@ -59,6 +59,14 @@ The generators fetch WordPress and Gravity Forms data and write static JSON:
59
59
 
60
60
  You can wire them into npm scripts using your preferred runner. Example entry points are included in the docs.
61
61
 
62
+ ### Pages now include Gutenberg blocks
63
+
64
+ - Pages are fetched with `context=edit` so `content.raw` is available.
65
+ - We parse `content.raw` using `@wordpress/block-serialization-default-parser` and persist `pages[n].blocks`.
66
+ - Posts remain unchanged (HTML `content.rendered`).
67
+
68
+ Proxy mode note: the Cloudflare worker can inject Basic Auth for `context=edit` if `WP_BASIC_AUTH_USERNAME` and `WP_BASIC_AUTH_PASSWORD` are set.
69
+
62
70
  ## Runtime access (static-only)
63
71
 
64
72
  - Loaders
@@ -71,6 +79,19 @@ You can wire them into npm scripts using your preferred runner. Example entry po
71
79
 
72
80
  Note: These selectors read only from static JSON. They do not fetch live content at runtime.
73
81
 
82
+ ## Exports and types
83
+
84
+ - Generators
85
+ - `WordPressGenerator`, `generateWordPressData`
86
+ - `GravityFormsGenerator`, `generateGravityFormsData`
87
+ - Generator output type for GF: `GravityFormsStaticBundle`
88
+
89
+ - Static runtime selectors
90
+ - WordPress: `loadWordPressData`, `getWordPressPosts`, `getWordPressPages`, `getWordPressMedia`, `getWordPressCategories`, `getWordPressTags`
91
+ - Gravity Forms: `loadGravityFormsData`, `hasGravityFormsStatic`, `getActiveForms`, `getPublishedForms`, `getFormById`
92
+
93
+ > Note: The generator bundle type was renamed to avoid conflicts with runtime static selectors.
94
+
74
95
  ## Form submissions
75
96
 
76
97
  Use the package Gravity Forms client. It routes per mode:
@@ -20,7 +20,7 @@ export interface GravityFormsGeneratorConfig extends GravityFormsConfig {
20
20
  formIds?: number[];
21
21
  includeInactive?: boolean;
22
22
  }
23
- export interface GravityFormsStaticData {
23
+ export interface GravityFormsStaticBundle {
24
24
  generated_at: string;
25
25
  total_forms: number;
26
26
  forms: GravityForm[];
@@ -28,9 +28,9 @@ export interface GravityFormsStaticData {
28
28
  export declare class GravityFormsGenerator {
29
29
  private config;
30
30
  constructor(config: GravityFormsGeneratorConfig);
31
- generateStaticData(): Promise<GravityFormsStaticData>;
31
+ generateStaticData(): Promise<GravityFormsStaticBundle>;
32
32
  private writeStaticData;
33
33
  generateFormConfig(formId: number): Promise<GravityForm>;
34
34
  }
35
- export declare function generateGravityFormsData(config: GravityFormsGeneratorConfig): Promise<GravityFormsStaticData>;
35
+ export declare function generateGravityFormsData(config: GravityFormsGeneratorConfig): Promise<GravityFormsStaticBundle>;
36
36
  //# sourceMappingURL=gravity-forms-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gravity-forms-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/gravity-forms/gravity-forms-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI5E,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA8B;gBAEhC,MAAM,EAAE,2BAA2B;IAIzC,kBAAkB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAyE3D,OAAO,CAAC,eAAe;IAWjB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAI/D;AAGD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAGnH"}
1
+ {"version":3,"file":"gravity-forms-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/gravity-forms/gravity-forms-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI5E,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA8B;gBAEhC,MAAM,EAAE,2BAA2B;IAIzC,kBAAkB,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAyE7D,OAAO,CAAC,eAAe;IAWjB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAI/D;AAGD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAGrH"}
@@ -1 +1 @@
1
- {"version":3,"file":"wordpress-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/wordpress/wordpress-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAmC,MAAM,uBAAuB,CAAC;AAIvI,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YACzB,SAAS,EAAE,MAAM,CAAC;YAClB,gBAAgB,EAAE,OAAO,CAAC;YAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;YACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;SACvB,CAAC,CAAC;KACJ,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAA2B;gBAE7B,MAAM,EAAE,wBAAwB;IAItC,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAiDpD,OAAO,CAAC,eAAe;IAWjB,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK7C,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK7C,iBAAiB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAIrD;AAGD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC,CAGtG"}
1
+ {"version":3,"file":"wordpress-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/wordpress/wordpress-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAmC,MAAM,uBAAuB,CAAC;AAKvI,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YACzB,SAAS,EAAE,MAAM,CAAC;YAClB,gBAAgB,EAAE,OAAO,CAAC;YAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;YACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;SACvB,CAAC,CAAC;KACJ,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAA2B;gBAE7B,MAAM,EAAE,wBAAwB;IAItC,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IA4DpD,OAAO,CAAC,eAAe;IAWjB,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK7C,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK7C,iBAAiB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAIrD;AAGD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC,CAGtG"}
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ interface WordPressPost {
35
35
  content: {
36
36
  rendered: string;
37
37
  protected: boolean;
38
+ raw?: string;
38
39
  };
39
40
  excerpt: {
40
41
  rendered: string;
@@ -346,6 +347,7 @@ interface WordPressQueryParams {
346
347
  include?: number[];
347
348
  offset?: number;
348
349
  _embed?: boolean;
350
+ context?: 'view' | 'embed' | 'edit';
349
351
  }
350
352
 
351
353
  /**
@@ -823,12 +825,12 @@ declare function getWordPressTags(): WordPressTag[];
823
825
  * See the GNU General Public License for more details.
824
826
  */
825
827
 
826
- interface GravityFormsStaticData$1 {
828
+ interface GravityFormsStaticData {
827
829
  generated_at?: string;
828
830
  total_forms: number;
829
831
  forms: GravityForm$1[];
830
832
  }
831
- declare function loadGravityFormsData(path?: string): Promise<GravityFormsStaticData$1 | null>;
833
+ declare function loadGravityFormsData(path?: string): Promise<GravityFormsStaticData | null>;
832
834
  declare function hasGravityFormsStatic(): boolean;
833
835
  declare function getActiveForms(): GravityForm$1[];
834
836
  declare function getPublishedForms(): GravityForm$1[];
@@ -909,7 +911,7 @@ interface GravityFormsGeneratorConfig extends GravityFormsConfig {
909
911
  formIds?: number[];
910
912
  includeInactive?: boolean;
911
913
  }
912
- interface GravityFormsStaticData {
914
+ interface GravityFormsStaticBundle {
913
915
  generated_at: string;
914
916
  total_forms: number;
915
917
  forms: GravityForm$1[];
@@ -917,11 +919,11 @@ interface GravityFormsStaticData {
917
919
  declare class GravityFormsGenerator {
918
920
  private config;
919
921
  constructor(config: GravityFormsGeneratorConfig);
920
- generateStaticData(): Promise<GravityFormsStaticData>;
922
+ generateStaticData(): Promise<GravityFormsStaticBundle>;
921
923
  private writeStaticData;
922
924
  generateFormConfig(formId: number): Promise<GravityForm$1>;
923
925
  }
924
- declare function generateGravityFormsData(config: GravityFormsGeneratorConfig): Promise<GravityFormsStaticData>;
926
+ declare function generateGravityFormsData(config: GravityFormsGeneratorConfig): Promise<GravityFormsStaticBundle>;
925
927
 
926
928
  /**
927
929
  * @license GPL-3.0-or-later
@@ -1069,4 +1071,4 @@ declare function validateFormData(formData: Record<string, any>, rules: Record<s
1069
1071
  };
1070
1072
 
1071
1073
  export { FormProtectionGenerator, GravityForm, GravityFormsClient, GravityFormsGenerator, GravityFormsProvider, WordPressClient, WordPressContent, WordPressGenerator, WordPressProvider, createFormProtectionConfig, createGravityFormsConfig, createWordPressConfig, generateFormProtectionData, generateGravityFormsData, generateWordPressData, getActiveForms, getFormById, getPublishedForms, getWordPressCategories, getWordPressMedia, getWordPressPages, getWordPressPosts, getWordPressTags, hasGravityFormsStatic, hasWordPressStatic, loadGravityFormsData, loadWordPressData, sanitizeHtml, transformWordPressMedia, transformWordPressMediaItems, transformWordPressPage, transformWordPressPages, transformWordPressPost, transformWordPressPosts, useGravityForms, useGravityFormsConfig, useGravityFormsContext, useWordPress, useWordPressCategories, useWordPressContext, useWordPressMedia, useWordPressPage, useWordPressPages, useWordPressPost, useWordPressPosts, useWordPressTags, validateEmail, validateFormData, validateFormProtectionConfig, validateGravityFormsConfig, validateMaxLength, validateMinLength, validatePhoneNumber, validateRequired, validateUrl, validateWordPressConfig };
1072
- export type { EmailVerificationData, FormProtectionConfig, FormProtectionGeneratorConfig, FormProtectionResult, FormProtectionStaticData, FormProtectionValidation, GravityFormConfirmation, GravityFormField, GravityFormNotification, GravityFormSubmission, GravityFormSubmissionResult, GravityFormsConfig, GravityFormsGeneratorConfig, StaticDataStore, TransformedWordPressMedia, TransformedWordPressPage, TransformedWordPressPost, UseGravityFormsResult, UseWordPressResult, WordPressAuthor, WordPressCategory, WordPressConfig, WordPressGeneratorConfig, WordPressMedia, WordPressPage, WordPressPost, WordPressQueryParams, WordPressStaticData, WordPressTag };
1074
+ export type { EmailVerificationData, FormProtectionConfig, FormProtectionGeneratorConfig, FormProtectionResult, FormProtectionStaticData, FormProtectionValidation, GravityFormConfirmation, GravityFormField, GravityFormNotification, GravityFormSubmission, GravityFormSubmissionResult, GravityFormsConfig, GravityFormsGeneratorConfig, GravityFormsStaticBundle, GravityFormsStaticData, StaticDataStore, TransformedWordPressMedia, TransformedWordPressPage, TransformedWordPressPost, UseGravityFormsResult, UseWordPressResult, WordPressAuthor, WordPressCategory, WordPressConfig, WordPressGeneratorConfig, WordPressMedia, WordPressPage, WordPressPost, WordPressQueryParams, WordPressStaticData, WordPressTag };
package/dist/index.esm.js CHANGED
@@ -2105,6 +2105,205 @@ function getFormById(id) {
2105
2105
  return (gravityFormsStaticData?.forms ?? []).find(f => String(f.id) === key);
2106
2106
  }
2107
2107
 
2108
+ let document;
2109
+ let offset;
2110
+ let output;
2111
+ let stack;
2112
+ const tokenizer = /<!--\s+(\/)?wp:([a-z][a-z0-9_-]*\/)?([a-z][a-z0-9_-]*)\s+({(?:(?=([^}]+|}+(?=})|(?!}\s+\/?-->)[^])*)\5|[^]*?)}\s+)?(\/)?-->/g;
2113
+ function Block(blockName, attrs, innerBlocks, innerHTML, innerContent) {
2114
+ return {
2115
+ blockName,
2116
+ attrs,
2117
+ innerBlocks,
2118
+ innerHTML,
2119
+ innerContent
2120
+ };
2121
+ }
2122
+ function Freeform(innerHTML) {
2123
+ return Block(null, {}, [], innerHTML, [innerHTML]);
2124
+ }
2125
+ function Frame(block, tokenStart, tokenLength, prevOffset, leadingHtmlStart) {
2126
+ return {
2127
+ block,
2128
+ tokenStart,
2129
+ tokenLength,
2130
+ prevOffset: prevOffset || tokenStart + tokenLength,
2131
+ leadingHtmlStart
2132
+ };
2133
+ }
2134
+ const parse = (doc) => {
2135
+ document = doc;
2136
+ offset = 0;
2137
+ output = [];
2138
+ stack = [];
2139
+ tokenizer.lastIndex = 0;
2140
+ do {
2141
+ } while (proceed());
2142
+ return output;
2143
+ };
2144
+ function proceed() {
2145
+ const stackDepth = stack.length;
2146
+ const next = nextToken();
2147
+ const [tokenType, blockName, attrs, startOffset, tokenLength] = next;
2148
+ const leadingHtmlStart = startOffset > offset ? offset : null;
2149
+ switch (tokenType) {
2150
+ case "no-more-tokens":
2151
+ if (0 === stackDepth) {
2152
+ addFreeform();
2153
+ return false;
2154
+ }
2155
+ if (1 === stackDepth) {
2156
+ addBlockFromStack();
2157
+ return false;
2158
+ }
2159
+ while (0 < stack.length) {
2160
+ addBlockFromStack();
2161
+ }
2162
+ return false;
2163
+ case "void-block":
2164
+ if (0 === stackDepth) {
2165
+ if (null !== leadingHtmlStart) {
2166
+ output.push(
2167
+ Freeform(
2168
+ document.substr(
2169
+ leadingHtmlStart,
2170
+ startOffset - leadingHtmlStart
2171
+ )
2172
+ )
2173
+ );
2174
+ }
2175
+ output.push(Block(blockName, attrs, [], "", []));
2176
+ offset = startOffset + tokenLength;
2177
+ return true;
2178
+ }
2179
+ addInnerBlock(
2180
+ Block(blockName, attrs, [], "", []),
2181
+ startOffset,
2182
+ tokenLength
2183
+ );
2184
+ offset = startOffset + tokenLength;
2185
+ return true;
2186
+ case "block-opener":
2187
+ stack.push(
2188
+ Frame(
2189
+ Block(blockName, attrs, [], "", []),
2190
+ startOffset,
2191
+ tokenLength,
2192
+ startOffset + tokenLength,
2193
+ leadingHtmlStart
2194
+ )
2195
+ );
2196
+ offset = startOffset + tokenLength;
2197
+ return true;
2198
+ case "block-closer":
2199
+ if (0 === stackDepth) {
2200
+ addFreeform();
2201
+ return false;
2202
+ }
2203
+ if (1 === stackDepth) {
2204
+ addBlockFromStack(startOffset);
2205
+ offset = startOffset + tokenLength;
2206
+ return true;
2207
+ }
2208
+ const stackTop = stack.pop();
2209
+ const html = document.substr(
2210
+ stackTop.prevOffset,
2211
+ startOffset - stackTop.prevOffset
2212
+ );
2213
+ stackTop.block.innerHTML += html;
2214
+ stackTop.block.innerContent.push(html);
2215
+ stackTop.prevOffset = startOffset + tokenLength;
2216
+ addInnerBlock(
2217
+ stackTop.block,
2218
+ stackTop.tokenStart,
2219
+ stackTop.tokenLength,
2220
+ startOffset + tokenLength
2221
+ );
2222
+ offset = startOffset + tokenLength;
2223
+ return true;
2224
+ default:
2225
+ addFreeform();
2226
+ return false;
2227
+ }
2228
+ }
2229
+ function parseJSON(input) {
2230
+ try {
2231
+ return JSON.parse(input);
2232
+ } catch (e) {
2233
+ return null;
2234
+ }
2235
+ }
2236
+ function nextToken() {
2237
+ const matches = tokenizer.exec(document);
2238
+ if (null === matches) {
2239
+ return ["no-more-tokens", "", null, 0, 0];
2240
+ }
2241
+ const startedAt = matches.index;
2242
+ const [
2243
+ match,
2244
+ closerMatch,
2245
+ namespaceMatch,
2246
+ nameMatch,
2247
+ attrsMatch,
2248
+ ,
2249
+ voidMatch
2250
+ ] = matches;
2251
+ const length = match.length;
2252
+ const isCloser = !!closerMatch;
2253
+ const isVoid = !!voidMatch;
2254
+ const namespace = namespaceMatch || "core/";
2255
+ const name = namespace + nameMatch;
2256
+ const hasAttrs = !!attrsMatch;
2257
+ const attrs = hasAttrs ? parseJSON(attrsMatch) : {};
2258
+ if (isVoid) {
2259
+ return ["void-block", name, attrs, startedAt, length];
2260
+ }
2261
+ if (isCloser) {
2262
+ return ["block-closer", name, null, startedAt, length];
2263
+ }
2264
+ return ["block-opener", name, attrs, startedAt, length];
2265
+ }
2266
+ function addFreeform(rawLength) {
2267
+ const length = document.length - offset;
2268
+ if (0 === length) {
2269
+ return;
2270
+ }
2271
+ output.push(Freeform(document.substr(offset, length)));
2272
+ }
2273
+ function addInnerBlock(block, tokenStart, tokenLength, lastOffset) {
2274
+ const parent = stack[stack.length - 1];
2275
+ parent.block.innerBlocks.push(block);
2276
+ const html = document.substr(
2277
+ parent.prevOffset,
2278
+ tokenStart - parent.prevOffset
2279
+ );
2280
+ if (html) {
2281
+ parent.block.innerHTML += html;
2282
+ parent.block.innerContent.push(html);
2283
+ }
2284
+ parent.block.innerContent.push(null);
2285
+ parent.prevOffset = lastOffset ? lastOffset : tokenStart + tokenLength;
2286
+ }
2287
+ function addBlockFromStack(endOffset) {
2288
+ const { block, leadingHtmlStart, prevOffset, tokenStart } = stack.pop();
2289
+ const html = endOffset ? document.substr(prevOffset, endOffset - prevOffset) : document.substr(prevOffset);
2290
+ if (html) {
2291
+ block.innerHTML += html;
2292
+ block.innerContent.push(html);
2293
+ }
2294
+ if (null !== leadingHtmlStart) {
2295
+ output.push(
2296
+ Freeform(
2297
+ document.substr(
2298
+ leadingHtmlStart,
2299
+ tokenStart - leadingHtmlStart
2300
+ )
2301
+ )
2302
+ );
2303
+ }
2304
+ output.push(block);
2305
+ }
2306
+
2108
2307
  /**
2109
2308
  * @license GPL-3.0-or-later
2110
2309
  *
@@ -2135,6 +2334,8 @@ class WordPressGenerator {
2135
2334
  const data = await client.getAllData({
2136
2335
  per_page: this.config.maxItems || 100,
2137
2336
  _embed: this.config.includeEmbedded || false,
2337
+ // required for content.raw with Gutenberg comments
2338
+ context: 'edit',
2138
2339
  });
2139
2340
  // Create the static data structure matching the existing format
2140
2341
  const staticData = {
@@ -2156,7 +2357,17 @@ class WordPressGenerator {
2156
2357
  },
2157
2358
  // Map the data to the expected structure
2158
2359
  posts: data.posts,
2159
- pages: data.pages,
2360
+ pages: (data.pages || []).map((p) => {
2361
+ let blocks = [];
2362
+ try {
2363
+ const raw = p?.content?.raw || '';
2364
+ blocks = raw ? parse(raw) : [];
2365
+ }
2366
+ catch (e) {
2367
+ console.warn('⚠️ Failed to parse Gutenberg blocks for page', p?.id, e);
2368
+ }
2369
+ return { ...p, blocks };
2370
+ }),
2160
2371
  media: data.media,
2161
2372
  categories: data.categories,
2162
2373
  tags: data.tags,