@pie-element/cli 0.1.2-next.0 → 0.1.2-next.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"sync-presets.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-presets.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from 'node:path';\n\nexport interface TextReplacement {\n from: string;\n to: string;\n}\n\nexport interface PostSyncTextPatch {\n id: string;\n label: string;\n file: string;\n replacements: TextReplacement[];\n}\n\nexport type PieLibSyncMode = 'full-sync' | 'wrapper';\nexport type PieLibVitePreset =\n | 'default'\n | 'math-rendering-wrapper'\n | 'test-utils'\n | 'editable-html-tip-tap';\n\n/**\n * Central inventory for element/package-specific sync compatibility adaptations.\n *\n * Each entry gets a stable id so it can be referenced in docs/logs/tests without\n * coupling to implementation file names.\n */\nexport const PRESET_IDS = {\n testUtilsDeclarationStabilization: 'patch.test-utils.declaration-stabilization',\n graphingDomPropLeakGuard: 'patch.graphing.dom-prop-leak-guard',\n previewPromptPropTypesShape: 'patch.render-ui.preview-prompt-proptypes-shape',\n correctAnswerToggleStyleNormalization: 'patch.correct-answer-toggle.style-key-normalization',\n plotToolPropTypesCompatibility: 'patch.plot.tool-proptypes-compatibility',\n mathRenderingWrapperMode: 'mode.math-rendering.wrapper',\n preserveRenderUiInlineMenu: 'preserve.render-ui.inline-menu',\n depsGraphingDndKit: 'deps.graphing.dnd-kit-core',\n depsChartingD3Peers: 'deps.charting.d3-peers',\n depsMathRenderingOverride: 'deps.math-rendering.shared-adapter-only',\n viteMathRenderingWrapper: 'vite.math-rendering-wrapper',\n viteTestUtils: 'vite.test-utils',\n viteEditableHtmlTipTap: 'vite.editable-html-tip-tap',\n transformChartingUtilsTypeFix: 'transform.charting.utils-exported-function-types',\n transformTranslatorIndexTypeFix: 'transform.translator.index-type-annotations',\n transformRenderUiInlineMenuExport: 'transform.render-ui.inline-menu-export',\n transformTextSelectTokenTypesReexport: 'transform.text-select.token-types-reexport',\n} as const;\n\nexport function getPostSyncTextPatches(projectRoot: string): PostSyncTextPatch[] {\n return [\n {\n id: PRESET_IDS.testUtilsDeclarationStabilization,\n label: '@pie-lib/test-utils declaration stabilization',\n file: join(projectRoot, 'packages/lib-react/test-utils/src/index.tsx'),\n replacements: [\n {\n from: \"import { render } from '@testing-library/react';\",\n to: \"import { render, type RenderOptions, type RenderResult } from '@testing-library/react';\",\n },\n {\n from: 'export function renderWithTheme(ui, options = {}) {',\n to: 'export function renderWithTheme(ui: React.ReactElement, options: RenderOptions & { theme?: unknown } = {}): RenderResult {',\n },\n {\n from: 'export function renderWithProviders(ui, options = {}) {',\n to: 'export function renderWithProviders(ui: React.ReactElement, options: RenderOptions & { theme?: unknown; providers?: React.ComponentType<{ children?: React.ReactNode }>[] } = {}): RenderResult {',\n },\n ],\n },\n {\n id: PRESET_IDS.graphingDomPropLeakGuard,\n label: '@pie-lib/graphing DOM prop leak guard',\n file: join(projectRoot, 'packages/lib-react/graphing/src/tools/shared/point/base-point.tsx'),\n replacements: [\n {\n from: ' onTouchEnd,\\n ...rest\\n',\n to: ' onTouchEnd\\n',\n },\n {\n from: ' <circle {...rest} r={r} cx={scale.x(x)} cy={scale.y(y)} />',\n to: ' <circle r={r} cx={scale.x(x)} cy={scale.y(y)} />',\n },\n ],\n },\n {\n id: PRESET_IDS.previewPromptPropTypesShape,\n label: '@pie-lib/render-ui PreviewPrompt PropTypes.shape',\n file: join(projectRoot, 'packages/lib-react/render-ui/src/preview-prompt.tsx'),\n replacements: [\n {\n from: ' customAudioButton: {\\n playImage: PropTypes.string,\\n pauseImage: PropTypes.string,\\n },',\n to: ' customAudioButton: PropTypes.shape({\\n playImage: PropTypes.string,\\n pauseImage: PropTypes.string,\\n }),',\n },\n ],\n },\n {\n id: PRESET_IDS.correctAnswerToggleStyleNormalization,\n label: '@pie-lib/correct-answer-toggle style key normalization',\n file: join(projectRoot, 'packages/lib-react/correct-answer-toggle/src/index.tsx'),\n replacements: [\n { from: \" '-webkit-touchCcallout': 'none',\", to: \" WebkitTouchCallout: 'none',\" },\n { from: \" '-webkit-user-select': 'none',\", to: \" WebkitUserSelect: 'none',\" },\n { from: \" '-khtml-user-select': 'none',\", to: \" KhtmlUserSelect: 'none',\" },\n { from: \" '-moz-user-select': 'none',\", to: \" MozUserSelect: 'none',\" },\n { from: \" '-ms-user-select': 'none',\", to: \" msUserSelect: 'none',\" },\n { from: \" 'user-select': 'none',\", to: \" userSelect: 'none',\" },\n ],\n },\n ];\n}\n\nexport function getPieLibSyncMode(pkgName: string): PieLibSyncMode {\n if (pkgName === 'math-rendering') {\n return 'wrapper';\n }\n return 'full-sync';\n}\n\nexport function getPieLibSourcePreserveList(pkgName: string): string[] {\n if (pkgName === 'render-ui') {\n return ['inline-menu.tsx'];\n }\n return [];\n}\n\nexport function shouldGenerateAutosizeInputComponent(pkgName: string): boolean {\n return ['charting', 'graphing', 'graphing-solution-set'].includes(pkgName);\n}\n\nexport function shouldGenerateConfigUiFractionHelper(pkgName: string): boolean {\n return pkgName === 'config-ui';\n}\n\nexport function shouldTransformReactInputAutosizeSource(sourcePath?: string): boolean {\n if (!sourcePath) {\n return true;\n }\n\n return ['charting', 'graphing', 'graphing-solution-set'].some(\n (pkgName) =>\n sourcePath.includes(`pie-lib/packages/${pkgName}/src/`) ||\n sourcePath.includes(`packages/lib-react/${pkgName}/src/`)\n );\n}\n\nexport function shouldTransformConfigUiMathjsSource(sourcePath?: string): boolean {\n if (!sourcePath) {\n return false;\n }\n\n return (\n sourcePath.includes('pie-lib/packages/config-ui/src/number-text-field-custom') ||\n sourcePath.includes('packages/lib-react/config-ui/src/number-text-field-custom')\n );\n}\n\nexport function getPieLibVitePreset(pkgName?: string): PieLibVitePreset {\n if (pkgName === 'math-rendering') {\n return 'math-rendering-wrapper';\n }\n if (pkgName === 'test-utils') {\n return 'test-utils';\n }\n if (pkgName === 'editable-html-tip-tap') {\n return 'editable-html-tip-tap';\n }\n return 'default';\n}\n\nexport function getPieLibDependencyAugmentations(pkgName: string): Record<string, string> {\n if (pkgName === 'graphing') {\n return {\n '@dnd-kit/core': '^6.3.0',\n };\n }\n if (pkgName === 'charting') {\n return {\n 'd3-time': '^3.1.0',\n 'd3-interpolate': '^3.0.1',\n 'd3-shape': '^3.2.0',\n };\n }\n return {};\n}\n\nexport function getPieLibDependencyOverride(pkgName: string): Record<string, string> | null {\n if (pkgName === 'math-rendering') {\n return {\n '@pie-element/shared-math-rendering-mathjax': 'workspace:*',\n };\n }\n return null;\n}\n\nexport const PIE_LIB_COMPATIBILITY_APPEND_PATCHES: Record<\n string,\n { id: string; append: string; requiredMarker: string }\n> = {\n plot: {\n id: PRESET_IDS.plotToolPropTypesCompatibility,\n requiredMarker: 'ToolPropTypeFields',\n append: `\n\n// Local compatibility export used by graphing tool components.\nexport const ToolPropTypeFields = {\n graphProps: GraphPropsType.isRequired,\n mark: PropTypes.object,\n onChange: PropTypes.func,\n onDelete: PropTypes.func,\n onClick: PropTypes.func,\n};\n\nexport const ToolPropType = PropTypes.shape(ToolPropTypeFields);\n`,\n },\n};\n"]}
1
+ {"version":3,"file":"sync-presets.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-presets.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from 'node:path';\n\nexport interface TextReplacement {\n from: string;\n to: string;\n}\n\nexport interface PostSyncTextPatch {\n id: string;\n label: string;\n file: string;\n replacements: TextReplacement[];\n}\n\nexport type PieLibSyncMode = 'full-sync' | 'wrapper';\nexport type PieLibVitePreset =\n | 'default'\n | 'math-rendering-wrapper'\n | 'test-utils'\n | 'editable-html-tip-tap';\n\n/**\n * Central inventory for element/package-specific sync compatibility adaptations.\n *\n * Each entry gets a stable id so it can be referenced in docs/logs/tests without\n * coupling to implementation file names.\n */\nexport const PRESET_IDS = {\n testUtilsDeclarationStabilization: 'patch.test-utils.declaration-stabilization',\n graphingDomPropLeakGuard: 'patch.graphing.dom-prop-leak-guard',\n previewPromptPropTypesShape: 'patch.render-ui.preview-prompt-proptypes-shape',\n correctAnswerToggleStyleNormalization: 'patch.correct-answer-toggle.style-key-normalization',\n plotToolPropTypesCompatibility: 'patch.plot.tool-proptypes-compatibility',\n mathRenderingWrapperMode: 'mode.math-rendering.wrapper',\n preserveRenderUiInlineMenu: 'preserve.render-ui.inline-menu',\n depsGraphingDndKit: 'deps.graphing.dnd-kit-core',\n depsChartingD3Peers: 'deps.charting.d3-peers',\n depsMathRenderingOverride: 'deps.math-rendering.shared-adapter-only',\n viteMathRenderingWrapper: 'vite.math-rendering-wrapper',\n viteTestUtils: 'vite.test-utils',\n viteEditableHtmlTipTap: 'vite.editable-html-tip-tap',\n transformChartingUtilsTypeFix: 'transform.charting.utils-exported-function-types',\n transformTranslatorIndexTypeFix: 'transform.translator.index-type-annotations',\n transformRenderUiInlineMenuExport: 'transform.render-ui.inline-menu-export',\n transformTextSelectTokenTypesReexport: 'transform.text-select.token-types-reexport',\n} as const;\n\nexport function getPostSyncTextPatches(projectRoot: string): PostSyncTextPatch[] {\n return [\n {\n id: PRESET_IDS.testUtilsDeclarationStabilization,\n label: '@pie-lib/test-utils declaration stabilization',\n file: join(projectRoot, 'packages/lib-react/test-utils/src/index.tsx'),\n replacements: [\n {\n from: \"import { render } from '@testing-library/react';\",\n to: \"import { render, type RenderOptions, type RenderResult } from '@testing-library/react';\",\n },\n {\n from: 'export function renderWithTheme(ui, options = {}) {',\n to: 'export function renderWithTheme(ui: React.ReactElement, options: RenderOptions & { theme?: unknown } = {}): RenderResult {',\n },\n {\n from: 'export function renderWithProviders(ui, options = {}) {',\n to: 'export function renderWithProviders(ui: React.ReactElement, options: RenderOptions & { theme?: unknown; providers?: React.ComponentType<{ children?: React.ReactNode }>[] } = {}): RenderResult {',\n },\n ],\n },\n {\n id: PRESET_IDS.graphingDomPropLeakGuard,\n label: '@pie-lib/graphing DOM prop leak guard',\n file: join(projectRoot, 'packages/lib-react/graphing/src/tools/shared/point/base-point.tsx'),\n replacements: [\n {\n from: ' onTouchEnd,\\n ...rest\\n',\n to: ' onTouchEnd\\n',\n },\n {\n from: ' <circle {...rest} r={r} cx={scale.x(x)} cy={scale.y(y)} />',\n to: ' <circle r={r} cx={scale.x(x)} cy={scale.y(y)} />',\n },\n ],\n },\n {\n id: PRESET_IDS.previewPromptPropTypesShape,\n label: '@pie-lib/render-ui PreviewPrompt PropTypes.shape',\n file: join(projectRoot, 'packages/lib-react/render-ui/src/preview-prompt.tsx'),\n replacements: [\n {\n from: ' customAudioButton: {\\n playImage: PropTypes.string,\\n pauseImage: PropTypes.string,\\n },',\n to: ' customAudioButton: PropTypes.shape({\\n playImage: PropTypes.string,\\n pauseImage: PropTypes.string,\\n }),',\n },\n ],\n },\n {\n id: PRESET_IDS.correctAnswerToggleStyleNormalization,\n label: '@pie-lib/correct-answer-toggle style key normalization',\n file: join(projectRoot, 'packages/lib-react/correct-answer-toggle/src/index.tsx'),\n replacements: [\n { from: \" '-webkit-touchCcallout': 'none',\", to: \" WebkitTouchCallout: 'none',\" },\n { from: \" '-webkit-user-select': 'none',\", to: \" WebkitUserSelect: 'none',\" },\n { from: \" '-khtml-user-select': 'none',\", to: \" KhtmlUserSelect: 'none',\" },\n { from: \" '-moz-user-select': 'none',\", to: \" MozUserSelect: 'none',\" },\n { from: \" '-ms-user-select': 'none',\", to: \" msUserSelect: 'none',\" },\n { from: \" 'user-select': 'none',\", to: \" userSelect: 'none',\" },\n ],\n },\n ];\n}\n\nexport function getPieLibSyncMode(pkgName: string): PieLibSyncMode {\n if (pkgName === 'math-rendering') {\n return 'wrapper';\n }\n return 'full-sync';\n}\n\nexport function getPieLibSourcePreserveList(pkgName: string): string[] {\n if (pkgName === 'render-ui') {\n return ['inline-menu.tsx'];\n }\n return [];\n}\n\nexport function shouldGenerateAutosizeInputComponent(pkgName: string): boolean {\n return ['charting', 'graphing', 'graphing-solution-set'].includes(pkgName);\n}\n\nexport function shouldGenerateConfigUiFractionHelper(pkgName: string): boolean {\n return pkgName === 'config-ui';\n}\n\nexport function shouldTransformReactInputAutosizeSource(sourcePath?: string): boolean {\n if (!sourcePath) {\n return true;\n }\n\n return ['charting', 'graphing', 'graphing-solution-set'].some(\n (pkgName) =>\n sourcePath.includes(`pie-lib/packages/${pkgName}/src/`) ||\n sourcePath.includes(`packages/lib-react/${pkgName}/src/`)\n );\n}\n\nexport function shouldTransformConfigUiMathjsSource(sourcePath?: string): boolean {\n if (!sourcePath) {\n return false;\n }\n\n return (\n sourcePath.includes('pie-lib/packages/config-ui/src/number-text-field-custom') ||\n sourcePath.includes('packages/lib-react/config-ui/src/number-text-field-custom')\n );\n}\n\nexport function getPieLibVitePreset(pkgName?: string): PieLibVitePreset {\n if (pkgName === 'math-rendering') {\n return 'math-rendering-wrapper';\n }\n if (pkgName === 'test-utils') {\n return 'test-utils';\n }\n if (pkgName === 'editable-html-tip-tap') {\n return 'editable-html-tip-tap';\n }\n return 'default';\n}\n\nexport function getPieLibDependencyAugmentations(pkgName: string): Record<string, string> {\n if (pkgName === 'graphing') {\n return {\n '@dnd-kit/core': '^6.3.0',\n };\n }\n if (pkgName === 'charting') {\n return {\n 'd3-time': '^3.1.0',\n 'd3-interpolate': '^3.0.1',\n 'd3-shape': '^3.2.0',\n };\n }\n return {};\n}\n\nexport function getPieLibDependencyOverride(pkgName: string): Record<string, string> | null {\n if (pkgName === 'math-rendering') {\n return {\n '@pie-element/shared-math-rendering-mathjax': 'workspace:*',\n };\n }\n return null;\n}\n\n/**\n * Exact versions forced onto a synced package's dependencies, whatever upstream declares.\n *\n * tiptap pins its own peers exactly from 3.24.0 on — `@tiptap/core@3.31.3` peers on\n * `@tiptap/pm: \"3.31.3\"`, not a range — so every `@tiptap/*` package in one install tree has\n * to be the same exact version. Mix them and a second `@tiptap/core` resolves, which breaks\n * ProseMirror on duplicate schema and plugin identity.\n *\n * Upstream pie-lib still declares 3.20.0 and is no longer maintained, so the version lives\n * here instead of being fixed there. This matters because `ensurePieLibPackageJson` rebuilds\n * `dependencies` from the upstream manifest on every sync: without this pin, one\n * `upstream:sync` walks the whole set back to 3.20.0 and silently undoes the alignment.\n *\n * Matched by prefix rather than by name so a newly imported `@tiptap/*` package is pinned as\n * well, instead of arriving as a caret range off whatever happens to be installed. Keep in\n * step with the root `package.json` `overrides`.\n */\nconst PIE_LIB_DEPENDENCY_VERSION_PINS: ReadonlyArray<{ prefix: string; version: string }> = [\n { prefix: '@tiptap/', version: '3.31.3' },\n];\n\nexport function applyPieLibDependencyVersionPins(\n deps: Record<string, string>\n): Record<string, string> {\n const pinned: Record<string, string> = {};\n for (const [depName, version] of Object.entries(deps)) {\n const pin = PIE_LIB_DEPENDENCY_VERSION_PINS.find(({ prefix }) => depName.startsWith(prefix));\n pinned[depName] = pin ? pin.version : version;\n }\n return pinned;\n}\n\nexport const PIE_LIB_COMPATIBILITY_APPEND_PATCHES: Record<\n string,\n { id: string; append: string; requiredMarker: string }\n> = {\n plot: {\n id: PRESET_IDS.plotToolPropTypesCompatibility,\n requiredMarker: 'ToolPropTypeFields',\n append: `\n\n// Local compatibility export used by graphing tool components.\nexport const ToolPropTypeFields = {\n graphProps: GraphPropsType.isRequired,\n mark: PropTypes.object,\n onChange: PropTypes.func,\n onDelete: PropTypes.func,\n onClick: PropTypes.func,\n};\n\nexport const ToolPropType = PropTypes.shape(ToolPropTypeFields);\n`,\n },\n};\n"]}
@@ -15,7 +15,7 @@ import { containsJsx } from './sync-imports.js';
15
15
  import { createReactComponentTransformPipeline } from './sync-transforms.js';
16
16
  import { ensureElementPackageJson } from './sync-package-manager.js';
17
17
  import { isSubdirectoryCompatible } from './sync-compatibility.js';
18
- import { EXCLUDED_UPSTREAM_ELEMENTS } from './sync-constants.js';
18
+ import { EXCLUDED_UPSTREAM_ELEMENTS, IIFE_DEBUG_SHIM_SOURCE, IIFE_PROP_TYPES_SHIM_SOURCE, } from './sync-constants.js';
19
19
  import { collectEntryPoints } from './sync-entry-discovery.js';
20
20
  import { syncSourceTree } from './sync-source-tree.js';
21
21
  import { seedContractForElement } from '../docs/contracts.js';
@@ -820,10 +820,10 @@ export default defineConfig({
820
820
  },
821
821
  load(id) {
822
822
  if (id === '\\0iife-debug-shim') {
823
- return 'export default function debug() { return () => {}; }';
823
+ return ${JSON.stringify(IIFE_DEBUG_SHIM_SOURCE)};
824
824
  }
825
825
  if (id === '\\0iife-prop-types-shim') {
826
- return "const fn = () => null; const types = new Proxy(fn, { get: () => fn }); export default types;";
826
+ return ${JSON.stringify(IIFE_PROP_TYPES_SHIM_SOURCE)};
827
827
  }
828
828
  },
829
829
  },
@@ -1 +1 @@
1
- {"version":3,"file":"sync-react-strategy.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-react-strategy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * React components sync strategy - syncs React components from upstream pie-elements\n *\n * Synced from: pie-elements/packages/{element}/src/\n * Target: packages/elements-react/{element}/src/\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, stat as fsStat, writeFile, rm as fsRm } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { convertJsToTs, convertJsxToTsx } from '../../utils/conversion.js';\nimport { getCurrentCommit } from '../../utils/git.js';\nimport type { SyncStrategy, SyncContext, SyncConfig, SyncResult } from './sync-strategy.js';\nimport { cleanDirectory, existsAny, readdir } from './sync-filesystem.js';\nimport { createExternalFunction, createKonvaExternalFunction } from './sync-externals.js';\nimport { containsJsx } from './sync-imports.js';\nimport { createReactComponentTransformPipeline } from './sync-transforms.js';\nimport { ensureElementPackageJson } from './sync-package-manager.js';\nimport { isSubdirectoryCompatible } from './sync-compatibility.js';\nimport { EXCLUDED_UPSTREAM_ELEMENTS } from './sync-constants.js';\nimport { collectEntryPoints } from './sync-entry-discovery.js';\nimport { syncSourceTree } from './sync-source-tree.js';\nimport { seedContractForElement } from '../docs/contracts.js';\nimport type { ElementPackageInfo } from '../docs/types.js';\n\ninterface InternalSyncResult {\n filesChecked: number;\n filesCopied: number;\n filesSkipped: number;\n filesUpdated: number;\n}\n\ninterface PrivateTagConstant {\n name: string;\n tag: string;\n}\n\nconst PRIVATE_CHILD_TAGS: Record<string, PrivateTagConstant[]> = {\n ebsr: [\n { name: 'EBSR_MULTIPLE_CHOICE_TAG', tag: 'ebsr-multiple-choice' },\n { name: 'EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG', tag: 'ebsr-multiple-choice-configure' },\n ],\n 'complex-rubric': [\n { name: 'COMPLEX_RUBRIC_SIMPLE_TAG', tag: 'complex-rubric-simple' },\n { name: 'COMPLEX_RUBRIC_MULTI_TRAIT_TAG', tag: 'complex-rubric-multi-trait' },\n { name: 'COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG', tag: 'rubric-configure' },\n { name: 'COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG', tag: 'multi-trait-rubric-configure' },\n ],\n};\n\nexport function collectElementViteEntryPoints(elementDir: string): Record<string, string> {\n return collectEntryPoints(elementDir, [\n ['index', 'src/index'],\n ['controller/index', 'src/controller/index'],\n ['configure/index', 'src/configure/index'],\n ['delivery/index', 'src/delivery/index'],\n ['author/index', 'src/author/index'],\n ['print/index', 'src/print/index'],\n ['types/index', 'src/types/index'],\n ['runtime-support', 'src/runtime-support'],\n ]);\n}\n\nexport class ReactComponentsStrategy implements SyncStrategy {\n private touchedElementPackages = new Set<string>();\n private result: InternalSyncResult = {\n filesChecked: 0,\n filesCopied: 0,\n filesSkipped: 0,\n filesUpdated: 0,\n };\n\n getName(): string {\n return 'react-components';\n }\n\n getDescription(): string {\n return 'React components';\n }\n\n shouldRun(config: SyncConfig): boolean {\n return config.syncReactComponents;\n }\n\n async execute(context: SyncContext): Promise<SyncResult> {\n const { config, logger } = context;\n this.touchedElementPackages.clear();\n this.result = {\n filesChecked: 0,\n filesCopied: 0,\n filesSkipped: 0,\n filesUpdated: 0,\n };\n\n if (!logger.isVerbose()) {\n logger.progressStart('Syncing React components...');\n } else {\n logger.section('⚛️ Syncing React components');\n }\n\n const upstreamElementsDir = join(config.pieElements, 'packages');\n const targetBaseDir = join(config.pieElementsNg, 'packages/elements-react');\n\n const upstreamCommit = getCurrentCommit(config.pieElements);\n\n const packages = await readdir(upstreamElementsDir);\n\n for (const pkg of packages) {\n if (EXCLUDED_UPSTREAM_ELEMENTS.includes(pkg as (typeof EXCLUDED_UPSTREAM_ELEMENTS)[number])) {\n if (context.packageFilter && pkg !== context.packageFilter) {\n continue;\n }\n\n const targetDir = join(targetBaseDir, pkg);\n const hasControllerSource = existsAny([\n join(targetDir, 'src/controller/index.ts'),\n join(targetDir, 'src/controller/index.tsx'),\n join(targetDir, 'src/controller/index.js'),\n join(targetDir, 'src/controller/index.jsx'),\n ]);\n if (!config.dryRun && existsSync(targetDir) && hasControllerSource) {\n await ensureElementPackageJson(pkg, targetDir, config);\n }\n continue;\n }\n\n if (context.packageFilter && pkg !== context.packageFilter) {\n continue;\n }\n\n // Check if element is in compatibility report (ESM-compatible)\n if (context.compatibilityReport) {\n if (!context.compatibilityReport.elements.includes(pkg)) {\n continue; // Skip non-compatible elements\n }\n\n // Check if student UI (src/) is ESM-compatible\n if (!isSubdirectoryCompatible(pkg, 'src', context)) {\n if (logger.isVerbose()) {\n logger.info(` ⏭️ ${pkg}: skipping src/ (not ESM-compatible)`);\n }\n continue;\n }\n }\n\n // Check if React component exists upstream (src/ directory)\n const componentSrcDir = join(upstreamElementsDir, pkg, 'src');\n if (!existsSync(componentSrcDir)) {\n continue;\n }\n\n // Target: packages/elements-react/{element}/src/\n const targetDir = join(targetBaseDir, pkg);\n const targetSrcDir = join(targetDir, 'src');\n\n // Clean target src subtree first so removed upstream files don't linger\n // BUT: preserve controller/ subdirectory if it exists (synced separately)\n await this.cleanTargetDirExcept(\n targetSrcDir,\n ['controller'],\n `elements-react/${pkg}/src`,\n logger,\n config.dryRun\n );\n\n // Recursively sync all files from src/ directory to delivery/ subdirectory\n const beforeChanges = this.result.filesCopied + this.result.filesUpdated;\n const targetDeliveryDir = join(targetDir, 'src/delivery');\n let elementFilesProcessed = await this.syncDirectory(\n componentSrcDir,\n targetDeliveryDir,\n 'src',\n pkg,\n upstreamCommit\n );\n\n // Also sync configure/ if it exists and is ESM-compatible\n // Note: Renamed to author/ in the target directory\n const configureDir = join(upstreamElementsDir, pkg, 'configure');\n if (existsSync(configureDir)) {\n // Check if configure subdirectory is ESM-compatible\n const configureCompatible = isSubdirectoryCompatible(pkg, 'configure', context);\n if (configureCompatible) {\n // First, sync configure/src/ -> src/author/\n const configureSrcDir = join(configureDir, 'src');\n if (existsSync(configureSrcDir)) {\n const targetAuthorDir = join(targetDir, 'src/author');\n const configureFilesProcessed = await this.syncDirectory(\n configureSrcDir,\n targetAuthorDir,\n 'configure/src',\n pkg,\n upstreamCommit\n );\n elementFilesProcessed += configureFilesProcessed;\n }\n\n // Then, sync configure/*.js files (not in subdirectories) -> src/author/\n // These are utility files that live directly in configure/ like utils.js\n const targetAuthorDir = join(targetDir, 'src/author');\n const configureRootFilesProcessed = await this.syncConfigureRootFiles(\n configureDir,\n targetAuthorDir,\n pkg,\n upstreamCommit\n );\n elementFilesProcessed += configureRootFilesProcessed;\n } else if (logger.isVerbose()) {\n logger.info(` ⏭️ ${pkg}: skipping configure/ (not ESM-compatible)`);\n }\n }\n\n // Sync print file if it exists (src/print.js -> src/print/index.ts)\n const upstreamPrintFile = join(componentSrcDir, 'print.js');\n if (existsSync(upstreamPrintFile)) {\n const targetPrintDir = join(targetDir, 'src/print');\n const printFilesProcessed = await this.syncPrintFile(\n upstreamPrintFile,\n targetPrintDir,\n pkg,\n upstreamCommit\n );\n elementFilesProcessed += printFilesProcessed;\n }\n\n const wrotePrivateChildSupport = await this.ensurePrivateChildElementSupport(pkg, targetDir);\n\n // Generate src/index.ts that re-exports from delivery/\n const mainIndexPath = join(targetDir, 'src/index.ts');\n const mainIndexContent = `export { default } from './delivery/index.js';\\n`;\n await writeFile(mainIndexPath, mainIndexContent, 'utf-8');\n\n const afterChanges = this.result.filesCopied + this.result.filesUpdated;\n const elementChanged = afterChanges > beforeChanges;\n\n if (elementFilesProcessed > 0 && logger.isVerbose()) {\n logger.success(` ✨ ${pkg}: ${elementFilesProcessed} file(s) synced`);\n }\n\n const elementDir = join(targetBaseDir, pkg);\n\n // Ensure IIFE files exist before generating package.json scripts.\n // package.json generation derives the build script from presence of iife files.\n await this.ensureIifeEntryPoint(pkg, elementDir, config, logger);\n await this.ensureIifeViteConfig(pkg, elementDir, config, logger);\n\n // Ensure package.json has ESM module support and expected exports.\n let wrotePkgJson = false;\n wrotePkgJson = await ensureElementPackageJson(pkg, elementDir, config, {\n includeBrowserExports: true,\n });\n await this.ensureElementViteConfig(pkg, elementDir, logger);\n const wroteTsConfig = await this.ensureTsConfig(pkg, elementDir, logger);\n\n // Ensure demo structure\n await this.ensureElementDemoStructure(pkg, elementDir, config, logger);\n // Demo configs are maintained locally - we do NOT apply overrides from upstream\n\n if (!config.dryRun) {\n const packageJsonPath = join(elementDir, 'package.json');\n const packageJsonRaw = existsSync(packageJsonPath)\n ? (JSON.parse(await readFile(packageJsonPath, 'utf-8')) as Record<string, unknown>)\n : {};\n const packageInfo: ElementPackageInfo = {\n elementName: pkg,\n packageName:\n typeof packageJsonRaw.name === 'string' ? packageJsonRaw.name : `@pie-element/${pkg}`,\n framework: 'react',\n packageDir: elementDir,\n packageDescription:\n typeof packageJsonRaw.description === 'string' ? packageJsonRaw.description : undefined,\n exportsMap:\n packageJsonRaw.exports && typeof packageJsonRaw.exports === 'object'\n ? (packageJsonRaw.exports as Record<string, unknown>)\n : undefined,\n };\n await seedContractForElement(packageInfo, config.pieElementsNg, { refresh: true });\n }\n\n if (elementChanged || wrotePrivateChildSupport || wrotePkgJson || wroteTsConfig) {\n this.touchedElementPackages.add(pkg);\n }\n }\n\n // Demo configs are maintained locally - we do NOT apply overrides to existing elements\n\n if (!logger.isVerbose()) {\n logger.progressCompleteWithCount(this.touchedElementPackages.size, 'packages');\n } else {\n logger.info(`\\nSynced ${this.touchedElementPackages.size} React component package(s)`);\n }\n return {\n count: this.touchedElementPackages.size,\n packageNames: Array.from(this.touchedElementPackages).sort(),\n };\n }\n\n private async cleanTargetDirExcept(\n targetDir: string,\n preserveDirs: string[],\n label: string,\n logger: any,\n dryRun: boolean\n ): Promise<void> {\n await cleanDirectory(\n targetDir,\n label,\n { dryRun, verbose: false, preserve: preserveDirs },\n logger\n );\n }\n\n private async syncDirectory(\n sourceDir: string,\n targetDir: string,\n relativePath: string,\n pkg: string,\n upstreamCommit: string\n ): Promise<number> {\n const packageName = `@pie-element/${pkg}`;\n const transformPipeline = createReactComponentTransformPipeline(packageName);\n const stats = await syncSourceTree({\n sourceDir,\n targetDir,\n relativePath,\n sourcePathPrefix: `pie-elements/packages/${pkg}`,\n upstreamCommit,\n transform: (content, context) => transformPipeline(content, context.relativeFilePath),\n skipFile: (fileName) => fileName === 'print.js' || fileName === 'print.jsx',\n });\n\n this.result.filesChecked += stats.filesChecked;\n this.result.filesCopied += stats.filesCopied;\n this.result.filesSkipped += stats.filesSkipped;\n this.result.filesUpdated += stats.filesUpdated;\n\n return stats.filesProcessed;\n }\n\n /**\n * Sync root-level .js files from configure/ directory (not including subdirectories)\n * These are typically utility files like utils.js that are imported by files in configure/src/\n */\n private async syncConfigureRootFiles(\n sourceDir: string,\n targetDir: string,\n pkg: string,\n upstreamCommit: string\n ): Promise<number> {\n let filesProcessed = 0;\n\n const items = await readdir(sourceDir);\n\n for (const item of items) {\n const srcPath = join(sourceDir, item);\n const stat = await fsStat(srcPath);\n\n // Skip directories - we only want root-level files\n if (stat.isDirectory()) {\n continue;\n }\n\n // Only process .js and .jsx files\n if (!item.endsWith('.js') && !item.endsWith('.jsx')) {\n continue;\n }\n\n this.result.filesChecked++;\n filesProcessed++;\n\n // Read source\n let sourceContent = await readFile(srcPath, 'utf-8');\n\n // Apply all standard transformations\n const packageName = `@pie-element/${pkg}`;\n const transformPipeline = createReactComponentTransformPipeline(packageName);\n sourceContent = transformPipeline(sourceContent);\n\n const hasJsx = item.endsWith('.jsx') || (item.endsWith('.js') && containsJsx(sourceContent));\n\n // Convert .js → .ts/.tsx and .jsx → .tsx\n const targetFile = item.replace(/\\.jsx?$/, hasJsx ? '.tsx' : '.ts');\n const targetPath = join(targetDir, targetFile);\n\n // Convert based on file extension\n const conversionResult = hasJsx\n ? convertJsxToTsx(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/configure/${item}`,\n commit: upstreamCommit,\n })\n : convertJsToTs(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/configure/${item}`,\n commit: upstreamCommit,\n });\n\n const converted = conversionResult.code;\n\n // Check if file already exists (synced from configure/src/)\n const isNew = !existsSync(targetPath);\n if (!isNew) {\n // File exists - this means configure/src/utils.js was already synced\n // We need to merge the exports instead of overwriting\n const existingContent = await readFile(targetPath, 'utf-8');\n\n // Extract exports from both files and merge them\n const mergedContent = this.mergeUtilsFiles(existingContent, converted);\n\n if (existingContent === mergedContent) {\n this.result.filesSkipped++;\n continue;\n }\n\n await writeFile(targetPath, mergedContent, 'utf-8');\n this.result.filesUpdated++;\n } else {\n // New file - just write it\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(targetPath, converted, 'utf-8');\n this.result.filesCopied++;\n }\n }\n\n return filesProcessed;\n }\n\n private async ensurePrivateChildElementSupport(\n pkg: string,\n elementDir: string\n ): Promise<boolean> {\n const tags = PRIVATE_CHILD_TAGS[pkg];\n if (!tags) {\n return false;\n }\n\n let changed = await this.ensurePrivateTagsFile(elementDir, tags);\n\n if (pkg === 'ebsr') {\n changed = (await this.ensureEbsrPrivateChildReferences(elementDir)) || changed;\n }\n\n if (pkg === 'complex-rubric') {\n changed = (await this.ensureComplexRubricPrivateChildReferences(elementDir)) || changed;\n }\n\n return changed;\n }\n\n private async ensurePrivateTagsFile(\n elementDir: string,\n tags: PrivateTagConstant[]\n ): Promise<boolean> {\n const privateTagsPath = join(elementDir, 'src/private-tags.ts');\n const exports = tags.map(\n ({ name, tag }) => `export const ${name} = \\`${tag}\\${ownerVersionSuffix}\\`;`\n );\n const content = `declare const __PIE_PACKAGE_VERSION__: string | undefined;\n\nconst encodeVersionForTag = (version: string): string =>\n version\n .trim()\n .toLowerCase()\n .replace(/[.+]/g, '-')\n .replace(/[^0-9A-Za-z-]/g, '-')\n .replace(/-{2,}/g, '-');\n\nconst ownerVersion =\n typeof __PIE_PACKAGE_VERSION__ === 'string' && __PIE_PACKAGE_VERSION__.trim()\n ? __PIE_PACKAGE_VERSION__\n : 'local';\nconst ownerVersionSuffix = \\`--version-\\${encodeVersionForTag(ownerVersion)}\\`;\n\n${exports.join('\\n')}\n`;\n\n const current = existsSync(privateTagsPath)\n ? await readFile(privateTagsPath, 'utf-8').catch(() => null)\n : null;\n if (current === content) {\n return false;\n }\n\n await mkdir(dirname(privateTagsPath), { recursive: true });\n await writeFile(privateTagsPath, content, 'utf-8');\n return true;\n }\n\n private async ensureEbsrPrivateChildReferences(elementDir: string): Promise<boolean> {\n let changed = false;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/delivery/index.tsx'), [\n {\n from: \"import debug from 'debug';\\n\",\n to: \"import debug from 'debug';\\nimport { EBSR_MULTIPLE_CHOICE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const MC_TAG_NAME = 'ebsr-multiple-choice';\",\n to: 'const MC_TAG_NAME = EBSR_MULTIPLE_CHOICE_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/print/index.tsx'), [\n {\n from: \"import { SessionChangedEvent } from '@pie-element/shared-player-events';\\n\",\n to: \"import { SessionChangedEvent } from '@pie-element/shared-player-events';\\nimport { EBSR_MULTIPLE_CHOICE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const MC_TAG_NAME = 'ebsr-multiple-choice';\",\n to: 'const MC_TAG_NAME = EBSR_MULTIPLE_CHOICE_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/index.ts'), [\n {\n from: \"import Main from './main';\\n\",\n to: \"import Main from './main';\\nimport { EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const MC_TAG_NAME = 'ebsr-multiple-choice-configure';\",\n to: 'const MC_TAG_NAME = EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG;',\n },\n {\n from: ' configuration: this._configuration,\\n',\n to: ' configuration: this._configuration,\\n multipleChoiceTagName: MC_TAG_NAME,\\n',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/main.tsx'), [\n {\n from: \"import { styled } from '@mui/material/styles';\\n\",\n to: \"import { styled } from '@mui/material/styles';\\nimport { EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: ` configuration: PropTypes.object,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,`,\n to: ` configuration: PropTypes.object,\n model: PropTypes.object,\n multipleChoiceTagName: PropTypes.string,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,`,\n },\n {\n from: ' const { model, configuration, onConfigurationChanged } = this.props;\\n',\n to: ` const {\n model,\n configuration,\n multipleChoiceTagName = EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG,\n onConfigurationChanged,\n } = this.props;\n const MultipleChoiceConfigureElement = multipleChoiceTagName;\n`,\n },\n {\n from: '<ebsr-multiple-choice-configure',\n to: '<MultipleChoiceConfigureElement',\n },\n {\n from: '</ebsr-multiple-choice-configure>',\n to: '</MultipleChoiceConfigureElement>',\n },\n ])) || changed;\n\n return changed;\n }\n\n private async ensureComplexRubricPrivateChildReferences(elementDir: string): Promise<boolean> {\n let changed = false;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/delivery/index.ts'), [\n {\n from: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\n\",\n to: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\nimport { COMPLEX_RUBRIC_MULTI_TRAIT_TAG, COMPLEX_RUBRIC_SIMPLE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const RUBRIC_TAG_NAME = 'complex-rubric-simple';\",\n to: 'const RUBRIC_TAG_NAME = COMPLEX_RUBRIC_SIMPLE_TAG;',\n },\n {\n from: \"const MULTI_TRAIT_RUBRIC_TAG_NAME = 'complex-rubric-multi-trait';\",\n to: 'const MULTI_TRAIT_RUBRIC_TAG_NAME = COMPLEX_RUBRIC_MULTI_TRAIT_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/print/index.ts'), [\n {\n from: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\n\",\n to: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\nimport { COMPLEX_RUBRIC_MULTI_TRAIT_TAG, COMPLEX_RUBRIC_SIMPLE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const RUBRIC_TAG_NAME = 'complex-rubric-simple';\",\n to: 'const RUBRIC_TAG_NAME = COMPLEX_RUBRIC_SIMPLE_TAG;',\n },\n {\n from: \"const MULTI_TRAIT_RUBRIC_TAG_NAME = 'complex-rubric-multi-trait';\",\n to: 'const MULTI_TRAIT_RUBRIC_TAG_NAME = COMPLEX_RUBRIC_MULTI_TRAIT_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/index.ts'), [\n {\n from: \"import sensibleDefaults from './defaults';\\n\",\n to: \"import sensibleDefaults from './defaults';\\nimport {\\n COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG,\\n COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG,\\n} from '../private-tags.js';\\n\",\n },\n {\n from: \"const RUBRIC_TAG_NAME = 'rubric-configure';\",\n to: 'const RUBRIC_TAG_NAME = COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG;',\n },\n {\n from: \"const MULTI_TRAIT_RUBRIC_TAG_NAME = 'multi-trait-rubric-configure';\",\n to: 'const MULTI_TRAIT_RUBRIC_TAG_NAME = COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG;',\n },\n {\n from: ' configuration: this._configuration,\\n',\n to: ' configuration: this._configuration,\\n multiTraitRubricTagName: MULTI_TRAIT_RUBRIC_TAG_NAME,\\n',\n },\n {\n from: ' onConfigurationChanged: this.onConfigurationChanged,\\n',\n to: ' onConfigurationChanged: this.onConfigurationChanged,\\n simpleRubricTagName: RUBRIC_TAG_NAME,\\n',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/main.tsx'), [\n {\n from: \"import { color } from '@pie-lib/render-ui';\\n\",\n to: \"import { color } from '@pie-lib/render-ui';\\nimport {\\n COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG,\\n COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG,\\n} from '../private-tags.js';\\n\",\n },\n {\n from: ` canUpdateModel: PropTypes.bool,\n configuration: PropTypes.object,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,`,\n to: ` canUpdateModel: PropTypes.bool,\n configuration: PropTypes.object,\n multiTraitRubricTagName: PropTypes.string,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,\n simpleRubricTagName: PropTypes.string,`,\n },\n {\n from: ' const { model, configuration, canUpdateModel } = this.props;\\n',\n to: ` const {\n model,\n configuration,\n canUpdateModel,\n multiTraitRubricTagName = COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG,\n simpleRubricTagName = COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG,\n } = this.props;\n const MultiTraitRubricConfigureElement = multiTraitRubricTagName;\n const SimpleRubricConfigureElement = simpleRubricTagName;\n`,\n },\n { from: '<rubric-configure', to: '<SimpleRubricConfigureElement' },\n { from: '</rubric-configure>', to: '</SimpleRubricConfigureElement>' },\n { from: '<multi-trait-rubric-configure', to: '<MultiTraitRubricConfigureElement' },\n {\n from: '</multi-trait-rubric-configure>',\n to: '</MultiTraitRubricConfigureElement>',\n },\n ])) || changed;\n\n return changed;\n }\n\n private async replaceInSyncedFile(\n filePath: string,\n replacements: Array<{ from: string; to: string }>\n ): Promise<boolean> {\n if (!existsSync(filePath)) {\n return false;\n }\n\n const original = await readFile(filePath, 'utf-8');\n let next = original;\n\n for (const { from, to } of replacements) {\n if (!next.includes(from)) {\n continue;\n }\n next = next.split(from).join(to);\n }\n\n if (next === original) {\n return false;\n }\n\n await writeFile(filePath, next, 'utf-8');\n return true;\n }\n\n /**\n * Sync a single print file (src/print.js -> src/print/index.ts)\n */\n private async syncPrintFile(\n sourceFile: string,\n targetDir: string,\n pkg: string,\n upstreamCommit: string\n ): Promise<number> {\n this.result.filesChecked++;\n\n // Read source\n let sourceContent = await readFile(sourceFile, 'utf-8');\n\n // Apply all standard transformations\n const packageName = `@pie-element/${pkg}`;\n const transformPipeline = createReactComponentTransformPipeline(packageName);\n sourceContent = transformPipeline(sourceContent);\n\n // Transform imports from './' to '../delivery/' since print is now in print/\n // This handles './main', './stimulus-tabs', './choice', etc.\n sourceContent = sourceContent.replace(/from\\s+['\"]\\.\\/([^'\"]+)['\"]/g, \"from '../delivery/$1'\");\n sourceContent = sourceContent.replace(\n /import\\s*\\(\\s*['\"]\\.\\/([^'\"]+)['\"]\\s*\\)/g,\n \"import('../delivery/$1')\"\n );\n\n const hasJsx = sourceContent.includes('React.createElement') || containsJsx(sourceContent);\n\n // Convert to TypeScript\n const conversionResult = hasJsx\n ? convertJsxToTsx(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/src/print.js`,\n commit: upstreamCommit,\n })\n : convertJsToTs(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/src/print.js`,\n commit: upstreamCommit,\n });\n\n const converted = conversionResult.code;\n const targetFile = hasJsx ? 'index.tsx' : 'index.ts';\n const targetPath = join(targetDir, targetFile);\n\n // Check if needs update\n const isNew = !existsSync(targetPath);\n if (!isNew) {\n const existingContent = await readFile(targetPath, 'utf-8');\n if (existingContent === converted) {\n this.result.filesSkipped++;\n return 1;\n }\n await writeFile(targetPath, converted, 'utf-8');\n this.result.filesUpdated++;\n } else {\n await mkdir(targetDir, { recursive: true });\n await writeFile(targetPath, converted, 'utf-8');\n this.result.filesCopied++;\n }\n\n return 1;\n }\n\n /**\n * Merge two utils files by combining their exports\n *\n * When syncing configure/ files, we may have:\n * - configure/src/utils.js (already synced to src/configure/utils.ts)\n * - configure/utils.js (being synced now to src/configure/utils.ts)\n *\n * Both files export different functions, so we need to merge them.\n */\n private mergeUtilsFiles(existingContent: string, newContent: string): string {\n // Extract the header comment from existing file (has sync metadata)\n const headerMatch = existingContent.match(/^\\/\\/ @ts-nocheck\\n\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/);\n const existingHeader = headerMatch ? headerMatch[0] : '';\n\n // Extract exports from existing file (remove header and blank lines)\n const existingExports = existingContent\n .replace(/^\\/\\/ @ts-nocheck\\n\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/, '')\n .trim();\n\n // Extract exports from new file (remove header and blank lines)\n const newExports = newContent.replace(/^\\/\\/ @ts-nocheck\\n\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/, '').trim();\n\n // Combine: use existing header + both sets of exports\n return `${existingHeader}${existingExports}\\n\\n${newExports}\\n`;\n }\n\n private async ensureElementViteConfig(\n _elementName: string,\n elementDir: string,\n _logger: any\n ): Promise<void> {\n if (!existsSync(elementDir)) {\n return;\n }\n\n const viteConfigPath = join(elementDir, 'vite.config.ts');\n\n // Always regenerate to reflect current directory structure\n // (e.g., if configure/ was skipped due to ESM incompatibility)\n\n const entryPoints = collectElementViteEntryPoints(elementDir);\n\n if (Object.keys(entryPoints).length === 0) {\n return; // No entry points, skip vite config\n }\n\n // Format entry points for vite config\n const entryLines = Object.entries(entryPoints)\n .map(([key, value]) => ` '${key}': resolve(__dirname, '${value}'),`)\n .join('\\n');\n\n // Konva is now external like other dependencies - no special bundling needed\n // This avoids workspace dependency resolution issues\n const shouldBundleKonva = false;\n\n // Check if demo directory exists\n const hasDemoDir = existsSync(join(elementDir, 'docs/demo'));\n\n // Generate appropriate config based on element characteristics\n const viteConfig = shouldBundleKonva\n ? this.generateViteConfigWithBundledKonva(entryLines, hasDemoDir)\n : this.generateStandardViteConfig(entryLines, hasDemoDir);\n\n await writeFile(viteConfigPath, viteConfig, 'utf-8');\n }\n\n private generateStandardViteConfig(entryLines: string, hasDemoDir: boolean): string {\n const demoModeConfig = hasDemoDir\n ? `({ mode, command }) => {\n // Demo mode: serve the docs/demo directory\n if (mode === 'demo' && command === 'serve') {\n return {\n plugins: [react()],\n root: resolve(__dirname, 'docs/demo'),\n };\n }\n\n // Build mode: build the library\n return {`\n : `{`;\n\n return `import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8')) as {\n name?: string;\n version?: string;\n};\n\nexport default defineConfig(${demoModeConfig}\n plugins: [react()],\n define: {\n __PIE_PACKAGE_NAME__: JSON.stringify(packageJson.name ?? ''),\n __PIE_PACKAGE_VERSION__: JSON.stringify(packageJson.version ?? 'local'),\n },\n build: {\n lib: {\n entry: {\n${entryLines}\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: ${createExternalFunction('element')},\n output: {\n preserveModules: true,\n preserveModulesRoot: 'src',\n },\n },\n },${hasDemoDir ? '\\n };' : ''}\n});\n`;\n }\n\n private generateViteConfigWithBundledKonva(entryLines: string, hasDemoDir: boolean): string {\n const demoModeConfig = hasDemoDir\n ? `({ mode, command }) => ({\n plugins: [react()],\n // Only change root for demo mode when serving (not building)\n root: mode === 'demo' && command === 'serve' ? resolve(__dirname, 'docs/demo') : __dirname,`\n : `{\n plugins: [react()],`;\n\n return `import { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig(${demoModeConfig}\n build: {\n lib: {\n entry: {\n${entryLines}\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: ${createKonvaExternalFunction()},\n output: {\n preserveModules: false,\n // Paths helps resolve external lodash imports correctly in the bundled output\n paths: (id) => {\n if (id.startsWith('lodash/')) {\n // Keep lodash subpath imports as-is so they resolve via import map\n return id;\n }\n return id;\n },\n },\n },\n },\n}${hasDemoDir ? '))' : ')'};\n`;\n }\n\n /**\n * Ensure IIFE entry point exists for element\n */\n private async ensureIifeEntryPoint(\n elementName: string,\n elementDir: string,\n _config: SyncConfig,\n _logger: any\n ): Promise<void> {\n const iifeEntryPath = join(elementDir, 'src/index.iife.ts');\n\n // Check if main entry point exists\n const mainEntryExists = existsAny([\n join(elementDir, 'src/index.ts'),\n join(elementDir, 'src/index.tsx'),\n ]);\n\n if (!mainEntryExists) {\n return; // No main entry, skip IIFE\n }\n\n const iifeContent = `/**\n * IIFE entry point for ${elementName} element\n * This file is only used for IIFE builds and includes auto-registration\n *\n * @sync-generated - Auto-generated during sync from pie-elements\n */\n\nimport Element from './index';\n\n// Auto-register the custom element for IIFE mode\nif (typeof window !== 'undefined' && !customElements.get('${elementName}-element')) {\n customElements.define('${elementName}-element', Element);\n}\n\n// Export for IIFE global\nexport default Element;\n`;\n\n await writeFile(iifeEntryPath, iifeContent, 'utf-8');\n }\n\n /**\n * Ensure IIFE Vite config exists for element\n */\n private async ensureIifeViteConfig(\n elementName: string,\n elementDir: string,\n _config: SyncConfig,\n _logger: any\n ): Promise<void> {\n const iifeViteConfigPath = join(elementDir, 'vite.config.iife.ts');\n\n // Check if IIFE entry exists\n if (!existsSync(join(elementDir, 'src/index.iife.ts'))) {\n return;\n }\n\n // Compute global name (e.g., \"hotspot\" → \"HotspotElement\")\n const globalName =\n elementName\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('') + 'Element';\n\n const config = `import { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8')) as {\n name?: string;\n version?: string;\n};\n\nconst resolveWorkspaceEntry = (baseDir: string): string | null => {\n const candidates = ['index.ts', 'index.tsx', 'index.js', 'index.jsx'];\n for (const candidate of candidates) {\n const fullPath = resolve(baseDir, candidate);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n};\n\nexport default defineConfig({\n plugins: [\n {\n name: 'iife-workspace-and-shim-resolver',\n enforce: 'pre',\n resolveId(id) {\n const sharedMatch = id.match(/^@pie-element\\\\/shared-(.+)$/);\n if (sharedMatch) {\n const entry = resolveWorkspaceEntry(resolve(__dirname, '../../shared', sharedMatch[1], 'src'));\n if (entry) {\n return entry;\n }\n }\n\n const pieLibMatch = id.match(/^@pie-lib\\\\/([^/]+)$/);\n if (pieLibMatch) {\n const entry = resolveWorkspaceEntry(resolve(__dirname, '../../lib-react', pieLibMatch[1], 'src'));\n if (entry) {\n return entry;\n }\n }\n\n if (id === 'debug') {\n return '\\\\0iife-debug-shim';\n }\n if (id === 'prop-types') {\n return '\\\\0iife-prop-types-shim';\n }\n },\n load(id) {\n if (id === '\\\\0iife-debug-shim') {\n return 'export default function debug() { return () => {}; }';\n }\n if (id === '\\\\0iife-prop-types-shim') {\n return \"const fn = () => null; const types = new Proxy(fn, { get: () => fn }); export default types;\";\n }\n },\n },\n react(),\n ],\n define: {\n 'process.env.NODE_ENV': JSON.stringify('production'),\n __PIE_PACKAGE_NAME__: JSON.stringify(packageJson.name ?? ''),\n __PIE_PACKAGE_VERSION__: JSON.stringify(packageJson.version ?? 'local'),\n },\n build: {\n emptyOutDir: false, // Don't wipe existing ESM builds\n lib: {\n entry: resolve(__dirname, 'src/index.iife.ts'),\n name: '${globalName}',\n fileName: () => 'index.iife.js',\n formats: ['iife'] as const,\n },\n rollupOptions: {\n external: (id: string) => {\n // Bundle everything including React and math-rendering\n // This creates a fully self-contained IIFE bundle\n return false;\n },\n output: {\n // IIFE global name\n name: '${globalName}',\n extend: true,\n },\n },\n },\n});\n`;\n\n await writeFile(iifeViteConfigPath, config, 'utf-8');\n }\n\n /**\n * Ensure element demo structure exists with new dev/production split\n */\n private async ensureElementDemoStructure(\n elementName: string,\n elementDir: string,\n config: SyncConfig,\n _logger: any\n ): Promise<void> {\n const upstreamDemoDir = join(config.pieElements, 'packages', elementName, 'docs/demo');\n\n // Only generate if upstream has demo files\n if (!existsSync(upstreamDemoDir)) {\n return;\n }\n\n const targetDemoDir = join(elementDir, 'docs/demo');\n await mkdir(targetDemoDir, { recursive: true });\n\n // Demo configs are maintained locally for the unified demo app (apps/element-demo).\n // We do NOT sync demo configs from upstream - each element should have its own\n // locally-maintained multi-demo config.mjs in docs/demo/.\n //\n // If a new element is synced and doesn't have a local demo config yet,\n // it should be created manually with multiple demo scenarios.\n //\n // The unified demo app showcases all elements with rich demo configurations,\n // so we maintain these locally rather than using upstream's single-demo configs.\n\n // Convert session.js (CommonJS) to session.mjs (ESM) if it exists upstream\n const sessionJs = join(upstreamDemoDir, 'session.js');\n const sessionMjs = join(upstreamDemoDir, 'session.mjs');\n\n let sessionContent: string | null = null;\n\n if (existsSync(sessionMjs)) {\n // If session.mjs exists, just copy it\n sessionContent = await readFile(sessionMjs, 'utf-8');\n } else if (existsSync(sessionJs)) {\n // Convert CommonJS session.js to ESM session.mjs\n const content = await readFile(sessionJs, 'utf-8');\n // Simple conversion: replace module.exports with export default\n sessionContent = content\n .replace(/module\\.exports\\s*=/, 'export default')\n .replace(/exports\\.\\w+\\s*=/g, 'export const');\n }\n\n if (sessionContent) {\n await writeFile(join(targetDemoDir, 'session.mjs'), sessionContent, 'utf-8');\n }\n\n // Demo configs are maintained locally - we do NOT apply overrides from upstream\n\n // Remove unused generate.js if config.mjs exists (from demo dir only)\n const configPath = join(targetDemoDir, 'config.mjs');\n const generatePath = join(targetDemoDir, 'generate.js');\n if (existsSync(configPath) && existsSync(generatePath)) {\n await fsRm(generatePath, { force: true });\n }\n }\n\n private async ensureTsConfig(\n elementName: string,\n elementDir: string,\n logger: any\n ): Promise<boolean> {\n if (!existsSync(elementDir)) {\n return false;\n }\n\n const tsConfigPath = join(elementDir, 'tsconfig.json');\n const tsConfig = this.generateTsConfig();\n\n // Check if tsconfig needs to be written\n const currentContent = existsSync(tsConfigPath)\n ? await readFile(tsConfigPath, 'utf-8').catch(() => null)\n : null;\n\n if (currentContent === tsConfig) {\n return false;\n }\n\n await writeFile(tsConfigPath, tsConfig, 'utf-8');\n if (logger.isVerbose()) {\n logger.success(` 📝 ${elementName}: generated tsconfig.json`);\n }\n return true;\n }\n\n private generateTsConfig(): string {\n return `{\n \"extends\": \"../../../tsconfig.declarations.json\",\n \"compilerOptions\": {\n \"outDir\": \"dist\",\n \"declarationDir\": \"dist\",\n \"rootDir\": \"src\"\n },\n \"include\": [\"src/**/*\"]\n}\n`;\n }\n}\n"]}
1
+ {"version":3,"file":"sync-react-strategy.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-react-strategy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * React components sync strategy - syncs React components from upstream pie-elements\n *\n * Synced from: pie-elements/packages/{element}/src/\n * Target: packages/elements-react/{element}/src/\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, stat as fsStat, writeFile, rm as fsRm } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { convertJsToTs, convertJsxToTsx } from '../../utils/conversion.js';\nimport { getCurrentCommit } from '../../utils/git.js';\nimport type { SyncStrategy, SyncContext, SyncConfig, SyncResult } from './sync-strategy.js';\nimport { cleanDirectory, existsAny, readdir } from './sync-filesystem.js';\nimport { createExternalFunction, createKonvaExternalFunction } from './sync-externals.js';\nimport { containsJsx } from './sync-imports.js';\nimport { createReactComponentTransformPipeline } from './sync-transforms.js';\nimport { ensureElementPackageJson } from './sync-package-manager.js';\nimport { isSubdirectoryCompatible } from './sync-compatibility.js';\nimport {\n EXCLUDED_UPSTREAM_ELEMENTS,\n IIFE_DEBUG_SHIM_SOURCE,\n IIFE_PROP_TYPES_SHIM_SOURCE,\n} from './sync-constants.js';\nimport { collectEntryPoints } from './sync-entry-discovery.js';\nimport { syncSourceTree } from './sync-source-tree.js';\nimport { seedContractForElement } from '../docs/contracts.js';\nimport type { ElementPackageInfo } from '../docs/types.js';\n\ninterface InternalSyncResult {\n filesChecked: number;\n filesCopied: number;\n filesSkipped: number;\n filesUpdated: number;\n}\n\ninterface PrivateTagConstant {\n name: string;\n tag: string;\n}\n\nconst PRIVATE_CHILD_TAGS: Record<string, PrivateTagConstant[]> = {\n ebsr: [\n { name: 'EBSR_MULTIPLE_CHOICE_TAG', tag: 'ebsr-multiple-choice' },\n { name: 'EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG', tag: 'ebsr-multiple-choice-configure' },\n ],\n 'complex-rubric': [\n { name: 'COMPLEX_RUBRIC_SIMPLE_TAG', tag: 'complex-rubric-simple' },\n { name: 'COMPLEX_RUBRIC_MULTI_TRAIT_TAG', tag: 'complex-rubric-multi-trait' },\n { name: 'COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG', tag: 'rubric-configure' },\n { name: 'COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG', tag: 'multi-trait-rubric-configure' },\n ],\n};\n\nexport function collectElementViteEntryPoints(elementDir: string): Record<string, string> {\n return collectEntryPoints(elementDir, [\n ['index', 'src/index'],\n ['controller/index', 'src/controller/index'],\n ['configure/index', 'src/configure/index'],\n ['delivery/index', 'src/delivery/index'],\n ['author/index', 'src/author/index'],\n ['print/index', 'src/print/index'],\n ['types/index', 'src/types/index'],\n ['runtime-support', 'src/runtime-support'],\n ]);\n}\n\nexport class ReactComponentsStrategy implements SyncStrategy {\n private touchedElementPackages = new Set<string>();\n private result: InternalSyncResult = {\n filesChecked: 0,\n filesCopied: 0,\n filesSkipped: 0,\n filesUpdated: 0,\n };\n\n getName(): string {\n return 'react-components';\n }\n\n getDescription(): string {\n return 'React components';\n }\n\n shouldRun(config: SyncConfig): boolean {\n return config.syncReactComponents;\n }\n\n async execute(context: SyncContext): Promise<SyncResult> {\n const { config, logger } = context;\n this.touchedElementPackages.clear();\n this.result = {\n filesChecked: 0,\n filesCopied: 0,\n filesSkipped: 0,\n filesUpdated: 0,\n };\n\n if (!logger.isVerbose()) {\n logger.progressStart('Syncing React components...');\n } else {\n logger.section('⚛️ Syncing React components');\n }\n\n const upstreamElementsDir = join(config.pieElements, 'packages');\n const targetBaseDir = join(config.pieElementsNg, 'packages/elements-react');\n\n const upstreamCommit = getCurrentCommit(config.pieElements);\n\n const packages = await readdir(upstreamElementsDir);\n\n for (const pkg of packages) {\n if (EXCLUDED_UPSTREAM_ELEMENTS.includes(pkg as (typeof EXCLUDED_UPSTREAM_ELEMENTS)[number])) {\n if (context.packageFilter && pkg !== context.packageFilter) {\n continue;\n }\n\n const targetDir = join(targetBaseDir, pkg);\n const hasControllerSource = existsAny([\n join(targetDir, 'src/controller/index.ts'),\n join(targetDir, 'src/controller/index.tsx'),\n join(targetDir, 'src/controller/index.js'),\n join(targetDir, 'src/controller/index.jsx'),\n ]);\n if (!config.dryRun && existsSync(targetDir) && hasControllerSource) {\n await ensureElementPackageJson(pkg, targetDir, config);\n }\n continue;\n }\n\n if (context.packageFilter && pkg !== context.packageFilter) {\n continue;\n }\n\n // Check if element is in compatibility report (ESM-compatible)\n if (context.compatibilityReport) {\n if (!context.compatibilityReport.elements.includes(pkg)) {\n continue; // Skip non-compatible elements\n }\n\n // Check if student UI (src/) is ESM-compatible\n if (!isSubdirectoryCompatible(pkg, 'src', context)) {\n if (logger.isVerbose()) {\n logger.info(` ⏭️ ${pkg}: skipping src/ (not ESM-compatible)`);\n }\n continue;\n }\n }\n\n // Check if React component exists upstream (src/ directory)\n const componentSrcDir = join(upstreamElementsDir, pkg, 'src');\n if (!existsSync(componentSrcDir)) {\n continue;\n }\n\n // Target: packages/elements-react/{element}/src/\n const targetDir = join(targetBaseDir, pkg);\n const targetSrcDir = join(targetDir, 'src');\n\n // Clean target src subtree first so removed upstream files don't linger\n // BUT: preserve controller/ subdirectory if it exists (synced separately)\n await this.cleanTargetDirExcept(\n targetSrcDir,\n ['controller'],\n `elements-react/${pkg}/src`,\n logger,\n config.dryRun\n );\n\n // Recursively sync all files from src/ directory to delivery/ subdirectory\n const beforeChanges = this.result.filesCopied + this.result.filesUpdated;\n const targetDeliveryDir = join(targetDir, 'src/delivery');\n let elementFilesProcessed = await this.syncDirectory(\n componentSrcDir,\n targetDeliveryDir,\n 'src',\n pkg,\n upstreamCommit\n );\n\n // Also sync configure/ if it exists and is ESM-compatible\n // Note: Renamed to author/ in the target directory\n const configureDir = join(upstreamElementsDir, pkg, 'configure');\n if (existsSync(configureDir)) {\n // Check if configure subdirectory is ESM-compatible\n const configureCompatible = isSubdirectoryCompatible(pkg, 'configure', context);\n if (configureCompatible) {\n // First, sync configure/src/ -> src/author/\n const configureSrcDir = join(configureDir, 'src');\n if (existsSync(configureSrcDir)) {\n const targetAuthorDir = join(targetDir, 'src/author');\n const configureFilesProcessed = await this.syncDirectory(\n configureSrcDir,\n targetAuthorDir,\n 'configure/src',\n pkg,\n upstreamCommit\n );\n elementFilesProcessed += configureFilesProcessed;\n }\n\n // Then, sync configure/*.js files (not in subdirectories) -> src/author/\n // These are utility files that live directly in configure/ like utils.js\n const targetAuthorDir = join(targetDir, 'src/author');\n const configureRootFilesProcessed = await this.syncConfigureRootFiles(\n configureDir,\n targetAuthorDir,\n pkg,\n upstreamCommit\n );\n elementFilesProcessed += configureRootFilesProcessed;\n } else if (logger.isVerbose()) {\n logger.info(` ⏭️ ${pkg}: skipping configure/ (not ESM-compatible)`);\n }\n }\n\n // Sync print file if it exists (src/print.js -> src/print/index.ts)\n const upstreamPrintFile = join(componentSrcDir, 'print.js');\n if (existsSync(upstreamPrintFile)) {\n const targetPrintDir = join(targetDir, 'src/print');\n const printFilesProcessed = await this.syncPrintFile(\n upstreamPrintFile,\n targetPrintDir,\n pkg,\n upstreamCommit\n );\n elementFilesProcessed += printFilesProcessed;\n }\n\n const wrotePrivateChildSupport = await this.ensurePrivateChildElementSupport(pkg, targetDir);\n\n // Generate src/index.ts that re-exports from delivery/\n const mainIndexPath = join(targetDir, 'src/index.ts');\n const mainIndexContent = `export { default } from './delivery/index.js';\\n`;\n await writeFile(mainIndexPath, mainIndexContent, 'utf-8');\n\n const afterChanges = this.result.filesCopied + this.result.filesUpdated;\n const elementChanged = afterChanges > beforeChanges;\n\n if (elementFilesProcessed > 0 && logger.isVerbose()) {\n logger.success(` ✨ ${pkg}: ${elementFilesProcessed} file(s) synced`);\n }\n\n const elementDir = join(targetBaseDir, pkg);\n\n // Ensure IIFE files exist before generating package.json scripts.\n // package.json generation derives the build script from presence of iife files.\n await this.ensureIifeEntryPoint(pkg, elementDir, config, logger);\n await this.ensureIifeViteConfig(pkg, elementDir, config, logger);\n\n // Ensure package.json has ESM module support and expected exports.\n let wrotePkgJson = false;\n wrotePkgJson = await ensureElementPackageJson(pkg, elementDir, config, {\n includeBrowserExports: true,\n });\n await this.ensureElementViteConfig(pkg, elementDir, logger);\n const wroteTsConfig = await this.ensureTsConfig(pkg, elementDir, logger);\n\n // Ensure demo structure\n await this.ensureElementDemoStructure(pkg, elementDir, config, logger);\n // Demo configs are maintained locally - we do NOT apply overrides from upstream\n\n if (!config.dryRun) {\n const packageJsonPath = join(elementDir, 'package.json');\n const packageJsonRaw = existsSync(packageJsonPath)\n ? (JSON.parse(await readFile(packageJsonPath, 'utf-8')) as Record<string, unknown>)\n : {};\n const packageInfo: ElementPackageInfo = {\n elementName: pkg,\n packageName:\n typeof packageJsonRaw.name === 'string' ? packageJsonRaw.name : `@pie-element/${pkg}`,\n framework: 'react',\n packageDir: elementDir,\n packageDescription:\n typeof packageJsonRaw.description === 'string' ? packageJsonRaw.description : undefined,\n exportsMap:\n packageJsonRaw.exports && typeof packageJsonRaw.exports === 'object'\n ? (packageJsonRaw.exports as Record<string, unknown>)\n : undefined,\n };\n await seedContractForElement(packageInfo, config.pieElementsNg, { refresh: true });\n }\n\n if (elementChanged || wrotePrivateChildSupport || wrotePkgJson || wroteTsConfig) {\n this.touchedElementPackages.add(pkg);\n }\n }\n\n // Demo configs are maintained locally - we do NOT apply overrides to existing elements\n\n if (!logger.isVerbose()) {\n logger.progressCompleteWithCount(this.touchedElementPackages.size, 'packages');\n } else {\n logger.info(`\\nSynced ${this.touchedElementPackages.size} React component package(s)`);\n }\n return {\n count: this.touchedElementPackages.size,\n packageNames: Array.from(this.touchedElementPackages).sort(),\n };\n }\n\n private async cleanTargetDirExcept(\n targetDir: string,\n preserveDirs: string[],\n label: string,\n logger: any,\n dryRun: boolean\n ): Promise<void> {\n await cleanDirectory(\n targetDir,\n label,\n { dryRun, verbose: false, preserve: preserveDirs },\n logger\n );\n }\n\n private async syncDirectory(\n sourceDir: string,\n targetDir: string,\n relativePath: string,\n pkg: string,\n upstreamCommit: string\n ): Promise<number> {\n const packageName = `@pie-element/${pkg}`;\n const transformPipeline = createReactComponentTransformPipeline(packageName);\n const stats = await syncSourceTree({\n sourceDir,\n targetDir,\n relativePath,\n sourcePathPrefix: `pie-elements/packages/${pkg}`,\n upstreamCommit,\n transform: (content, context) => transformPipeline(content, context.relativeFilePath),\n skipFile: (fileName) => fileName === 'print.js' || fileName === 'print.jsx',\n });\n\n this.result.filesChecked += stats.filesChecked;\n this.result.filesCopied += stats.filesCopied;\n this.result.filesSkipped += stats.filesSkipped;\n this.result.filesUpdated += stats.filesUpdated;\n\n return stats.filesProcessed;\n }\n\n /**\n * Sync root-level .js files from configure/ directory (not including subdirectories)\n * These are typically utility files like utils.js that are imported by files in configure/src/\n */\n private async syncConfigureRootFiles(\n sourceDir: string,\n targetDir: string,\n pkg: string,\n upstreamCommit: string\n ): Promise<number> {\n let filesProcessed = 0;\n\n const items = await readdir(sourceDir);\n\n for (const item of items) {\n const srcPath = join(sourceDir, item);\n const stat = await fsStat(srcPath);\n\n // Skip directories - we only want root-level files\n if (stat.isDirectory()) {\n continue;\n }\n\n // Only process .js and .jsx files\n if (!item.endsWith('.js') && !item.endsWith('.jsx')) {\n continue;\n }\n\n this.result.filesChecked++;\n filesProcessed++;\n\n // Read source\n let sourceContent = await readFile(srcPath, 'utf-8');\n\n // Apply all standard transformations\n const packageName = `@pie-element/${pkg}`;\n const transformPipeline = createReactComponentTransformPipeline(packageName);\n sourceContent = transformPipeline(sourceContent);\n\n const hasJsx = item.endsWith('.jsx') || (item.endsWith('.js') && containsJsx(sourceContent));\n\n // Convert .js → .ts/.tsx and .jsx → .tsx\n const targetFile = item.replace(/\\.jsx?$/, hasJsx ? '.tsx' : '.ts');\n const targetPath = join(targetDir, targetFile);\n\n // Convert based on file extension\n const conversionResult = hasJsx\n ? convertJsxToTsx(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/configure/${item}`,\n commit: upstreamCommit,\n })\n : convertJsToTs(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/configure/${item}`,\n commit: upstreamCommit,\n });\n\n const converted = conversionResult.code;\n\n // Check if file already exists (synced from configure/src/)\n const isNew = !existsSync(targetPath);\n if (!isNew) {\n // File exists - this means configure/src/utils.js was already synced\n // We need to merge the exports instead of overwriting\n const existingContent = await readFile(targetPath, 'utf-8');\n\n // Extract exports from both files and merge them\n const mergedContent = this.mergeUtilsFiles(existingContent, converted);\n\n if (existingContent === mergedContent) {\n this.result.filesSkipped++;\n continue;\n }\n\n await writeFile(targetPath, mergedContent, 'utf-8');\n this.result.filesUpdated++;\n } else {\n // New file - just write it\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(targetPath, converted, 'utf-8');\n this.result.filesCopied++;\n }\n }\n\n return filesProcessed;\n }\n\n private async ensurePrivateChildElementSupport(\n pkg: string,\n elementDir: string\n ): Promise<boolean> {\n const tags = PRIVATE_CHILD_TAGS[pkg];\n if (!tags) {\n return false;\n }\n\n let changed = await this.ensurePrivateTagsFile(elementDir, tags);\n\n if (pkg === 'ebsr') {\n changed = (await this.ensureEbsrPrivateChildReferences(elementDir)) || changed;\n }\n\n if (pkg === 'complex-rubric') {\n changed = (await this.ensureComplexRubricPrivateChildReferences(elementDir)) || changed;\n }\n\n return changed;\n }\n\n private async ensurePrivateTagsFile(\n elementDir: string,\n tags: PrivateTagConstant[]\n ): Promise<boolean> {\n const privateTagsPath = join(elementDir, 'src/private-tags.ts');\n const exports = tags.map(\n ({ name, tag }) => `export const ${name} = \\`${tag}\\${ownerVersionSuffix}\\`;`\n );\n const content = `declare const __PIE_PACKAGE_VERSION__: string | undefined;\n\nconst encodeVersionForTag = (version: string): string =>\n version\n .trim()\n .toLowerCase()\n .replace(/[.+]/g, '-')\n .replace(/[^0-9A-Za-z-]/g, '-')\n .replace(/-{2,}/g, '-');\n\nconst ownerVersion =\n typeof __PIE_PACKAGE_VERSION__ === 'string' && __PIE_PACKAGE_VERSION__.trim()\n ? __PIE_PACKAGE_VERSION__\n : 'local';\nconst ownerVersionSuffix = \\`--version-\\${encodeVersionForTag(ownerVersion)}\\`;\n\n${exports.join('\\n')}\n`;\n\n const current = existsSync(privateTagsPath)\n ? await readFile(privateTagsPath, 'utf-8').catch(() => null)\n : null;\n if (current === content) {\n return false;\n }\n\n await mkdir(dirname(privateTagsPath), { recursive: true });\n await writeFile(privateTagsPath, content, 'utf-8');\n return true;\n }\n\n private async ensureEbsrPrivateChildReferences(elementDir: string): Promise<boolean> {\n let changed = false;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/delivery/index.tsx'), [\n {\n from: \"import debug from 'debug';\\n\",\n to: \"import debug from 'debug';\\nimport { EBSR_MULTIPLE_CHOICE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const MC_TAG_NAME = 'ebsr-multiple-choice';\",\n to: 'const MC_TAG_NAME = EBSR_MULTIPLE_CHOICE_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/print/index.tsx'), [\n {\n from: \"import { SessionChangedEvent } from '@pie-element/shared-player-events';\\n\",\n to: \"import { SessionChangedEvent } from '@pie-element/shared-player-events';\\nimport { EBSR_MULTIPLE_CHOICE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const MC_TAG_NAME = 'ebsr-multiple-choice';\",\n to: 'const MC_TAG_NAME = EBSR_MULTIPLE_CHOICE_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/index.ts'), [\n {\n from: \"import Main from './main';\\n\",\n to: \"import Main from './main';\\nimport { EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const MC_TAG_NAME = 'ebsr-multiple-choice-configure';\",\n to: 'const MC_TAG_NAME = EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG;',\n },\n {\n from: ' configuration: this._configuration,\\n',\n to: ' configuration: this._configuration,\\n multipleChoiceTagName: MC_TAG_NAME,\\n',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/main.tsx'), [\n {\n from: \"import { styled } from '@mui/material/styles';\\n\",\n to: \"import { styled } from '@mui/material/styles';\\nimport { EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: ` configuration: PropTypes.object,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,`,\n to: ` configuration: PropTypes.object,\n model: PropTypes.object,\n multipleChoiceTagName: PropTypes.string,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,`,\n },\n {\n from: ' const { model, configuration, onConfigurationChanged } = this.props;\\n',\n to: ` const {\n model,\n configuration,\n multipleChoiceTagName = EBSR_MULTIPLE_CHOICE_CONFIGURE_TAG,\n onConfigurationChanged,\n } = this.props;\n const MultipleChoiceConfigureElement = multipleChoiceTagName;\n`,\n },\n {\n from: '<ebsr-multiple-choice-configure',\n to: '<MultipleChoiceConfigureElement',\n },\n {\n from: '</ebsr-multiple-choice-configure>',\n to: '</MultipleChoiceConfigureElement>',\n },\n ])) || changed;\n\n return changed;\n }\n\n private async ensureComplexRubricPrivateChildReferences(elementDir: string): Promise<boolean> {\n let changed = false;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/delivery/index.ts'), [\n {\n from: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\n\",\n to: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\nimport { COMPLEX_RUBRIC_MULTI_TRAIT_TAG, COMPLEX_RUBRIC_SIMPLE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const RUBRIC_TAG_NAME = 'complex-rubric-simple';\",\n to: 'const RUBRIC_TAG_NAME = COMPLEX_RUBRIC_SIMPLE_TAG;',\n },\n {\n from: \"const MULTI_TRAIT_RUBRIC_TAG_NAME = 'complex-rubric-multi-trait';\",\n to: 'const MULTI_TRAIT_RUBRIC_TAG_NAME = COMPLEX_RUBRIC_MULTI_TRAIT_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/print/index.ts'), [\n {\n from: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\n\",\n to: \"import { RUBRIC_TYPES } from '@pie-lib/rubric';\\nimport { COMPLEX_RUBRIC_MULTI_TRAIT_TAG, COMPLEX_RUBRIC_SIMPLE_TAG } from '../private-tags.js';\\n\",\n },\n {\n from: \"const RUBRIC_TAG_NAME = 'complex-rubric-simple';\",\n to: 'const RUBRIC_TAG_NAME = COMPLEX_RUBRIC_SIMPLE_TAG;',\n },\n {\n from: \"const MULTI_TRAIT_RUBRIC_TAG_NAME = 'complex-rubric-multi-trait';\",\n to: 'const MULTI_TRAIT_RUBRIC_TAG_NAME = COMPLEX_RUBRIC_MULTI_TRAIT_TAG;',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/index.ts'), [\n {\n from: \"import sensibleDefaults from './defaults';\\n\",\n to: \"import sensibleDefaults from './defaults';\\nimport {\\n COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG,\\n COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG,\\n} from '../private-tags.js';\\n\",\n },\n {\n from: \"const RUBRIC_TAG_NAME = 'rubric-configure';\",\n to: 'const RUBRIC_TAG_NAME = COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG;',\n },\n {\n from: \"const MULTI_TRAIT_RUBRIC_TAG_NAME = 'multi-trait-rubric-configure';\",\n to: 'const MULTI_TRAIT_RUBRIC_TAG_NAME = COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG;',\n },\n {\n from: ' configuration: this._configuration,\\n',\n to: ' configuration: this._configuration,\\n multiTraitRubricTagName: MULTI_TRAIT_RUBRIC_TAG_NAME,\\n',\n },\n {\n from: ' onConfigurationChanged: this.onConfigurationChanged,\\n',\n to: ' onConfigurationChanged: this.onConfigurationChanged,\\n simpleRubricTagName: RUBRIC_TAG_NAME,\\n',\n },\n ])) || changed;\n\n changed =\n (await this.replaceInSyncedFile(join(elementDir, 'src/author/main.tsx'), [\n {\n from: \"import { color } from '@pie-lib/render-ui';\\n\",\n to: \"import { color } from '@pie-lib/render-ui';\\nimport {\\n COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG,\\n COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG,\\n} from '../private-tags.js';\\n\",\n },\n {\n from: ` canUpdateModel: PropTypes.bool,\n configuration: PropTypes.object,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,`,\n to: ` canUpdateModel: PropTypes.bool,\n configuration: PropTypes.object,\n multiTraitRubricTagName: PropTypes.string,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,\n simpleRubricTagName: PropTypes.string,`,\n },\n {\n from: ' const { model, configuration, canUpdateModel } = this.props;\\n',\n to: ` const {\n model,\n configuration,\n canUpdateModel,\n multiTraitRubricTagName = COMPLEX_RUBRIC_MULTI_TRAIT_CONFIGURE_TAG,\n simpleRubricTagName = COMPLEX_RUBRIC_SIMPLE_CONFIGURE_TAG,\n } = this.props;\n const MultiTraitRubricConfigureElement = multiTraitRubricTagName;\n const SimpleRubricConfigureElement = simpleRubricTagName;\n`,\n },\n { from: '<rubric-configure', to: '<SimpleRubricConfigureElement' },\n { from: '</rubric-configure>', to: '</SimpleRubricConfigureElement>' },\n { from: '<multi-trait-rubric-configure', to: '<MultiTraitRubricConfigureElement' },\n {\n from: '</multi-trait-rubric-configure>',\n to: '</MultiTraitRubricConfigureElement>',\n },\n ])) || changed;\n\n return changed;\n }\n\n private async replaceInSyncedFile(\n filePath: string,\n replacements: Array<{ from: string; to: string }>\n ): Promise<boolean> {\n if (!existsSync(filePath)) {\n return false;\n }\n\n const original = await readFile(filePath, 'utf-8');\n let next = original;\n\n for (const { from, to } of replacements) {\n if (!next.includes(from)) {\n continue;\n }\n next = next.split(from).join(to);\n }\n\n if (next === original) {\n return false;\n }\n\n await writeFile(filePath, next, 'utf-8');\n return true;\n }\n\n /**\n * Sync a single print file (src/print.js -> src/print/index.ts)\n */\n private async syncPrintFile(\n sourceFile: string,\n targetDir: string,\n pkg: string,\n upstreamCommit: string\n ): Promise<number> {\n this.result.filesChecked++;\n\n // Read source\n let sourceContent = await readFile(sourceFile, 'utf-8');\n\n // Apply all standard transformations\n const packageName = `@pie-element/${pkg}`;\n const transformPipeline = createReactComponentTransformPipeline(packageName);\n sourceContent = transformPipeline(sourceContent);\n\n // Transform imports from './' to '../delivery/' since print is now in print/\n // This handles './main', './stimulus-tabs', './choice', etc.\n sourceContent = sourceContent.replace(/from\\s+['\"]\\.\\/([^'\"]+)['\"]/g, \"from '../delivery/$1'\");\n sourceContent = sourceContent.replace(\n /import\\s*\\(\\s*['\"]\\.\\/([^'\"]+)['\"]\\s*\\)/g,\n \"import('../delivery/$1')\"\n );\n\n const hasJsx = sourceContent.includes('React.createElement') || containsJsx(sourceContent);\n\n // Convert to TypeScript\n const conversionResult = hasJsx\n ? convertJsxToTsx(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/src/print.js`,\n commit: upstreamCommit,\n })\n : convertJsToTs(sourceContent, {\n sourcePath: `pie-elements/packages/${pkg}/src/print.js`,\n commit: upstreamCommit,\n });\n\n const converted = conversionResult.code;\n const targetFile = hasJsx ? 'index.tsx' : 'index.ts';\n const targetPath = join(targetDir, targetFile);\n\n // Check if needs update\n const isNew = !existsSync(targetPath);\n if (!isNew) {\n const existingContent = await readFile(targetPath, 'utf-8');\n if (existingContent === converted) {\n this.result.filesSkipped++;\n return 1;\n }\n await writeFile(targetPath, converted, 'utf-8');\n this.result.filesUpdated++;\n } else {\n await mkdir(targetDir, { recursive: true });\n await writeFile(targetPath, converted, 'utf-8');\n this.result.filesCopied++;\n }\n\n return 1;\n }\n\n /**\n * Merge two utils files by combining their exports\n *\n * When syncing configure/ files, we may have:\n * - configure/src/utils.js (already synced to src/configure/utils.ts)\n * - configure/utils.js (being synced now to src/configure/utils.ts)\n *\n * Both files export different functions, so we need to merge them.\n */\n private mergeUtilsFiles(existingContent: string, newContent: string): string {\n // Extract the header comment from existing file (has sync metadata)\n const headerMatch = existingContent.match(/^\\/\\/ @ts-nocheck\\n\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/);\n const existingHeader = headerMatch ? headerMatch[0] : '';\n\n // Extract exports from existing file (remove header and blank lines)\n const existingExports = existingContent\n .replace(/^\\/\\/ @ts-nocheck\\n\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/, '')\n .trim();\n\n // Extract exports from new file (remove header and blank lines)\n const newExports = newContent.replace(/^\\/\\/ @ts-nocheck\\n\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/, '').trim();\n\n // Combine: use existing header + both sets of exports\n return `${existingHeader}${existingExports}\\n\\n${newExports}\\n`;\n }\n\n private async ensureElementViteConfig(\n _elementName: string,\n elementDir: string,\n _logger: any\n ): Promise<void> {\n if (!existsSync(elementDir)) {\n return;\n }\n\n const viteConfigPath = join(elementDir, 'vite.config.ts');\n\n // Always regenerate to reflect current directory structure\n // (e.g., if configure/ was skipped due to ESM incompatibility)\n\n const entryPoints = collectElementViteEntryPoints(elementDir);\n\n if (Object.keys(entryPoints).length === 0) {\n return; // No entry points, skip vite config\n }\n\n // Format entry points for vite config\n const entryLines = Object.entries(entryPoints)\n .map(([key, value]) => ` '${key}': resolve(__dirname, '${value}'),`)\n .join('\\n');\n\n // Konva is now external like other dependencies - no special bundling needed\n // This avoids workspace dependency resolution issues\n const shouldBundleKonva = false;\n\n // Check if demo directory exists\n const hasDemoDir = existsSync(join(elementDir, 'docs/demo'));\n\n // Generate appropriate config based on element characteristics\n const viteConfig = shouldBundleKonva\n ? this.generateViteConfigWithBundledKonva(entryLines, hasDemoDir)\n : this.generateStandardViteConfig(entryLines, hasDemoDir);\n\n await writeFile(viteConfigPath, viteConfig, 'utf-8');\n }\n\n private generateStandardViteConfig(entryLines: string, hasDemoDir: boolean): string {\n const demoModeConfig = hasDemoDir\n ? `({ mode, command }) => {\n // Demo mode: serve the docs/demo directory\n if (mode === 'demo' && command === 'serve') {\n return {\n plugins: [react()],\n root: resolve(__dirname, 'docs/demo'),\n };\n }\n\n // Build mode: build the library\n return {`\n : `{`;\n\n return `import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8')) as {\n name?: string;\n version?: string;\n};\n\nexport default defineConfig(${demoModeConfig}\n plugins: [react()],\n define: {\n __PIE_PACKAGE_NAME__: JSON.stringify(packageJson.name ?? ''),\n __PIE_PACKAGE_VERSION__: JSON.stringify(packageJson.version ?? 'local'),\n },\n build: {\n lib: {\n entry: {\n${entryLines}\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: ${createExternalFunction('element')},\n output: {\n preserveModules: true,\n preserveModulesRoot: 'src',\n },\n },\n },${hasDemoDir ? '\\n };' : ''}\n});\n`;\n }\n\n private generateViteConfigWithBundledKonva(entryLines: string, hasDemoDir: boolean): string {\n const demoModeConfig = hasDemoDir\n ? `({ mode, command }) => ({\n plugins: [react()],\n // Only change root for demo mode when serving (not building)\n root: mode === 'demo' && command === 'serve' ? resolve(__dirname, 'docs/demo') : __dirname,`\n : `{\n plugins: [react()],`;\n\n return `import { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig(${demoModeConfig}\n build: {\n lib: {\n entry: {\n${entryLines}\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: ${createKonvaExternalFunction()},\n output: {\n preserveModules: false,\n // Paths helps resolve external lodash imports correctly in the bundled output\n paths: (id) => {\n if (id.startsWith('lodash/')) {\n // Keep lodash subpath imports as-is so they resolve via import map\n return id;\n }\n return id;\n },\n },\n },\n },\n}${hasDemoDir ? '))' : ')'};\n`;\n }\n\n /**\n * Ensure IIFE entry point exists for element\n */\n private async ensureIifeEntryPoint(\n elementName: string,\n elementDir: string,\n _config: SyncConfig,\n _logger: any\n ): Promise<void> {\n const iifeEntryPath = join(elementDir, 'src/index.iife.ts');\n\n // Check if main entry point exists\n const mainEntryExists = existsAny([\n join(elementDir, 'src/index.ts'),\n join(elementDir, 'src/index.tsx'),\n ]);\n\n if (!mainEntryExists) {\n return; // No main entry, skip IIFE\n }\n\n const iifeContent = `/**\n * IIFE entry point for ${elementName} element\n * This file is only used for IIFE builds and includes auto-registration\n *\n * @sync-generated - Auto-generated during sync from pie-elements\n */\n\nimport Element from './index';\n\n// Auto-register the custom element for IIFE mode\nif (typeof window !== 'undefined' && !customElements.get('${elementName}-element')) {\n customElements.define('${elementName}-element', Element);\n}\n\n// Export for IIFE global\nexport default Element;\n`;\n\n await writeFile(iifeEntryPath, iifeContent, 'utf-8');\n }\n\n /**\n * Ensure IIFE Vite config exists for element\n */\n private async ensureIifeViteConfig(\n elementName: string,\n elementDir: string,\n _config: SyncConfig,\n _logger: any\n ): Promise<void> {\n const iifeViteConfigPath = join(elementDir, 'vite.config.iife.ts');\n\n // Check if IIFE entry exists\n if (!existsSync(join(elementDir, 'src/index.iife.ts'))) {\n return;\n }\n\n // Compute global name (e.g., \"hotspot\" → \"HotspotElement\")\n const globalName =\n elementName\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('') + 'Element';\n\n const config = `import { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8')) as {\n name?: string;\n version?: string;\n};\n\nconst resolveWorkspaceEntry = (baseDir: string): string | null => {\n const candidates = ['index.ts', 'index.tsx', 'index.js', 'index.jsx'];\n for (const candidate of candidates) {\n const fullPath = resolve(baseDir, candidate);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n};\n\nexport default defineConfig({\n plugins: [\n {\n name: 'iife-workspace-and-shim-resolver',\n enforce: 'pre',\n resolveId(id) {\n const sharedMatch = id.match(/^@pie-element\\\\/shared-(.+)$/);\n if (sharedMatch) {\n const entry = resolveWorkspaceEntry(resolve(__dirname, '../../shared', sharedMatch[1], 'src'));\n if (entry) {\n return entry;\n }\n }\n\n const pieLibMatch = id.match(/^@pie-lib\\\\/([^/]+)$/);\n if (pieLibMatch) {\n const entry = resolveWorkspaceEntry(resolve(__dirname, '../../lib-react', pieLibMatch[1], 'src'));\n if (entry) {\n return entry;\n }\n }\n\n if (id === 'debug') {\n return '\\\\0iife-debug-shim';\n }\n if (id === 'prop-types') {\n return '\\\\0iife-prop-types-shim';\n }\n },\n load(id) {\n if (id === '\\\\0iife-debug-shim') {\n return ${JSON.stringify(IIFE_DEBUG_SHIM_SOURCE)};\n }\n if (id === '\\\\0iife-prop-types-shim') {\n return ${JSON.stringify(IIFE_PROP_TYPES_SHIM_SOURCE)};\n }\n },\n },\n react(),\n ],\n define: {\n 'process.env.NODE_ENV': JSON.stringify('production'),\n __PIE_PACKAGE_NAME__: JSON.stringify(packageJson.name ?? ''),\n __PIE_PACKAGE_VERSION__: JSON.stringify(packageJson.version ?? 'local'),\n },\n build: {\n emptyOutDir: false, // Don't wipe existing ESM builds\n lib: {\n entry: resolve(__dirname, 'src/index.iife.ts'),\n name: '${globalName}',\n fileName: () => 'index.iife.js',\n formats: ['iife'] as const,\n },\n rollupOptions: {\n external: (id: string) => {\n // Bundle everything including React and math-rendering\n // This creates a fully self-contained IIFE bundle\n return false;\n },\n output: {\n // IIFE global name\n name: '${globalName}',\n extend: true,\n },\n },\n },\n});\n`;\n\n await writeFile(iifeViteConfigPath, config, 'utf-8');\n }\n\n /**\n * Ensure element demo structure exists with new dev/production split\n */\n private async ensureElementDemoStructure(\n elementName: string,\n elementDir: string,\n config: SyncConfig,\n _logger: any\n ): Promise<void> {\n const upstreamDemoDir = join(config.pieElements, 'packages', elementName, 'docs/demo');\n\n // Only generate if upstream has demo files\n if (!existsSync(upstreamDemoDir)) {\n return;\n }\n\n const targetDemoDir = join(elementDir, 'docs/demo');\n await mkdir(targetDemoDir, { recursive: true });\n\n // Demo configs are maintained locally for the unified demo app (apps/element-demo).\n // We do NOT sync demo configs from upstream - each element should have its own\n // locally-maintained multi-demo config.mjs in docs/demo/.\n //\n // If a new element is synced and doesn't have a local demo config yet,\n // it should be created manually with multiple demo scenarios.\n //\n // The unified demo app showcases all elements with rich demo configurations,\n // so we maintain these locally rather than using upstream's single-demo configs.\n\n // Convert session.js (CommonJS) to session.mjs (ESM) if it exists upstream\n const sessionJs = join(upstreamDemoDir, 'session.js');\n const sessionMjs = join(upstreamDemoDir, 'session.mjs');\n\n let sessionContent: string | null = null;\n\n if (existsSync(sessionMjs)) {\n // If session.mjs exists, just copy it\n sessionContent = await readFile(sessionMjs, 'utf-8');\n } else if (existsSync(sessionJs)) {\n // Convert CommonJS session.js to ESM session.mjs\n const content = await readFile(sessionJs, 'utf-8');\n // Simple conversion: replace module.exports with export default\n sessionContent = content\n .replace(/module\\.exports\\s*=/, 'export default')\n .replace(/exports\\.\\w+\\s*=/g, 'export const');\n }\n\n if (sessionContent) {\n await writeFile(join(targetDemoDir, 'session.mjs'), sessionContent, 'utf-8');\n }\n\n // Demo configs are maintained locally - we do NOT apply overrides from upstream\n\n // Remove unused generate.js if config.mjs exists (from demo dir only)\n const configPath = join(targetDemoDir, 'config.mjs');\n const generatePath = join(targetDemoDir, 'generate.js');\n if (existsSync(configPath) && existsSync(generatePath)) {\n await fsRm(generatePath, { force: true });\n }\n }\n\n private async ensureTsConfig(\n elementName: string,\n elementDir: string,\n logger: any\n ): Promise<boolean> {\n if (!existsSync(elementDir)) {\n return false;\n }\n\n const tsConfigPath = join(elementDir, 'tsconfig.json');\n const tsConfig = this.generateTsConfig();\n\n // Check if tsconfig needs to be written\n const currentContent = existsSync(tsConfigPath)\n ? await readFile(tsConfigPath, 'utf-8').catch(() => null)\n : null;\n\n if (currentContent === tsConfig) {\n return false;\n }\n\n await writeFile(tsConfigPath, tsConfig, 'utf-8');\n if (logger.isVerbose()) {\n logger.success(` 📝 ${elementName}: generated tsconfig.json`);\n }\n return true;\n }\n\n private generateTsConfig(): string {\n return `{\n \"extends\": \"../../../tsconfig.declarations.json\",\n \"compilerOptions\": {\n \"outDir\": \"dist\",\n \"declarationDir\": \"dist\",\n \"rootDir\": \"src\"\n },\n \"include\": [\"src/**/*\"]\n}\n`;\n }\n}\n"]}
@@ -28,7 +28,7 @@ export interface TransformOptions {
28
28
  * This ensures consistent transformation across all sync strategies:
29
29
  * 1. lodash/lodash-es → @pie-element/shared-lodash (vendored ESM helpers)
30
30
  * 2. @pie-framework event packages → internal packages
31
- * 3. @pie-lib/controller-utils → @pie-framework/controller-utils
31
+ * 3. @pie-lib/controller-utils → @pie-element/shared-controller-utils
32
32
  * 4. @pie-lib shared packages → @pie-element/shared-*
33
33
  * 5. @mui/material/Menu → InlineMenu from @pie-lib/render-ui
34
34
  * 6. Self-referential imports → relative imports
@@ -43,7 +43,7 @@ export declare function applySourceTransforms(content: string, options?: Transfo
43
43
  * Ensures consistent dependency transformations across all packages:
44
44
  * 1. lodash/lodash-es → @pie-element/shared-lodash
45
45
  * 2. @pie-framework event packages → internal packages
46
- * 3. @pie-lib/controller-utils → @pie-framework/controller-utils
46
+ * 3. @pie-lib/controller-utils → @pie-element/shared-controller-utils
47
47
  * 4. @pie-lib shared packages → @pie-element/shared-*
48
48
  * 5. Preserve upstream @pie-framework/mathquill dependency versions from synced package.json
49
49
  */
@@ -5,14 +5,14 @@
5
5
  * composable pipeline to reduce duplication and ensure consistent transformations
6
6
  * across all sync strategies.
7
7
  */
8
- import { transformLodashToVendoredLodash, transformKnownDeepImportsToFullySpecified, transformPieFrameworkEventImports, transformControllerUtilsImports, transformSharedPackageImports, transformLegacyConfigureLibImports, inlineEditableHtmlConstants, reexportTokenTypes, transformSsrRequireToEsmImport, inlineConfigureDefaults, transformConfigureUtilsImports, transformSelfReferentialImports, transformPackageJsonLodash, transformPackageJsonRecharts, transformPackageJsonPieEvents, transformPackageJsonControllerUtils, transformPackageJsonSharedPackages, fixStyledComponentTypes, fixExportedFunctionTypes, transformMenuToInlineMenu, addInlineMenuExport, transformReactInteropComponentImports, transformClassnamesToClsx, transformConfigUiMathjsToLocalFraction, transformReactInputAutosizeToLocal, transformPackageJsonBrowserEsmDependencies, } from './sync-imports.js';
8
+ import { transformLodashToVendoredLodash, transformKnownDeepImportsToFullySpecified, transformPieFrameworkEventImports, transformControllerUtilsImports, transformSharedPackageImports, transformLegacyConfigureLibImports, inlineEditableHtmlConstants, reexportTokenTypes, transformSsrRequireToEsmImport, inlineConfigureDefaults, transformConfigureUtilsImports, transformSelfReferentialImports, transformPackageJsonLodash, transformPackageJsonRecharts, transformPackageJsonPieEvents, transformPackageJsonControllerUtils, transformPackageJsonSharedPackages, fixStyledComponentTypes, fixExportedFunctionTypes, transformMenuToInlineMenu, addInlineMenuExport, transformReactInteropComponentImports, transformClassnamesToClsx, transformJsCombinatoricsToV2, transformCommonJsNamedImports, transformConfigUiMathjsToLocalFraction, transformReactInputAutosizeToLocal, transformPackageJsonBrowserEsmDependencies, } from './sync-imports.js';
9
9
  /**
10
10
  * Apply all standard source code transformations in the correct order
11
11
  *
12
12
  * This ensures consistent transformation across all sync strategies:
13
13
  * 1. lodash/lodash-es → @pie-element/shared-lodash (vendored ESM helpers)
14
14
  * 2. @pie-framework event packages → internal packages
15
- * 3. @pie-lib/controller-utils → @pie-framework/controller-utils
15
+ * 3. @pie-lib/controller-utils → @pie-element/shared-controller-utils
16
16
  * 4. @pie-lib shared packages → @pie-element/shared-*
17
17
  * 5. @mui/material/Menu → InlineMenu from @pie-lib/render-ui
18
18
  * 6. Self-referential imports → relative imports
@@ -25,6 +25,8 @@ export function applySourceTransforms(content, options = {}) {
25
25
  // Core transforms (always applied)
26
26
  transformed = transformLodashToVendoredLodash(transformed);
27
27
  transformed = transformClassnamesToClsx(transformed);
28
+ transformed = transformJsCombinatoricsToV2(transformed);
29
+ transformed = transformCommonJsNamedImports(transformed);
28
30
  transformed = transformKnownDeepImportsToFullySpecified(transformed);
29
31
  transformed = transformPieFrameworkEventImports(transformed);
30
32
  transformed = transformControllerUtilsImports(transformed);
@@ -65,7 +67,7 @@ export function applySourceTransforms(content, options = {}) {
65
67
  * Ensures consistent dependency transformations across all packages:
66
68
  * 1. lodash/lodash-es → @pie-element/shared-lodash
67
69
  * 2. @pie-framework event packages → internal packages
68
- * 3. @pie-lib/controller-utils → @pie-framework/controller-utils
70
+ * 3. @pie-lib/controller-utils → @pie-element/shared-controller-utils
69
71
  * 4. @pie-lib shared packages → @pie-element/shared-*
70
72
  * 5. Preserve upstream @pie-framework/mathquill dependency versions from synced package.json
71
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sync-transforms.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-transforms.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Centralized transformation pipeline for upstream sync operations\n *\n * This module consolidates all source code transformations into a single,\n * composable pipeline to reduce duplication and ensure consistent transformations\n * across all sync strategies.\n */\n\nimport {\n transformLodashToVendoredLodash,\n transformKnownDeepImportsToFullySpecified,\n transformPieFrameworkEventImports,\n transformControllerUtilsImports,\n transformSharedPackageImports,\n transformLegacyConfigureLibImports,\n inlineEditableHtmlConstants,\n reexportTokenTypes,\n transformSsrRequireToEsmImport,\n inlineConfigureDefaults,\n transformConfigureUtilsImports,\n transformSelfReferentialImports,\n transformPackageJsonLodash,\n transformPackageJsonRecharts,\n transformPackageJsonPieEvents,\n transformPackageJsonControllerUtils,\n transformPackageJsonSharedPackages,\n fixStyledComponentTypes,\n fixExportedFunctionTypes,\n transformMenuToInlineMenu,\n addInlineMenuExport,\n transformReactInteropComponentImports,\n transformClassnamesToClsx,\n transformConfigUiMathjsToLocalFraction,\n transformReactInputAutosizeToLocal,\n transformPackageJsonBrowserEsmDependencies,\n} from './sync-imports.js';\nimport type { PackageJson } from '../../utils/package-json.js';\n\nexport interface TransformOptions {\n /** Path relative to package root (e.g., \"configure/src/utils.js\") */\n relativePath?: string;\n /** Source file path for context (e.g., \"/path/to/file.js\") */\n sourcePath?: string;\n /** Package name (e.g., \"@pie-element/fraction-model\") */\n packageName?: string;\n /** Whether to include configure-specific transforms */\n includeConfigure?: boolean;\n /** Whether to include pie-lib-specific transforms */\n includePieLib?: boolean;\n /** Whether to remove react-input-autosize from package metadata */\n removeReactInputAutosize?: boolean;\n /** Whether to remove mathjs from package metadata */\n removeMathjs?: boolean;\n}\n\n/**\n * Apply all standard source code transformations in the correct order\n *\n * This ensures consistent transformation across all sync strategies:\n * 1. lodash/lodash-es → @pie-element/shared-lodash (vendored ESM helpers)\n * 2. @pie-framework event packages → internal packages\n * 3. @pie-lib/controller-utils → @pie-framework/controller-utils\n * 4. @pie-lib shared packages → @pie-element/shared-*\n * 5. @mui/material/Menu → InlineMenu from @pie-lib/render-ui\n * 6. Self-referential imports → relative imports\n * 7. Configure-specific transforms (if enabled)\n * 8. Pie-lib-specific transforms (if enabled)\n * 9. Fix styled component TypeScript type inference errors\n */\nexport function applySourceTransforms(content: string, options: TransformOptions = {}): string {\n let transformed = content;\n\n // Core transforms (always applied)\n transformed = transformLodashToVendoredLodash(transformed);\n transformed = transformClassnamesToClsx(transformed);\n transformed = transformKnownDeepImportsToFullySpecified(transformed);\n transformed = transformPieFrameworkEventImports(transformed);\n transformed = transformControllerUtilsImports(transformed);\n transformed = transformSharedPackageImports(transformed);\n transformed = transformLegacyConfigureLibImports(transformed);\n transformed = transformMenuToInlineMenu(transformed);\n transformed = transformReactInteropComponentImports(transformed);\n\n // Transform self-referential imports to relative paths\n if (options.packageName && options.relativePath) {\n transformed = transformSelfReferentialImports(\n transformed,\n options.packageName,\n options.relativePath\n );\n }\n\n // Configure-specific transforms\n if (options.includeConfigure) {\n transformed = inlineConfigureDefaults(transformed);\n if (options.relativePath) {\n transformed = transformConfigureUtilsImports(transformed, options.relativePath);\n }\n }\n\n // Pie-lib-specific transforms (run only when syncing upstream pie-lib sources)\n if (options.includePieLib) {\n transformed = transformReactInputAutosizeToLocal(transformed, options.sourcePath);\n transformed = transformConfigUiMathjsToLocalFraction(transformed, options.sourcePath);\n transformed = inlineEditableHtmlConstants(transformed);\n if (options.sourcePath) {\n transformed = reexportTokenTypes(transformed, options.sourcePath);\n transformed = addInlineMenuExport(transformed, options.sourcePath);\n }\n transformed = transformSsrRequireToEsmImport(transformed);\n }\n\n // TypeScript fixes (always applied)\n transformed = fixStyledComponentTypes(transformed);\n transformed = fixExportedFunctionTypes(transformed, options.sourcePath);\n\n return transformed;\n}\n\n/**\n * Apply all standard package.json transformations\n *\n * Ensures consistent dependency transformations across all packages:\n * 1. lodash/lodash-es → @pie-element/shared-lodash\n * 2. @pie-framework event packages → internal packages\n * 3. @pie-lib/controller-utils → @pie-framework/controller-utils\n * 4. @pie-lib shared packages → @pie-element/shared-*\n * 5. Preserve upstream @pie-framework/mathquill dependency versions from synced package.json\n */\nexport function applyPackageJsonTransforms<T extends PackageJson>(\n pkg: T,\n options: TransformOptions = {}\n): T {\n let transformed = pkg;\n\n transformed = transformPackageJsonLodash(transformed);\n transformed = transformPackageJsonRecharts(transformed);\n transformed = transformPackageJsonBrowserEsmDependencies(transformed, {\n removeReactInputAutosize: options.removeReactInputAutosize,\n removeMathjs: options.removeMathjs,\n });\n transformed = transformPackageJsonPieEvents(transformed);\n transformed = transformPackageJsonControllerUtils(transformed);\n transformed = transformPackageJsonSharedPackages(transformed);\n\n return transformed;\n}\n\n/**\n * Create a transform pipeline for controller files\n */\nexport function createControllerTransformPipeline(packageName?: string) {\n return (content: string, relativePath?: string) =>\n applySourceTransforms(content, { relativePath, packageName, includeConfigure: false });\n}\n\n/**\n * Create a transform pipeline for React component files\n */\nexport function createReactComponentTransformPipeline(packageName?: string) {\n return (content: string, relativePath?: string) =>\n applySourceTransforms(content, { relativePath, packageName, includeConfigure: true });\n}\n\n/**\n * Create a transform pipeline for pie-lib files\n */\nexport function createPieLibTransformPipeline() {\n return (content: string, sourcePath?: string) =>\n applySourceTransforms(content, { sourcePath, includePieLib: true });\n}\n"]}
1
+ {"version":3,"file":"sync-transforms.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-transforms.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Centralized transformation pipeline for upstream sync operations\n *\n * This module consolidates all source code transformations into a single,\n * composable pipeline to reduce duplication and ensure consistent transformations\n * across all sync strategies.\n */\n\nimport {\n transformLodashToVendoredLodash,\n transformKnownDeepImportsToFullySpecified,\n transformPieFrameworkEventImports,\n transformControllerUtilsImports,\n transformSharedPackageImports,\n transformLegacyConfigureLibImports,\n inlineEditableHtmlConstants,\n reexportTokenTypes,\n transformSsrRequireToEsmImport,\n inlineConfigureDefaults,\n transformConfigureUtilsImports,\n transformSelfReferentialImports,\n transformPackageJsonLodash,\n transformPackageJsonRecharts,\n transformPackageJsonPieEvents,\n transformPackageJsonControllerUtils,\n transformPackageJsonSharedPackages,\n fixStyledComponentTypes,\n fixExportedFunctionTypes,\n transformMenuToInlineMenu,\n addInlineMenuExport,\n transformReactInteropComponentImports,\n transformClassnamesToClsx,\n transformJsCombinatoricsToV2,\n transformCommonJsNamedImports,\n transformConfigUiMathjsToLocalFraction,\n transformReactInputAutosizeToLocal,\n transformPackageJsonBrowserEsmDependencies,\n} from './sync-imports.js';\nimport type { PackageJson } from '../../utils/package-json.js';\n\nexport interface TransformOptions {\n /** Path relative to package root (e.g., \"configure/src/utils.js\") */\n relativePath?: string;\n /** Source file path for context (e.g., \"/path/to/file.js\") */\n sourcePath?: string;\n /** Package name (e.g., \"@pie-element/fraction-model\") */\n packageName?: string;\n /** Whether to include configure-specific transforms */\n includeConfigure?: boolean;\n /** Whether to include pie-lib-specific transforms */\n includePieLib?: boolean;\n /** Whether to remove react-input-autosize from package metadata */\n removeReactInputAutosize?: boolean;\n /** Whether to remove mathjs from package metadata */\n removeMathjs?: boolean;\n}\n\n/**\n * Apply all standard source code transformations in the correct order\n *\n * This ensures consistent transformation across all sync strategies:\n * 1. lodash/lodash-es → @pie-element/shared-lodash (vendored ESM helpers)\n * 2. @pie-framework event packages → internal packages\n * 3. @pie-lib/controller-utils → @pie-element/shared-controller-utils\n * 4. @pie-lib shared packages → @pie-element/shared-*\n * 5. @mui/material/Menu → InlineMenu from @pie-lib/render-ui\n * 6. Self-referential imports → relative imports\n * 7. Configure-specific transforms (if enabled)\n * 8. Pie-lib-specific transforms (if enabled)\n * 9. Fix styled component TypeScript type inference errors\n */\nexport function applySourceTransforms(content: string, options: TransformOptions = {}): string {\n let transformed = content;\n\n // Core transforms (always applied)\n transformed = transformLodashToVendoredLodash(transformed);\n transformed = transformClassnamesToClsx(transformed);\n transformed = transformJsCombinatoricsToV2(transformed);\n transformed = transformCommonJsNamedImports(transformed);\n transformed = transformKnownDeepImportsToFullySpecified(transformed);\n transformed = transformPieFrameworkEventImports(transformed);\n transformed = transformControllerUtilsImports(transformed);\n transformed = transformSharedPackageImports(transformed);\n transformed = transformLegacyConfigureLibImports(transformed);\n transformed = transformMenuToInlineMenu(transformed);\n transformed = transformReactInteropComponentImports(transformed);\n\n // Transform self-referential imports to relative paths\n if (options.packageName && options.relativePath) {\n transformed = transformSelfReferentialImports(\n transformed,\n options.packageName,\n options.relativePath\n );\n }\n\n // Configure-specific transforms\n if (options.includeConfigure) {\n transformed = inlineConfigureDefaults(transformed);\n if (options.relativePath) {\n transformed = transformConfigureUtilsImports(transformed, options.relativePath);\n }\n }\n\n // Pie-lib-specific transforms (run only when syncing upstream pie-lib sources)\n if (options.includePieLib) {\n transformed = transformReactInputAutosizeToLocal(transformed, options.sourcePath);\n transformed = transformConfigUiMathjsToLocalFraction(transformed, options.sourcePath);\n transformed = inlineEditableHtmlConstants(transformed);\n if (options.sourcePath) {\n transformed = reexportTokenTypes(transformed, options.sourcePath);\n transformed = addInlineMenuExport(transformed, options.sourcePath);\n }\n transformed = transformSsrRequireToEsmImport(transformed);\n }\n\n // TypeScript fixes (always applied)\n transformed = fixStyledComponentTypes(transformed);\n transformed = fixExportedFunctionTypes(transformed, options.sourcePath);\n\n return transformed;\n}\n\n/**\n * Apply all standard package.json transformations\n *\n * Ensures consistent dependency transformations across all packages:\n * 1. lodash/lodash-es → @pie-element/shared-lodash\n * 2. @pie-framework event packages → internal packages\n * 3. @pie-lib/controller-utils → @pie-element/shared-controller-utils\n * 4. @pie-lib shared packages → @pie-element/shared-*\n * 5. Preserve upstream @pie-framework/mathquill dependency versions from synced package.json\n */\nexport function applyPackageJsonTransforms<T extends PackageJson>(\n pkg: T,\n options: TransformOptions = {}\n): T {\n let transformed = pkg;\n\n transformed = transformPackageJsonLodash(transformed);\n transformed = transformPackageJsonRecharts(transformed);\n transformed = transformPackageJsonBrowserEsmDependencies(transformed, {\n removeReactInputAutosize: options.removeReactInputAutosize,\n removeMathjs: options.removeMathjs,\n });\n transformed = transformPackageJsonPieEvents(transformed);\n transformed = transformPackageJsonControllerUtils(transformed);\n transformed = transformPackageJsonSharedPackages(transformed);\n\n return transformed;\n}\n\n/**\n * Create a transform pipeline for controller files\n */\nexport function createControllerTransformPipeline(packageName?: string) {\n return (content: string, relativePath?: string) =>\n applySourceTransforms(content, { relativePath, packageName, includeConfigure: false });\n}\n\n/**\n * Create a transform pipeline for React component files\n */\nexport function createReactComponentTransformPipeline(packageName?: string) {\n return (content: string, relativePath?: string) =>\n applySourceTransforms(content, { relativePath, packageName, includeConfigure: true });\n}\n\n/**\n * Create a transform pipeline for pie-lib files\n */\nexport function createPieLibTransformPipeline() {\n return (content: string, sourcePath?: string) =>\n applySourceTransforms(content, { sourcePath, includePieLib: true });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ /** Maps each workspace `@pie-lib/<name>` package's `<name>` to its directory. */
2
+ export declare function findWorkspacePieLibPackages(root: string): Map<string, string>;
@@ -0,0 +1,29 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { WORKSPACE } from './sync-constants.js';
4
+ /**
5
+ * Workspace directories that hold `@pie-lib/*` packages. A framework-independent
6
+ * library lives under `packages/shared` while keeping its `@pie-lib` name, so a
7
+ * package is found by the name in its manifest, never by its directory.
8
+ */
9
+ const PIE_LIB_PARENT_DIRS = ['packages/lib-react', 'packages/lib-svelte', 'packages/shared'];
10
+ /** Maps each workspace `@pie-lib/<name>` package's `<name>` to its directory. */
11
+ export function findWorkspacePieLibPackages(root) {
12
+ const packages = new Map();
13
+ for (const parent of PIE_LIB_PARENT_DIRS) {
14
+ const parentDir = join(root, parent);
15
+ if (!existsSync(parentDir))
16
+ continue;
17
+ for (const entry of readdirSync(parentDir)) {
18
+ const manifestPath = join(parentDir, entry, 'package.json');
19
+ if (!existsSync(manifestPath))
20
+ continue;
21
+ const name = JSON.parse(readFileSync(manifestPath, 'utf8')).name;
22
+ if (typeof name === 'string' && name.startsWith(WORKSPACE.PIE_LIB_PREFIX)) {
23
+ packages.set(name.slice(WORKSPACE.PIE_LIB_PREFIX.length), join(parentDir, entry));
24
+ }
25
+ }
26
+ }
27
+ return packages;
28
+ }
29
+ //# sourceMappingURL=workspace-pie-lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-pie-lib.js","sourceRoot":"","sources":["../../../src/lib/upstream/workspace-pie-lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;AAE7F,iFAAiF;AACjF,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QACrC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,SAAS;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACjE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1E,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { WORKSPACE } from './sync-constants.js';\n\n/**\n * Workspace directories that hold `@pie-lib/*` packages. A framework-independent\n * library lives under `packages/shared` while keeping its `@pie-lib` name, so a\n * package is found by the name in its manifest, never by its directory.\n */\nconst PIE_LIB_PARENT_DIRS = ['packages/lib-react', 'packages/lib-svelte', 'packages/shared'];\n\n/** Maps each workspace `@pie-lib/<name>` package's `<name>` to its directory. */\nexport function findWorkspacePieLibPackages(root: string): Map<string, string> {\n const packages = new Map<string, string>();\n for (const parent of PIE_LIB_PARENT_DIRS) {\n const parentDir = join(root, parent);\n if (!existsSync(parentDir)) continue;\n for (const entry of readdirSync(parentDir)) {\n const manifestPath = join(parentDir, entry, 'package.json');\n if (!existsSync(manifestPath)) continue;\n const name = JSON.parse(readFileSync(manifestPath, 'utf8')).name;\n if (typeof name === 'string' && name.startsWith(WORKSPACE.PIE_LIB_PREFIX)) {\n packages.set(name.slice(WORKSPACE.PIE_LIB_PREFIX.length), join(parentDir, entry));\n }\n }\n }\n return packages;\n}\n"]}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * The environment for a git subprocess aimed at a repository through `cwd`.
3
+ * A git hook exports `GIT_DIR`, which overrides `cwd`: from a worktree it is an
4
+ * absolute path, so `git init` in a temp dir re-initialises the hooked
5
+ * repository as bare and `rev-parse` reads the hooked repository's HEAD.
6
+ */
7
+ export declare function isolatedGitEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
1
8
  export declare function getCurrentCommit(cwd: string): string;
2
9
  export declare function getCurrentCommitShort(cwd: string): string;
3
10
  export declare function getCommitsSince(since: string, cwd: string): string[];