@pie-element/cli 0.1.2-next.13 → 0.1.2-next.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/commands/upstream/analyze-esm.js +1 -34
- package/dist/commands/upstream/analyze-esm.js.map +1 -1
- package/dist/commands/upstream/sync.js +0 -1
- package/dist/commands/upstream/sync.js.map +1 -1
- package/dist/lib/upstream/sync-constants.d.ts +1 -1
- package/dist/lib/upstream/sync-constants.js +7 -1
- package/dist/lib/upstream/sync-constants.js.map +1 -1
- package/dist/lib/upstream/sync-demo-metadata.js +117 -109
- package/dist/lib/upstream/sync-demo-metadata.js.map +1 -1
- package/dist/lib/upstream/sync-presets.d.ts +2 -0
- package/dist/lib/upstream/sync-presets.js +34 -0
- package/dist/lib/upstream/sync-presets.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,76 +1,133 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generate demo metadata for SvelteKit demo app
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* 3. Sample sessions converted to JSON from each element
|
|
4
|
+
* Scans packages/elements-react and packages/elements-svelte and rewrites the element registry
|
|
5
|
+
* (lib/elements/registry.ts). Each element's demos live in lib/samples/<element>.json, which the
|
|
6
|
+
* demo app reads; an element's docs/demo/config.mjs seeds that file only when it does not exist.
|
|
8
7
|
*/
|
|
8
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
9
9
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
10
10
|
import { join, dirname } from 'node:path';
|
|
11
11
|
import { fileURLToPath } from 'node:url';
|
|
12
12
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
13
|
const REPO_ROOT = join(__dirname, '../../../../..');
|
|
14
14
|
const DEMO_APP_PATH = join(REPO_ROOT, 'apps/element-demo');
|
|
15
|
-
const
|
|
15
|
+
const REGISTRY_PATH = join(DEMO_APP_PATH, 'src/lib/elements/registry.ts');
|
|
16
|
+
const SAMPLES_PATH = join(DEMO_APP_PATH, 'src/lib/samples');
|
|
17
|
+
const ELEMENT_ROOTS = ['packages/elements-react', 'packages/elements-svelte'];
|
|
16
18
|
/**
|
|
17
|
-
*
|
|
19
|
+
* Read the current registry entries, whose hand-set title and hasSession survive regeneration
|
|
18
20
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
function readExistingRegistry() {
|
|
22
|
+
if (!existsSync(REGISTRY_PATH))
|
|
23
|
+
return new Map();
|
|
24
|
+
const content = readFileSync(REGISTRY_PATH, 'utf-8');
|
|
25
|
+
const match = content.match(/export const ELEMENT_REGISTRY[^=]*=\s*(\[[\s\S]*?\]);/);
|
|
26
|
+
if (!match)
|
|
27
|
+
throw new Error(`Could not find ELEMENT_REGISTRY in ${REGISTRY_PATH}`);
|
|
28
|
+
const entries = JSON.parse(match[1]);
|
|
29
|
+
return new Map(entries.map((entry) => [entry.name, entry]));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Convert old format (models array) to new format (demos array)
|
|
33
|
+
*/
|
|
34
|
+
function toDemosFormat(configData) {
|
|
35
|
+
if (!configData?.models || configData?.demos)
|
|
36
|
+
return configData;
|
|
37
|
+
return {
|
|
38
|
+
demos: configData.models.map((model, index) => ({
|
|
39
|
+
id: index === 0 ? 'default' : `demo-${index + 1}`,
|
|
40
|
+
title: index === 0 ? 'Default Demo' : `Demo ${index + 1}`,
|
|
41
|
+
description: 'Default configuration',
|
|
42
|
+
tags: [],
|
|
43
|
+
model: model,
|
|
44
|
+
session: { value: [] },
|
|
45
|
+
})),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load an element's samples JSON, seeding it from docs/demo/config.mjs when it does not exist
|
|
50
|
+
*/
|
|
51
|
+
async function loadSamples(name, elementPath) {
|
|
52
|
+
const samplesPath = join(SAMPLES_PATH, `${name}.json`);
|
|
53
|
+
const configPath = join(elementPath, 'docs/demo/config.mjs');
|
|
54
|
+
const existing = existsSync(samplesPath)
|
|
55
|
+
? JSON.parse(readFileSync(samplesPath, 'utf-8'))
|
|
56
|
+
: undefined;
|
|
57
|
+
if (!existsSync(configPath))
|
|
58
|
+
return existing;
|
|
59
|
+
let configData;
|
|
60
|
+
try {
|
|
61
|
+
configData = toDemosFormat((await import(`file://${configPath}`)).default);
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.warn(`[demo-metadata] Failed to convert config for ${name}:`, e);
|
|
65
|
+
return existing;
|
|
24
66
|
}
|
|
67
|
+
if (existing) {
|
|
68
|
+
if (JSON.stringify(configData) !== JSON.stringify(existing)) {
|
|
69
|
+
console.warn(`[demo-metadata] ${name}: docs/demo/config.mjs differs from samples/${name}.json; ` +
|
|
70
|
+
'kept the samples file (delete it to regenerate from config.mjs)');
|
|
71
|
+
}
|
|
72
|
+
return existing;
|
|
73
|
+
}
|
|
74
|
+
await mkdir(SAMPLES_PATH, { recursive: true });
|
|
75
|
+
await writeFile(samplesPath, JSON.stringify(configData, null, 2) + '\n', 'utf-8');
|
|
76
|
+
console.log(`[demo-metadata] Seeded samples/${name}.json from docs/demo/config.mjs`);
|
|
77
|
+
return configData;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Scan the element package directories for all elements
|
|
81
|
+
*/
|
|
82
|
+
async function scanElements(existing) {
|
|
25
83
|
const elements = [];
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const stat = statSync(elementPath);
|
|
30
|
-
if (!stat.isDirectory())
|
|
31
|
-
continue;
|
|
32
|
-
// Check for required structure
|
|
33
|
-
const srcPath = join(elementPath, 'src');
|
|
34
|
-
const deliveryPath = join(srcPath, 'delivery');
|
|
35
|
-
if (!fsExistsSync(deliveryPath))
|
|
84
|
+
for (const root of ELEMENT_ROOTS) {
|
|
85
|
+
const rootPath = join(REPO_ROOT, root);
|
|
86
|
+
if (!existsSync(rootPath))
|
|
36
87
|
continue;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
88
|
+
for (const dir of readdirSync(rootPath, { withFileTypes: true })) {
|
|
89
|
+
if (!dir.isDirectory())
|
|
90
|
+
continue;
|
|
91
|
+
// Check for required structure
|
|
92
|
+
const elementPath = join(rootPath, dir.name);
|
|
93
|
+
const srcPath = join(elementPath, 'src');
|
|
94
|
+
if (!existsSync(join(srcPath, 'delivery')))
|
|
95
|
+
continue;
|
|
96
|
+
const pkg = JSON.parse(readFileSync(join(elementPath, 'package.json'), 'utf-8'));
|
|
97
|
+
const samples = await loadSamples(dir.name, elementPath);
|
|
98
|
+
const previous = existing.get(dir.name);
|
|
99
|
+
if (!previous) {
|
|
100
|
+
console.log(`[demo-metadata] Added ${dir.name}; check its title and hasSession in registry.ts`);
|
|
101
|
+
}
|
|
102
|
+
elements.push({
|
|
103
|
+
name: dir.name,
|
|
104
|
+
// Generate title from name (e.g., "multiple-choice" -> "Multiple Choice")
|
|
105
|
+
title: previous?.title ??
|
|
106
|
+
dir.name
|
|
107
|
+
.split('-')
|
|
108
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
109
|
+
.join(' '),
|
|
110
|
+
packageName: pkg.name,
|
|
111
|
+
hasAuthor: existsSync(join(srcPath, 'author')),
|
|
112
|
+
hasPrint: existsSync(join(srcPath, 'print')),
|
|
113
|
+
hasConfig: samples !== undefined,
|
|
114
|
+
hasSession: previous?.hasSession ?? true,
|
|
115
|
+
demoCount: Array.isArray(samples?.demos) ? samples.demos.length : 0,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
59
118
|
}
|
|
60
|
-
return elements;
|
|
119
|
+
return elements.sort((a, b) => a.name.localeCompare(b.name));
|
|
61
120
|
}
|
|
62
121
|
/**
|
|
63
122
|
* Generate registry.ts file
|
|
64
123
|
*/
|
|
65
124
|
async function generateRegistry(elements) {
|
|
66
|
-
const registryPath = join(DEMO_APP_PATH, 'src/lib/elements/registry.ts');
|
|
67
125
|
const content = `/**
|
|
68
126
|
* Element Registry
|
|
69
127
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* Generated: ${new Date().toISOString()}
|
|
128
|
+
* Generated by \`bun tools/generate-demo-metadata.mjs\` from packages/elements-react and
|
|
129
|
+
* packages/elements-svelte. Edit \`title\` and \`hasSession\` here; regeneration keeps them and
|
|
130
|
+
* overwrites the other fields.
|
|
74
131
|
*/
|
|
75
132
|
|
|
76
133
|
export interface ElementMetadata {
|
|
@@ -90,76 +147,27 @@ export function getElement(name: string): ElementMetadata | undefined {
|
|
|
90
147
|
return ELEMENT_REGISTRY.find((el) => el.name === name);
|
|
91
148
|
}
|
|
92
149
|
|
|
93
|
-
export function getAllElements(): ElementMetadata[] {
|
|
150
|
+
export function getAllElements(): readonly ElementMetadata[] {
|
|
94
151
|
return ELEMENT_REGISTRY;
|
|
95
152
|
}
|
|
96
153
|
`;
|
|
97
|
-
await mkdir(dirname(
|
|
98
|
-
await writeFile(
|
|
154
|
+
await mkdir(dirname(REGISTRY_PATH), { recursive: true });
|
|
155
|
+
await writeFile(REGISTRY_PATH, content, 'utf-8');
|
|
99
156
|
console.log(`[demo-metadata] Generated registry with ${elements.length} elements`);
|
|
100
157
|
}
|
|
101
|
-
/**
|
|
102
|
-
* Convert and copy sample configs for an element as JSON
|
|
103
|
-
*/
|
|
104
|
-
async function copySampleConfigs(elements) {
|
|
105
|
-
for (const element of elements) {
|
|
106
|
-
const sourcePath = join(ELEMENTS_REACT_PATH, element.name, 'docs/demo');
|
|
107
|
-
const targetDir = join(DEMO_APP_PATH, 'src/lib/samples');
|
|
108
|
-
await mkdir(targetDir, { recursive: true });
|
|
109
|
-
// Convert config.mjs to JSON
|
|
110
|
-
if (element.hasConfig) {
|
|
111
|
-
const sourceConfig = join(sourcePath, 'config.mjs');
|
|
112
|
-
const targetConfig = join(targetDir, `${element.name}.json`);
|
|
113
|
-
try {
|
|
114
|
-
// Dynamic import the .mjs file
|
|
115
|
-
const configModule = await import(`file://${sourceConfig}`);
|
|
116
|
-
let configData = configModule.default;
|
|
117
|
-
// Convert old format (models array) to new format (demos array)
|
|
118
|
-
if (configData?.models && !configData?.demos) {
|
|
119
|
-
console.log(`[demo-metadata] Converting ${element.name} from old format to new format`);
|
|
120
|
-
configData = {
|
|
121
|
-
demos: configData.models.map((model, index) => ({
|
|
122
|
-
id: index === 0 ? 'default' : `demo-${index + 1}`,
|
|
123
|
-
title: index === 0 ? 'Default Demo' : `Demo ${index + 1}`,
|
|
124
|
-
description: 'Default configuration',
|
|
125
|
-
tags: [],
|
|
126
|
-
model: model,
|
|
127
|
-
session: { value: [] },
|
|
128
|
-
})),
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
// Count demos (now all in 'demos' format)
|
|
132
|
-
if (configData?.demos && Array.isArray(configData.demos)) {
|
|
133
|
-
element.demoCount = configData.demos.length;
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
element.demoCount = 0;
|
|
137
|
-
}
|
|
138
|
-
// Write as JSON
|
|
139
|
-
await writeFile(targetConfig, JSON.stringify(configData, null, 2) + '\n', 'utf-8');
|
|
140
|
-
}
|
|
141
|
-
catch (e) {
|
|
142
|
-
console.warn(`[demo-metadata] Failed to convert config for ${element.name}:`, e);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Note: session.mjs files are no longer copied as separate files.
|
|
146
|
-
// Sessions are now embedded within each demo object in the config.
|
|
147
|
-
// Old format session files are automatically converted during config import above.
|
|
148
|
-
}
|
|
149
|
-
console.log(`[demo-metadata] Converted sample configs to JSON for ${elements.length} elements`);
|
|
150
|
-
}
|
|
151
158
|
/**
|
|
152
159
|
* Main entry point
|
|
153
160
|
*/
|
|
154
161
|
export async function generateDemoMetadata() {
|
|
155
162
|
console.log('[demo-metadata] Scanning elements...');
|
|
156
|
-
const
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
+
const existing = readExistingRegistry();
|
|
164
|
+
const elements = await scanElements(existing);
|
|
165
|
+
for (const name of existing.keys()) {
|
|
166
|
+
if (!elements.some((element) => element.name === name)) {
|
|
167
|
+
console.log(`[demo-metadata] Removed ${name}; no element package found`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
await generateRegistry(elements);
|
|
163
171
|
console.log('[demo-metadata] ✓ Demo metadata generation complete');
|
|
164
172
|
}
|
|
165
173
|
//# sourceMappingURL=sync-demo-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-demo-metadata.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-demo-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generate demo metadata for SvelteKit demo app\n *\n * This module generates:\n * 1. Element registry (lib/elements/registry.ts)\n * 2. Sample configs converted to JSON from each element\n * 3. Sample sessions converted to JSON from each element\n */\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst REPO_ROOT = join(__dirname, '../../../../..');\nconst DEMO_APP_PATH = join(REPO_ROOT, 'apps/element-demo');\nconst ELEMENTS_REACT_PATH = join(REPO_ROOT, 'packages/elements-react');\n\nexport interface ElementMetadata {\n name: string;\n title: string;\n packageName: string;\n hasAuthor: boolean;\n hasPrint: boolean;\n hasConfig: boolean;\n hasSession: boolean;\n demoCount: number;\n}\n\n/**\n * Scan elements-react directory for all elements\n */\nasync function scanReactElements(): Promise<ElementMetadata[]> {\n const { readdirSync, existsSync: fsExistsSync, statSync } = await import('node:fs');\n\n if (!fsExistsSync(ELEMENTS_REACT_PATH)) {\n console.log('[demo-metadata] elements-react directory not found, skipping');\n return [];\n }\n\n const elements: ElementMetadata[] = [];\n const dirs = readdirSync(ELEMENTS_REACT_PATH);\n\n for (const dir of dirs) {\n const elementPath = join(ELEMENTS_REACT_PATH, dir);\n const stat = statSync(elementPath);\n\n if (!stat.isDirectory()) continue;\n\n // Check for required structure\n const srcPath = join(elementPath, 'src');\n const deliveryPath = join(srcPath, 'delivery');\n if (!fsExistsSync(deliveryPath)) continue;\n\n // Check for author and print\n const hasAuthor = fsExistsSync(join(srcPath, 'author'));\n const hasPrint = fsExistsSync(join(srcPath, 'print'));\n\n // Check for demo files\n const docsPath = join(elementPath, 'docs/demo');\n const hasConfig = fsExistsSync(join(docsPath, 'config.mjs'));\n const hasSession = fsExistsSync(join(docsPath, 'session.mjs'));\n\n // Generate title from name (e.g., \"multiple-choice\" -> \"Multiple Choice\")\n const title = dir\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n\n elements.push({\n name: dir,\n title,\n packageName: `@pie-element/${dir}`,\n hasAuthor,\n hasPrint,\n hasConfig,\n hasSession,\n demoCount: 0, // Will be updated in copySampleConfigs\n });\n }\n\n return elements;\n}\n\n/**\n * Generate registry.ts file\n */\nasync function generateRegistry(elements: ElementMetadata[]): Promise<void> {\n const registryPath = join(DEMO_APP_PATH, 'src/lib/elements/registry.ts');\n\n const content = `/**\n * Element Registry\n *\n * AUTO-GENERATED by upstream:sync command.\n * DO NOT EDIT MANUALLY - changes will be overwritten.\n *\n * Generated: ${new Date().toISOString()}\n */\n\nexport interface ElementMetadata {\n name: string;\n title: string;\n packageName: string;\n hasAuthor: boolean;\n hasPrint: boolean;\n hasConfig: boolean;\n hasSession: boolean;\n demoCount: number;\n}\n\nexport const ELEMENT_REGISTRY: readonly ElementMetadata[] = ${JSON.stringify(elements, null, 2)};\n\nexport function getElement(name: string): ElementMetadata | undefined {\n return ELEMENT_REGISTRY.find((el) => el.name === name);\n}\n\nexport function getAllElements(): ElementMetadata[] {\n return ELEMENT_REGISTRY;\n}\n`;\n\n await mkdir(dirname(registryPath), { recursive: true });\n await writeFile(registryPath, content, 'utf-8');\n console.log(`[demo-metadata] Generated registry with ${elements.length} elements`);\n}\n\n/**\n * Convert and copy sample configs for an element as JSON\n */\nasync function copySampleConfigs(elements: ElementMetadata[]): Promise<void> {\n for (const element of elements) {\n const sourcePath = join(ELEMENTS_REACT_PATH, element.name, 'docs/demo');\n const targetDir = join(DEMO_APP_PATH, 'src/lib/samples');\n await mkdir(targetDir, { recursive: true });\n\n // Convert config.mjs to JSON\n if (element.hasConfig) {\n const sourceConfig = join(sourcePath, 'config.mjs');\n const targetConfig = join(targetDir, `${element.name}.json`);\n try {\n // Dynamic import the .mjs file\n const configModule = await import(`file://${sourceConfig}`);\n let configData = configModule.default;\n\n // Convert old format (models array) to new format (demos array)\n if (configData?.models && !configData?.demos) {\n console.log(`[demo-metadata] Converting ${element.name} from old format to new format`);\n configData = {\n demos: configData.models.map((model: any, index: number) => ({\n id: index === 0 ? 'default' : `demo-${index + 1}`,\n title: index === 0 ? 'Default Demo' : `Demo ${index + 1}`,\n description: 'Default configuration',\n tags: [],\n model: model,\n session: { value: [] },\n })),\n };\n }\n\n // Count demos (now all in 'demos' format)\n if (configData?.demos && Array.isArray(configData.demos)) {\n element.demoCount = configData.demos.length;\n } else {\n element.demoCount = 0;\n }\n\n // Write as JSON\n await writeFile(targetConfig, JSON.stringify(configData, null, 2) + '\\n', 'utf-8');\n } catch (e) {\n console.warn(`[demo-metadata] Failed to convert config for ${element.name}:`, e);\n }\n }\n\n // Note: session.mjs files are no longer copied as separate files.\n // Sessions are now embedded within each demo object in the config.\n // Old format session files are automatically converted during config import above.\n }\n\n console.log(`[demo-metadata] Converted sample configs to JSON for ${elements.length} elements`);\n}\n\n/**\n * Main entry point\n */\nexport async function generateDemoMetadata(): Promise<void> {\n console.log('[demo-metadata] Scanning elements...');\n\n const reactElements = await scanReactElements();\n const allElements = [...reactElements].sort((a, b) => a.name.localeCompare(b.name));\n\n console.log(`[demo-metadata] Found ${reactElements.length} React elements`);\n\n // Copy sample configs first so demoCount gets populated\n await copySampleConfigs(allElements);\n\n // Then generate registry with updated demoCount values\n await generateRegistry(allElements);\n\n console.log('[demo-metadata] ✓ Demo metadata generation complete');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sync-demo-metadata.js","sourceRoot":"","sources":["../../../src/lib/upstream/sync-demo-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generate demo metadata for SvelteKit demo app\n *\n * Scans packages/elements-react and packages/elements-svelte and rewrites the element registry\n * (lib/elements/registry.ts). Each element's demos live in lib/samples/<element>.json, which the\n * demo app reads; an element's docs/demo/config.mjs seeds that file only when it does not exist.\n */\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst REPO_ROOT = join(__dirname, '../../../../..');\nconst DEMO_APP_PATH = join(REPO_ROOT, 'apps/element-demo');\nconst REGISTRY_PATH = join(DEMO_APP_PATH, 'src/lib/elements/registry.ts');\nconst SAMPLES_PATH = join(DEMO_APP_PATH, 'src/lib/samples');\nconst ELEMENT_ROOTS = ['packages/elements-react', 'packages/elements-svelte'];\n\nexport interface ElementMetadata {\n name: string;\n title: string;\n packageName: string;\n hasAuthor: boolean;\n hasPrint: boolean;\n hasConfig: boolean;\n hasSession: boolean;\n demoCount: number;\n}\n\n/**\n * Read the current registry entries, whose hand-set title and hasSession survive regeneration\n */\nfunction readExistingRegistry(): Map<string, ElementMetadata> {\n if (!existsSync(REGISTRY_PATH)) return new Map();\n\n const content = readFileSync(REGISTRY_PATH, 'utf-8');\n const match = content.match(/export const ELEMENT_REGISTRY[^=]*=\\s*(\\[[\\s\\S]*?\\]);/);\n if (!match) throw new Error(`Could not find ELEMENT_REGISTRY in ${REGISTRY_PATH}`);\n\n const entries: ElementMetadata[] = JSON.parse(match[1]);\n return new Map(entries.map((entry) => [entry.name, entry]));\n}\n\n/**\n * Convert old format (models array) to new format (demos array)\n */\nfunction toDemosFormat(configData: any): any {\n if (!configData?.models || configData?.demos) return configData;\n\n return {\n demos: configData.models.map((model: any, index: number) => ({\n id: index === 0 ? 'default' : `demo-${index + 1}`,\n title: index === 0 ? 'Default Demo' : `Demo ${index + 1}`,\n description: 'Default configuration',\n tags: [],\n model: model,\n session: { value: [] },\n })),\n };\n}\n\n/**\n * Load an element's samples JSON, seeding it from docs/demo/config.mjs when it does not exist\n */\nasync function loadSamples(name: string, elementPath: string): Promise<any | undefined> {\n const samplesPath = join(SAMPLES_PATH, `${name}.json`);\n const configPath = join(elementPath, 'docs/demo/config.mjs');\n const existing = existsSync(samplesPath)\n ? JSON.parse(readFileSync(samplesPath, 'utf-8'))\n : undefined;\n\n if (!existsSync(configPath)) return existing;\n\n let configData: any;\n try {\n configData = toDemosFormat((await import(`file://${configPath}`)).default);\n } catch (e) {\n console.warn(`[demo-metadata] Failed to convert config for ${name}:`, e);\n return existing;\n }\n\n if (existing) {\n if (JSON.stringify(configData) !== JSON.stringify(existing)) {\n console.warn(\n `[demo-metadata] ${name}: docs/demo/config.mjs differs from samples/${name}.json; ` +\n 'kept the samples file (delete it to regenerate from config.mjs)'\n );\n }\n return existing;\n }\n\n await mkdir(SAMPLES_PATH, { recursive: true });\n await writeFile(samplesPath, JSON.stringify(configData, null, 2) + '\\n', 'utf-8');\n console.log(`[demo-metadata] Seeded samples/${name}.json from docs/demo/config.mjs`);\n return configData;\n}\n\n/**\n * Scan the element package directories for all elements\n */\nasync function scanElements(existing: Map<string, ElementMetadata>): Promise<ElementMetadata[]> {\n const elements: ElementMetadata[] = [];\n\n for (const root of ELEMENT_ROOTS) {\n const rootPath = join(REPO_ROOT, root);\n if (!existsSync(rootPath)) continue;\n\n for (const dir of readdirSync(rootPath, { withFileTypes: true })) {\n if (!dir.isDirectory()) continue;\n\n // Check for required structure\n const elementPath = join(rootPath, dir.name);\n const srcPath = join(elementPath, 'src');\n if (!existsSync(join(srcPath, 'delivery'))) continue;\n\n const pkg = JSON.parse(readFileSync(join(elementPath, 'package.json'), 'utf-8'));\n const samples = await loadSamples(dir.name, elementPath);\n const previous = existing.get(dir.name);\n\n if (!previous) {\n console.log(\n `[demo-metadata] Added ${dir.name}; check its title and hasSession in registry.ts`\n );\n }\n\n elements.push({\n name: dir.name,\n // Generate title from name (e.g., \"multiple-choice\" -> \"Multiple Choice\")\n title:\n previous?.title ??\n dir.name\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' '),\n packageName: pkg.name,\n hasAuthor: existsSync(join(srcPath, 'author')),\n hasPrint: existsSync(join(srcPath, 'print')),\n hasConfig: samples !== undefined,\n hasSession: previous?.hasSession ?? true,\n demoCount: Array.isArray(samples?.demos) ? samples.demos.length : 0,\n });\n }\n }\n\n return elements.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Generate registry.ts file\n */\nasync function generateRegistry(elements: ElementMetadata[]): Promise<void> {\n const content = `/**\n * Element Registry\n *\n * Generated by \\`bun tools/generate-demo-metadata.mjs\\` from packages/elements-react and\n * packages/elements-svelte. Edit \\`title\\` and \\`hasSession\\` here; regeneration keeps them and\n * overwrites the other fields.\n */\n\nexport interface ElementMetadata {\n name: string;\n title: string;\n packageName: string;\n hasAuthor: boolean;\n hasPrint: boolean;\n hasConfig: boolean;\n hasSession: boolean;\n demoCount: number;\n}\n\nexport const ELEMENT_REGISTRY: readonly ElementMetadata[] = ${JSON.stringify(elements, null, 2)};\n\nexport function getElement(name: string): ElementMetadata | undefined {\n return ELEMENT_REGISTRY.find((el) => el.name === name);\n}\n\nexport function getAllElements(): readonly ElementMetadata[] {\n return ELEMENT_REGISTRY;\n}\n`;\n\n await mkdir(dirname(REGISTRY_PATH), { recursive: true });\n await writeFile(REGISTRY_PATH, content, 'utf-8');\n console.log(`[demo-metadata] Generated registry with ${elements.length} elements`);\n}\n\n/**\n * Main entry point\n */\nexport async function generateDemoMetadata(): Promise<void> {\n console.log('[demo-metadata] Scanning elements...');\n\n const existing = readExistingRegistry();\n const elements = await scanElements(existing);\n\n for (const name of existing.keys()) {\n if (!elements.some((element) => element.name === name)) {\n console.log(`[demo-metadata] Removed ${name}; no element package found`);\n }\n }\n\n await generateRegistry(elements);\n\n console.log('[demo-metadata] ✓ Demo metadata generation complete');\n}\n"]}
|
|
@@ -22,6 +22,8 @@ export declare const PRESET_IDS: {
|
|
|
22
22
|
readonly previewPromptPropTypesShape: "patch.render-ui.preview-prompt-proptypes-shape";
|
|
23
23
|
readonly correctAnswerToggleStyleNormalization: "patch.correct-answer-toggle.style-key-normalization";
|
|
24
24
|
readonly plotToolPropTypesCompatibility: "patch.plot.tool-proptypes-compatibility";
|
|
25
|
+
readonly editableHtmlMathjaxIgnore: "patch.editable-html-tip-tap.mathjax-ignore-editor-root";
|
|
26
|
+
readonly editableHtmlMathNodeUnwrap: "patch.editable-html-tip-tap.math-node-unwrap-delimiters";
|
|
25
27
|
readonly mathRenderingWrapperMode: "mode.math-rendering.wrapper";
|
|
26
28
|
readonly preserveRenderUiInlineMenu: "preserve.render-ui.inline-menu";
|
|
27
29
|
readonly depsGraphingDndKit: "deps.graphing.dnd-kit-core";
|
|
@@ -11,6 +11,8 @@ export const PRESET_IDS = {
|
|
|
11
11
|
previewPromptPropTypesShape: 'patch.render-ui.preview-prompt-proptypes-shape',
|
|
12
12
|
correctAnswerToggleStyleNormalization: 'patch.correct-answer-toggle.style-key-normalization',
|
|
13
13
|
plotToolPropTypesCompatibility: 'patch.plot.tool-proptypes-compatibility',
|
|
14
|
+
editableHtmlMathjaxIgnore: 'patch.editable-html-tip-tap.mathjax-ignore-editor-root',
|
|
15
|
+
editableHtmlMathNodeUnwrap: 'patch.editable-html-tip-tap.math-node-unwrap-delimiters',
|
|
14
16
|
mathRenderingWrapperMode: 'mode.math-rendering.wrapper',
|
|
15
17
|
preserveRenderUiInlineMenu: 'preserve.render-ui.inline-menu',
|
|
16
18
|
depsGraphingDndKit: 'deps.graphing.dnd-kit-core',
|
|
@@ -84,6 +86,38 @@ export function getPostSyncTextPatches(projectRoot) {
|
|
|
84
86
|
{ from: " 'user-select': 'none',", to: " userSelect: 'none'," },
|
|
85
87
|
],
|
|
86
88
|
},
|
|
89
|
+
{
|
|
90
|
+
id: PRESET_IDS.editableHtmlMathjaxIgnore,
|
|
91
|
+
label: '@pie-lib/editable-html-tip-tap editor root excluded from MathJax',
|
|
92
|
+
file: join(projectRoot, 'packages/lib-react/editable-html-tip-tap/src/components/EditableHtml.tsx'),
|
|
93
|
+
replacements: [
|
|
94
|
+
{
|
|
95
|
+
from: " 'data-pie-editor': 'true',\n // Without these the browser spellchecks",
|
|
96
|
+
to: " 'data-pie-editor': 'true',\n" +
|
|
97
|
+
" // MathJax's default ignore class. A typeset pass over an ancestor would otherwise typeset the\n" +
|
|
98
|
+
" // editor's text, and ProseMirror reads MathJax's output back into the document.\n" +
|
|
99
|
+
" class: 'mathjax_ignore',\n" +
|
|
100
|
+
' // Without these the browser spellchecks',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: PRESET_IDS.editableHtmlMathNodeUnwrap,
|
|
106
|
+
label: '@pie-lib/editable-html-tip-tap math node parses bare TeX',
|
|
107
|
+
file: join(projectRoot, 'packages/lib-react/editable-html-tip-tap/src/extensions/math.tsx'),
|
|
108
|
+
replacements: [
|
|
109
|
+
{
|
|
110
|
+
from: "import { wrapMath } from '@pie-element/shared-math-rendering-mathjax';",
|
|
111
|
+
to: "import { unWrapMath, wrapMath } from '@pie-element/shared-math-rendering-mathjax';",
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
from: " latex: el.getAttribute('data-raw') || el.textContent,\n",
|
|
115
|
+
to: ' // A span saved without `data-raw`, or with delimiters in it, holds delimited TeX, which\n' +
|
|
116
|
+
' // `renderHTML` would wrap a second time.\n' +
|
|
117
|
+
" latex: unWrapMath(el.getAttribute('data-raw') || el.textContent).unwrapped,\n",
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
87
121
|
];
|
|
88
122
|
}
|
|
89
123
|
export function getPieLibSyncMode(pkgName) {
|
|
@@ -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\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"]}
|
|
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 editableHtmlMathjaxIgnore: 'patch.editable-html-tip-tap.mathjax-ignore-editor-root',\n editableHtmlMathNodeUnwrap: 'patch.editable-html-tip-tap.math-node-unwrap-delimiters',\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 id: PRESET_IDS.editableHtmlMathjaxIgnore,\n label: '@pie-lib/editable-html-tip-tap editor root excluded from MathJax',\n file: join(\n projectRoot,\n 'packages/lib-react/editable-html-tip-tap/src/components/EditableHtml.tsx'\n ),\n replacements: [\n {\n from: \" 'data-pie-editor': 'true',\\n // Without these the browser spellchecks\",\n to:\n \" 'data-pie-editor': 'true',\\n\" +\n \" // MathJax's default ignore class. A typeset pass over an ancestor would otherwise typeset the\\n\" +\n \" // editor's text, and ProseMirror reads MathJax's output back into the document.\\n\" +\n \" class: 'mathjax_ignore',\\n\" +\n ' // Without these the browser spellchecks',\n },\n ],\n },\n {\n id: PRESET_IDS.editableHtmlMathNodeUnwrap,\n label: '@pie-lib/editable-html-tip-tap math node parses bare TeX',\n file: join(projectRoot, 'packages/lib-react/editable-html-tip-tap/src/extensions/math.tsx'),\n replacements: [\n {\n from: \"import { wrapMath } from '@pie-element/shared-math-rendering-mathjax';\",\n to: \"import { unWrapMath, wrapMath } from '@pie-element/shared-math-rendering-mathjax';\",\n },\n {\n from: \" latex: el.getAttribute('data-raw') || el.textContent,\\n\",\n to:\n ' // A span saved without `data-raw`, or with delimiters in it, holds delimited TeX, which\\n' +\n ' // `renderHTML` would wrap a second time.\\n' +\n \" latex: unWrapMath(el.getAttribute('data-raw') || el.textContent).unwrapped,\\n\",\n },\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/cli",
|
|
3
|
-
"version": "0.1.2-next.
|
|
3
|
+
"version": "0.1.2-next.15",
|
|
4
4
|
"description": "CLI tools for managing PIE Elements NG",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@oclif/core": "^4.0.0",
|
|
25
25
|
"@oclif/plugin-help": "^6.2.0",
|
|
26
|
-
"@pie-element/element-bundler": "0.1.2-next.
|
|
26
|
+
"@pie-element/element-bundler": "0.1.2-next.7",
|
|
27
27
|
"es-module-lexer": "^1.7.0",
|
|
28
28
|
"glob": "^13.0.0",
|
|
29
29
|
"open": "^10.0.3",
|