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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +5 -5
  2. package/dist/commands/packages/create-react-elements.js +12 -31
  3. package/dist/commands/packages/create-react-elements.js.map +1 -1
  4. package/dist/commands/packages/init-synced-elements.js +3 -5
  5. package/dist/commands/packages/init-synced-elements.js.map +1 -1
  6. package/dist/commands/upstream/analyze-esm.js +1 -34
  7. package/dist/commands/upstream/analyze-esm.js.map +1 -1
  8. package/dist/commands/upstream/sync.js +0 -1
  9. package/dist/commands/upstream/sync.js.map +1 -1
  10. package/dist/lib/upstream/sync-compatibility.d.ts +0 -8
  11. package/dist/lib/upstream/sync-compatibility.js +0 -31
  12. package/dist/lib/upstream/sync-compatibility.js.map +1 -1
  13. package/dist/lib/upstream/sync-constants.d.ts +2 -12
  14. package/dist/lib/upstream/sync-constants.js +33 -16
  15. package/dist/lib/upstream/sync-constants.js.map +1 -1
  16. package/dist/lib/upstream/sync-demo-metadata.js +117 -109
  17. package/dist/lib/upstream/sync-demo-metadata.js.map +1 -1
  18. package/dist/lib/upstream/sync-imports.d.ts +0 -21
  19. package/dist/lib/upstream/sync-imports.js +0 -77
  20. package/dist/lib/upstream/sync-imports.js.map +1 -1
  21. package/dist/lib/upstream/sync-package-json.d.ts +0 -19
  22. package/dist/lib/upstream/sync-package-json.js +0 -58
  23. package/dist/lib/upstream/sync-package-json.js.map +1 -1
  24. package/dist/lib/upstream/sync-package-manager.d.ts +6 -0
  25. package/dist/lib/upstream/sync-package-manager.js +47 -24
  26. package/dist/lib/upstream/sync-package-manager.js.map +1 -1
  27. package/dist/lib/upstream/sync-source-tree.js +3 -1
  28. package/dist/lib/upstream/sync-source-tree.js.map +1 -1
  29. package/dist/lib/upstream/sync-vite-config.d.ts +0 -4
  30. package/dist/lib/upstream/sync-vite-config.js +1 -12
  31. package/dist/lib/upstream/sync-vite-config.js.map +1 -1
  32. package/dist/utils/compatibility.d.ts +0 -15
  33. package/dist/utils/compatibility.js +0 -34
  34. package/dist/utils/compatibility.js.map +1 -1
  35. package/dist/utils/conversion.d.ts +0 -5
  36. package/dist/utils/conversion.js +0 -21
  37. package/dist/utils/conversion.js.map +1 -1
  38. package/dist/utils/git.d.ts +0 -1
  39. package/dist/utils/git.js +0 -8
  40. package/dist/utils/git.js.map +1 -1
  41. package/package.json +2 -2
package/README.md CHANGED
@@ -30,14 +30,14 @@ bun run cli upstream:sync --help
30
30
 
31
31
  #### `dev:demo`
32
32
 
33
- Start a demo server for an element using `apps/element-demo`.
33
+ Start `apps/element-demo`, which serves every element; the URL picks the element (`/<element>/deliver`).
34
34
 
35
35
  ```bash
36
- # Start demo for an element
37
- bun run cli dev:demo hotspot
36
+ # Start the demo on port 5222
37
+ bun run cli dev:demo
38
38
 
39
- # Custom port, skip builds, and don't auto-open browser
40
- bun run cli dev:demo multiple-choice --port 5180 --skip-build --no-open
39
+ # Custom port, build all elements first, and don't auto-open browser
40
+ bun run cli dev:demo --port 5180 --build --no-open
41
41
  ```
42
42
 
43
43
  ### Upstream Synchronization
@@ -3,6 +3,7 @@ import { Logger } from '../../utils/logger.js';
3
3
  import { existsSync } from 'node:fs';
4
4
  import { readdir, readFile, writeFile, stat as fsStat } from 'node:fs/promises';
5
5
  import { join } from 'node:path';
6
+ import { elementSharedRuntimeDependencies } from '../../lib/upstream/sync-package-manager.js';
6
7
  const ELEMENTS_REACT_DIR = 'packages/elements-react';
7
8
  export default class CreateReactElements extends Command {
8
9
  static description = 'Create package.json files for synced React elements';
@@ -37,12 +38,12 @@ export default class CreateReactElements extends Command {
37
38
  continue;
38
39
  }
39
40
  // Scan for dependencies
40
- const { deps, peerDeps } = await this.scanElement(elementDir);
41
+ const { deps } = await this.scanElement(elementDir);
41
42
  // Add controller package as a dependency
42
43
  const controllerPkg = `@pie-element/${element}-controller`;
43
44
  deps.add(controllerPkg);
44
45
  // Generate package.json
45
- const packageContent = this.generatePackageJson(element, Array.from(deps), Array.from(peerDeps));
46
+ const packageContent = this.generatePackageJson(element, Array.from(deps));
46
47
  // Write package.json
47
48
  await writeFile(packageJsonPath, packageContent, 'utf-8');
48
49
  // Generate vite.config.ts
@@ -55,7 +56,7 @@ export default class CreateReactElements extends Command {
55
56
  if (!existsSync(tsconfigPath)) {
56
57
  await writeFile(tsconfigPath, this.generateTsConfig(), 'utf-8');
57
58
  }
58
- this.logger.success(` ✅ ${element}: Created package.json (${deps.size} deps, ${peerDeps.size} peer deps)`);
59
+ this.logger.success(` ✅ ${element}: Created package.json (${deps.size} deps)`);
59
60
  created++;
60
61
  }
61
62
  this.logger.section(`\n📊 Summary: ${created} created, ${skipped} skipped`);
@@ -63,9 +64,8 @@ export default class CreateReactElements extends Command {
63
64
  async scanElement(elementDir) {
64
65
  const srcDir = join(elementDir, 'src');
65
66
  const deps = new Set();
66
- const peerDeps = new Set();
67
67
  if (!existsSync(srcDir)) {
68
- return { deps, peerDeps };
68
+ return { deps };
69
69
  }
70
70
  // Recursively scan all .ts and .tsx files
71
71
  const scanDir = async (dir) => {
@@ -78,19 +78,16 @@ export default class CreateReactElements extends Command {
78
78
  else if (item.name.endsWith('.ts') || item.name.endsWith('.tsx')) {
79
79
  const content = await readFile(itemPath, 'utf-8');
80
80
  const fileDeps = this.extractDeps(content);
81
- for (const dep of fileDeps.deps)
81
+ for (const dep of fileDeps)
82
82
  deps.add(dep);
83
- for (const dep of fileDeps.peerDeps)
84
- peerDeps.add(dep);
85
83
  }
86
84
  }
87
85
  };
88
86
  await scanDir(srcDir);
89
- return { deps, peerDeps };
87
+ return { deps };
90
88
  }
91
89
  extractDeps(content) {
92
90
  const deps = new Set();
93
- const peerDeps = new Set();
94
91
  // Match import statements
95
92
  const importRegex = /^import .* from ['"]([^'"]+)['"]/gm;
96
93
  const matches = content.matchAll(importRegex);
@@ -99,15 +96,6 @@ export default class CreateReactElements extends Command {
99
96
  // Skip relative imports
100
97
  if (dep.startsWith('.'))
101
98
  continue;
102
- // React is a peer dependency
103
- if (dep === 'react' || dep.startsWith('react/')) {
104
- peerDeps.add('react');
105
- continue;
106
- }
107
- if (dep === 'react-dom' || dep.startsWith('react-dom/')) {
108
- peerDeps.add('react-dom');
109
- continue;
110
- }
111
99
  // Add @pie-lib packages
112
100
  if (dep.startsWith('@pie-lib/')) {
113
101
  deps.add(dep.split('/').slice(0, 2).join('/'));
@@ -129,14 +117,12 @@ export default class CreateReactElements extends Command {
129
117
  deps.add(dep.split('/')[0]);
130
118
  }
131
119
  }
132
- return {
133
- deps: Array.from(deps).sort(),
134
- peerDeps: Array.from(peerDeps).sort(),
135
- };
120
+ return Array.from(deps).sort();
136
121
  }
137
- generatePackageJson(name, deps, peerDeps) {
122
+ generatePackageJson(name, deps) {
138
123
  const dependencies = {};
139
- const peerDependencies = {};
124
+ // React and React DOM are dependencies at the browser ESM policy version, never peers.
125
+ const sharedRuntimeDeps = elementSharedRuntimeDependencies(process.cwd());
140
126
  // Add dependencies (use * for external deps, they're in root package.json)
141
127
  for (const dep of deps) {
142
128
  // Use workspace protocol for internal packages
@@ -144,13 +130,9 @@ export default class CreateReactElements extends Command {
144
130
  dependencies[dep] = 'workspace:*';
145
131
  }
146
132
  else {
147
- dependencies[dep] = '*';
133
+ dependencies[dep] = sharedRuntimeDeps[dep] ?? '*';
148
134
  }
149
135
  }
150
- // Add peer dependencies
151
- for (const dep of peerDeps) {
152
- peerDependencies[dep] = '^18.0.0';
153
- }
154
136
  const pkg = {
155
137
  name: `@pie-element/${name}`,
156
138
  version: '0.1.0',
@@ -185,7 +167,6 @@ export default class CreateReactElements extends Command {
185
167
  'lint:fix': 'biome check --write .',
186
168
  },
187
169
  dependencies: Object.keys(dependencies).length > 0 ? dependencies : undefined,
188
- peerDependencies: Object.keys(peerDependencies).length > 0 ? peerDependencies : undefined,
189
170
  devDependencies: {
190
171
  '@types/react': '^18.2.0',
191
172
  '@types/react-dom': '^18.2.0',
@@ -1 +1 @@
1
- {"version":3,"file":"create-react-elements.js","sourceRoot":"","sources":["../../../src/commands/packages/create-react-elements.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { Logger } from '../../utils/logger.js';\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile, writeFile, stat as fsStat } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst ELEMENTS_REACT_DIR = 'packages/elements-react';\n\ninterface ElementDeps {\n deps: Set<string>;\n peerDeps: Set<string>;\n}\n\nexport default class CreateReactElements extends Command {\n static override description = 'Create package.json files for synced React elements';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show detailed output',\n default: false,\n }),\n };\n\n private logger = new Logger();\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(CreateReactElements);\n\n this.logger = new Logger(flags.verbose);\n\n this.logger.section('📦 Creating package.json files for React elements');\n\n const elements = await readdir(ELEMENTS_REACT_DIR);\n let created = 0;\n let skipped = 0;\n\n for (const element of elements) {\n const elementDir = join(ELEMENTS_REACT_DIR, element);\n const packageJsonPath = join(elementDir, 'package.json');\n\n // Skip if not a directory\n const statResult = await fsStat(elementDir).catch(() => null);\n if (!statResult?.isDirectory()) {\n continue;\n }\n\n // Skip if package.json already exists\n if (existsSync(packageJsonPath)) {\n this.logger.info(` ⏭️ ${element}: package.json already exists`);\n skipped++;\n continue;\n }\n\n // Scan for dependencies\n const { deps, peerDeps } = await this.scanElement(elementDir);\n\n // Add controller package as a dependency\n const controllerPkg = `@pie-element/${element}-controller`;\n deps.add(controllerPkg);\n\n // Generate package.json\n const packageContent = this.generatePackageJson(\n element,\n Array.from(deps),\n Array.from(peerDeps)\n );\n\n // Write package.json\n await writeFile(packageJsonPath, packageContent, 'utf-8');\n\n // Generate vite.config.ts\n const viteConfigPath = join(elementDir, 'vite.config.ts');\n if (!existsSync(viteConfigPath)) {\n await writeFile(viteConfigPath, this.generateViteConfig(), 'utf-8');\n }\n\n // Generate tsconfig.json\n const tsconfigPath = join(elementDir, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n await writeFile(tsconfigPath, this.generateTsConfig(), 'utf-8');\n }\n\n this.logger.success(\n ` ✅ ${element}: Created package.json (${deps.size} deps, ${peerDeps.size} peer deps)`\n );\n created++;\n }\n\n this.logger.section(`\\n📊 Summary: ${created} created, ${skipped} skipped`);\n }\n\n private async scanElement(elementDir: string): Promise<ElementDeps> {\n const srcDir = join(elementDir, 'src');\n const deps = new Set<string>();\n const peerDeps = new Set<string>();\n\n if (!existsSync(srcDir)) {\n return { deps, peerDeps };\n }\n\n // Recursively scan all .ts and .tsx files\n const scanDir = async (dir: string): Promise<void> => {\n const items = await readdir(dir, { withFileTypes: true });\n\n for (const item of items) {\n const itemPath = join(dir, item.name);\n\n if (item.isDirectory()) {\n await scanDir(itemPath);\n } else if (item.name.endsWith('.ts') || item.name.endsWith('.tsx')) {\n const content = await readFile(itemPath, 'utf-8');\n const fileDeps = this.extractDeps(content);\n\n for (const dep of fileDeps.deps) deps.add(dep);\n for (const dep of fileDeps.peerDeps) peerDeps.add(dep);\n }\n }\n };\n\n await scanDir(srcDir);\n\n return { deps, peerDeps };\n }\n\n private extractDeps(content: string): { deps: string[]; peerDeps: string[] } {\n const deps = new Set<string>();\n const peerDeps = new Set<string>();\n\n // Match import statements\n const importRegex = /^import .* from ['\"]([^'\"]+)['\"]/gm;\n const matches = content.matchAll(importRegex);\n\n for (const match of matches) {\n const dep = match[1];\n\n // Skip relative imports\n if (dep.startsWith('.')) continue;\n\n // React is a peer dependency\n if (dep === 'react' || dep.startsWith('react/')) {\n peerDeps.add('react');\n continue;\n }\n if (dep === 'react-dom' || dep.startsWith('react-dom/')) {\n peerDeps.add('react-dom');\n continue;\n }\n\n // Add @pie-lib packages\n if (dep.startsWith('@pie-lib/')) {\n deps.add(dep.split('/').slice(0, 2).join('/'));\n }\n // Add @pie-element packages (controller packages)\n else if (dep.startsWith('@pie-element/')) {\n deps.add(dep.split('/').slice(0, 2).join('/'));\n }\n // Add other scoped packages\n else if (dep.startsWith('@')) {\n deps.add(dep.split('/').slice(0, 2).join('/'));\n }\n // Add non-scoped packages\n else if (!dep.includes('/')) {\n deps.add(dep);\n } else {\n // Package with sub-path (e.g., lodash/get)\n deps.add(dep.split('/')[0]);\n }\n }\n\n return {\n deps: Array.from(deps).sort(),\n peerDeps: Array.from(peerDeps).sort(),\n };\n }\n\n private generatePackageJson(name: string, deps: string[], peerDeps: string[]): string {\n const dependencies: Record<string, string> = {};\n const peerDependencies: Record<string, string> = {};\n\n // Add dependencies (use * for external deps, they're in root package.json)\n for (const dep of deps) {\n // Use workspace protocol for internal packages\n if (dep.startsWith('@pie-element/')) {\n dependencies[dep] = 'workspace:*';\n } else {\n dependencies[dep] = '*';\n }\n }\n\n // Add peer dependencies\n for (const dep of peerDeps) {\n peerDependencies[dep] = '^18.0.0';\n }\n\n const pkg = {\n name: `@pie-element/${name}`,\n version: '0.1.0',\n description: `React implementation of ${name} element synced from pie-elements`,\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n types: './dist/index.d.ts',\n default: './dist/index.js',\n },\n './delivery': {\n types: './dist/delivery/index.d.ts',\n default: './dist/delivery/index.js',\n },\n './configure': {\n types: './dist/configure/index.d.ts',\n default: './dist/configure/index.js',\n },\n './controller': {\n types: './dist/controller/index.d.ts',\n default: './dist/controller/index.js',\n },\n },\n files: ['dist', 'src'],\n scripts: {\n dev: 'vite',\n build: 'vite build && tsc --emitDeclarationOnly',\n test: 'vitest run',\n lint: 'biome check .',\n 'lint:fix': 'biome check --write .',\n },\n dependencies: Object.keys(dependencies).length > 0 ? dependencies : undefined,\n peerDependencies: Object.keys(peerDependencies).length > 0 ? peerDependencies : undefined,\n devDependencies: {\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n '@vitejs/plugin-react': '^4.2.0',\n typescript: '^5.9.3',\n vite: '^6.0.0',\n vitest: '^2.1.0',\n },\n keywords: ['pie', 'pie-element', 'react', name, 'assessment'],\n license: 'ISC',\n repository: {\n type: 'git',\n url: 'https://github.com/pie-framework/pie-elements-ng.git',\n directory: `packages/elements-react/${name}`,\n },\n };\n\n // Remove undefined fields\n const cleaned = JSON.parse(JSON.stringify(pkg));\n\n return `${JSON.stringify(cleaned, null, 2)}\\n`;\n }\n\n private generateViteConfig(): string {\n return `import react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\nimport { resolve } from 'node:path';\n\nexport default defineConfig({\n plugins: [react()],\n build: {\n lib: {\n entry: {\n index: resolve(__dirname, 'src/index.ts'),\n 'delivery/index': resolve(__dirname, 'src/index.ts'),\n 'configure/index': resolve(__dirname, 'src/configure/index.ts'),\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: [\n /^react($|\\\\/)/,\n /^react-dom($|\\\\/)/,\n /^@pie-lib/,\n /^@pie-element/,\n /^@pie-framework/,\n /^@mui/,\n ],\n output: {\n preserveModules: true,\n preserveModulesRoot: 'src',\n },\n },\n },\n});\n`;\n }\n\n private generateTsConfig(): string {\n return `{\n \"extends\": \"../../../tsconfig.declarations.json\",\n \"compilerOptions\": {\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"jsx\": \"react-jsx\",\n \"declaration\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\", \"**/*.test.ts\", \"**/*.test.tsx\"]\n}\n`;\n }\n}\n"]}
1
+ {"version":3,"file":"create-react-elements.js","sourceRoot":"","sources":["../../../src/commands/packages/create-react-elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAE9F,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAMrD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,OAAO;IACtD,MAAM,CAAU,WAAW,GAAG,qDAAqD,CAAC;IAEpF,MAAM,CAAU,QAAQ,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnE,MAAM,CAAU,KAAK,GAAG;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sBAAsB;YACnC,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAEvB,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACnD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YAEzD,0BAA0B;YAC1B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YAED,sCAAsC;YACtC,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,+BAA+B,CAAC,CAAC;gBAClE,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,wBAAwB;YACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAEpD,yCAAyC;YACzC,MAAM,aAAa,GAAG,gBAAgB,OAAO,aAAa,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAExB,wBAAwB;YACxB,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE3E,qBAAqB;YACrB,MAAM,SAAS,CAAC,eAAe,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAE1D,0BAA0B;YAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAChC,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,yBAAyB;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,2BAA2B,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;YAChF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,OAAO,aAAa,OAAO,UAAU,CAAC,CAAC;IAC9E,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,UAAkB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,0CAA0C;QAC1C,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;YACnD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBAE3C,KAAK,MAAM,GAAG,IAAI,QAAQ;wBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAEtB,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,0BAA0B;QAC1B,MAAM,WAAW,GAAG,oCAAoC,CAAC;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE9C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAErB,wBAAwB;YACxB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAElC,wBAAwB;YACxB,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,kDAAkD;iBAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,4BAA4B;iBACvB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,0BAA0B;iBACrB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAEO,mBAAmB,CAAC,IAAY,EAAE,IAAc;QACtD,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,uFAAuF;QACvF,MAAM,iBAAiB,GAAG,gCAAgC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAE1E,2EAA2E;QAC3E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,+CAA+C;YAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpC,YAAY,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YACpD,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,gBAAgB,IAAI,EAAE;YAC5B,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,2BAA2B,IAAI,mCAAmC;YAC/E,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE;gBACP,GAAG,EAAE;oBACH,KAAK,EAAE,mBAAmB;oBAC1B,OAAO,EAAE,iBAAiB;iBAC3B;gBACD,YAAY,EAAE;oBACZ,KAAK,EAAE,4BAA4B;oBACnC,OAAO,EAAE,0BAA0B;iBACpC;gBACD,aAAa,EAAE;oBACb,KAAK,EAAE,6BAA6B;oBACpC,OAAO,EAAE,2BAA2B;iBACrC;gBACD,cAAc,EAAE;oBACd,KAAK,EAAE,8BAA8B;oBACrC,OAAO,EAAE,4BAA4B;iBACtC;aACF;YACD,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;YACtB,OAAO,EAAE;gBACP,GAAG,EAAE,MAAM;gBACX,KAAK,EAAE,yCAAyC;gBAChD,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,eAAe;gBACrB,UAAU,EAAE,uBAAuB;aACpC;YACD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;YAC7E,eAAe,EAAE;gBACf,cAAc,EAAE,SAAS;gBACzB,kBAAkB,EAAE,SAAS;gBAC7B,sBAAsB,EAAE,QAAQ;gBAChC,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,QAAQ;aACjB;YACD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC;YAC7D,OAAO,EAAE,KAAK;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,sDAAsD;gBAC3D,SAAS,EAAE,2BAA2B,IAAI,EAAE;aAC7C;SACF,CAAC;QAEF,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAEhD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAEO,kBAAkB;QACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BV,CAAC;IACA,CAAC;IAEO,gBAAgB;QACtB,OAAO;;;;;;;;;;;CAWV,CAAC;IACA,CAAC","sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { Logger } from '../../utils/logger.js';\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile, writeFile, stat as fsStat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { elementSharedRuntimeDependencies } from '../../lib/upstream/sync-package-manager.js';\n\nconst ELEMENTS_REACT_DIR = 'packages/elements-react';\n\ninterface ElementDeps {\n deps: Set<string>;\n}\n\nexport default class CreateReactElements extends Command {\n static override description = 'Create package.json files for synced React elements';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show detailed output',\n default: false,\n }),\n };\n\n private logger = new Logger();\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(CreateReactElements);\n\n this.logger = new Logger(flags.verbose);\n\n this.logger.section('📦 Creating package.json files for React elements');\n\n const elements = await readdir(ELEMENTS_REACT_DIR);\n let created = 0;\n let skipped = 0;\n\n for (const element of elements) {\n const elementDir = join(ELEMENTS_REACT_DIR, element);\n const packageJsonPath = join(elementDir, 'package.json');\n\n // Skip if not a directory\n const statResult = await fsStat(elementDir).catch(() => null);\n if (!statResult?.isDirectory()) {\n continue;\n }\n\n // Skip if package.json already exists\n if (existsSync(packageJsonPath)) {\n this.logger.info(` ⏭️ ${element}: package.json already exists`);\n skipped++;\n continue;\n }\n\n // Scan for dependencies\n const { deps } = await this.scanElement(elementDir);\n\n // Add controller package as a dependency\n const controllerPkg = `@pie-element/${element}-controller`;\n deps.add(controllerPkg);\n\n // Generate package.json\n const packageContent = this.generatePackageJson(element, Array.from(deps));\n\n // Write package.json\n await writeFile(packageJsonPath, packageContent, 'utf-8');\n\n // Generate vite.config.ts\n const viteConfigPath = join(elementDir, 'vite.config.ts');\n if (!existsSync(viteConfigPath)) {\n await writeFile(viteConfigPath, this.generateViteConfig(), 'utf-8');\n }\n\n // Generate tsconfig.json\n const tsconfigPath = join(elementDir, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n await writeFile(tsconfigPath, this.generateTsConfig(), 'utf-8');\n }\n\n this.logger.success(` ✅ ${element}: Created package.json (${deps.size} deps)`);\n created++;\n }\n\n this.logger.section(`\\n📊 Summary: ${created} created, ${skipped} skipped`);\n }\n\n private async scanElement(elementDir: string): Promise<ElementDeps> {\n const srcDir = join(elementDir, 'src');\n const deps = new Set<string>();\n\n if (!existsSync(srcDir)) {\n return { deps };\n }\n\n // Recursively scan all .ts and .tsx files\n const scanDir = async (dir: string): Promise<void> => {\n const items = await readdir(dir, { withFileTypes: true });\n\n for (const item of items) {\n const itemPath = join(dir, item.name);\n\n if (item.isDirectory()) {\n await scanDir(itemPath);\n } else if (item.name.endsWith('.ts') || item.name.endsWith('.tsx')) {\n const content = await readFile(itemPath, 'utf-8');\n const fileDeps = this.extractDeps(content);\n\n for (const dep of fileDeps) deps.add(dep);\n }\n }\n };\n\n await scanDir(srcDir);\n\n return { deps };\n }\n\n private extractDeps(content: string): string[] {\n const deps = new Set<string>();\n\n // Match import statements\n const importRegex = /^import .* from ['\"]([^'\"]+)['\"]/gm;\n const matches = content.matchAll(importRegex);\n\n for (const match of matches) {\n const dep = match[1];\n\n // Skip relative imports\n if (dep.startsWith('.')) continue;\n\n // Add @pie-lib packages\n if (dep.startsWith('@pie-lib/')) {\n deps.add(dep.split('/').slice(0, 2).join('/'));\n }\n // Add @pie-element packages (controller packages)\n else if (dep.startsWith('@pie-element/')) {\n deps.add(dep.split('/').slice(0, 2).join('/'));\n }\n // Add other scoped packages\n else if (dep.startsWith('@')) {\n deps.add(dep.split('/').slice(0, 2).join('/'));\n }\n // Add non-scoped packages\n else if (!dep.includes('/')) {\n deps.add(dep);\n } else {\n // Package with sub-path (e.g., lodash/get)\n deps.add(dep.split('/')[0]);\n }\n }\n\n return Array.from(deps).sort();\n }\n\n private generatePackageJson(name: string, deps: string[]): string {\n const dependencies: Record<string, string> = {};\n // React and React DOM are dependencies at the browser ESM policy version, never peers.\n const sharedRuntimeDeps = elementSharedRuntimeDependencies(process.cwd());\n\n // Add dependencies (use * for external deps, they're in root package.json)\n for (const dep of deps) {\n // Use workspace protocol for internal packages\n if (dep.startsWith('@pie-element/')) {\n dependencies[dep] = 'workspace:*';\n } else {\n dependencies[dep] = sharedRuntimeDeps[dep] ?? '*';\n }\n }\n\n const pkg = {\n name: `@pie-element/${name}`,\n version: '0.1.0',\n description: `React implementation of ${name} element synced from pie-elements`,\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n types: './dist/index.d.ts',\n default: './dist/index.js',\n },\n './delivery': {\n types: './dist/delivery/index.d.ts',\n default: './dist/delivery/index.js',\n },\n './configure': {\n types: './dist/configure/index.d.ts',\n default: './dist/configure/index.js',\n },\n './controller': {\n types: './dist/controller/index.d.ts',\n default: './dist/controller/index.js',\n },\n },\n files: ['dist', 'src'],\n scripts: {\n dev: 'vite',\n build: 'vite build && tsc --emitDeclarationOnly',\n test: 'vitest run',\n lint: 'biome check .',\n 'lint:fix': 'biome check --write .',\n },\n dependencies: Object.keys(dependencies).length > 0 ? dependencies : undefined,\n devDependencies: {\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n '@vitejs/plugin-react': '^4.2.0',\n typescript: '^5.9.3',\n vite: '^6.0.0',\n vitest: '^2.1.0',\n },\n keywords: ['pie', 'pie-element', 'react', name, 'assessment'],\n license: 'ISC',\n repository: {\n type: 'git',\n url: 'https://github.com/pie-framework/pie-elements-ng.git',\n directory: `packages/elements-react/${name}`,\n },\n };\n\n // Remove undefined fields\n const cleaned = JSON.parse(JSON.stringify(pkg));\n\n return `${JSON.stringify(cleaned, null, 2)}\\n`;\n }\n\n private generateViteConfig(): string {\n return `import react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\nimport { resolve } from 'node:path';\n\nexport default defineConfig({\n plugins: [react()],\n build: {\n lib: {\n entry: {\n index: resolve(__dirname, 'src/index.ts'),\n 'delivery/index': resolve(__dirname, 'src/index.ts'),\n 'configure/index': resolve(__dirname, 'src/configure/index.ts'),\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: [\n /^react($|\\\\/)/,\n /^react-dom($|\\\\/)/,\n /^@pie-lib/,\n /^@pie-element/,\n /^@pie-framework/,\n /^@mui/,\n ],\n output: {\n preserveModules: true,\n preserveModulesRoot: 'src',\n },\n },\n },\n});\n`;\n }\n\n private generateTsConfig(): string {\n return `{\n \"extends\": \"../../../tsconfig.declarations.json\",\n \"compilerOptions\": {\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"jsx\": \"react-jsx\",\n \"declaration\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\", \"**/*.test.ts\", \"**/*.test.tsx\"]\n}\n`;\n }\n}\n"]}
@@ -3,6 +3,7 @@ import { Logger } from '../../utils/logger.js';
3
3
  import { existsSync } from 'node:fs';
4
4
  import { readdir, readFile, writeFile, stat as fsStat } from 'node:fs/promises';
5
5
  import { join } from 'node:path';
6
+ import { elementSharedRuntimeDependencies } from '../../lib/upstream/sync-package-manager.js';
6
7
  const ELEMENTS_REACT_DIR = 'packages/elements-react';
7
8
  const PIE_ELEMENTS_DIR = '../pie-elements/packages';
8
9
  export default class InitSyncedElements extends Command {
@@ -140,11 +141,8 @@ export default class InitSyncedElements extends Command {
140
141
  lint: 'biome check .',
141
142
  'lint:fix': 'biome check --write .',
142
143
  },
143
- dependencies: deps,
144
- peerDependencies: {
145
- react: '^18.0.0',
146
- 'react-dom': '^18.0.0',
147
- },
144
+ // React and React DOM are dependencies at the browser ESM policy version, never peers.
145
+ dependencies: { ...deps, ...elementSharedRuntimeDependencies(process.cwd()) },
148
146
  devDependencies: {
149
147
  '@types/react': '^18.2.0',
150
148
  '@types/react-dom': '^18.2.0',
@@ -1 +1 @@
1
- {"version":3,"file":"init-synced-elements.js","sourceRoot":"","sources":["../../../src/commands/packages/init-synced-elements.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { Logger } from '../../utils/logger.js';\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile, writeFile, stat as fsStat } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst ELEMENTS_REACT_DIR = 'packages/elements-react';\nconst PIE_ELEMENTS_DIR = '../pie-elements/packages';\n\ninterface PackageTemplate {\n name: string;\n private: boolean;\n version: string;\n description: string;\n type: string;\n main: string;\n types: string;\n exports: Record<string, unknown>;\n files: string[];\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n keywords: string[];\n license: string;\n repository: {\n type: string;\n url: string;\n directory: string;\n };\n}\n\nexport default class InitSyncedElements extends Command {\n static override description =\n 'Initialize package.json and vite.config.ts files for synced React elements';\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --element=categorize',\n '<%= config.bin %> <%= command.id %> --dry-run',\n ];\n\n static override flags = {\n element: Flags.string({\n description: 'Initialize only specified element',\n }),\n 'dry-run': Flags.boolean({\n description: 'Show what would be created without making changes',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show detailed output',\n default: false,\n }),\n };\n\n private logger = new Logger();\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(InitSyncedElements);\n\n this.logger = new Logger(flags.verbose);\n\n this.logger.section('🔧 Initializing synced React elements');\n\n if (flags['dry-run']) {\n this.logger.info(' Mode: DRY RUN\\n');\n }\n\n const elements = await readdir(ELEMENTS_REACT_DIR);\n let created = 0;\n let skipped = 0;\n\n for (const element of elements) {\n // Skip if filtering by element and this isn't it\n if (flags.element && element !== flags.element) {\n continue;\n }\n\n const elementDir = join(ELEMENTS_REACT_DIR, element);\n\n // Skip if not a directory\n const statResult = await fsStat(elementDir).catch(() => null);\n if (!statResult?.isDirectory()) {\n continue;\n }\n\n // Skip if src directory doesn't exist\n if (!existsSync(join(elementDir, 'src'))) {\n continue;\n }\n\n const packageJsonPath = join(elementDir, 'package.json');\n\n // Skip if package.json already exists\n if (existsSync(packageJsonPath)) {\n if (flags.verbose) {\n this.logger.info(` ⏭️ ${element}: package.json already exists`);\n }\n skipped++;\n continue;\n }\n\n // Read upstream package.json\n const upstreamPkg = await this.readUpstreamPackageJson(element);\n if (!upstreamPkg) {\n this.logger.warn(` ⚠️ ${element}: Could not read upstream package.json`);\n continue;\n }\n\n // Generate package.json\n const pkg = this.generatePackageJson(element, upstreamPkg);\n\n if (!flags['dry-run']) {\n await writeFile(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf-8');\n this.logger.success(` ✨ ${element}: Created package.json`);\n } else {\n this.logger.info(` 🔍 ${element}: Would create package.json`);\n }\n\n // Generate vite.config.ts\n const viteConfigPath = join(elementDir, 'vite.config.ts');\n if (!existsSync(viteConfigPath)) {\n if (!flags['dry-run']) {\n await writeFile(viteConfigPath, this.generateViteConfig(), 'utf-8');\n this.logger.success(` ✨ ${element}: Created vite.config.ts`);\n } else {\n this.logger.info(` 🔍 ${element}: Would create vite.config.ts`);\n }\n }\n\n created++;\n }\n\n this.logger.section(\n `\\n📊 Summary: ${created} ${flags['dry-run'] ? 'would be created' : 'created'}, ${skipped} skipped`\n );\n }\n\n private async readUpstreamPackageJson(\n elementName: string\n ): Promise<Record<string, unknown> | null> {\n const upstreamPath = join(PIE_ELEMENTS_DIR, elementName, 'package.json');\n\n if (!existsSync(upstreamPath)) {\n return null;\n }\n\n try {\n const content = await readFile(upstreamPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n private generatePackageJson(\n elementName: string,\n upstreamPkg: Record<string, unknown>\n ): PackageTemplate {\n const deps: Record<string, string> = {};\n\n // Map upstream dependencies to workspace:* for @pie-lib packages\n const upstreamDeps = upstreamPkg.dependencies as Record<string, string> | undefined;\n if (upstreamDeps) {\n for (const [name] of Object.entries(upstreamDeps)) {\n if (name.startsWith('@pie-lib/')) {\n deps[name] = 'workspace:*';\n } else if (!name.startsWith('react') && name !== 'react-dom') {\n deps[name] = '*';\n }\n }\n }\n\n return {\n name: `@pie-element/${elementName}`,\n private: true,\n version: '0.1.0',\n description: `React implementation of ${elementName} element synced from pie-elements`,\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n types: './dist/index.d.ts',\n default: './dist/index.js',\n },\n },\n files: ['dist', 'src'],\n scripts: {\n dev: 'vite',\n build: 'vite build && tsc --emitDeclarationOnly',\n test: 'vitest run',\n lint: 'biome check .',\n 'lint:fix': 'biome check --write .',\n },\n dependencies: deps,\n peerDependencies: {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n },\n devDependencies: {\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n '@vitejs/plugin-react': '^4.2.0',\n typescript: '^5.9.3',\n vite: '^6.0.0',\n vitest: '^2.1.0',\n },\n keywords: ['pie', 'pie-element', 'react', 'assessment', elementName],\n license: 'ISC',\n repository: {\n type: 'git',\n url: 'https://github.com/pie-framework/pie-elements-ng.git',\n directory: `packages/elements-react/${elementName}`,\n },\n };\n }\n\n private generateViteConfig(): string {\n return `import { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n plugins: [react()],\n build: {\n lib: {\n entry: {\n index: resolve(__dirname, 'src/index.ts'),\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: (id) => {\n return (\n /^react($|\\\\/)/.test(id) ||\n /^react-dom($|\\\\/)/.test(id) ||\n /^@pie-lib\\\\//.test(id) ||\n /^@pie-element\\\\//.test(id) ||\n /^@pie-framework\\\\//.test(id) ||\n /^@mui\\\\//.test(id) ||\n /^d3-/.test(id) ||\n id === 'lodash' ||\n /^lodash\\\\//.test(id) ||\n ['prop-types', 'debug'].includes(id)\n );\n },\n output: {\n preserveModules: true,\n preserveModulesRoot: 'src',\n },\n },\n },\n});\n`;\n }\n}\n"]}
1
+ {"version":3,"file":"init-synced-elements.js","sourceRoot":"","sources":["../../../src/commands/packages/init-synced-elements.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { Logger } from '../../utils/logger.js';\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile, writeFile, stat as fsStat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { elementSharedRuntimeDependencies } from '../../lib/upstream/sync-package-manager.js';\n\nconst ELEMENTS_REACT_DIR = 'packages/elements-react';\nconst PIE_ELEMENTS_DIR = '../pie-elements/packages';\n\ninterface PackageTemplate {\n name: string;\n private: boolean;\n version: string;\n description: string;\n type: string;\n main: string;\n types: string;\n exports: Record<string, unknown>;\n files: string[];\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n keywords: string[];\n license: string;\n repository: {\n type: string;\n url: string;\n directory: string;\n };\n}\n\nexport default class InitSyncedElements extends Command {\n static override description =\n 'Initialize package.json and vite.config.ts files for synced React elements';\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --element=categorize',\n '<%= config.bin %> <%= command.id %> --dry-run',\n ];\n\n static override flags = {\n element: Flags.string({\n description: 'Initialize only specified element',\n }),\n 'dry-run': Flags.boolean({\n description: 'Show what would be created without making changes',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show detailed output',\n default: false,\n }),\n };\n\n private logger = new Logger();\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(InitSyncedElements);\n\n this.logger = new Logger(flags.verbose);\n\n this.logger.section('🔧 Initializing synced React elements');\n\n if (flags['dry-run']) {\n this.logger.info(' Mode: DRY RUN\\n');\n }\n\n const elements = await readdir(ELEMENTS_REACT_DIR);\n let created = 0;\n let skipped = 0;\n\n for (const element of elements) {\n // Skip if filtering by element and this isn't it\n if (flags.element && element !== flags.element) {\n continue;\n }\n\n const elementDir = join(ELEMENTS_REACT_DIR, element);\n\n // Skip if not a directory\n const statResult = await fsStat(elementDir).catch(() => null);\n if (!statResult?.isDirectory()) {\n continue;\n }\n\n // Skip if src directory doesn't exist\n if (!existsSync(join(elementDir, 'src'))) {\n continue;\n }\n\n const packageJsonPath = join(elementDir, 'package.json');\n\n // Skip if package.json already exists\n if (existsSync(packageJsonPath)) {\n if (flags.verbose) {\n this.logger.info(` ⏭️ ${element}: package.json already exists`);\n }\n skipped++;\n continue;\n }\n\n // Read upstream package.json\n const upstreamPkg = await this.readUpstreamPackageJson(element);\n if (!upstreamPkg) {\n this.logger.warn(` ⚠️ ${element}: Could not read upstream package.json`);\n continue;\n }\n\n // Generate package.json\n const pkg = this.generatePackageJson(element, upstreamPkg);\n\n if (!flags['dry-run']) {\n await writeFile(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf-8');\n this.logger.success(` ✨ ${element}: Created package.json`);\n } else {\n this.logger.info(` 🔍 ${element}: Would create package.json`);\n }\n\n // Generate vite.config.ts\n const viteConfigPath = join(elementDir, 'vite.config.ts');\n if (!existsSync(viteConfigPath)) {\n if (!flags['dry-run']) {\n await writeFile(viteConfigPath, this.generateViteConfig(), 'utf-8');\n this.logger.success(` ✨ ${element}: Created vite.config.ts`);\n } else {\n this.logger.info(` 🔍 ${element}: Would create vite.config.ts`);\n }\n }\n\n created++;\n }\n\n this.logger.section(\n `\\n📊 Summary: ${created} ${flags['dry-run'] ? 'would be created' : 'created'}, ${skipped} skipped`\n );\n }\n\n private async readUpstreamPackageJson(\n elementName: string\n ): Promise<Record<string, unknown> | null> {\n const upstreamPath = join(PIE_ELEMENTS_DIR, elementName, 'package.json');\n\n if (!existsSync(upstreamPath)) {\n return null;\n }\n\n try {\n const content = await readFile(upstreamPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n private generatePackageJson(\n elementName: string,\n upstreamPkg: Record<string, unknown>\n ): PackageTemplate {\n const deps: Record<string, string> = {};\n\n // Map upstream dependencies to workspace:* for @pie-lib packages\n const upstreamDeps = upstreamPkg.dependencies as Record<string, string> | undefined;\n if (upstreamDeps) {\n for (const [name] of Object.entries(upstreamDeps)) {\n if (name.startsWith('@pie-lib/')) {\n deps[name] = 'workspace:*';\n } else if (!name.startsWith('react') && name !== 'react-dom') {\n deps[name] = '*';\n }\n }\n }\n\n return {\n name: `@pie-element/${elementName}`,\n private: true,\n version: '0.1.0',\n description: `React implementation of ${elementName} element synced from pie-elements`,\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n types: './dist/index.d.ts',\n default: './dist/index.js',\n },\n },\n files: ['dist', 'src'],\n scripts: {\n dev: 'vite',\n build: 'vite build && tsc --emitDeclarationOnly',\n test: 'vitest run',\n lint: 'biome check .',\n 'lint:fix': 'biome check --write .',\n },\n // React and React DOM are dependencies at the browser ESM policy version, never peers.\n dependencies: { ...deps, ...elementSharedRuntimeDependencies(process.cwd()) },\n devDependencies: {\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n '@vitejs/plugin-react': '^4.2.0',\n typescript: '^5.9.3',\n vite: '^6.0.0',\n vitest: '^2.1.0',\n },\n keywords: ['pie', 'pie-element', 'react', 'assessment', elementName],\n license: 'ISC',\n repository: {\n type: 'git',\n url: 'https://github.com/pie-framework/pie-elements-ng.git',\n directory: `packages/elements-react/${elementName}`,\n },\n };\n }\n\n private generateViteConfig(): string {\n return `import { resolve } from 'node:path';\nimport react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n plugins: [react()],\n build: {\n lib: {\n entry: {\n index: resolve(__dirname, 'src/index.ts'),\n },\n formats: ['es'],\n },\n rollupOptions: {\n external: (id) => {\n return (\n /^react($|\\\\/)/.test(id) ||\n /^react-dom($|\\\\/)/.test(id) ||\n /^@pie-lib\\\\//.test(id) ||\n /^@pie-element\\\\//.test(id) ||\n /^@pie-framework\\\\//.test(id) ||\n /^@mui\\\\//.test(id) ||\n /^d3-/.test(id) ||\n id === 'lodash' ||\n /^lodash\\\\//.test(id) ||\n ['prop-types', 'debug'].includes(id)\n );\n },\n output: {\n preserveModules: true,\n preserveModulesRoot: 'src',\n },\n },\n },\n});\n`;\n }\n}\n"]}
@@ -45,12 +45,6 @@ const ESM_BLOCKERS = [
45
45
  // Known CommonJS-only packages (add more as discovered)
46
46
  { pattern: /^enzyme/, reason: 'Enzyme is not ESM compatible' },
47
47
  ];
48
- // PIE lib packages that should always be included if compatible
49
- // These are packages that may be imported directly in code (e.g., controllers)
50
- // but not declared in package.json dependencies
51
- const ALWAYS_INCLUDE_PIE_LIB = [
52
- 'controller-utils', // Used in controller code via direct imports
53
- ];
54
48
  export default class AnalyzeEsm extends Command {
55
49
  static description = 'Analyze PIE elements for ESM compatibility';
56
50
  static examples = [
@@ -284,34 +278,7 @@ export default class AnalyzeEsm extends Command {
284
278
  };
285
279
  }
286
280
  }
287
- // Add always-include pie-lib packages if they're compatible
288
- for (const pieLibPkg of ALWAYS_INCLUDE_PIE_LIB) {
289
- // Skip if already in the report
290
- if (pieLibUsage.has(pieLibPkg)) {
291
- continue;
292
- }
293
- // Check if this package exists and is compatible
294
- let check = pieLibCache.get(pieLibPkg);
295
- if (!check) {
296
- check = await this.checkPieLibCompatibility(pieLibPkg, pieLibPath, verbose, includeDevDeps, pieLibCache);
297
- pieLibCache.set(pieLibPkg, check);
298
- }
299
- if (check.compatible) {
300
- report.pieLibPackages.push(pieLibPkg);
301
- report.pieLibDetails[pieLibPkg] = {
302
- compatible: true,
303
- usedBy: ['(always included)'], // Mark as always included
304
- blockers: [],
305
- };
306
- if (verbose) {
307
- this.logger.info(` ✅ ${pieLibPkg}: always included (compatible)`);
308
- }
309
- }
310
- else if (verbose) {
311
- this.logger.info(` ⏭️ ${pieLibPkg}: skipped (not compatible)`);
312
- }
313
- }
314
- report.summary.totalPieLibPackages = pieLibUsage.size + ALWAYS_INCLUDE_PIE_LIB.length;
281
+ report.summary.totalPieLibPackages = pieLibUsage.size;
315
282
  report.summary.compatiblePieLibPackages = report.pieLibPackages.length;
316
283
  // Identify student-UI-only elements (blocked overall but student UI is compatible)
317
284
  report.studentUIOnly = [];