@qontinui/ui-bridge 0.3.0 → 0.3.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/dist/ai/index.d.mts +312 -155
- package/dist/ai/index.d.ts +312 -155
- package/dist/ai/index.js +2363 -67
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +2328 -68
- package/dist/ai/index.mjs.map +1 -1
- package/dist/annotations/index.d.mts +218 -0
- package/dist/annotations/index.d.ts +218 -0
- package/dist/annotations/index.js +246 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/index.mjs +241 -0
- package/dist/annotations/index.mjs.map +1 -0
- package/dist/assertions-BSR3afVr.d.ts +161 -0
- package/dist/assertions-CTw1hfOx.d.mts +161 -0
- package/dist/babel-plugin/index.js +23 -34
- package/dist/babel-plugin/index.js.map +1 -1
- package/dist/babel-plugin/index.mjs +23 -34
- package/dist/babel-plugin/index.mjs.map +1 -1
- package/dist/browser-capture-Bms60T6f.d.mts +47 -0
- package/dist/browser-capture-CsTU29mb.d.ts +47 -0
- package/dist/control/index.d.mts +26 -7
- package/dist/control/index.d.ts +26 -7
- package/dist/control/index.js +276 -48
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +276 -48
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.d.mts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +5 -3
- package/dist/debug/index.d.ts +5 -3
- package/dist/debug/index.js +925 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +924 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.mts +12 -7
- package/dist/index.d.ts +12 -7
- package/dist/index.js +4720 -173
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4656 -174
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-DTA2bwG7.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
- package/dist/{metrics-BfiT_rhZ.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
- package/dist/native/control/index.js +2 -7
- package/dist/native/control/index.js.map +1 -1
- package/dist/native/control/index.mjs +2 -7
- package/dist/native/control/index.mjs.map +1 -1
- package/dist/native/core/index.js.map +1 -1
- package/dist/native/core/index.mjs.map +1 -1
- package/dist/native/debug/index.js +23 -66
- package/dist/native/debug/index.js.map +1 -1
- package/dist/native/debug/index.mjs +23 -66
- package/dist/native/debug/index.mjs.map +1 -1
- package/dist/native/index.js +89 -131
- package/dist/native/index.js.map +1 -1
- package/dist/native/index.mjs +89 -131
- package/dist/native/index.mjs.map +1 -1
- package/dist/native/react/index.js +28 -52
- package/dist/native/react/index.js.map +1 -1
- package/dist/native/react/index.mjs +28 -52
- package/dist/native/react/index.mjs.map +1 -1
- package/dist/native/server/index.js +38 -13
- package/dist/native/server/index.js.map +1 -1
- package/dist/native/server/index.mjs +38 -13
- package/dist/native/server/index.mjs.map +1 -1
- package/dist/react/index.d.mts +107 -8
- package/dist/react/index.d.ts +107 -8
- package/dist/react/index.js +2194 -84
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +2194 -85
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-BKLEm-yk.d.ts → registry-C6dDtn1v.d.ts} +27 -2
- package/dist/{registry-BmZgyCz8.d.mts → registry-POtcxnal.d.mts} +27 -2
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +5 -4
- package/dist/server/express.d.ts +5 -4
- package/dist/server/express.js +104 -2
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.mjs +104 -2
- package/dist/server/express.mjs.map +1 -1
- package/dist/server/handlers.d.mts +36 -5
- package/dist/server/handlers.d.ts +36 -5
- package/dist/server/handlers.js +3129 -224
- package/dist/server/handlers.js.map +1 -1
- package/dist/server/handlers.mjs +3129 -224
- package/dist/server/handlers.mjs.map +1 -1
- package/dist/server/index.d.mts +7 -5
- package/dist/server/index.d.ts +7 -5
- package/dist/server/index.js +3215 -183
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +3215 -183
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/nextjs.d.mts +6 -4
- package/dist/server/nextjs.d.ts +6 -4
- package/dist/server/nextjs.js +106 -3
- package/dist/server/nextjs.js.map +1 -1
- package/dist/server/nextjs.mjs +106 -3
- package/dist/server/nextjs.mjs.map +1 -1
- package/dist/server/standalone.d.mts +6 -5
- package/dist/server/standalone.d.ts +6 -5
- package/dist/server/standalone.js +131 -5
- package/dist/server/standalone.js.map +1 -1
- package/dist/server/standalone.mjs +131 -5
- package/dist/server/standalone.mjs.map +1 -1
- package/dist/specs/index.d.mts +365 -0
- package/dist/specs/index.d.ts +365 -0
- package/dist/specs/index.js +2809 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/index.mjs +2786 -0
- package/dist/specs/index.mjs.map +1 -0
- package/dist/{standalone-BURj8J3G.d.ts → standalone-B6GLIEmR.d.ts} +6 -2
- package/dist/{standalone-Dwmel29d.d.mts → standalone-CjdYqj3P.d.mts} +6 -2
- package/dist/{types-CHnlwiTK.d.ts → types-B2EfvEaq.d.ts} +83 -3
- package/dist/{types-B7J7noLK.d.mts → types-C7gVYRnF.d.ts} +72 -2
- package/dist/{types-BkNRILUa.d.ts → types-CJGrBEhC.d.mts} +72 -2
- package/dist/types-CebMQj76.d.ts +1275 -0
- package/dist/types-D_ypYl3T.d.mts +1275 -0
- package/dist/types-UBtp7R0u.d.mts +132 -0
- package/dist/types-UBtp7R0u.d.ts +132 -0
- package/dist/{types-CEQLnFMv.d.mts → types-gO696T_t.d.mts} +83 -3
- package/dist/{types-jKVgTI6_.d.mts → types-suaYwWWg.d.mts} +173 -2
- package/dist/{types-jKVgTI6_.d.ts → types-suaYwWWg.d.ts} +173 -2
- package/package.json +18 -2
- package/dist/types-B5Q0GVo0.d.mts +0 -646
- package/dist/types-DfPqwU-i.d.ts +0 -646
|
@@ -330,10 +330,7 @@ function hasAttribute(element, attrName, types) {
|
|
|
330
330
|
}
|
|
331
331
|
function addAttribute(element, name, value, types) {
|
|
332
332
|
element.attributes.push(
|
|
333
|
-
types.jsxAttribute(
|
|
334
|
-
types.jsxIdentifier(name),
|
|
335
|
-
types.stringLiteral(value)
|
|
336
|
-
)
|
|
333
|
+
types.jsxAttribute(types.jsxIdentifier(name), types.stringLiteral(value))
|
|
337
334
|
);
|
|
338
335
|
}
|
|
339
336
|
function getTagName(element, types) {
|
|
@@ -404,8 +401,7 @@ var uiBridgeBabelPlugin = helperPluginUtils.declare(
|
|
|
404
401
|
},
|
|
405
402
|
visitor: {
|
|
406
403
|
JSXElement(path) {
|
|
407
|
-
|
|
408
|
-
if (!shouldProcessFile(state.filename, state.config)) {
|
|
404
|
+
if (!shouldProcessFile(this.filename, this.config)) {
|
|
409
405
|
return;
|
|
410
406
|
}
|
|
411
407
|
const openingElement = path.node.openingElement;
|
|
@@ -413,36 +409,33 @@ var uiBridgeBabelPlugin = helperPluginUtils.declare(
|
|
|
413
409
|
if (!tagName || !isHtmlElement(tagName)) {
|
|
414
410
|
return;
|
|
415
411
|
}
|
|
416
|
-
if (!
|
|
412
|
+
if (!this.config.elements.includes(tagName)) {
|
|
417
413
|
return;
|
|
418
414
|
}
|
|
419
|
-
if (
|
|
415
|
+
if (this.config.skipExisting && hasAttribute(openingElement, this.config.idAttribute, types)) {
|
|
420
416
|
return;
|
|
421
417
|
}
|
|
422
418
|
const componentName = findComponentName(path);
|
|
423
|
-
if (
|
|
424
|
-
if (!componentName || !
|
|
419
|
+
if (this.config.onlyInComponents.length > 0) {
|
|
420
|
+
if (!componentName || !this.config.onlyInComponents.includes(componentName)) {
|
|
425
421
|
return;
|
|
426
422
|
}
|
|
427
423
|
}
|
|
428
|
-
if (
|
|
429
|
-
if (componentName &&
|
|
424
|
+
if (this.config.skipInComponents.length > 0) {
|
|
425
|
+
if (componentName && this.config.skipInComponents.includes(componentName)) {
|
|
430
426
|
return;
|
|
431
427
|
}
|
|
432
428
|
}
|
|
433
|
-
const textContent = extractTextContent(
|
|
434
|
-
path.node.children,
|
|
435
|
-
types
|
|
436
|
-
);
|
|
429
|
+
const textContent = extractTextContent(path.node.children, types);
|
|
437
430
|
const ariaLabel = getAttributeValue(openingElement, "aria-label", types);
|
|
438
431
|
const placeholder = getAttributeValue(openingElement, "placeholder", types);
|
|
439
432
|
const title = getAttributeValue(openingElement, "title", types);
|
|
440
433
|
const name = getAttributeValue(openingElement, "name", types);
|
|
441
434
|
const existingId = getAttributeValue(openingElement, "id", types);
|
|
442
|
-
const elementIndex = getNextElementIndex(
|
|
435
|
+
const elementIndex = getNextElementIndex(this.filename, tagName);
|
|
443
436
|
const idContext = {
|
|
444
437
|
componentName,
|
|
445
|
-
filePath:
|
|
438
|
+
filePath: this.filename,
|
|
446
439
|
tagName,
|
|
447
440
|
textContent,
|
|
448
441
|
ariaLabel,
|
|
@@ -451,16 +444,16 @@ var uiBridgeBabelPlugin = helperPluginUtils.declare(
|
|
|
451
444
|
elementIndex,
|
|
452
445
|
existingId
|
|
453
446
|
};
|
|
454
|
-
const generatedId = generateId(idContext,
|
|
455
|
-
if (
|
|
447
|
+
const generatedId = generateId(idContext, this.config);
|
|
448
|
+
if (this.processed.has(generatedId)) {
|
|
456
449
|
const uniqueId = `${generatedId}-${elementIndex}`;
|
|
457
|
-
addAttribute(openingElement,
|
|
450
|
+
addAttribute(openingElement, this.config.idAttribute, uniqueId, types);
|
|
458
451
|
} else {
|
|
459
|
-
|
|
460
|
-
addAttribute(openingElement,
|
|
452
|
+
this.processed.add(generatedId);
|
|
453
|
+
addAttribute(openingElement, this.config.idAttribute, generatedId, types);
|
|
461
454
|
}
|
|
462
455
|
const semanticType = getSemanticType(tagName, idContext);
|
|
463
|
-
addAttribute(openingElement,
|
|
456
|
+
addAttribute(openingElement, this.config.typeAttribute, semanticType, types);
|
|
464
457
|
const aliasContext = {
|
|
465
458
|
tagName,
|
|
466
459
|
textContent,
|
|
@@ -468,29 +461,25 @@ var uiBridgeBabelPlugin = helperPluginUtils.declare(
|
|
|
468
461
|
placeholder,
|
|
469
462
|
title,
|
|
470
463
|
name};
|
|
471
|
-
if (shouldGenerateAliases(aliasContext,
|
|
472
|
-
const aliases = generateAliases(aliasContext,
|
|
464
|
+
if (shouldGenerateAliases(aliasContext, this.config)) {
|
|
465
|
+
const aliases = generateAliases(aliasContext, this.config);
|
|
473
466
|
if (aliases.length > 0) {
|
|
474
467
|
addAttribute(
|
|
475
468
|
openingElement,
|
|
476
|
-
|
|
469
|
+
this.config.aliasesAttribute,
|
|
477
470
|
formatAliasesAttribute(aliases),
|
|
478
471
|
types
|
|
479
472
|
);
|
|
480
473
|
}
|
|
481
474
|
}
|
|
482
|
-
if (
|
|
483
|
-
console.log(
|
|
484
|
-
`[ui-bridge-babel-plugin] Instrumented <${tagName}> as "${generatedId}"`
|
|
485
|
-
);
|
|
475
|
+
if (this.config.verbose) {
|
|
476
|
+
console.log(`[ui-bridge-babel-plugin] Instrumented <${tagName}> as "${generatedId}"`);
|
|
486
477
|
}
|
|
487
478
|
}
|
|
488
479
|
},
|
|
489
480
|
post() {
|
|
490
481
|
if (this.config.verbose) {
|
|
491
|
-
console.log(
|
|
492
|
-
`[ui-bridge-babel-plugin] Finished processing: ${this.filename}`
|
|
493
|
-
);
|
|
482
|
+
console.log(`[ui-bridge-babel-plugin] Finished processing: ${this.filename}`);
|
|
494
483
|
}
|
|
495
484
|
}
|
|
496
485
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/babel-plugin/config.ts","../../src/babel-plugin/id-generator.ts","../../src/babel-plugin/alias-generator.ts","../../src/babel-plugin/index.ts"],"names":["declare"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Plugin Configuration\n *\n * Configuration options for the UI Bridge Babel plugin.\n */\n\n/**\n * Elements to instrument\n */\nexport type InstrumentableElement =\n | 'button'\n | 'input'\n | 'select'\n | 'textarea'\n | 'a'\n | 'form'\n | 'label'\n | 'img'\n | 'video'\n | 'audio'\n | 'dialog'\n | 'details'\n | 'summary'\n | 'nav'\n | 'header'\n | 'footer'\n | 'main'\n | 'aside'\n | 'section'\n | 'article';\n\n/**\n * Plugin configuration options\n */\nexport interface PluginConfig {\n /**\n * Include specific file patterns (glob)\n * @default ['**\\/*.tsx', '**\\/*.jsx']\n */\n include?: string[];\n\n /**\n * Exclude specific file patterns (glob)\n * @default ['**\\/node_modules/**', '**\\/*.test.*', '**\\/*.spec.*']\n */\n exclude?: string[];\n\n /**\n * Elements to automatically instrument\n * @default ['button', 'input', 'select', 'textarea', 'a', 'form']\n */\n elements?: InstrumentableElement[];\n\n /**\n * Prefix for generated IDs\n * @default 'ui'\n */\n idPrefix?: string;\n\n /**\n * Attribute name for the generated ID\n * @default 'data-ui-id'\n */\n idAttribute?: string;\n\n /**\n * Attribute name for aliases\n * @default 'data-ui-aliases'\n */\n aliasesAttribute?: string;\n\n /**\n * Attribute name for element type\n * @default 'data-ui-type'\n */\n typeAttribute?: string;\n\n /**\n * Generate aliases from text content\n * @default true\n */\n generateAliases?: boolean;\n\n /**\n * Include component name in generated ID\n * @default true\n */\n includeComponentName?: boolean;\n\n /**\n * Include file path in generated ID\n * @default false\n */\n includeFilePath?: boolean;\n\n /**\n * Hash the generated ID for shorter strings\n * @default false\n */\n hashIds?: boolean;\n\n /**\n * Maximum alias count per element\n * @default 5\n */\n maxAliases?: number;\n\n /**\n * Skip elements that already have data-ui-id\n * @default true\n */\n skipExisting?: boolean;\n\n /**\n * Only instrument elements inside components with specific names\n * @default []\n */\n onlyInComponents?: string[];\n\n /**\n * Skip instrumentation for elements inside these components\n * @default []\n */\n skipInComponents?: string[];\n\n /**\n * Enable verbose logging during build\n * @default false\n */\n verbose?: boolean;\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CONFIG: Required<PluginConfig> = {\n include: ['**/*.tsx', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/*.test.*', '**/*.spec.*', '**/*.stories.*'],\n elements: ['button', 'input', 'select', 'textarea', 'a', 'form'],\n idPrefix: 'ui',\n idAttribute: 'data-ui-id',\n aliasesAttribute: 'data-ui-aliases',\n typeAttribute: 'data-ui-type',\n generateAliases: true,\n includeComponentName: true,\n includeFilePath: false,\n hashIds: false,\n maxAliases: 5,\n skipExisting: true,\n onlyInComponents: [],\n skipInComponents: [],\n verbose: false,\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(userConfig: PluginConfig = {}): Required<PluginConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...userConfig,\n // Ensure arrays are properly merged\n include: userConfig.include ?? DEFAULT_CONFIG.include,\n exclude: userConfig.exclude ?? DEFAULT_CONFIG.exclude,\n elements: userConfig.elements ?? DEFAULT_CONFIG.elements,\n onlyInComponents: userConfig.onlyInComponents ?? DEFAULT_CONFIG.onlyInComponents,\n skipInComponents: userConfig.skipInComponents ?? DEFAULT_CONFIG.skipInComponents,\n };\n}\n\n/**\n * Check if a file should be processed based on include/exclude patterns\n */\nexport function shouldProcessFile(\n filename: string,\n config: Required<PluginConfig>\n): boolean {\n // Simple pattern matching (for full glob support, use micromatch)\n const matchPattern = (pattern: string, path: string): boolean => {\n // Simple extension-based matching for common patterns\n // **/*.tsx -> match any .tsx file\n // **/*.test.* -> match any file with .test. in name\n\n // Handle **/*.ext pattern (match files with extension anywhere)\n if (pattern.startsWith('**/')) {\n const restOfPattern = pattern.slice(3); // Remove **/\n\n // Handle **/dir/** patterns\n if (restOfPattern.includes('/**')) {\n const dir = restOfPattern.replace('/**', '');\n return path.includes('/' + dir + '/') || path.startsWith(dir + '/');\n }\n\n // Handle **/*.test.* or **/*.spec.* (files with .test. or .spec. in name)\n // Must check this BEFORE the simple extension check\n if (restOfPattern.startsWith('*.') && restOfPattern.endsWith('.*') && restOfPattern.length > 3) {\n const middle = restOfPattern.slice(2, -2); // Get middle part like \"test\" or \"spec\"\n const fileName = path.includes('/') ? path.split('/').pop() || path : path;\n return fileName.includes('.' + middle + '.');\n }\n\n // Handle **/*.ext (any file with simple extension like .tsx, .jsx)\n if (restOfPattern.startsWith('*.') && !restOfPattern.slice(2).includes('*')) {\n const ext = restOfPattern.slice(1); // Get .ext part\n return path.endsWith(ext);\n }\n }\n\n // Fallback: exact match\n return path === pattern;\n };\n\n // Normalize path\n const normalizedPath = filename.replace(/\\\\/g, '/');\n\n // Check exclude patterns first\n for (const pattern of config.exclude) {\n if (matchPattern(pattern, normalizedPath)) {\n return false;\n }\n }\n\n // Check include patterns\n for (const pattern of config.include) {\n if (matchPattern(pattern, normalizedPath)) {\n return true;\n }\n }\n\n return false;\n}\n","/**\n * ID Generator\n *\n * Generates stable, unique IDs for UI elements based on component path,\n * element type, and content.\n */\n\nimport type { PluginConfig } from './config';\n\n/**\n * Context for generating element IDs\n */\nexport interface IdGeneratorContext {\n /** Component name */\n componentName: string | null;\n /** File path */\n filePath: string;\n /** Element tag name */\n tagName: string;\n /** Element text content */\n textContent: string | null;\n /** Aria label */\n ariaLabel: string | null;\n /** Placeholder text */\n placeholder: string | null;\n /** Title attribute */\n title: string | null;\n /** Element index in component (for uniqueness) */\n elementIndex: number;\n /** Existing id attribute */\n existingId: string | null;\n}\n\n/**\n * Simple hash function for ID generation\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n // Convert to positive hex string\n return Math.abs(hash).toString(16).substring(0, 8);\n}\n\n/**\n * Normalize text for use in ID\n */\nfunction normalizeForId(text: string): string {\n return text\n .toLowerCase()\n .trim()\n // Replace non-alphanumeric with dash\n .replace(/[^a-z0-9]+/g, '-')\n // Remove leading/trailing dashes\n .replace(/^-+|-+$/g, '')\n // Collapse multiple dashes\n .replace(/-+/g, '-')\n // Limit length\n .substring(0, 30);\n}\n\n/**\n * Extract component name from file path\n */\nexport function extractComponentFromPath(filePath: string): string | null {\n // Normalize path separators\n const normalized = filePath.replace(/\\\\/g, '/');\n\n // Get filename without extension\n const match = normalized.match(/\\/([^/]+)\\.(tsx?|jsx?)$/);\n if (!match) return null;\n\n const filename = match[1];\n\n // Skip index files\n if (filename === 'index') {\n // Try to get parent folder name\n const parentMatch = normalized.match(/\\/([^/]+)\\/index\\.(tsx?|jsx?)$/);\n if (parentMatch) {\n return normalizeForId(parentMatch[1]);\n }\n }\n\n return normalizeForId(filename);\n}\n\n/**\n * Get semantic type for element\n */\nexport function getSemanticType(tagName: string, context: IdGeneratorContext): string {\n const tag = tagName.toLowerCase();\n\n // Check for specific input types\n if (tag === 'input') {\n // Would need to check type attribute, for now just return 'input'\n return 'input';\n }\n\n // Check for specific button purposes\n if (tag === 'button') {\n const text = context.textContent?.toLowerCase() || '';\n if (text.includes('submit') || text.includes('save')) return 'submit-button';\n if (text.includes('cancel') || text.includes('close')) return 'cancel-button';\n if (text.includes('delete') || text.includes('remove')) return 'delete-button';\n return 'button';\n }\n\n // Map tags to semantic types\n const typeMap: Record<string, string> = {\n a: 'link',\n select: 'dropdown',\n textarea: 'textarea',\n form: 'form',\n nav: 'navigation',\n header: 'header',\n footer: 'footer',\n main: 'main',\n aside: 'sidebar',\n dialog: 'dialog',\n img: 'image',\n };\n\n return typeMap[tag] || tag;\n}\n\n/**\n * Generate a unique ID for an element\n */\nexport function generateId(\n context: IdGeneratorContext,\n config: Required<PluginConfig>\n): string {\n const parts: string[] = [];\n\n // Add prefix\n if (config.idPrefix) {\n parts.push(config.idPrefix);\n }\n\n // Add file path component\n if (config.includeFilePath) {\n const fileComponent = extractComponentFromPath(context.filePath);\n if (fileComponent) {\n parts.push(fileComponent);\n }\n }\n\n // Add component name\n if (config.includeComponentName && context.componentName) {\n parts.push(normalizeForId(context.componentName));\n }\n\n // Add descriptive part from text/aria/placeholder\n const descriptiveText =\n context.textContent ||\n context.ariaLabel ||\n context.placeholder ||\n context.title ||\n context.existingId;\n\n if (descriptiveText) {\n parts.push(normalizeForId(descriptiveText));\n }\n\n // Add semantic type\n const semanticType = getSemanticType(context.tagName, context);\n parts.push(semanticType);\n\n // Generate base ID\n let id = parts.filter(Boolean).join('-');\n\n // If ID is empty or too short, use index\n if (id.length < 5) {\n id = `${config.idPrefix}-${context.tagName}-${context.elementIndex}`;\n }\n\n // Hash if configured\n if (config.hashIds) {\n const hash = simpleHash(id + context.filePath + context.elementIndex);\n id = `${config.idPrefix}-${hash}`;\n }\n\n return id;\n}\n\n/**\n * Counter for element indices per file\n */\nconst fileElementCounters = new Map<string, Map<string, number>>();\n\n/**\n * Get next element index for a file/tag combination\n */\nexport function getNextElementIndex(filePath: string, tagName: string): number {\n if (!fileElementCounters.has(filePath)) {\n fileElementCounters.set(filePath, new Map());\n }\n\n const fileCounters = fileElementCounters.get(filePath)!;\n const current = fileCounters.get(tagName) || 0;\n fileCounters.set(tagName, current + 1);\n\n return current;\n}\n\n/**\n * Reset counters for a file (call at start of file processing)\n */\nexport function resetFileCounters(filePath: string): void {\n fileElementCounters.delete(filePath);\n}\n","/**\n * Alias Generator\n *\n * Generates search aliases from element text, aria labels, and other attributes.\n */\n\nimport type { PluginConfig } from './config';\n\n/**\n * Context for generating aliases\n */\nexport interface AliasGeneratorContext {\n /** Element tag name */\n tagName: string;\n /** Text content */\n textContent: string | null;\n /** Aria label */\n ariaLabel: string | null;\n /** Placeholder text */\n placeholder: string | null;\n /** Title attribute */\n title: string | null;\n /** Name attribute */\n name: string | null;\n /** ID attribute */\n id: string | null;\n}\n\n/**\n * Common word synonyms for UI actions\n */\nconst SYNONYMS: Record<string, string[]> = {\n submit: ['send', 'go', 'confirm', 'done', 'ok', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit'],\n delete: ['remove', 'trash', 'erase', 'clear'],\n edit: ['modify', 'change', 'update'],\n add: ['create', 'new', 'plus', 'insert'],\n save: ['store', 'keep', 'preserve'],\n search: ['find', 'lookup', 'query'],\n login: ['signin', 'sign in', 'log in'],\n logout: ['signout', 'sign out', 'log out'],\n register: ['signup', 'sign up', 'join'],\n next: ['continue', 'forward', 'proceed'],\n previous: ['back', 'prev', 'prior'],\n start: ['begin', 'launch', 'run'],\n stop: ['end', 'halt', 'pause'],\n upload: ['attach', 'import'],\n download: ['export', 'get'],\n settings: ['preferences', 'options', 'config'],\n help: ['support', 'info', 'about'],\n home: ['main', 'dashboard'],\n profile: ['account', 'user'],\n};\n\n/**\n * Normalize text for alias matching\n */\nfunction normalizeText(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, ' ');\n}\n\n/**\n * Tokenize text into words\n */\nfunction tokenize(text: string): string[] {\n return normalizeText(text)\n .split(' ')\n .filter((word) => word.length > 1);\n}\n\n/**\n * Get synonyms for a word\n */\nfunction getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase();\n\n // Check if word is in synonyms\n if (SYNONYMS[normalized]) {\n return SYNONYMS[normalized];\n }\n\n // Check if word is a synonym of something\n for (const [key, values] of Object.entries(SYNONYMS)) {\n if (values.includes(normalized)) {\n return [key, ...values.filter((v) => v !== normalized)];\n }\n }\n\n return [];\n}\n\n/**\n * Generate n-grams from tokens\n */\nfunction generateNgrams(tokens: string[], n: number): string[] {\n const ngrams: string[] = [];\n\n for (let i = 0; i <= tokens.length - n; i++) {\n ngrams.push(tokens.slice(i, i + n).join(' '));\n }\n\n return ngrams;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n context: AliasGeneratorContext,\n config: Required<PluginConfig>\n): string[] {\n const aliases = new Set<string>();\n\n // Add text content\n if (context.textContent) {\n const normalized = normalizeText(context.textContent);\n if (normalized) {\n aliases.add(normalized);\n\n // Add individual tokens\n const tokens = tokenize(context.textContent);\n for (const token of tokens) {\n if (token.length >= 3) {\n aliases.add(token);\n }\n\n // Add synonyms\n for (const synonym of getSynonyms(token)) {\n aliases.add(synonym);\n }\n }\n\n // Add bi-grams\n if (tokens.length >= 2) {\n for (const ngram of generateNgrams(tokens, 2)) {\n aliases.add(ngram);\n }\n }\n }\n }\n\n // Add aria label\n if (context.ariaLabel) {\n const normalized = normalizeText(context.ariaLabel);\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add placeholder\n if (context.placeholder) {\n const normalized = normalizeText(context.placeholder);\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add title\n if (context.title) {\n const normalized = normalizeText(context.title);\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add name attribute (often semantic)\n if (context.name) {\n const normalized = normalizeText(context.name).replace(/-/g, ' ');\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add element type\n const typeAlias = getElementTypeAlias(context.tagName);\n if (typeAlias) {\n aliases.add(typeAlias);\n }\n\n // Convert to array and limit\n const result = Array.from(aliases)\n .filter((alias) => alias.length >= 2 && alias.length <= 50)\n .slice(0, config.maxAliases);\n\n return result;\n}\n\n/**\n * Get type alias for element\n */\nfunction getElementTypeAlias(tagName: string): string | null {\n const tag = tagName.toLowerCase();\n\n const typeAliases: Record<string, string> = {\n button: 'button',\n input: 'input',\n select: 'dropdown',\n textarea: 'text area',\n a: 'link',\n form: 'form',\n nav: 'navigation',\n img: 'image',\n };\n\n return typeAliases[tag] || null;\n}\n\n/**\n * Format aliases for attribute value\n */\nexport function formatAliasesAttribute(aliases: string[]): string {\n return aliases.join(',');\n}\n\n/**\n * Determine if aliases should be generated for this element\n */\nexport function shouldGenerateAliases(\n context: AliasGeneratorContext,\n config: Required<PluginConfig>\n): boolean {\n if (!config.generateAliases) {\n return false;\n }\n\n // Need at least some content to generate aliases\n return !!(\n context.textContent ||\n context.ariaLabel ||\n context.placeholder ||\n context.title ||\n context.name\n );\n}\n","/**\n * UI Bridge Babel Plugin\n *\n * Automatically instruments React components with UI Bridge IDs and aliases.\n *\n * @example\n * ```js\n * // babel.config.js\n * module.exports = {\n * plugins: [\n * ['@qontinui/ui-bridge/babel-plugin', {\n * elements: ['button', 'input', 'a'],\n * idPrefix: 'ui',\n * }]\n * ]\n * };\n * ```\n *\n * @example\n * ```jsx\n * // Input\n * <button onClick={handleSubmit}>Submit</button>\n *\n * // Output\n * <button\n * onClick={handleSubmit}\n * data-ui-id=\"ui-component-submit-button\"\n * data-ui-aliases=\"submit,send,go,confirm\"\n * data-ui-type=\"button\"\n * >\n * Submit\n * </button>\n * ```\n */\n\nimport { declare } from '@babel/helper-plugin-utils';\nimport type { PluginObj, NodePath, BabelFile } from '@babel/core';\nimport type * as t from '@babel/types';\nimport {\n type PluginConfig,\n mergeConfig,\n shouldProcessFile,\n} from './config';\nimport {\n generateId,\n getNextElementIndex,\n resetFileCounters,\n getSemanticType,\n type IdGeneratorContext,\n} from './id-generator';\nimport {\n generateAliases,\n formatAliasesAttribute,\n shouldGenerateAliases,\n type AliasGeneratorContext,\n} from './alias-generator';\n\nexport type { PluginConfig } from './config';\n\n/**\n * State tracked during file transformation\n */\ninterface PluginState {\n filename: string;\n config: Required<PluginConfig>;\n componentStack: string[];\n processed: Set<string>;\n}\n\n/**\n * Extract text content from JSX children\n */\nfunction extractTextContent(\n children: (t.JSXElement | t.JSXText | t.JSXExpressionContainer | t.JSXSpreadChild | t.JSXFragment)[],\n types: typeof t\n): string | null {\n const textParts: string[] = [];\n\n for (const child of children) {\n if (types.isJSXText(child)) {\n const text = child.value.trim();\n if (text) {\n textParts.push(text);\n }\n }\n }\n\n return textParts.length > 0 ? textParts.join(' ') : null;\n}\n\n/**\n * Get attribute value from JSX element\n */\nfunction getAttributeValue(\n element: t.JSXOpeningElement,\n attrName: string,\n types: typeof t\n): string | null {\n for (const attr of element.attributes) {\n if (types.isJSXAttribute(attr) && types.isJSXIdentifier(attr.name)) {\n if (attr.name.name === attrName) {\n if (types.isStringLiteral(attr.value)) {\n return attr.value.value;\n }\n if (types.isJSXExpressionContainer(attr.value)) {\n if (types.isStringLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n }\n }\n }\n }\n return null;\n}\n\n/**\n * Check if element has a specific attribute\n */\nfunction hasAttribute(\n element: t.JSXOpeningElement,\n attrName: string,\n types: typeof t\n): boolean {\n return element.attributes.some(\n (attr) =>\n types.isJSXAttribute(attr) &&\n types.isJSXIdentifier(attr.name) &&\n attr.name.name === attrName\n );\n}\n\n/**\n * Add attribute to JSX element\n */\nfunction addAttribute(\n element: t.JSXOpeningElement,\n name: string,\n value: string,\n types: typeof t\n): void {\n element.attributes.push(\n types.jsxAttribute(\n types.jsxIdentifier(name),\n types.stringLiteral(value)\n )\n );\n}\n\n/**\n * Get tag name from JSX element\n */\nfunction getTagName(element: t.JSXOpeningElement, types: typeof t): string | null {\n if (types.isJSXIdentifier(element.name)) {\n return element.name.name;\n }\n if (types.isJSXMemberExpression(element.name)) {\n // Handle Component.SubComponent\n return null; // Skip member expressions\n }\n return null;\n}\n\n/**\n * Check if tag is a lowercase HTML element (not a React component)\n */\nfunction isHtmlElement(tagName: string): boolean {\n return tagName[0] === tagName[0].toLowerCase();\n}\n\n/**\n * Find parent component name\n */\nfunction findComponentName(path: NodePath<t.JSXElement>): string | null {\n let current: NodePath<t.Node> | null = path as NodePath<t.Node>;\n\n while (current) {\n const parent: NodePath<t.Node> | null = current.parentPath;\n\n if (!parent) break;\n\n // Check for function declaration\n if (parent.isFunctionDeclaration()) {\n const name = (parent.node as t.FunctionDeclaration).id?.name;\n if (name && name[0] === name[0].toUpperCase()) {\n return name;\n }\n }\n\n // Check for variable declarator with arrow function\n if (parent.isArrowFunctionExpression() || parent.isFunctionExpression()) {\n const varDeclarator = parent.parentPath;\n if (varDeclarator?.isVariableDeclarator()) {\n const id = (varDeclarator.node as t.VariableDeclarator).id;\n if (id && id.type === 'Identifier') {\n const name = id.name;\n if (name[0] === name[0].toUpperCase()) {\n return name;\n }\n }\n }\n }\n\n // Check for class method (render)\n if (parent.isClassMethod()) {\n const classDecl = parent.parentPath?.parentPath;\n if (classDecl?.isClassDeclaration()) {\n const name = (classDecl.node as t.ClassDeclaration).id?.name;\n if (name) {\n return name;\n }\n }\n }\n\n current = parent;\n }\n\n return null;\n}\n\n/**\n * Babel API interface\n */\ninterface BabelAPI {\n assertVersion(version: number): void;\n types: typeof t;\n}\n\n/**\n * The Babel plugin\n */\nconst uiBridgeBabelPlugin = declare<PluginConfig, PluginObj<PluginState>>(\n (api: BabelAPI, options: PluginConfig) => {\n api.assertVersion(7);\n\n const types = api.types;\n const config = mergeConfig(options);\n\n return {\n name: 'ui-bridge-babel-plugin',\n\n pre(this: PluginState, file: BabelFile) {\n const filename = file.opts.filename || 'unknown';\n this.filename = filename;\n this.config = config;\n this.componentStack = [];\n this.processed = new Set();\n\n // Reset element counters for this file\n resetFileCounters(filename);\n\n if (config.verbose) {\n console.log(`[ui-bridge-babel-plugin] Processing: ${filename}`);\n }\n },\n\n visitor: {\n JSXElement(this: PluginState, path: NodePath<t.JSXElement>) {\n const state = this;\n\n // Check if file should be processed\n if (!shouldProcessFile(state.filename, state.config)) {\n return;\n }\n\n const openingElement = path.node.openingElement;\n const tagName = getTagName(openingElement, types);\n\n // Skip if no tag name or not an HTML element\n if (!tagName || !isHtmlElement(tagName)) {\n return;\n }\n\n // Check if this element type should be instrumented\n if (!state.config.elements.includes(tagName as any)) {\n return;\n }\n\n // Skip if already has ui-id (unless configured otherwise)\n if (\n state.config.skipExisting &&\n hasAttribute(openingElement, state.config.idAttribute, types)\n ) {\n return;\n }\n\n // Find component name\n const componentName = findComponentName(path);\n\n // Check component filters\n if (state.config.onlyInComponents.length > 0) {\n if (!componentName || !state.config.onlyInComponents.includes(componentName)) {\n return;\n }\n }\n\n if (state.config.skipInComponents.length > 0) {\n if (componentName && state.config.skipInComponents.includes(componentName)) {\n return;\n }\n }\n\n // Extract element info\n const textContent = extractTextContent(\n path.node.children as any[],\n types\n );\n const ariaLabel = getAttributeValue(openingElement, 'aria-label', types);\n const placeholder = getAttributeValue(openingElement, 'placeholder', types);\n const title = getAttributeValue(openingElement, 'title', types);\n const name = getAttributeValue(openingElement, 'name', types);\n const existingId = getAttributeValue(openingElement, 'id', types);\n\n // Get element index for uniqueness\n const elementIndex = getNextElementIndex(state.filename, tagName);\n\n // Build context for ID generation\n const idContext: IdGeneratorContext = {\n componentName,\n filePath: state.filename,\n tagName,\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementIndex,\n existingId,\n };\n\n // Generate ID\n const generatedId = generateId(idContext, state.config);\n\n // Skip if this exact ID was already generated (collision)\n if (state.processed.has(generatedId)) {\n // Add index suffix for uniqueness\n const uniqueId = `${generatedId}-${elementIndex}`;\n addAttribute(openingElement, state.config.idAttribute, uniqueId, types);\n } else {\n state.processed.add(generatedId);\n addAttribute(openingElement, state.config.idAttribute, generatedId, types);\n }\n\n // Add element type\n const semanticType = getSemanticType(tagName, idContext);\n addAttribute(openingElement, state.config.typeAttribute, semanticType, types);\n\n // Generate and add aliases\n const aliasContext: AliasGeneratorContext = {\n tagName,\n textContent,\n ariaLabel,\n placeholder,\n title,\n name,\n id: existingId,\n };\n\n if (shouldGenerateAliases(aliasContext, state.config)) {\n const aliases = generateAliases(aliasContext, state.config);\n if (aliases.length > 0) {\n addAttribute(\n openingElement,\n state.config.aliasesAttribute,\n formatAliasesAttribute(aliases),\n types\n );\n }\n }\n\n if (state.config.verbose) {\n console.log(\n `[ui-bridge-babel-plugin] Instrumented <${tagName}> as \"${generatedId}\"`\n );\n }\n },\n },\n\n post(this: PluginState) {\n if (this.config.verbose) {\n console.log(\n `[ui-bridge-babel-plugin] Finished processing: ${this.filename}`\n );\n }\n },\n };\n }\n);\n\nexport default uiBridgeBabelPlugin;\n\n// Named export for ESM compatibility\nexport { uiBridgeBabelPlugin };\n\n// Re-export utilities for advanced usage\nexport { mergeConfig, shouldProcessFile, DEFAULT_CONFIG } from './config';\nexport {\n generateId,\n getSemanticType,\n extractComponentFromPath,\n resetFileCounters,\n getNextElementIndex,\n type IdGeneratorContext,\n} from './id-generator';\nexport {\n generateAliases,\n formatAliasesAttribute,\n shouldGenerateAliases,\n type AliasGeneratorContext,\n} from './alias-generator';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/babel-plugin/config.ts","../../src/babel-plugin/id-generator.ts","../../src/babel-plugin/alias-generator.ts","../../src/babel-plugin/index.ts"],"names":["declare"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Plugin Configuration\n *\n * Configuration options for the UI Bridge Babel plugin.\n */\n\n/**\n * Elements to instrument\n */\nexport type InstrumentableElement =\n | 'button'\n | 'input'\n | 'select'\n | 'textarea'\n | 'a'\n | 'form'\n | 'label'\n | 'img'\n | 'video'\n | 'audio'\n | 'dialog'\n | 'details'\n | 'summary'\n | 'nav'\n | 'header'\n | 'footer'\n | 'main'\n | 'aside'\n | 'section'\n | 'article';\n\n/**\n * Plugin configuration options\n */\nexport interface PluginConfig {\n /**\n * Include specific file patterns (glob)\n * @default ['**\\/*.tsx', '**\\/*.jsx']\n */\n include?: string[];\n\n /**\n * Exclude specific file patterns (glob)\n * @default ['**\\/node_modules/**', '**\\/*.test.*', '**\\/*.spec.*']\n */\n exclude?: string[];\n\n /**\n * Elements to automatically instrument\n * @default ['button', 'input', 'select', 'textarea', 'a', 'form']\n */\n elements?: InstrumentableElement[];\n\n /**\n * Prefix for generated IDs\n * @default 'ui'\n */\n idPrefix?: string;\n\n /**\n * Attribute name for the generated ID\n * @default 'data-ui-id'\n */\n idAttribute?: string;\n\n /**\n * Attribute name for aliases\n * @default 'data-ui-aliases'\n */\n aliasesAttribute?: string;\n\n /**\n * Attribute name for element type\n * @default 'data-ui-type'\n */\n typeAttribute?: string;\n\n /**\n * Generate aliases from text content\n * @default true\n */\n generateAliases?: boolean;\n\n /**\n * Include component name in generated ID\n * @default true\n */\n includeComponentName?: boolean;\n\n /**\n * Include file path in generated ID\n * @default false\n */\n includeFilePath?: boolean;\n\n /**\n * Hash the generated ID for shorter strings\n * @default false\n */\n hashIds?: boolean;\n\n /**\n * Maximum alias count per element\n * @default 5\n */\n maxAliases?: number;\n\n /**\n * Skip elements that already have data-ui-id\n * @default true\n */\n skipExisting?: boolean;\n\n /**\n * Only instrument elements inside components with specific names\n * @default []\n */\n onlyInComponents?: string[];\n\n /**\n * Skip instrumentation for elements inside these components\n * @default []\n */\n skipInComponents?: string[];\n\n /**\n * Enable verbose logging during build\n * @default false\n */\n verbose?: boolean;\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CONFIG: Required<PluginConfig> = {\n include: ['**/*.tsx', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/*.test.*', '**/*.spec.*', '**/*.stories.*'],\n elements: ['button', 'input', 'select', 'textarea', 'a', 'form'],\n idPrefix: 'ui',\n idAttribute: 'data-ui-id',\n aliasesAttribute: 'data-ui-aliases',\n typeAttribute: 'data-ui-type',\n generateAliases: true,\n includeComponentName: true,\n includeFilePath: false,\n hashIds: false,\n maxAliases: 5,\n skipExisting: true,\n onlyInComponents: [],\n skipInComponents: [],\n verbose: false,\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(userConfig: PluginConfig = {}): Required<PluginConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...userConfig,\n // Ensure arrays are properly merged\n include: userConfig.include ?? DEFAULT_CONFIG.include,\n exclude: userConfig.exclude ?? DEFAULT_CONFIG.exclude,\n elements: userConfig.elements ?? DEFAULT_CONFIG.elements,\n onlyInComponents: userConfig.onlyInComponents ?? DEFAULT_CONFIG.onlyInComponents,\n skipInComponents: userConfig.skipInComponents ?? DEFAULT_CONFIG.skipInComponents,\n };\n}\n\n/**\n * Check if a file should be processed based on include/exclude patterns\n */\nexport function shouldProcessFile(filename: string, config: Required<PluginConfig>): boolean {\n // Simple pattern matching (for full glob support, use micromatch)\n const matchPattern = (pattern: string, path: string): boolean => {\n // Simple extension-based matching for common patterns\n // **/*.tsx -> match any .tsx file\n // **/*.test.* -> match any file with .test. in name\n\n // Handle **/*.ext pattern (match files with extension anywhere)\n if (pattern.startsWith('**/')) {\n const restOfPattern = pattern.slice(3); // Remove **/\n\n // Handle **/dir/** patterns\n if (restOfPattern.includes('/**')) {\n const dir = restOfPattern.replace('/**', '');\n return path.includes('/' + dir + '/') || path.startsWith(dir + '/');\n }\n\n // Handle **/*.test.* or **/*.spec.* (files with .test. or .spec. in name)\n // Must check this BEFORE the simple extension check\n if (\n restOfPattern.startsWith('*.') &&\n restOfPattern.endsWith('.*') &&\n restOfPattern.length > 3\n ) {\n const middle = restOfPattern.slice(2, -2); // Get middle part like \"test\" or \"spec\"\n const fileName = path.includes('/') ? path.split('/').pop() || path : path;\n return fileName.includes('.' + middle + '.');\n }\n\n // Handle **/*.ext (any file with simple extension like .tsx, .jsx)\n if (restOfPattern.startsWith('*.') && !restOfPattern.slice(2).includes('*')) {\n const ext = restOfPattern.slice(1); // Get .ext part\n return path.endsWith(ext);\n }\n }\n\n // Fallback: exact match\n return path === pattern;\n };\n\n // Normalize path\n const normalizedPath = filename.replace(/\\\\/g, '/');\n\n // Check exclude patterns first\n for (const pattern of config.exclude) {\n if (matchPattern(pattern, normalizedPath)) {\n return false;\n }\n }\n\n // Check include patterns\n for (const pattern of config.include) {\n if (matchPattern(pattern, normalizedPath)) {\n return true;\n }\n }\n\n return false;\n}\n","/**\n * ID Generator\n *\n * Generates stable, unique IDs for UI elements based on component path,\n * element type, and content.\n */\n\nimport type { PluginConfig } from './config';\n\n/**\n * Context for generating element IDs\n */\nexport interface IdGeneratorContext {\n /** Component name */\n componentName: string | null;\n /** File path */\n filePath: string;\n /** Element tag name */\n tagName: string;\n /** Element text content */\n textContent: string | null;\n /** Aria label */\n ariaLabel: string | null;\n /** Placeholder text */\n placeholder: string | null;\n /** Title attribute */\n title: string | null;\n /** Element index in component (for uniqueness) */\n elementIndex: number;\n /** Existing id attribute */\n existingId: string | null;\n}\n\n/**\n * Simple hash function for ID generation\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n // Convert to positive hex string\n return Math.abs(hash).toString(16).substring(0, 8);\n}\n\n/**\n * Normalize text for use in ID\n */\nfunction normalizeForId(text: string): string {\n return (\n text\n .toLowerCase()\n .trim()\n // Replace non-alphanumeric with dash\n .replace(/[^a-z0-9]+/g, '-')\n // Remove leading/trailing dashes\n .replace(/^-+|-+$/g, '')\n // Collapse multiple dashes\n .replace(/-+/g, '-')\n // Limit length\n .substring(0, 30)\n );\n}\n\n/**\n * Extract component name from file path\n */\nexport function extractComponentFromPath(filePath: string): string | null {\n // Normalize path separators\n const normalized = filePath.replace(/\\\\/g, '/');\n\n // Get filename without extension\n const match = normalized.match(/\\/([^/]+)\\.(tsx?|jsx?)$/);\n if (!match) return null;\n\n const filename = match[1];\n\n // Skip index files\n if (filename === 'index') {\n // Try to get parent folder name\n const parentMatch = normalized.match(/\\/([^/]+)\\/index\\.(tsx?|jsx?)$/);\n if (parentMatch) {\n return normalizeForId(parentMatch[1]);\n }\n }\n\n return normalizeForId(filename);\n}\n\n/**\n * Get semantic type for element\n */\nexport function getSemanticType(tagName: string, context: IdGeneratorContext): string {\n const tag = tagName.toLowerCase();\n\n // Check for specific input types\n if (tag === 'input') {\n // Would need to check type attribute, for now just return 'input'\n return 'input';\n }\n\n // Check for specific button purposes\n if (tag === 'button') {\n const text = context.textContent?.toLowerCase() || '';\n if (text.includes('submit') || text.includes('save')) return 'submit-button';\n if (text.includes('cancel') || text.includes('close')) return 'cancel-button';\n if (text.includes('delete') || text.includes('remove')) return 'delete-button';\n return 'button';\n }\n\n // Map tags to semantic types\n const typeMap: Record<string, string> = {\n a: 'link',\n select: 'dropdown',\n textarea: 'textarea',\n form: 'form',\n nav: 'navigation',\n header: 'header',\n footer: 'footer',\n main: 'main',\n aside: 'sidebar',\n dialog: 'dialog',\n img: 'image',\n };\n\n return typeMap[tag] || tag;\n}\n\n/**\n * Generate a unique ID for an element\n */\nexport function generateId(context: IdGeneratorContext, config: Required<PluginConfig>): string {\n const parts: string[] = [];\n\n // Add prefix\n if (config.idPrefix) {\n parts.push(config.idPrefix);\n }\n\n // Add file path component\n if (config.includeFilePath) {\n const fileComponent = extractComponentFromPath(context.filePath);\n if (fileComponent) {\n parts.push(fileComponent);\n }\n }\n\n // Add component name\n if (config.includeComponentName && context.componentName) {\n parts.push(normalizeForId(context.componentName));\n }\n\n // Add descriptive part from text/aria/placeholder\n const descriptiveText =\n context.textContent ||\n context.ariaLabel ||\n context.placeholder ||\n context.title ||\n context.existingId;\n\n if (descriptiveText) {\n parts.push(normalizeForId(descriptiveText));\n }\n\n // Add semantic type\n const semanticType = getSemanticType(context.tagName, context);\n parts.push(semanticType);\n\n // Generate base ID\n let id = parts.filter(Boolean).join('-');\n\n // If ID is empty or too short, use index\n if (id.length < 5) {\n id = `${config.idPrefix}-${context.tagName}-${context.elementIndex}`;\n }\n\n // Hash if configured\n if (config.hashIds) {\n const hash = simpleHash(id + context.filePath + context.elementIndex);\n id = `${config.idPrefix}-${hash}`;\n }\n\n return id;\n}\n\n/**\n * Counter for element indices per file\n */\nconst fileElementCounters = new Map<string, Map<string, number>>();\n\n/**\n * Get next element index for a file/tag combination\n */\nexport function getNextElementIndex(filePath: string, tagName: string): number {\n if (!fileElementCounters.has(filePath)) {\n fileElementCounters.set(filePath, new Map());\n }\n\n const fileCounters = fileElementCounters.get(filePath)!;\n const current = fileCounters.get(tagName) || 0;\n fileCounters.set(tagName, current + 1);\n\n return current;\n}\n\n/**\n * Reset counters for a file (call at start of file processing)\n */\nexport function resetFileCounters(filePath: string): void {\n fileElementCounters.delete(filePath);\n}\n","/**\n * Alias Generator\n *\n * Generates search aliases from element text, aria labels, and other attributes.\n */\n\nimport type { PluginConfig } from './config';\n\n/**\n * Context for generating aliases\n */\nexport interface AliasGeneratorContext {\n /** Element tag name */\n tagName: string;\n /** Text content */\n textContent: string | null;\n /** Aria label */\n ariaLabel: string | null;\n /** Placeholder text */\n placeholder: string | null;\n /** Title attribute */\n title: string | null;\n /** Name attribute */\n name: string | null;\n /** ID attribute */\n id: string | null;\n}\n\n/**\n * Common word synonyms for UI actions\n */\nconst SYNONYMS: Record<string, string[]> = {\n submit: ['send', 'go', 'confirm', 'done', 'ok', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit'],\n delete: ['remove', 'trash', 'erase', 'clear'],\n edit: ['modify', 'change', 'update'],\n add: ['create', 'new', 'plus', 'insert'],\n save: ['store', 'keep', 'preserve'],\n search: ['find', 'lookup', 'query'],\n login: ['signin', 'sign in', 'log in'],\n logout: ['signout', 'sign out', 'log out'],\n register: ['signup', 'sign up', 'join'],\n next: ['continue', 'forward', 'proceed'],\n previous: ['back', 'prev', 'prior'],\n start: ['begin', 'launch', 'run'],\n stop: ['end', 'halt', 'pause'],\n upload: ['attach', 'import'],\n download: ['export', 'get'],\n settings: ['preferences', 'options', 'config'],\n help: ['support', 'info', 'about'],\n home: ['main', 'dashboard'],\n profile: ['account', 'user'],\n};\n\n/**\n * Normalize text for alias matching\n */\nfunction normalizeText(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, ' ');\n}\n\n/**\n * Tokenize text into words\n */\nfunction tokenize(text: string): string[] {\n return normalizeText(text)\n .split(' ')\n .filter((word) => word.length > 1);\n}\n\n/**\n * Get synonyms for a word\n */\nfunction getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase();\n\n // Check if word is in synonyms\n if (SYNONYMS[normalized]) {\n return SYNONYMS[normalized];\n }\n\n // Check if word is a synonym of something\n for (const [key, values] of Object.entries(SYNONYMS)) {\n if (values.includes(normalized)) {\n return [key, ...values.filter((v) => v !== normalized)];\n }\n }\n\n return [];\n}\n\n/**\n * Generate n-grams from tokens\n */\nfunction generateNgrams(tokens: string[], n: number): string[] {\n const ngrams: string[] = [];\n\n for (let i = 0; i <= tokens.length - n; i++) {\n ngrams.push(tokens.slice(i, i + n).join(' '));\n }\n\n return ngrams;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n context: AliasGeneratorContext,\n config: Required<PluginConfig>\n): string[] {\n const aliases = new Set<string>();\n\n // Add text content\n if (context.textContent) {\n const normalized = normalizeText(context.textContent);\n if (normalized) {\n aliases.add(normalized);\n\n // Add individual tokens\n const tokens = tokenize(context.textContent);\n for (const token of tokens) {\n if (token.length >= 3) {\n aliases.add(token);\n }\n\n // Add synonyms\n for (const synonym of getSynonyms(token)) {\n aliases.add(synonym);\n }\n }\n\n // Add bi-grams\n if (tokens.length >= 2) {\n for (const ngram of generateNgrams(tokens, 2)) {\n aliases.add(ngram);\n }\n }\n }\n }\n\n // Add aria label\n if (context.ariaLabel) {\n const normalized = normalizeText(context.ariaLabel);\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add placeholder\n if (context.placeholder) {\n const normalized = normalizeText(context.placeholder);\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add title\n if (context.title) {\n const normalized = normalizeText(context.title);\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add name attribute (often semantic)\n if (context.name) {\n const normalized = normalizeText(context.name).replace(/-/g, ' ');\n if (normalized) {\n aliases.add(normalized);\n }\n }\n\n // Add element type\n const typeAlias = getElementTypeAlias(context.tagName);\n if (typeAlias) {\n aliases.add(typeAlias);\n }\n\n // Convert to array and limit\n const result = Array.from(aliases)\n .filter((alias) => alias.length >= 2 && alias.length <= 50)\n .slice(0, config.maxAliases);\n\n return result;\n}\n\n/**\n * Get type alias for element\n */\nfunction getElementTypeAlias(tagName: string): string | null {\n const tag = tagName.toLowerCase();\n\n const typeAliases: Record<string, string> = {\n button: 'button',\n input: 'input',\n select: 'dropdown',\n textarea: 'text area',\n a: 'link',\n form: 'form',\n nav: 'navigation',\n img: 'image',\n };\n\n return typeAliases[tag] || null;\n}\n\n/**\n * Format aliases for attribute value\n */\nexport function formatAliasesAttribute(aliases: string[]): string {\n return aliases.join(',');\n}\n\n/**\n * Determine if aliases should be generated for this element\n */\nexport function shouldGenerateAliases(\n context: AliasGeneratorContext,\n config: Required<PluginConfig>\n): boolean {\n if (!config.generateAliases) {\n return false;\n }\n\n // Need at least some content to generate aliases\n return !!(\n context.textContent ||\n context.ariaLabel ||\n context.placeholder ||\n context.title ||\n context.name\n );\n}\n","/**\n * UI Bridge Babel Plugin\n *\n * Automatically instruments React components with UI Bridge IDs and aliases.\n *\n * @example\n * ```js\n * // babel.config.js\n * module.exports = {\n * plugins: [\n * ['@qontinui/ui-bridge/babel-plugin', {\n * elements: ['button', 'input', 'a'],\n * idPrefix: 'ui',\n * }]\n * ]\n * };\n * ```\n *\n * @example\n * ```jsx\n * // Input\n * <button onClick={handleSubmit}>Submit</button>\n *\n * // Output\n * <button\n * onClick={handleSubmit}\n * data-ui-id=\"ui-component-submit-button\"\n * data-ui-aliases=\"submit,send,go,confirm\"\n * data-ui-type=\"button\"\n * >\n * Submit\n * </button>\n * ```\n */\n\nimport { declare } from '@babel/helper-plugin-utils';\nimport type { PluginObj, NodePath, BabelFile } from '@babel/core';\nimport type * as t from '@babel/types';\nimport { type PluginConfig, mergeConfig, shouldProcessFile } from './config';\nimport {\n generateId,\n getNextElementIndex,\n resetFileCounters,\n getSemanticType,\n type IdGeneratorContext,\n} from './id-generator';\nimport {\n generateAliases,\n formatAliasesAttribute,\n shouldGenerateAliases,\n type AliasGeneratorContext,\n} from './alias-generator';\n\nexport type { PluginConfig } from './config';\n\n/**\n * State tracked during file transformation\n */\ninterface PluginState {\n filename: string;\n config: Required<PluginConfig>;\n componentStack: string[];\n processed: Set<string>;\n}\n\n/**\n * Extract text content from JSX children\n */\nfunction extractTextContent(\n children: (\n | t.JSXElement\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXFragment\n )[],\n types: typeof t\n): string | null {\n const textParts: string[] = [];\n\n for (const child of children) {\n if (types.isJSXText(child)) {\n const text = child.value.trim();\n if (text) {\n textParts.push(text);\n }\n }\n }\n\n return textParts.length > 0 ? textParts.join(' ') : null;\n}\n\n/**\n * Get attribute value from JSX element\n */\nfunction getAttributeValue(\n element: t.JSXOpeningElement,\n attrName: string,\n types: typeof t\n): string | null {\n for (const attr of element.attributes) {\n if (types.isJSXAttribute(attr) && types.isJSXIdentifier(attr.name)) {\n if (attr.name.name === attrName) {\n if (types.isStringLiteral(attr.value)) {\n return attr.value.value;\n }\n if (types.isJSXExpressionContainer(attr.value)) {\n if (types.isStringLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n }\n }\n }\n }\n return null;\n}\n\n/**\n * Check if element has a specific attribute\n */\nfunction hasAttribute(element: t.JSXOpeningElement, attrName: string, types: typeof t): boolean {\n return element.attributes.some(\n (attr) =>\n types.isJSXAttribute(attr) && types.isJSXIdentifier(attr.name) && attr.name.name === attrName\n );\n}\n\n/**\n * Add attribute to JSX element\n */\nfunction addAttribute(\n element: t.JSXOpeningElement,\n name: string,\n value: string,\n types: typeof t\n): void {\n element.attributes.push(\n types.jsxAttribute(types.jsxIdentifier(name), types.stringLiteral(value))\n );\n}\n\n/**\n * Get tag name from JSX element\n */\nfunction getTagName(element: t.JSXOpeningElement, types: typeof t): string | null {\n if (types.isJSXIdentifier(element.name)) {\n return element.name.name;\n }\n if (types.isJSXMemberExpression(element.name)) {\n // Handle Component.SubComponent\n return null; // Skip member expressions\n }\n return null;\n}\n\n/**\n * Check if tag is a lowercase HTML element (not a React component)\n */\nfunction isHtmlElement(tagName: string): boolean {\n return tagName[0] === tagName[0].toLowerCase();\n}\n\n/**\n * Find parent component name\n */\nfunction findComponentName(path: NodePath<t.JSXElement>): string | null {\n let current: NodePath<t.Node> | null = path as NodePath<t.Node>;\n\n while (current) {\n const parent: NodePath<t.Node> | null = current.parentPath;\n\n if (!parent) break;\n\n // Check for function declaration\n if (parent.isFunctionDeclaration()) {\n const name = (parent.node as t.FunctionDeclaration).id?.name;\n if (name && name[0] === name[0].toUpperCase()) {\n return name;\n }\n }\n\n // Check for variable declarator with arrow function\n if (parent.isArrowFunctionExpression() || parent.isFunctionExpression()) {\n const varDeclarator = parent.parentPath;\n if (varDeclarator?.isVariableDeclarator()) {\n const id = (varDeclarator.node as t.VariableDeclarator).id;\n if (id && id.type === 'Identifier') {\n const name = id.name;\n if (name[0] === name[0].toUpperCase()) {\n return name;\n }\n }\n }\n }\n\n // Check for class method (render)\n if (parent.isClassMethod()) {\n const classDecl = parent.parentPath?.parentPath;\n if (classDecl?.isClassDeclaration()) {\n const name = (classDecl.node as t.ClassDeclaration).id?.name;\n if (name) {\n return name;\n }\n }\n }\n\n current = parent;\n }\n\n return null;\n}\n\n/**\n * Babel API interface\n */\ninterface BabelAPI {\n assertVersion(version: number): void;\n types: typeof t;\n}\n\n/**\n * The Babel plugin\n */\nconst uiBridgeBabelPlugin = declare<PluginConfig, PluginObj<PluginState>>(\n (api: BabelAPI, options: PluginConfig) => {\n api.assertVersion(7);\n\n const types = api.types;\n const config = mergeConfig(options);\n\n return {\n name: 'ui-bridge-babel-plugin',\n\n pre(this: PluginState, file: BabelFile) {\n const filename = file.opts.filename || 'unknown';\n this.filename = filename;\n this.config = config;\n this.componentStack = [];\n this.processed = new Set();\n\n // Reset element counters for this file\n resetFileCounters(filename);\n\n if (config.verbose) {\n console.log(`[ui-bridge-babel-plugin] Processing: ${filename}`);\n }\n },\n\n visitor: {\n JSXElement(this: PluginState, path: NodePath<t.JSXElement>) {\n // Check if file should be processed\n if (!shouldProcessFile(this.filename, this.config)) {\n return;\n }\n\n const openingElement = path.node.openingElement;\n const tagName = getTagName(openingElement, types);\n\n // Skip if no tag name or not an HTML element\n if (!tagName || !isHtmlElement(tagName)) {\n return;\n }\n\n // Check if this element type should be instrumented\n if (!this.config.elements.includes(tagName as any)) {\n return;\n }\n\n // Skip if already has ui-id (unless configured otherwise)\n if (\n this.config.skipExisting &&\n hasAttribute(openingElement, this.config.idAttribute, types)\n ) {\n return;\n }\n\n // Find component name\n const componentName = findComponentName(path);\n\n // Check component filters\n if (this.config.onlyInComponents.length > 0) {\n if (!componentName || !this.config.onlyInComponents.includes(componentName)) {\n return;\n }\n }\n\n if (this.config.skipInComponents.length > 0) {\n if (componentName && this.config.skipInComponents.includes(componentName)) {\n return;\n }\n }\n\n // Extract element info\n const textContent = extractTextContent(path.node.children as any[], types);\n const ariaLabel = getAttributeValue(openingElement, 'aria-label', types);\n const placeholder = getAttributeValue(openingElement, 'placeholder', types);\n const title = getAttributeValue(openingElement, 'title', types);\n const name = getAttributeValue(openingElement, 'name', types);\n const existingId = getAttributeValue(openingElement, 'id', types);\n\n // Get element index for uniqueness\n const elementIndex = getNextElementIndex(this.filename, tagName);\n\n // Build context for ID generation\n const idContext: IdGeneratorContext = {\n componentName,\n filePath: this.filename,\n tagName,\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementIndex,\n existingId,\n };\n\n // Generate ID\n const generatedId = generateId(idContext, this.config);\n\n // Skip if this exact ID was already generated (collision)\n if (this.processed.has(generatedId)) {\n // Add index suffix for uniqueness\n const uniqueId = `${generatedId}-${elementIndex}`;\n addAttribute(openingElement, this.config.idAttribute, uniqueId, types);\n } else {\n this.processed.add(generatedId);\n addAttribute(openingElement, this.config.idAttribute, generatedId, types);\n }\n\n // Add element type\n const semanticType = getSemanticType(tagName, idContext);\n addAttribute(openingElement, this.config.typeAttribute, semanticType, types);\n\n // Generate and add aliases\n const aliasContext: AliasGeneratorContext = {\n tagName,\n textContent,\n ariaLabel,\n placeholder,\n title,\n name,\n id: existingId,\n };\n\n if (shouldGenerateAliases(aliasContext, this.config)) {\n const aliases = generateAliases(aliasContext, this.config);\n if (aliases.length > 0) {\n addAttribute(\n openingElement,\n this.config.aliasesAttribute,\n formatAliasesAttribute(aliases),\n types\n );\n }\n }\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-babel-plugin] Instrumented <${tagName}> as \"${generatedId}\"`);\n }\n },\n },\n\n post(this: PluginState) {\n if (this.config.verbose) {\n console.log(`[ui-bridge-babel-plugin] Finished processing: ${this.filename}`);\n }\n },\n };\n }\n);\n\nexport default uiBridgeBabelPlugin;\n\n// Named export for ESM compatibility\nexport { uiBridgeBabelPlugin };\n\n// Re-export utilities for advanced usage\nexport { mergeConfig, shouldProcessFile, DEFAULT_CONFIG } from './config';\nexport {\n generateId,\n getSemanticType,\n extractComponentFromPath,\n resetFileCounters,\n getNextElementIndex,\n type IdGeneratorContext,\n} from './id-generator';\nexport {\n generateAliases,\n formatAliasesAttribute,\n shouldGenerateAliases,\n type AliasGeneratorContext,\n} from './alias-generator';\n"]}
|
|
@@ -326,10 +326,7 @@ function hasAttribute(element, attrName, types) {
|
|
|
326
326
|
}
|
|
327
327
|
function addAttribute(element, name, value, types) {
|
|
328
328
|
element.attributes.push(
|
|
329
|
-
types.jsxAttribute(
|
|
330
|
-
types.jsxIdentifier(name),
|
|
331
|
-
types.stringLiteral(value)
|
|
332
|
-
)
|
|
329
|
+
types.jsxAttribute(types.jsxIdentifier(name), types.stringLiteral(value))
|
|
333
330
|
);
|
|
334
331
|
}
|
|
335
332
|
function getTagName(element, types) {
|
|
@@ -400,8 +397,7 @@ var uiBridgeBabelPlugin = declare(
|
|
|
400
397
|
},
|
|
401
398
|
visitor: {
|
|
402
399
|
JSXElement(path) {
|
|
403
|
-
|
|
404
|
-
if (!shouldProcessFile(state.filename, state.config)) {
|
|
400
|
+
if (!shouldProcessFile(this.filename, this.config)) {
|
|
405
401
|
return;
|
|
406
402
|
}
|
|
407
403
|
const openingElement = path.node.openingElement;
|
|
@@ -409,36 +405,33 @@ var uiBridgeBabelPlugin = declare(
|
|
|
409
405
|
if (!tagName || !isHtmlElement(tagName)) {
|
|
410
406
|
return;
|
|
411
407
|
}
|
|
412
|
-
if (!
|
|
408
|
+
if (!this.config.elements.includes(tagName)) {
|
|
413
409
|
return;
|
|
414
410
|
}
|
|
415
|
-
if (
|
|
411
|
+
if (this.config.skipExisting && hasAttribute(openingElement, this.config.idAttribute, types)) {
|
|
416
412
|
return;
|
|
417
413
|
}
|
|
418
414
|
const componentName = findComponentName(path);
|
|
419
|
-
if (
|
|
420
|
-
if (!componentName || !
|
|
415
|
+
if (this.config.onlyInComponents.length > 0) {
|
|
416
|
+
if (!componentName || !this.config.onlyInComponents.includes(componentName)) {
|
|
421
417
|
return;
|
|
422
418
|
}
|
|
423
419
|
}
|
|
424
|
-
if (
|
|
425
|
-
if (componentName &&
|
|
420
|
+
if (this.config.skipInComponents.length > 0) {
|
|
421
|
+
if (componentName && this.config.skipInComponents.includes(componentName)) {
|
|
426
422
|
return;
|
|
427
423
|
}
|
|
428
424
|
}
|
|
429
|
-
const textContent = extractTextContent(
|
|
430
|
-
path.node.children,
|
|
431
|
-
types
|
|
432
|
-
);
|
|
425
|
+
const textContent = extractTextContent(path.node.children, types);
|
|
433
426
|
const ariaLabel = getAttributeValue(openingElement, "aria-label", types);
|
|
434
427
|
const placeholder = getAttributeValue(openingElement, "placeholder", types);
|
|
435
428
|
const title = getAttributeValue(openingElement, "title", types);
|
|
436
429
|
const name = getAttributeValue(openingElement, "name", types);
|
|
437
430
|
const existingId = getAttributeValue(openingElement, "id", types);
|
|
438
|
-
const elementIndex = getNextElementIndex(
|
|
431
|
+
const elementIndex = getNextElementIndex(this.filename, tagName);
|
|
439
432
|
const idContext = {
|
|
440
433
|
componentName,
|
|
441
|
-
filePath:
|
|
434
|
+
filePath: this.filename,
|
|
442
435
|
tagName,
|
|
443
436
|
textContent,
|
|
444
437
|
ariaLabel,
|
|
@@ -447,16 +440,16 @@ var uiBridgeBabelPlugin = declare(
|
|
|
447
440
|
elementIndex,
|
|
448
441
|
existingId
|
|
449
442
|
};
|
|
450
|
-
const generatedId = generateId(idContext,
|
|
451
|
-
if (
|
|
443
|
+
const generatedId = generateId(idContext, this.config);
|
|
444
|
+
if (this.processed.has(generatedId)) {
|
|
452
445
|
const uniqueId = `${generatedId}-${elementIndex}`;
|
|
453
|
-
addAttribute(openingElement,
|
|
446
|
+
addAttribute(openingElement, this.config.idAttribute, uniqueId, types);
|
|
454
447
|
} else {
|
|
455
|
-
|
|
456
|
-
addAttribute(openingElement,
|
|
448
|
+
this.processed.add(generatedId);
|
|
449
|
+
addAttribute(openingElement, this.config.idAttribute, generatedId, types);
|
|
457
450
|
}
|
|
458
451
|
const semanticType = getSemanticType(tagName, idContext);
|
|
459
|
-
addAttribute(openingElement,
|
|
452
|
+
addAttribute(openingElement, this.config.typeAttribute, semanticType, types);
|
|
460
453
|
const aliasContext = {
|
|
461
454
|
tagName,
|
|
462
455
|
textContent,
|
|
@@ -464,29 +457,25 @@ var uiBridgeBabelPlugin = declare(
|
|
|
464
457
|
placeholder,
|
|
465
458
|
title,
|
|
466
459
|
name};
|
|
467
|
-
if (shouldGenerateAliases(aliasContext,
|
|
468
|
-
const aliases = generateAliases(aliasContext,
|
|
460
|
+
if (shouldGenerateAliases(aliasContext, this.config)) {
|
|
461
|
+
const aliases = generateAliases(aliasContext, this.config);
|
|
469
462
|
if (aliases.length > 0) {
|
|
470
463
|
addAttribute(
|
|
471
464
|
openingElement,
|
|
472
|
-
|
|
465
|
+
this.config.aliasesAttribute,
|
|
473
466
|
formatAliasesAttribute(aliases),
|
|
474
467
|
types
|
|
475
468
|
);
|
|
476
469
|
}
|
|
477
470
|
}
|
|
478
|
-
if (
|
|
479
|
-
console.log(
|
|
480
|
-
`[ui-bridge-babel-plugin] Instrumented <${tagName}> as "${generatedId}"`
|
|
481
|
-
);
|
|
471
|
+
if (this.config.verbose) {
|
|
472
|
+
console.log(`[ui-bridge-babel-plugin] Instrumented <${tagName}> as "${generatedId}"`);
|
|
482
473
|
}
|
|
483
474
|
}
|
|
484
475
|
},
|
|
485
476
|
post() {
|
|
486
477
|
if (this.config.verbose) {
|
|
487
|
-
console.log(
|
|
488
|
-
`[ui-bridge-babel-plugin] Finished processing: ${this.filename}`
|
|
489
|
-
);
|
|
478
|
+
console.log(`[ui-bridge-babel-plugin] Finished processing: ${this.filename}`);
|
|
490
479
|
}
|
|
491
480
|
}
|
|
492
481
|
};
|