@mui/internal-docs-infra 0.3.1-canary.2 → 0.3.1-canary.4

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.
Files changed (110) hide show
  1. package/esm/CodeControllerContext/CodeControllerContext.js +2 -2
  2. package/esm/CodeExternalsContext/CodeExternalsContext.js +1 -1
  3. package/esm/CodeHighlighter/CodeHighlighter.js +252 -327
  4. package/esm/CodeHighlighter/CodeHighlighterClient.js +447 -653
  5. package/esm/CodeHighlighter/CodeHighlighterContext.js +2 -2
  6. package/esm/CodeHighlighter/CodeHighlighterFallbackContext.js +2 -2
  7. package/esm/CodeHighlighter/codeToFallbackProps.js +21 -37
  8. package/esm/CodeHighlighter/errors.js +248 -400
  9. package/esm/CodeHighlighter/parseControlledCode.js +12 -20
  10. package/esm/CodeHighlighter/types.d.ts +7 -1
  11. package/esm/CodeProvider/CodeContext.js +3 -3
  12. package/esm/CodeProvider/CodeProvider.js +31 -40
  13. package/esm/abstractCreateDemo/abstractCreateDemo.js +13 -17
  14. package/esm/abstractCreateDemoClient/abstractCreateDemoClient.js +12 -12
  15. package/esm/cli/index.js +1 -1
  16. package/esm/cli/runValidate.js +160 -264
  17. package/esm/createDemoData/createDemoData.js +11 -12
  18. package/esm/createSitemap/createSitemap.js +2 -2
  19. package/esm/pipeline/getFileConventions/fileConventions.js +1 -1
  20. package/esm/pipeline/getFileConventions/getFileConventions.js +2 -15
  21. package/esm/pipeline/hastUtils/hastUtils.js +16 -17
  22. package/esm/pipeline/loadCodeVariant/addCodeVariantPaths.js +24 -24
  23. package/esm/pipeline/loadCodeVariant/applyCodeTransform.js +12 -22
  24. package/esm/pipeline/loadCodeVariant/calculateMainFilePath.js +30 -37
  25. package/esm/pipeline/loadCodeVariant/computeHastDeltas.js +107 -185
  26. package/esm/pipeline/loadCodeVariant/diffHast.js +18 -53
  27. package/esm/pipeline/loadCodeVariant/examineCodeVariant.js +24 -27
  28. package/esm/pipeline/loadCodeVariant/flattenCodeVariant.js +9 -10
  29. package/esm/pipeline/loadCodeVariant/hasAllCodeVariants.js +5 -5
  30. package/esm/pipeline/loadCodeVariant/loadCodeFallback.js +517 -727
  31. package/esm/pipeline/loadCodeVariant/loadCodeVariant.js +683 -1032
  32. package/esm/pipeline/loadCodeVariant/maybeCodeInitialData.js +14 -20
  33. package/esm/pipeline/loadCodeVariant/mergeCodeMetadata.js +53 -63
  34. package/esm/pipeline/loadCodeVariant/parseCode.js +40 -48
  35. package/esm/pipeline/loadCodeVariant/pathUtils.js +43 -64
  36. package/esm/pipeline/loadCodeVariant/transformSource.js +55 -125
  37. package/esm/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.js +160 -221
  38. package/esm/pipeline/loadPrecomputedCodeHighlighter/parseCreateFactoryCall.js +377 -479
  39. package/esm/pipeline/loadPrecomputedCodeHighlighter/parseFunctionArguments.js +171 -173
  40. package/esm/pipeline/loadPrecomputedCodeHighlighter/performanceLogger.js +14 -30
  41. package/esm/pipeline/loadPrecomputedCodeHighlighter/replacePrecomputeValue.js +19 -21
  42. package/esm/pipeline/loadPrecomputedCodeHighlighter/serializeFunctionArguments.js +37 -71
  43. package/esm/pipeline/loadPrecomputedCodeHighlighterClient/filterRuntimeExternals.js +3 -9
  44. package/esm/pipeline/loadPrecomputedCodeHighlighterClient/generateImportStatements.js +54 -80
  45. package/esm/pipeline/loadPrecomputedCodeHighlighterClient/generateResolvedExternals.js +71 -98
  46. package/esm/pipeline/loadPrecomputedCodeHighlighterClient/injectImportsIntoSource.js +5 -5
  47. package/esm/pipeline/loadPrecomputedCodeHighlighterClient/loadPrecomputedCodeHighlighterClient.js +161 -211
  48. package/esm/pipeline/loadPrecomputedSitemap/loadPrecomputedSitemap.js +159 -207
  49. package/esm/pipeline/loadServerCodeMeta/loadServerCodeMeta.js +42 -64
  50. package/esm/pipeline/loadServerCodeMeta/resolveModulePathWithFs.js +20 -96
  51. package/esm/pipeline/loadServerPageIndex/loadServerPageIndex.js +66 -85
  52. package/esm/pipeline/loadServerSitemap/loadServerSitemap.js +71 -118
  53. package/esm/pipeline/loadServerSource/loadServerSource.js +121 -148
  54. package/esm/pipeline/loaderUtils/externalsToPackages.js +7 -7
  55. package/esm/pipeline/loaderUtils/extractNameAndSlugFromUrl.js +8 -12
  56. package/esm/pipeline/loaderUtils/fileUrlToPortablePath.js +5 -5
  57. package/esm/pipeline/loaderUtils/getFileNameFromUrl.js +19 -29
  58. package/esm/pipeline/loaderUtils/getLanguageFromExtension.d.ts +24 -0
  59. package/esm/pipeline/loaderUtils/getLanguageFromExtension.js +62 -0
  60. package/esm/pipeline/loaderUtils/index.d.ts +2 -1
  61. package/esm/pipeline/loaderUtils/index.js +2 -1
  62. package/esm/pipeline/loaderUtils/mergeExternals.js +15 -35
  63. package/esm/pipeline/loaderUtils/parseImportsAndComments.js +413 -433
  64. package/esm/pipeline/loaderUtils/processRelativeImports.js +153 -239
  65. package/esm/pipeline/loaderUtils/resolveModulePath.js +544 -1303
  66. package/esm/pipeline/loaderUtils/rewriteImports.js +73 -111
  67. package/esm/pipeline/parseSource/addLineGutters.js +33 -45
  68. package/esm/pipeline/parseSource/grammars.d.ts +12 -1
  69. package/esm/pipeline/parseSource/grammars.js +36 -4
  70. package/esm/pipeline/parseSource/index.d.ts +2 -1
  71. package/esm/pipeline/parseSource/index.js +2 -1
  72. package/esm/pipeline/parseSource/parseSource.js +23 -32
  73. package/esm/pipeline/syncPageIndex/createMarkdownNodes.js +32 -55
  74. package/esm/pipeline/syncPageIndex/mergeMetadataMarkdown.js +107 -160
  75. package/esm/pipeline/syncPageIndex/metadataToMarkdown.js +846 -1033
  76. package/esm/pipeline/syncPageIndex/syncPageIndex.js +291 -438
  77. package/esm/pipeline/transformHtmlCodePrecomputed/transformHtmlCodePrecomputed.js +266 -320
  78. package/esm/pipeline/transformMarkdownBlockquoteCallouts/transformMarkdownBlockquoteCallouts.js +10 -10
  79. package/esm/pipeline/transformMarkdownCode/transformMarkdownCode.js +183 -267
  80. package/esm/pipeline/transformMarkdownDemoLinks/transformMarkdownDemoLinks.js +25 -27
  81. package/esm/pipeline/transformMarkdownMetadata/transformMarkdownMetadata.js +572 -717
  82. package/esm/pipeline/transformMarkdownRelativePaths/transformMarkdownRelativePaths.js +8 -8
  83. package/esm/pipeline/transformTypescriptToJavascript/removeTypes.js +84 -113
  84. package/esm/pipeline/transformTypescriptToJavascript/transformTypescriptToJavascript.js +10 -26
  85. package/esm/useCode/Pre.d.ts +2 -0
  86. package/esm/useCode/Pre.js +58 -60
  87. package/esm/useCode/useCode.js +59 -61
  88. package/esm/useCode/useCodeUtils.js +54 -63
  89. package/esm/useCode/useCopyFunctionality.js +10 -9
  90. package/esm/useCode/useFileNavigation.js +171 -209
  91. package/esm/useCode/useSourceEditing.js +17 -14
  92. package/esm/useCode/useTransformManagement.js +23 -26
  93. package/esm/useCode/useUIState.js +12 -20
  94. package/esm/useCode/useVariantSelection.js +62 -79
  95. package/esm/useCopier/index.js +29 -56
  96. package/esm/useDemo/createCodeSandbox.js +12 -15
  97. package/esm/useDemo/createStackBlitz.js +14 -20
  98. package/esm/useDemo/exportVariant.js +200 -180
  99. package/esm/useDemo/exportVariantAsCra.js +22 -25
  100. package/esm/useDemo/useDemo.js +80 -84
  101. package/esm/useErrors/ErrorsContext.js +1 -1
  102. package/esm/useErrors/useErrors.js +3 -3
  103. package/esm/useLocalStorageState/useLocalStorageState.js +23 -39
  104. package/esm/usePreference/PreferencesProvider.js +1 -1
  105. package/esm/usePreference/usePreference.js +9 -11
  106. package/esm/useSearch/useSearch.js +290 -387
  107. package/esm/useUrlHashState/useUrlHashState.js +11 -14
  108. package/esm/withDocsInfra/withDeploymentConfig.js +26 -21
  109. package/esm/withDocsInfra/withDocsInfra.js +99 -101
  110. package/package.json +7 -4
@@ -1,85 +1,87 @@
1
- import _regenerator from "@babel/runtime/helpers/esm/regenerator";
2
- import _typeof from "@babel/runtime/helpers/esm/typeof";
3
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4
- import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
5
- import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
6
1
  import { visit } from 'unist-util-visit';
7
2
  import { loadCodeVariant } from "../loadCodeVariant/loadCodeVariant.js";
8
3
  import { createParseSource } from "../parseSource/index.js";
9
4
  import { TypescriptToJavascriptTransformer } from "../transformTypescriptToJavascript/index.js";
10
5
  /**
11
- * Maps common language class names to file extensions
12
- * Only includes languages that have corresponding grammars in parseSource/grammars.ts
6
+ * Reserved data properties that are handled internally and should not be passed to userProps.
7
+ * These are either processed by the transform pipeline or have special meaning.
13
8
  */
14
- var LANGUAGE_TO_EXTENSION = {
15
- // JavaScript
16
- javascript: 'js',
17
- js: 'js',
18
- // TypeScript
19
- typescript: 'ts',
20
- ts: 'ts',
21
- // TSX/JSX
22
- tsx: 'tsx',
23
- jsx: 'jsx',
24
- // Maps to .jsx but uses tsx grammar
25
-
26
- // JSON
27
- json: 'json',
28
- // Markdown
29
- markdown: 'md',
30
- md: 'md',
31
- // MDX
32
- mdx: 'mdx',
33
- // HTML
34
- html: 'html',
35
- // CSS
36
- css: 'css',
37
- // Shell
38
- shell: 'sh',
39
- bash: 'sh',
40
- sh: 'sh',
41
- // YAML
42
- yaml: 'yaml',
43
- yml: 'yaml'
44
- };
9
+ const RESERVED_DATA_PROPS = new Set(['dataFilename',
10
+ // Used for fileName
11
+ 'dataVariant',
12
+ // Used for variant name
13
+ 'dataTransform',
14
+ // Used for skipTransforms
15
+ 'dataPrecompute',
16
+ // The precomputed output itself
17
+ 'dataContentProps',
18
+ // The serialized user props output
19
+ 'dataName',
20
+ // Used for demo name
21
+ 'dataSlug' // Used for demo slug/URL
22
+ ]);
45
23
 
46
24
  /**
47
- * Extracts the language from className attribute
25
+ * Extracts user-defined data properties from a code element.
26
+ * Filters out reserved properties and returns remaining data-* attributes.
27
+ * Converts from camelCase (dataTitle) to kebab-case keys (title).
48
28
  */
49
- function extractLanguageFromClassName(className) {
50
- if (!className) {
51
- return null;
29
+ function extractUserProps(codeElement) {
30
+ const props = codeElement.properties;
31
+ if (!props) {
32
+ return undefined;
52
33
  }
53
-
54
- // Handle array of class names (HAST format)
55
- var classString = Array.isArray(className) ? className.join(' ') : className;
56
- var match = classString.match(/(?:^|\s)language-(\w+)(?:\s|$)/);
57
- return match ? match[1] : null;
34
+ const userProps = {};
35
+ for (const [key, value] of Object.entries(props)) {
36
+ // Only process data-* attributes (in camelCase form: dataXxx)
37
+ if (key.startsWith('data') && key.length > 4 && !RESERVED_DATA_PROPS.has(key)) {
38
+ // Convert dataTitle -> title, dataHighlight -> highlight
39
+ const propName = key.charAt(4).toLowerCase() + key.slice(5);
40
+ // Convert value to string
41
+ userProps[propName] = String(value);
42
+ }
43
+ }
44
+ return Object.keys(userProps).length > 0 ? userProps : undefined;
58
45
  }
59
46
 
60
47
  /**
61
- * Gets the filename from data-filename attribute or derives it from language
62
- * Returns undefined if no explicit filename and no recognizable language
48
+ * Gets the filename from data-filename attribute only
49
+ * Returns undefined if no explicit filename is provided
63
50
  */
64
51
  function getFileName(codeElement) {
65
- var _codeElement$properti, _codeElement$properti2;
66
52
  // Check for explicit data-filename attribute
67
- var dataFilename = (_codeElement$properti = codeElement.properties) == null ? void 0 : _codeElement$properti.dataFilename;
53
+ const dataFilename = codeElement.properties?.dataFilename;
68
54
  if (dataFilename && typeof dataFilename === 'string') {
69
55
  return dataFilename;
70
56
  }
57
+ return undefined;
58
+ }
71
59
 
72
- // Extract language from className
73
- var className = (_codeElement$properti2 = codeElement.properties) == null ? void 0 : _codeElement$properti2.className;
74
- var language = extractLanguageFromClassName(className);
75
- if (language && LANGUAGE_TO_EXTENSION[language]) {
76
- return "index.".concat(LANGUAGE_TO_EXTENSION[language]);
60
+ /**
61
+ * Extracts language from a className like "language-typescript" or "language-js"
62
+ * Returns the language portion after "language-" prefix
63
+ */
64
+ function extractLanguageFromClassName(className) {
65
+ if (!className) {
66
+ return undefined;
67
+ }
68
+ const classes = Array.isArray(className) ? className : [className];
69
+ for (const cls of classes) {
70
+ if (typeof cls === 'string' && cls.startsWith('language-')) {
71
+ return cls.slice('language-'.length);
72
+ }
77
73
  }
78
-
79
- // Return undefined instead of a fallback - let the system handle gracefully
80
74
  return undefined;
81
75
  }
82
76
 
77
+ /**
78
+ * Gets the language from class="language-*" attribute
79
+ */
80
+ function getLanguage(codeElement) {
81
+ const className = codeElement.properties?.className;
82
+ return extractLanguageFromClassName(className);
83
+ }
84
+
83
85
  /**
84
86
  * Extracts text content from HAST nodes
85
87
  */
@@ -88,9 +90,7 @@ function extractTextContent(node) {
88
90
  return node.value;
89
91
  }
90
92
  if (node.type === 'element' && node.children) {
91
- return node.children.map(function (child) {
92
- return extractTextContent(child);
93
- }).join('');
93
+ return node.children.map(child => extractTextContent(child)).join('');
94
94
  }
95
95
  return '';
96
96
  }
@@ -100,51 +100,37 @@ function extractTextContent(node) {
100
100
  * Handles both section/figure/dl and standalone dl structures
101
101
  */
102
102
  function extractCodeFromSemanticStructure(element) {
103
- var results = [];
103
+ const results = [];
104
104
  if (element.tagName === 'section') {
105
105
  // Handle section with multiple figures
106
- var figures = element.children.filter(function (child) {
107
- return child.type === 'element' && child.tagName === 'figure';
108
- });
109
- var _iterator = _createForOfIteratorHelper(figures),
110
- _step;
111
- try {
112
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
113
- var figure = _step.value;
114
- // Extract variant name from figcaption
115
- var variantName = void 0;
116
- var figcaption = figure.children.find(function (child) {
117
- return child.type === 'element' && child.tagName === 'figcaption';
118
- });
119
- if (figcaption && figcaption.children[0] && figcaption.children[0].type === 'text') {
120
- variantName = figcaption.children[0].value.replace(' variant', '');
121
- }
106
+ const figures = element.children.filter(child => child.type === 'element' && child.tagName === 'figure');
107
+ for (const figure of figures) {
108
+ // Extract variant name from figcaption
109
+ let variantName;
110
+ const figcaption = figure.children.find(child => child.type === 'element' && child.tagName === 'figcaption');
111
+ if (figcaption && figcaption.children[0] && figcaption.children[0].type === 'text') {
112
+ variantName = figcaption.children[0].value.replace(' variant', '');
113
+ }
122
114
 
123
- // Find dl element in figure
124
- var dl = figure.children.find(function (child) {
125
- return child.type === 'element' && child.tagName === 'dl';
126
- });
127
- if (dl) {
128
- var extracted = extractFromDl(dl);
129
- if (extracted) {
130
- results.push({
131
- codeElement: extracted.codeElement,
132
- filename: extracted.filename,
133
- variantName: variantName || extracted.variantName
134
- });
135
- }
115
+ // Find dl element in figure
116
+ const dl = figure.children.find(child => child.type === 'element' && child.tagName === 'dl');
117
+ if (dl) {
118
+ const extracted = extractFromDl(dl);
119
+ if (extracted) {
120
+ results.push({
121
+ codeElement: extracted.codeElement,
122
+ filename: extracted.filename,
123
+ language: extracted.language,
124
+ variantName: variantName || extracted.variantName
125
+ });
136
126
  }
137
127
  }
138
- } catch (err) {
139
- _iterator.e(err);
140
- } finally {
141
- _iterator.f();
142
128
  }
143
129
  } else if (element.tagName === 'dl') {
144
130
  // Handle standalone dl
145
- var _extracted = extractFromDl(element);
146
- if (_extracted) {
147
- results.push(_extracted);
131
+ const extracted = extractFromDl(element);
132
+ if (extracted) {
133
+ results.push(extracted);
148
134
  }
149
135
  }
150
136
  return results;
@@ -155,51 +141,38 @@ function extractCodeFromSemanticStructure(element) {
155
141
  */
156
142
  function extractFromDl(dl) {
157
143
  // Find dt for filename and dd for code
158
- var filename;
159
- var codeElement;
160
- var _iterator2 = _createForOfIteratorHelper(dl.children),
161
- _step2;
162
- try {
163
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
164
- var child = _step2.value;
165
- if (child.type === 'element') {
166
- if (child.tagName === 'dt') {
167
- // Extract filename from dt > code
168
- var codeInDt = child.children.find(function (dtChild) {
169
- return dtChild.type === 'element' && dtChild.tagName === 'code';
170
- });
171
- if (codeInDt && codeInDt.children[0] && codeInDt.children[0].type === 'text') {
172
- filename = codeInDt.children[0].value;
173
- }
174
- } else if (child.tagName === 'dd') {
175
- // Extract code from dd > pre > code
176
- var pre = child.children.find(function (ddChild) {
177
- return ddChild.type === 'element' && ddChild.tagName === 'pre';
178
- });
179
- if (pre) {
180
- var code = pre.children.find(function (preChild) {
181
- return preChild.type === 'element' && preChild.tagName === 'code';
182
- });
183
- if (code) {
184
- codeElement = code;
185
- }
144
+ let filename;
145
+ let codeElement;
146
+ for (const child of dl.children) {
147
+ if (child.type === 'element') {
148
+ if (child.tagName === 'dt') {
149
+ // Extract filename from dt > code
150
+ const codeInDt = child.children.find(dtChild => dtChild.type === 'element' && dtChild.tagName === 'code');
151
+ if (codeInDt && codeInDt.children[0] && codeInDt.children[0].type === 'text') {
152
+ filename = codeInDt.children[0].value;
153
+ }
154
+ } else if (child.tagName === 'dd') {
155
+ // Extract code from dd > pre > code
156
+ const pre = child.children.find(ddChild => ddChild.type === 'element' && ddChild.tagName === 'pre');
157
+ if (pre) {
158
+ const code = pre.children.find(preChild => preChild.type === 'element' && preChild.tagName === 'code');
159
+ if (code) {
160
+ codeElement = code;
186
161
  }
187
162
  }
188
163
  }
189
164
  }
190
- } catch (err) {
191
- _iterator2.e(err);
192
- } finally {
193
- _iterator2.f();
194
165
  }
195
166
  if (codeElement) {
196
- var _codeElement$properti3;
197
167
  // Extract variant name from data-variant if available
198
- var variantName = (_codeElement$properti3 = codeElement.properties) == null ? void 0 : _codeElement$properti3.dataVariant;
168
+ const variantName = codeElement.properties?.dataVariant;
169
+ // Extract language from className
170
+ const language = getLanguage(codeElement);
199
171
  return {
200
- codeElement: codeElement,
201
- filename: filename,
202
- variantName: variantName
172
+ codeElement,
173
+ filename,
174
+ language,
175
+ variantName
203
176
  };
204
177
  }
205
178
  return null;
@@ -216,200 +189,173 @@ function extractFromDl(dl) {
216
189
  * 5. Stores the combined precompute data on the root element
217
190
  * 6. Clears all code element contents and replaces with error message
218
191
  */
219
- export var transformHtmlCodePrecomputed = function transformHtmlCodePrecomputed() {
220
- return /*#__PURE__*/function () {
221
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(tree) {
222
- var transformPromises, sourceParser, sourceTransformers;
223
- return _regenerator().w(function (_context3) {
224
- while (1) switch (_context3.n) {
225
- case 0:
226
- transformPromises = []; // Get the source parser and transformers
227
- sourceParser = createParseSource();
228
- sourceTransformers = [TypescriptToJavascriptTransformer];
229
- visit(tree, 'element', function (node) {
230
- var _node$properties;
231
- var extractedElements = [];
192
+ export const transformHtmlCodePrecomputed = () => {
193
+ return async tree => {
194
+ const transformPromises = [];
232
195
 
233
- // Handle basic pre > code structure from standard markdown
234
- if (node.tagName === 'pre' && node.children && node.children.length > 0 && !((_node$properties = node.properties) != null && _node$properties.dataPrecompute) // Don't process if already processed
235
- ) {
236
- // Look for direct code element in pre
237
- var codeElement = node.children.find(function (child) {
238
- return child.type === 'element' && child.tagName === 'code';
239
- });
240
- if (codeElement) {
241
- // Extract filename from data-filename or derive from language class
242
- var filename = getFileName(codeElement);
243
- extractedElements = [{
244
- codeElement: codeElement,
245
- filename: filename,
246
- variantName: undefined // Basic pre > code doesn't have variants
247
- }];
248
- }
196
+ // Get the source parser and transformers
197
+ const sourceParser = createParseSource();
198
+ const sourceTransformers = [TypescriptToJavascriptTransformer];
199
+ visit(tree, 'element', node => {
200
+ let extractedElements = [];
201
+
202
+ // Handle basic pre > code structure from standard markdown
203
+ if (node.tagName === 'pre' && node.children && node.children.length > 0 && !node.properties?.dataPrecompute // Don't process if already processed
204
+ ) {
205
+ // Look for direct code element in pre
206
+ const codeElement = node.children.find(child => child.type === 'element' && child.tagName === 'code');
207
+ if (codeElement) {
208
+ // Extract filename from data-filename attribute (explicit only)
209
+ const filename = getFileName(codeElement);
210
+ // Extract language from className
211
+ const language = getLanguage(codeElement);
212
+ extractedElements = [{
213
+ codeElement,
214
+ filename,
215
+ language,
216
+ variantName: undefined // Basic pre > code doesn't have variants
217
+ }];
218
+ }
219
+ }
220
+ // Look for section elements (multi-variant) or dl elements (single variant)
221
+ else if ((node.tagName === 'section' || node.tagName === 'dl') && node.children && node.children.length > 0) {
222
+ // Extract code elements from semantic structure
223
+ extractedElements = extractCodeFromSemanticStructure(node);
224
+ }
225
+ if (extractedElements.length > 0) {
226
+ const transformPromise = (async () => {
227
+ try {
228
+ // Create variants from extracted elements
229
+ const variants = {};
230
+ if (extractedElements.length === 1) {
231
+ // Single element - use "Default" as variant name
232
+ const {
233
+ codeElement,
234
+ filename,
235
+ language
236
+ } = extractedElements[0];
237
+ const sourceCode = extractTextContent(codeElement);
238
+ const variant = {
239
+ source: sourceCode,
240
+ skipTransforms: !codeElement.properties?.dataTransform
241
+ };
242
+
243
+ // Add filename if explicitly provided
244
+ if (filename) {
245
+ variant.fileName = filename;
249
246
  }
250
- // Look for section elements (multi-variant) or dl elements (single variant)
251
- else if ((node.tagName === 'section' || node.tagName === 'dl') && node.children && node.children.length > 0) {
252
- // Extract code elements from semantic structure
253
- extractedElements = extractCodeFromSemanticStructure(node);
247
+
248
+ // Add language if available (from className)
249
+ if (language) {
250
+ variant.language = language;
254
251
  }
255
- if (extractedElements.length > 0) {
256
- var transformPromise = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
257
- var variants, _codeElement$properti4, _extractedElements$, _codeElement, _filename, sourceCode, variant, derivedFilename, processedCode, variantPromises, variantResults, _iterator3, _step3, result, _t;
258
- return _regenerator().w(function (_context2) {
259
- while (1) switch (_context2.p = _context2.n) {
260
- case 0:
261
- _context2.p = 0;
262
- // Create variants from extracted elements
263
- variants = {};
264
- if (extractedElements.length === 1) {
265
- // Single element - use "Default" as variant name
266
- _extractedElements$ = extractedElements[0], _codeElement = _extractedElements$.codeElement, _filename = _extractedElements$.filename;
267
- sourceCode = extractTextContent(_codeElement);
268
- variant = {
269
- source: sourceCode,
270
- skipTransforms: !((_codeElement$properti4 = _codeElement.properties) != null && _codeElement$properti4.dataTransform)
271
- }; // Add filename if available (prefer explicit filename over derived)
272
- if (_filename) {
273
- variant.fileName = _filename;
274
- } else {
275
- derivedFilename = getFileName(_codeElement);
276
- if (derivedFilename) {
277
- variant.fileName = derivedFilename;
278
- }
279
- }
280
- variants.Default = variant;
281
- } else {
282
- // Multiple elements - use variant names
283
- extractedElements.forEach(function (_ref3, index) {
284
- var _codeElement$properti5;
285
- var codeElement = _ref3.codeElement,
286
- filename = _ref3.filename,
287
- variantName = _ref3.variantName;
288
- var sourceCode = extractTextContent(codeElement);
252
+ variants.Default = variant;
253
+ } else {
254
+ // Multiple elements - use variant names
255
+ extractedElements.forEach(({
256
+ codeElement,
257
+ filename,
258
+ language,
259
+ variantName
260
+ }, index) => {
261
+ const sourceCode = extractTextContent(codeElement);
289
262
 
290
- // Determine variant name
291
- var finalVariantName = variantName || "Variant ".concat(index + 1);
292
- var variant = {
293
- source: sourceCode,
294
- skipTransforms: !((_codeElement$properti5 = codeElement.properties) != null && _codeElement$properti5.dataTransform)
295
- };
263
+ // Determine variant name
264
+ const finalVariantName = variantName || `Variant ${index + 1}`;
265
+ const variant = {
266
+ source: sourceCode,
267
+ skipTransforms: !codeElement.properties?.dataTransform
268
+ };
296
269
 
297
- // Add filename if available (prefer explicit filename over derived)
298
- if (filename) {
299
- variant.fileName = filename;
300
- } else {
301
- var _derivedFilename = getFileName(codeElement);
302
- if (_derivedFilename) {
303
- variant.fileName = _derivedFilename;
304
- }
305
- }
306
- variants[finalVariantName] = variant;
307
- });
308
- }
270
+ // Add filename if explicitly provided
271
+ if (filename) {
272
+ variant.fileName = filename;
273
+ }
309
274
 
310
- // Process each variant with loadCodeVariant
311
- processedCode = {};
312
- variantPromises = Object.entries(variants).map(/*#__PURE__*/function () {
313
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref4) {
314
- var _ref6, variantName, variantData, result;
315
- return _regenerator().w(function (_context) {
316
- while (1) switch (_context.n) {
317
- case 0:
318
- _ref6 = _slicedToArray(_ref4, 2), variantName = _ref6[0], variantData = _ref6[1];
319
- if (!(variantData && _typeof(variantData) === 'object')) {
320
- _context.n = 2;
321
- break;
322
- }
323
- _context.n = 1;
324
- return loadCodeVariant(undefined,
325
- // url - not needed for inline code
326
- variantName, variantData, {
327
- sourceParser: sourceParser,
328
- loadSource: undefined,
329
- // loadSource - not needed since we have the data
330
- loadVariantMeta: undefined,
331
- // loadVariantMeta - not needed since we have the data
332
- sourceTransformers: sourceTransformers,
333
- disableTransforms: variantData.skipTransforms || false,
334
- // TODO: output option
335
- output: 'hastGzip'
336
- });
337
- case 1:
338
- result = _context.v;
339
- return _context.a(2, {
340
- variantName: variantName,
341
- processedVariant: result.code
342
- });
343
- case 2:
344
- return _context.a(2, null);
345
- }
346
- }, _callee);
347
- }));
348
- return function (_x2) {
349
- return _ref5.apply(this, arguments);
350
- };
351
- }());
352
- _context2.n = 1;
353
- return Promise.all(variantPromises);
354
- case 1:
355
- variantResults = _context2.v;
356
- _iterator3 = _createForOfIteratorHelper(variantResults);
357
- try {
358
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
359
- result = _step3.value;
360
- if (result) {
361
- processedCode[result.variantName] = result.processedVariant;
362
- }
363
- }
275
+ // Add language if available (from className)
276
+ if (language) {
277
+ variant.language = language;
278
+ }
279
+ variants[finalVariantName] = variant;
280
+ });
281
+ }
364
282
 
365
- // Clear all code element contents
366
- } catch (err) {
367
- _iterator3.e(err);
368
- } finally {
369
- _iterator3.f();
370
- }
371
- extractedElements.forEach(function (_ref7) {
372
- var codeElement = _ref7.codeElement;
373
- codeElement.children = [];
374
- });
283
+ // Process each variant with loadCodeVariant
284
+ const processedCode = {};
285
+ const variantPromises = Object.entries(variants).map(async ([variantName, variantData]) => {
286
+ if (variantData && typeof variantData === 'object') {
287
+ const result = await loadCodeVariant(undefined,
288
+ // url - not needed for inline code
289
+ variantName, variantData, {
290
+ sourceParser,
291
+ loadSource: undefined,
292
+ // loadSource - not needed since we have the data
293
+ loadVariantMeta: undefined,
294
+ // loadVariantMeta - not needed since we have the data
295
+ sourceTransformers,
296
+ disableTransforms: variantData.skipTransforms || false,
297
+ // TODO: output option
298
+ output: 'hastGzip'
299
+ });
300
+ return {
301
+ variantName,
302
+ processedVariant: result.code
303
+ };
304
+ }
305
+ return null;
306
+ });
307
+ const variantResults = await Promise.all(variantPromises);
308
+ for (const result of variantResults) {
309
+ if (result) {
310
+ processedCode[result.variantName] = result.processedVariant;
311
+ }
312
+ }
375
313
 
376
- // Replace the semantic structure with a <pre> element
377
- node.tagName = 'pre';
378
- node.children = [{
379
- type: 'text',
380
- value: 'Error: expected pre tag with precomputed data to be handled by the CodeHighlighter component'
381
- }];
314
+ // Extract user props from the first code element (they should be the same for all variants)
315
+ const userProps = extractUserProps(extractedElements[0].codeElement);
382
316
 
383
- // Set the precompute data on the pre element directly on properties for immediate HTML serialization
384
- if (!node.properties) {
385
- node.properties = {};
386
- }
387
- node.properties.dataPrecompute = JSON.stringify(processedCode);
388
- _context2.n = 3;
389
- break;
390
- case 2:
391
- _context2.p = 2;
392
- _t = _context2.v;
393
- console.warn('Failed to transform code block:', _t);
394
- case 3:
395
- return _context2.a(2);
396
- }
397
- }, _callee2, null, [[0, 2]]);
398
- }))();
399
- transformPromises.push(transformPromise);
400
- }
317
+ // Clear all code element contents
318
+ extractedElements.forEach(({
319
+ codeElement
320
+ }) => {
321
+ codeElement.children = [];
401
322
  });
402
323
 
403
- // Wait for all transformations to complete
404
- _context3.n = 1;
405
- return Promise.all(transformPromises);
406
- case 1:
407
- return _context3.a(2);
408
- }
409
- }, _callee3);
410
- }));
411
- return function (_x) {
412
- return _ref.apply(this, arguments);
413
- };
414
- }();
324
+ // Replace the semantic structure with a <pre> element
325
+ node.tagName = 'pre';
326
+ node.children = [{
327
+ type: 'text',
328
+ value: 'Error: expected pre tag with precomputed data to be handled by the CodeHighlighter component'
329
+ }];
330
+
331
+ // Set the precompute data on the pre element directly on properties for immediate HTML serialization
332
+ if (!node.properties) {
333
+ node.properties = {};
334
+ }
335
+ node.properties.dataPrecompute = JSON.stringify(processedCode);
336
+
337
+ // Pass through name and slug if provided on the code element
338
+ const firstCodeElement = extractedElements[0].codeElement;
339
+ if (firstCodeElement.properties?.dataName) {
340
+ node.properties.dataName = firstCodeElement.properties.dataName;
341
+ }
342
+ if (firstCodeElement.properties?.dataSlug) {
343
+ node.properties.dataSlug = firstCodeElement.properties.dataSlug;
344
+ }
345
+
346
+ // Set user props if any exist
347
+ if (userProps) {
348
+ node.properties.dataContentProps = JSON.stringify(userProps);
349
+ }
350
+ } catch (error) {
351
+ console.warn('Failed to transform code block:', error);
352
+ }
353
+ })();
354
+ transformPromises.push(transformPromise);
355
+ }
356
+ });
357
+
358
+ // Wait for all transformations to complete
359
+ await Promise.all(transformPromises);
360
+ };
415
361
  };