@pie-element/cli 0.1.1 ā 0.1.2-next.0
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 +48 -10
- package/dist/commands/dev/demo/index.d.ts +1 -1
- package/dist/commands/dev/demo/index.js +21 -0
- package/dist/commands/dev/demo/index.js.map +1 -1
- package/dist/commands/dev/test-bundler.d.ts +0 -1
- package/dist/commands/dev/test-bundler.js +2 -10
- package/dist/commands/dev/test-bundler.js.map +1 -1
- package/dist/commands/docs/generate.d.ts +16 -0
- package/dist/commands/docs/generate.js +150 -0
- package/dist/commands/docs/generate.js.map +1 -0
- package/dist/commands/docs/verify.d.ts +12 -0
- package/dist/commands/docs/verify.js +40 -0
- package/dist/commands/docs/verify.js.map +1 -0
- package/dist/commands/packages/create-controllers.d.ts +0 -1
- package/dist/commands/packages/create-controllers.js.map +1 -1
- package/dist/commands/packages/create-lib-react.d.ts +0 -1
- package/dist/commands/packages/create-lib-react.js +1 -3
- package/dist/commands/packages/create-lib-react.js.map +1 -1
- package/dist/commands/packages/create-react-elements.d.ts +0 -1
- package/dist/commands/packages/create-react-elements.js +2 -3
- package/dist/commands/packages/create-react-elements.js.map +1 -1
- package/dist/commands/packages/enable-publishing.d.ts +0 -1
- package/dist/commands/packages/enable-publishing.js +26 -23
- package/dist/commands/packages/enable-publishing.js.map +1 -1
- package/dist/commands/packages/init-synced-elements.d.ts +0 -1
- package/dist/commands/packages/init-synced-elements.js +1 -1
- package/dist/commands/packages/init-synced-elements.js.map +1 -1
- package/dist/commands/upstream/analyze-esm.d.ts +0 -1
- package/dist/commands/upstream/analyze-esm.js +5 -1
- package/dist/commands/upstream/analyze-esm.js.map +1 -1
- package/dist/commands/upstream/check.d.ts +0 -1
- package/dist/commands/upstream/check.js.map +1 -1
- package/dist/commands/upstream/deps.d.ts +0 -1
- package/dist/commands/upstream/deps.js.map +1 -1
- package/dist/commands/upstream/sync.d.ts +11 -2
- package/dist/commands/upstream/sync.js +364 -25
- package/dist/commands/upstream/sync.js.map +1 -1
- package/dist/commands/upstream/track.d.ts +0 -1
- package/dist/commands/upstream/track.js.map +1 -1
- package/dist/commands/upstream/update.d.ts +0 -1
- package/dist/commands/upstream/update.js +37 -7
- package/dist/commands/upstream/update.js.map +1 -1
- package/dist/commands/verify/controllers.d.ts +0 -1
- package/dist/commands/verify/controllers.js +213 -59
- package/dist/commands/verify/controllers.js.map +1 -1
- package/dist/commands/verify/dependency-integrity.d.ts +18 -0
- package/dist/commands/verify/dependency-integrity.js +147 -0
- package/dist/commands/verify/dependency-integrity.js.map +1 -0
- package/dist/commands/verify/react-build.d.ts +0 -1
- package/dist/commands/verify/react-build.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/docs/contract-validator.d.ts +12 -0
- package/dist/lib/docs/contract-validator.js +38 -0
- package/dist/lib/docs/contract-validator.js.map +1 -0
- package/dist/lib/docs/contracts.d.ts +11 -0
- package/dist/lib/docs/contracts.js +241 -0
- package/dist/lib/docs/contracts.js.map +1 -0
- package/dist/lib/docs/discovery.d.ts +10 -0
- package/dist/lib/docs/discovery.js +91 -0
- package/dist/lib/docs/discovery.js.map +1 -0
- package/dist/lib/docs/generator.d.ts +14 -0
- package/dist/lib/docs/generator.js +450 -0
- package/dist/lib/docs/generator.js.map +1 -0
- package/dist/lib/docs/source-extractor.d.ts +2 -0
- package/dist/lib/docs/source-extractor.js +209 -0
- package/dist/lib/docs/source-extractor.js.map +1 -0
- package/dist/lib/docs/types.d.ts +77 -0
- package/dist/lib/docs/types.js +2 -0
- package/dist/lib/docs/types.js.map +1 -0
- package/dist/lib/upstream/repo-utils.d.ts +0 -1
- package/dist/lib/upstream/repo-utils.js.map +1 -1
- package/dist/lib/upstream/sync-compatibility.d.ts +0 -1
- package/dist/lib/upstream/sync-compatibility.js.map +1 -1
- package/dist/lib/upstream/sync-constants.d.ts +35 -7
- package/dist/lib/upstream/sync-constants.js +40 -11
- package/dist/lib/upstream/sync-constants.js.map +1 -1
- package/dist/lib/upstream/sync-controllers-strategy.d.ts +0 -1
- package/dist/lib/upstream/sync-controllers-strategy.js +14 -4
- package/dist/lib/upstream/sync-controllers-strategy.js.map +1 -1
- package/dist/lib/upstream/sync-demo-metadata.d.ts +0 -1
- package/dist/lib/upstream/sync-demo-metadata.js +1 -1
- package/dist/lib/upstream/sync-demo-metadata.js.map +1 -1
- package/dist/lib/upstream/sync-entry-discovery.d.ts +3 -0
- package/dist/lib/upstream/sync-entry-discovery.js +23 -0
- package/dist/lib/upstream/sync-entry-discovery.js.map +1 -0
- package/dist/lib/upstream/sync-externals.d.ts +7 -7
- package/dist/lib/upstream/sync-externals.js +51 -35
- package/dist/lib/upstream/sync-externals.js.map +1 -1
- package/dist/lib/upstream/sync-filesystem.d.ts +0 -1
- package/dist/lib/upstream/sync-filesystem.js.map +1 -1
- package/dist/lib/upstream/sync-imports.d.ts +82 -62
- package/dist/lib/upstream/sync-imports.js +658 -185
- package/dist/lib/upstream/sync-imports.js.map +1 -1
- package/dist/lib/upstream/sync-package-json.d.ts +0 -1
- package/dist/lib/upstream/sync-package-json.js +7 -0
- package/dist/lib/upstream/sync-package-json.js.map +1 -1
- package/dist/lib/upstream/sync-package-manager.d.ts +14 -4
- package/dist/lib/upstream/sync-package-manager.js +405 -72
- package/dist/lib/upstream/sync-package-manager.js.map +1 -1
- package/dist/lib/upstream/sync-pielib-strategy.d.ts +2 -1
- package/dist/lib/upstream/sync-pielib-strategy.js +228 -110
- package/dist/lib/upstream/sync-pielib-strategy.js.map +1 -1
- package/dist/lib/upstream/sync-presets.d.ts +52 -0
- package/dist/lib/upstream/sync-presets.js +175 -0
- package/dist/lib/upstream/sync-presets.js.map +1 -0
- package/dist/lib/upstream/sync-react-strategy.d.ts +6 -1
- package/dist/lib/upstream/sync-react-strategy.js +342 -134
- package/dist/lib/upstream/sync-react-strategy.js.map +1 -1
- package/dist/lib/upstream/sync-source-edit.d.ts +14 -0
- package/dist/lib/upstream/sync-source-edit.js +89 -0
- package/dist/lib/upstream/sync-source-edit.js.map +1 -0
- package/dist/lib/upstream/sync-source-tree.d.ts +22 -0
- package/dist/lib/upstream/sync-source-tree.js +99 -0
- package/dist/lib/upstream/sync-source-tree.js.map +1 -0
- package/dist/lib/upstream/sync-strategy.d.ts +1 -1
- package/dist/lib/upstream/sync-strategy.js.map +1 -1
- package/dist/lib/upstream/sync-summary.d.ts +0 -1
- package/dist/lib/upstream/sync-summary.js.map +1 -1
- package/dist/lib/upstream/sync-transforms.d.ts +13 -11
- package/dist/lib/upstream/sync-transforms.js +23 -17
- package/dist/lib/upstream/sync-transforms.js.map +1 -1
- package/dist/lib/upstream/sync-vite-config.d.ts +13 -1
- package/dist/lib/upstream/sync-vite-config.js +65 -46
- package/dist/lib/upstream/sync-vite-config.js.map +1 -1
- package/dist/utils/compatibility.d.ts +13 -1
- package/dist/utils/compatibility.js +143 -2
- package/dist/utils/compatibility.js.map +1 -1
- package/dist/utils/conversion.d.ts +0 -1
- package/dist/utils/conversion.js.map +1 -1
- package/dist/utils/dependency-integrity.d.ts +37 -0
- package/dist/utils/dependency-integrity.js +557 -0
- package/dist/utils/dependency-integrity.js.map +1 -0
- package/dist/utils/git.d.ts +0 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/package-json.d.ts +0 -1
- package/dist/utils/package-json.js.map +1 -1
- package/package.json +25 -8
- package/.compatibility/report.json +0 -2491
- package/.turbo/turbo-build.log +0 -1
- package/CHANGELOG.md +0 -8
- package/REFACTORING.md +0 -131
- package/bin/dev.js +0 -5
- package/dist/commands/dev/demo/index.d.ts.map +0 -1
- package/dist/commands/dev/test-bundler.d.ts.map +0 -1
- package/dist/commands/mathquill/migrate.d.ts +0 -20
- package/dist/commands/mathquill/migrate.d.ts.map +0 -1
- package/dist/commands/mathquill/migrate.js +0 -240
- package/dist/commands/mathquill/migrate.js.map +0 -1
- package/dist/commands/mathquill/status.d.ts +0 -20
- package/dist/commands/mathquill/status.d.ts.map +0 -1
- package/dist/commands/mathquill/status.js +0 -231
- package/dist/commands/mathquill/status.js.map +0 -1
- package/dist/commands/packages/create-controllers.d.ts.map +0 -1
- package/dist/commands/packages/create-lib-react.d.ts.map +0 -1
- package/dist/commands/packages/create-react-elements.d.ts.map +0 -1
- package/dist/commands/packages/enable-publishing.d.ts.map +0 -1
- package/dist/commands/packages/init-synced-elements.d.ts.map +0 -1
- package/dist/commands/upstream/analyze-esm.d.ts.map +0 -1
- package/dist/commands/upstream/check.d.ts.map +0 -1
- package/dist/commands/upstream/deps.d.ts.map +0 -1
- package/dist/commands/upstream/sync-mathquill.d.ts +0 -12
- package/dist/commands/upstream/sync-mathquill.d.ts.map +0 -1
- package/dist/commands/upstream/sync-mathquill.js +0 -97
- package/dist/commands/upstream/sync-mathquill.js.map +0 -1
- package/dist/commands/upstream/sync.d.ts.map +0 -1
- package/dist/commands/upstream/track.d.ts.map +0 -1
- package/dist/commands/upstream/update.d.ts.map +0 -1
- package/dist/commands/verify/controllers.d.ts.map +0 -1
- package/dist/commands/verify/react-build.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/mathquill/extension-generator.d.ts +0 -9
- package/dist/lib/mathquill/extension-generator.d.ts.map +0 -1
- package/dist/lib/mathquill/extension-generator.js +0 -107
- package/dist/lib/mathquill/extension-generator.js.map +0 -1
- package/dist/lib/mathquill/khan-extractor.d.ts +0 -16
- package/dist/lib/mathquill/khan-extractor.d.ts.map +0 -1
- package/dist/lib/mathquill/khan-extractor.js +0 -148
- package/dist/lib/mathquill/khan-extractor.js.map +0 -1
- package/dist/lib/mathquill/learnosity-extractor.d.ts +0 -15
- package/dist/lib/mathquill/learnosity-extractor.d.ts.map +0 -1
- package/dist/lib/mathquill/learnosity-extractor.js +0 -170
- package/dist/lib/mathquill/learnosity-extractor.js.map +0 -1
- package/dist/lib/mathquill/migration-orchestrator.d.ts +0 -77
- package/dist/lib/mathquill/migration-orchestrator.d.ts.map +0 -1
- package/dist/lib/mathquill/migration-orchestrator.js +0 -391
- package/dist/lib/mathquill/migration-orchestrator.js.map +0 -1
- package/dist/lib/mathquill/package-updater.d.ts +0 -9
- package/dist/lib/mathquill/package-updater.d.ts.map +0 -1
- package/dist/lib/mathquill/package-updater.js +0 -103
- package/dist/lib/mathquill/package-updater.js.map +0 -1
- package/dist/lib/mathquill/pie-extractor.d.ts +0 -14
- package/dist/lib/mathquill/pie-extractor.d.ts.map +0 -1
- package/dist/lib/mathquill/pie-extractor.js +0 -167
- package/dist/lib/mathquill/pie-extractor.js.map +0 -1
- package/dist/lib/upstream/repo-utils.d.ts.map +0 -1
- package/dist/lib/upstream/sync-compatibility.d.ts.map +0 -1
- package/dist/lib/upstream/sync-constants.d.ts.map +0 -1
- package/dist/lib/upstream/sync-controllers-strategy.d.ts.map +0 -1
- package/dist/lib/upstream/sync-demo-metadata.d.ts.map +0 -1
- package/dist/lib/upstream/sync-dev-exports.d.ts +0 -13
- package/dist/lib/upstream/sync-dev-exports.d.ts.map +0 -1
- package/dist/lib/upstream/sync-dev-exports.js +0 -115
- package/dist/lib/upstream/sync-dev-exports.js.map +0 -1
- package/dist/lib/upstream/sync-externals.d.ts.map +0 -1
- package/dist/lib/upstream/sync-filesystem.d.ts.map +0 -1
- package/dist/lib/upstream/sync-imports.d.ts.map +0 -1
- package/dist/lib/upstream/sync-mathquill.d.ts +0 -19
- package/dist/lib/upstream/sync-mathquill.d.ts.map +0 -1
- package/dist/lib/upstream/sync-mathquill.js +0 -160
- package/dist/lib/upstream/sync-mathquill.js.map +0 -1
- package/dist/lib/upstream/sync-package-json.d.ts.map +0 -1
- package/dist/lib/upstream/sync-package-manager.d.ts.map +0 -1
- package/dist/lib/upstream/sync-pielib-strategy.d.ts.map +0 -1
- package/dist/lib/upstream/sync-react-strategy.d.ts.map +0 -1
- package/dist/lib/upstream/sync-strategy.d.ts.map +0 -1
- package/dist/lib/upstream/sync-summary.d.ts.map +0 -1
- package/dist/lib/upstream/sync-transforms.d.ts.map +0 -1
- package/dist/lib/upstream/sync-vite-config.d.ts.map +0 -1
- package/dist/utils/compatibility.d.ts.map +0 -1
- package/dist/utils/conversion.d.ts.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/package-json.d.ts.map +0 -1
- package/packages/cli/bin/dev.js +0 -5
- package/packages/cli/bin/run.js +0 -5
- package/src/commands/dev/demo/index.ts +0 -313
- package/src/commands/dev/test-bundler.ts +0 -345
- package/src/commands/mathquill/migrate.ts +0 -269
- package/src/commands/mathquill/status.ts +0 -267
- package/src/commands/packages/create-controllers.ts +0 -127
- package/src/commands/packages/create-lib-react.ts +0 -279
- package/src/commands/packages/create-react-elements.ts +0 -306
- package/src/commands/packages/enable-publishing.ts +0 -161
- package/src/commands/packages/init-synced-elements.ts +0 -259
- package/src/commands/upstream/README.md +0 -444
- package/src/commands/upstream/analyze-esm.ts +0 -1973
- package/src/commands/upstream/check.ts +0 -228
- package/src/commands/upstream/deps.ts +0 -222
- package/src/commands/upstream/sync-mathquill.ts +0 -108
- package/src/commands/upstream/sync.ts +0 -687
- package/src/commands/upstream/track.ts +0 -145
- package/src/commands/upstream/update.ts +0 -110
- package/src/commands/verify/controllers.ts +0 -166
- package/src/commands/verify/react-build.ts +0 -171
- package/src/index.ts +0 -1
- package/src/lib/mathquill/extension-generator.ts +0 -111
- package/src/lib/mathquill/khan-extractor.ts +0 -175
- package/src/lib/mathquill/learnosity-extractor.ts +0 -198
- package/src/lib/mathquill/migration-orchestrator.ts +0 -513
- package/src/lib/mathquill/package-updater.ts +0 -120
- package/src/lib/mathquill/pie-extractor.ts +0 -194
- package/src/lib/upstream/repo-utils.ts +0 -18
- package/src/lib/upstream/sync-compatibility.ts +0 -89
- package/src/lib/upstream/sync-constants.ts +0 -77
- package/src/lib/upstream/sync-controllers-strategy.ts +0 -291
- package/src/lib/upstream/sync-demo-metadata.ts +0 -199
- package/src/lib/upstream/sync-dev-exports.ts +0 -151
- package/src/lib/upstream/sync-externals.ts +0 -159
- package/src/lib/upstream/sync-filesystem.ts +0 -87
- package/src/lib/upstream/sync-imports.ts +0 -992
- package/src/lib/upstream/sync-mathquill.ts +0 -194
- package/src/lib/upstream/sync-package-json.ts +0 -86
- package/src/lib/upstream/sync-package-manager.ts +0 -694
- package/src/lib/upstream/sync-pielib-strategy.ts +0 -441
- package/src/lib/upstream/sync-react-strategy.ts +0 -945
- package/src/lib/upstream/sync-strategy.ts +0 -61
- package/src/lib/upstream/sync-summary.ts +0 -194
- package/src/lib/upstream/sync-transforms.ts +0 -154
- package/src/lib/upstream/sync-vite-config.ts +0 -243
- package/src/types/es-module-lexer.d.ts +0 -4
- package/src/utils/compatibility.ts +0 -182
- package/src/utils/conversion.ts +0 -153
- package/src/utils/git.ts +0 -63
- package/src/utils/logger.ts +0 -69
- package/src/utils/package-json.ts +0 -43
- package/tests/sync-package-manager.test.ts +0 -112
- package/tests/transform-assign-props.test.ts +0 -101
- package/tsconfig.json +0 -15
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import { Logger } from '../../utils/logger.js';
|
|
3
|
-
import { MigrationOrchestrator } from '../../lib/mathquill/migration-orchestrator.js';
|
|
4
|
-
import { existsSync } from 'node:fs';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
-
|
|
7
|
-
export default class MathQuillMigrate extends Command {
|
|
8
|
-
static override description = `Migrate MathQuill from PIE fork to Desmos fork with patches
|
|
9
|
-
|
|
10
|
-
Automates the migration from PIE's 2015 MathQuill fork to the modern Desmos fork
|
|
11
|
-
with Khan Academy patches, Learnosity features, and PIE extensions.
|
|
12
|
-
|
|
13
|
-
This command:
|
|
14
|
-
1. Clones Desmos, Khan, and Learnosity forks to temp directory
|
|
15
|
-
2. Extracts features from each fork:
|
|
16
|
-
- Khan: Mobile keyboard fixes, i18n ARIA strings
|
|
17
|
-
- Learnosity: Recurring decimals, nless/ngtr symbols, empty() method
|
|
18
|
-
- PIE: Matrices (pmatrix, bmatrix, vmatrix), lrnexponent
|
|
19
|
-
3. Generates TypeScript extension modules with source attribution
|
|
20
|
-
4. Creates unified extension loader
|
|
21
|
-
5. Updates package.json to use Desmos fork
|
|
22
|
-
6. Runs automated tests
|
|
23
|
-
|
|
24
|
-
The migration is repeatable - you can re-run it when forks update.
|
|
25
|
-
|
|
26
|
-
After migration, review changes and test thoroughly before committing.
|
|
27
|
-
`;
|
|
28
|
-
|
|
29
|
-
static override examples = [
|
|
30
|
-
{
|
|
31
|
-
description: 'Show what would be migrated (dry run)',
|
|
32
|
-
command: '<%= config.bin %> <%= command.id %> --dry-run',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
description: 'Run full migration',
|
|
36
|
-
command: '<%= config.bin %> <%= command.id %>',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
description: 'Verbose output with detailed progress',
|
|
40
|
-
command: '<%= config.bin %> <%= command.id %> --verbose',
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
description: 'Force migration (skip confirmations)',
|
|
44
|
-
command: '<%= config.bin %> <%= command.id %> --force',
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
description: 'Skip tests',
|
|
48
|
-
command: '<%= config.bin %> <%= command.id %> --skip-tests',
|
|
49
|
-
},
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
static override flags = {
|
|
53
|
-
'dry-run': Flags.boolean({
|
|
54
|
-
description: 'Show what would be done without making changes',
|
|
55
|
-
default: false,
|
|
56
|
-
}),
|
|
57
|
-
force: Flags.boolean({
|
|
58
|
-
description: 'Skip confirmation prompts and continue on non-fatal errors',
|
|
59
|
-
default: false,
|
|
60
|
-
}),
|
|
61
|
-
verbose: Flags.boolean({
|
|
62
|
-
char: 'v',
|
|
63
|
-
description: 'Show detailed progress output',
|
|
64
|
-
default: false,
|
|
65
|
-
}),
|
|
66
|
-
'skip-tests': Flags.boolean({
|
|
67
|
-
description: 'Skip running tests after migration',
|
|
68
|
-
default: false,
|
|
69
|
-
}),
|
|
70
|
-
'temp-dir': Flags.string({
|
|
71
|
-
description: 'Temporary directory for cloning forks',
|
|
72
|
-
default: '/tmp/mathquill-migration',
|
|
73
|
-
}),
|
|
74
|
-
clean: Flags.boolean({
|
|
75
|
-
description: 'Clean temporary directory before starting',
|
|
76
|
-
default: false,
|
|
77
|
-
}),
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
async run(): Promise<void> {
|
|
81
|
-
const { flags } = await this.parse(MathQuillMigrate);
|
|
82
|
-
const logger = new Logger(flags.verbose);
|
|
83
|
-
|
|
84
|
-
// Validate workspace
|
|
85
|
-
const workspaceRoot = process.cwd();
|
|
86
|
-
const mathquillPath = join(workspaceRoot, 'packages/shared/mathquill');
|
|
87
|
-
|
|
88
|
-
if (!existsSync(mathquillPath)) {
|
|
89
|
-
logger.error('MathQuill package not found at: packages/shared/mathquill');
|
|
90
|
-
logger.info('This command must be run from the workspace root');
|
|
91
|
-
this.exit(1);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Show banner
|
|
95
|
-
logger.section('š MathQuill Migration');
|
|
96
|
-
logger.info(' Migrating from PIE fork to Desmos fork + patches\n');
|
|
97
|
-
|
|
98
|
-
if (flags['dry-run']) {
|
|
99
|
-
logger.warn('š DRY RUN MODE - No changes will be made\n');
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Create orchestrator
|
|
103
|
-
const orchestrator = new MigrationOrchestrator({
|
|
104
|
-
workspaceRoot,
|
|
105
|
-
mathquillPath,
|
|
106
|
-
tempDir: flags['temp-dir'],
|
|
107
|
-
dryRun: flags['dry-run'],
|
|
108
|
-
force: flags.force,
|
|
109
|
-
skipTests: flags['skip-tests'],
|
|
110
|
-
clean: flags.clean,
|
|
111
|
-
logger,
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Show configuration
|
|
115
|
-
if (flags.verbose) {
|
|
116
|
-
logger.section('Configuration');
|
|
117
|
-
logger.info(` Workspace: ${workspaceRoot}`);
|
|
118
|
-
logger.info(` MathQuill: ${mathquillPath}`);
|
|
119
|
-
logger.info(` Temp Dir: ${flags['temp-dir']}`);
|
|
120
|
-
logger.info(` Dry Run: ${flags['dry-run']}`);
|
|
121
|
-
logger.info(` Force: ${flags.force}`);
|
|
122
|
-
logger.info(` Skip Tests: ${flags['skip-tests']}\n`);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Confirm if not in dry-run or force mode
|
|
126
|
-
if (!flags['dry-run'] && !flags.force) {
|
|
127
|
-
logger.warn('ā ļø This will modify packages/shared/mathquill');
|
|
128
|
-
logger.info(' A git commit is recommended before proceeding.\n');
|
|
129
|
-
|
|
130
|
-
// In a real implementation, you'd use inquirer or similar
|
|
131
|
-
// For now, we'll just proceed
|
|
132
|
-
logger.info(' Proceeding with migration...\n');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
try {
|
|
136
|
-
// Run migration
|
|
137
|
-
const result = await orchestrator.migrate();
|
|
138
|
-
|
|
139
|
-
if (flags['dry-run']) {
|
|
140
|
-
this.showDryRunSummary(result, logger);
|
|
141
|
-
} else {
|
|
142
|
-
this.showSuccessSummary(result, logger);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (!result.success) {
|
|
146
|
-
this.exit(1);
|
|
147
|
-
}
|
|
148
|
-
} catch (error) {
|
|
149
|
-
logger.error('\nā Migration failed');
|
|
150
|
-
|
|
151
|
-
if (error instanceof Error) {
|
|
152
|
-
logger.error(` ${error.message}`);
|
|
153
|
-
if (flags.verbose && error.stack) {
|
|
154
|
-
logger.debug(`\n${error.stack}`);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
logger.info('\nš” Troubleshooting:');
|
|
159
|
-
logger.info(' 1. Check internet connectivity for git clones');
|
|
160
|
-
logger.info(' 2. Ensure temp directory is writable');
|
|
161
|
-
logger.info(' 3. Run with --verbose for detailed output');
|
|
162
|
-
logger.info(' 4. Try --clean to remove cached forks');
|
|
163
|
-
logger.info(' 5. Check docs/MATHQUILL_MIGRATION_CLI_PLAN.md');
|
|
164
|
-
|
|
165
|
-
this.exit(1);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
private showDryRunSummary(result: any, logger: Logger): void {
|
|
170
|
-
logger.section('š Dry Run Summary');
|
|
171
|
-
logger.info('Would perform the following actions:\n');
|
|
172
|
-
|
|
173
|
-
logger.info('š Prepare environment:');
|
|
174
|
-
logger.info(` ⢠Create temp directory: ${result.tempDir}`);
|
|
175
|
-
logger.info(' ⢠Create extension directories\n');
|
|
176
|
-
|
|
177
|
-
logger.info('š Clone forks:');
|
|
178
|
-
logger.info(' ⢠Desmos fork (desmosinc/mathquill)');
|
|
179
|
-
logger.info(' ⢠Khan fork (Khan/mathquill v1.0.3)');
|
|
180
|
-
logger.info(' ⢠Learnosity fork (Learnosity/mathquill)\n');
|
|
181
|
-
|
|
182
|
-
logger.info('š¦ Extract features:');
|
|
183
|
-
logger.info(' Khan Academy:');
|
|
184
|
-
logger.info(' ⢠mobile-keyboard.ts (Android keyboard fixes)');
|
|
185
|
-
logger.info(' ⢠i18n-aria.ts (Internationalized ARIA strings)');
|
|
186
|
-
logger.info(' Learnosity:');
|
|
187
|
-
logger.info(' ⢠recurring-decimal.ts (Recurring decimal dot)');
|
|
188
|
-
logger.info(' ⢠not-symbols.ts (nless, ngtr symbols)');
|
|
189
|
-
logger.info(' ⢠empty-method.ts (Check if field is empty)');
|
|
190
|
-
logger.info(' PIE:');
|
|
191
|
-
logger.info(' ⢠matrices.ts (pmatrix, bmatrix, vmatrix)');
|
|
192
|
-
logger.info(' ⢠lrn-exponent.ts (LRN exponent notation)\n');
|
|
193
|
-
|
|
194
|
-
logger.info('šØ Generate:');
|
|
195
|
-
logger.info(' ⢠Extension loader (src/extensions/index.ts)\n');
|
|
196
|
-
|
|
197
|
-
logger.info('š Update:');
|
|
198
|
-
logger.info(' ⢠Install: mathquill@github:desmosinc/mathquill');
|
|
199
|
-
logger.info(' ⢠Update: package.json with migration metadata\n');
|
|
200
|
-
|
|
201
|
-
logger.info('š§Ŗ Test:');
|
|
202
|
-
logger.info(' ⢠Run unit tests');
|
|
203
|
-
logger.info(' ⢠Run integration tests\n');
|
|
204
|
-
|
|
205
|
-
logger.success('Dry run complete!');
|
|
206
|
-
logger.info('\nRun without --dry-run to execute migration.');
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
private showSuccessSummary(result: any, logger: Logger): void {
|
|
210
|
-
logger.section('ā
Migration Complete!');
|
|
211
|
-
|
|
212
|
-
logger.info('\nš Summary:');
|
|
213
|
-
logger.info(` Base: Desmos fork (${result.desmos?.commit || 'latest'})`);
|
|
214
|
-
logger.info(` + Khan: ${result.khan?.featuresCount || 0} patches applied`);
|
|
215
|
-
logger.info(` + Learnosity: ${result.learnosity?.featuresCount || 0} features added`);
|
|
216
|
-
logger.info(` + PIE: ${result.pie?.featuresCount || 0} extensions ported`);
|
|
217
|
-
|
|
218
|
-
if (result.files && result.files.length > 0) {
|
|
219
|
-
logger.info('\nš Generated Files:');
|
|
220
|
-
logger.info(' packages/shared/mathquill/src/extensions/');
|
|
221
|
-
logger.info(' āāā khan/');
|
|
222
|
-
logger.info(' ā āāā mobile-keyboard.ts');
|
|
223
|
-
logger.info(' ā āāā i18n-aria.ts');
|
|
224
|
-
logger.info(' āāā learnosity/');
|
|
225
|
-
logger.info(' ā āāā recurring-decimal.ts');
|
|
226
|
-
logger.info(' ā āāā not-symbols.ts');
|
|
227
|
-
logger.info(' ā āāā empty-method.ts');
|
|
228
|
-
logger.info(' āāā pie/');
|
|
229
|
-
logger.info(' ā āāā matrices.ts');
|
|
230
|
-
logger.info(' ā āāā lrn-exponent.ts');
|
|
231
|
-
logger.info(' āāā index.ts (loader)');
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (result.tests) {
|
|
235
|
-
logger.info('\nš§Ŗ Tests:');
|
|
236
|
-
if (result.tests.unit?.passed) {
|
|
237
|
-
logger.success(` Unit tests: ${result.tests.unit.passed} passed`);
|
|
238
|
-
}
|
|
239
|
-
if (result.tests.integration?.passed) {
|
|
240
|
-
logger.success(` Integration tests: ${result.tests.integration.passed} passed`);
|
|
241
|
-
}
|
|
242
|
-
if (result.tests.warnings && result.tests.warnings.length > 0) {
|
|
243
|
-
logger.warn(` Warnings: ${result.tests.warnings.length}`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
logger.info('\nš Next Steps:');
|
|
248
|
-
logger.info(' 1. Review changes:');
|
|
249
|
-
logger.info(' git diff packages/shared/mathquill');
|
|
250
|
-
logger.info(' 2. Build package:');
|
|
251
|
-
logger.info(' cd packages/shared/mathquill && bun run build');
|
|
252
|
-
logger.info(' 3. Test in demo:');
|
|
253
|
-
logger.info(' bun run dev:demo');
|
|
254
|
-
logger.info(' 4. Verify migration:');
|
|
255
|
-
logger.info(' pie mathquill:status');
|
|
256
|
-
logger.info(' 5. Run full test suite:');
|
|
257
|
-
logger.info(' bun test packages/lib-react/math-input');
|
|
258
|
-
logger.info(' bun test packages/elements-react/math-inline');
|
|
259
|
-
logger.info(' 6. Commit changes:');
|
|
260
|
-
logger.info(' git add packages/shared/mathquill');
|
|
261
|
-
logger.info(' git commit -m "Migrate MathQuill to Desmos fork + patches"');
|
|
262
|
-
|
|
263
|
-
logger.info('\nš” Tips:');
|
|
264
|
-
logger.info(' ⢠Review docs/MATHQUILL_MIGRATION_PLAN.md for details');
|
|
265
|
-
logger.info(' ⢠Check docs/MATHQUILL_FORK_ANALYSIS.md for fork comparison');
|
|
266
|
-
logger.info(' ⢠Run "pie mathquill:status" to verify migration state');
|
|
267
|
-
logger.info(' ⢠Keep /tmp/mathquill-migration for re-running migration\n');
|
|
268
|
-
}
|
|
269
|
-
}
|
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import { Logger } from '../../utils/logger.js';
|
|
3
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
|
|
6
|
-
export default class MathQuillStatus extends Command {
|
|
7
|
-
static override description = `Show MathQuill migration status
|
|
8
|
-
|
|
9
|
-
Displays the current state of the MathQuill migration:
|
|
10
|
-
- Current version and source
|
|
11
|
-
- Migration state (pending, in-progress, complete)
|
|
12
|
-
- Installed fork versions (Desmos, Khan patches, Learnosity features)
|
|
13
|
-
- Extracted features and extensions
|
|
14
|
-
- Test results
|
|
15
|
-
- Next steps
|
|
16
|
-
|
|
17
|
-
Use this to verify migration success or check what needs to be done.
|
|
18
|
-
`;
|
|
19
|
-
|
|
20
|
-
static override examples = [
|
|
21
|
-
{
|
|
22
|
-
description: 'Show migration status',
|
|
23
|
-
command: '<%= config.bin %> <%= command.id %>',
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
description: 'Verbose output with file details',
|
|
27
|
-
command: '<%= config.bin %> <%= command.id %> --verbose',
|
|
28
|
-
},
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
static override flags = {
|
|
32
|
-
verbose: Flags.boolean({
|
|
33
|
-
char: 'v',
|
|
34
|
-
description: 'Show detailed information',
|
|
35
|
-
default: false,
|
|
36
|
-
}),
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
async run(): Promise<void> {
|
|
40
|
-
const { flags } = await this.parse(MathQuillStatus);
|
|
41
|
-
const logger = new Logger(flags.verbose);
|
|
42
|
-
|
|
43
|
-
const workspaceRoot = process.cwd();
|
|
44
|
-
const mathquillPath = join(workspaceRoot, 'packages/shared/mathquill');
|
|
45
|
-
|
|
46
|
-
if (!existsSync(mathquillPath)) {
|
|
47
|
-
logger.error('MathQuill package not found at: packages/shared/mathquill');
|
|
48
|
-
this.exit(1);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
logger.section('š MathQuill Status');
|
|
52
|
-
|
|
53
|
-
// Read package.json
|
|
54
|
-
const pkgPath = join(mathquillPath, 'package.json');
|
|
55
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
56
|
-
|
|
57
|
-
// Determine migration state
|
|
58
|
-
const isLegacy = existsSync(join(mathquillPath, 'src/legacy/mathquill-bundle.js'));
|
|
59
|
-
const hasExtensions = existsSync(join(mathquillPath, 'src/extensions'));
|
|
60
|
-
const hasLoader = existsSync(join(mathquillPath, 'src/extensions/index.ts'));
|
|
61
|
-
const migrationConfig = this.loadMigrationConfig(mathquillPath);
|
|
62
|
-
|
|
63
|
-
// Current state
|
|
64
|
-
this.log('\nš¦ Current Configuration:');
|
|
65
|
-
this.log(` Package: ${pkg.name}@${pkg.version}`);
|
|
66
|
-
this.log(` Source: ${this.detectSource(pkg, isLegacy, hasExtensions)}`);
|
|
67
|
-
|
|
68
|
-
if (pkg.dependencies?.mathquill) {
|
|
69
|
-
const dep = pkg.dependencies.mathquill;
|
|
70
|
-
if (dep.includes('desmosinc')) {
|
|
71
|
-
this.log(` Fork: Desmos (${dep})`);
|
|
72
|
-
} else if (dep.includes('Khan')) {
|
|
73
|
-
this.log(` Fork: Khan Academy (${dep})`);
|
|
74
|
-
} else if (dep.includes('Learnosity')) {
|
|
75
|
-
this.log(` Fork: Learnosity (${dep})`);
|
|
76
|
-
} else {
|
|
77
|
-
this.log(` Fork: ${dep}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Migration state
|
|
82
|
-
this.log('\nš Migration State:');
|
|
83
|
-
const migrationState = this.determineMigrationState(
|
|
84
|
-
isLegacy,
|
|
85
|
-
hasExtensions,
|
|
86
|
-
hasLoader,
|
|
87
|
-
migrationConfig
|
|
88
|
-
);
|
|
89
|
-
this.log(` Status: ${migrationState.status} ${migrationState.icon}`);
|
|
90
|
-
if (migrationState.detail) {
|
|
91
|
-
this.log(` Detail: ${migrationState.detail}`);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Extension state
|
|
95
|
-
if (hasExtensions) {
|
|
96
|
-
this.log('\nš§ Extensions:');
|
|
97
|
-
this.showExtensionStatus(mathquillPath, flags.verbose, logger);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Migration metadata
|
|
101
|
-
if (migrationConfig) {
|
|
102
|
-
this.log('\nš Migration Metadata:');
|
|
103
|
-
this.showMigrationMetadata(migrationConfig);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Next steps
|
|
107
|
-
this.log('\nš Next Steps:');
|
|
108
|
-
this.showNextSteps(migrationState.status, isLegacy, hasExtensions);
|
|
109
|
-
|
|
110
|
-
this.log('');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private detectSource(_pkg: any, isLegacy: boolean, hasExtensions: boolean): string {
|
|
114
|
-
if (hasExtensions && !isLegacy) {
|
|
115
|
-
return 'Desmos fork + patches (migrated)';
|
|
116
|
-
}
|
|
117
|
-
if (isLegacy) {
|
|
118
|
-
return 'PIE fork (legacy - needs migration)';
|
|
119
|
-
}
|
|
120
|
-
return 'Unknown';
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
private determineMigrationState(
|
|
124
|
-
isLegacy: boolean,
|
|
125
|
-
hasExtensions: boolean,
|
|
126
|
-
hasLoader: boolean,
|
|
127
|
-
_config: any
|
|
128
|
-
): { status: string; icon: string; detail?: string } {
|
|
129
|
-
if (!isLegacy && hasExtensions && hasLoader) {
|
|
130
|
-
return {
|
|
131
|
-
status: 'Complete',
|
|
132
|
-
icon: 'ā
',
|
|
133
|
-
detail: 'Migration successful',
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (hasExtensions && !hasLoader) {
|
|
138
|
-
return {
|
|
139
|
-
status: 'In Progress',
|
|
140
|
-
icon: 'ā ļø',
|
|
141
|
-
detail: 'Extensions exist but loader missing',
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (isLegacy && !hasExtensions) {
|
|
146
|
-
return {
|
|
147
|
-
status: 'Pending',
|
|
148
|
-
icon: 'š',
|
|
149
|
-
detail: 'Legacy fork still in use',
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (isLegacy && hasExtensions) {
|
|
154
|
-
return {
|
|
155
|
-
status: 'Transitioning',
|
|
156
|
-
icon: 'š',
|
|
157
|
-
detail: 'Both legacy and new extensions present',
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
status: 'Unknown',
|
|
163
|
-
icon: 'ā',
|
|
164
|
-
detail: 'Unexpected state',
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
private showExtensionStatus(mathquillPath: string, verbose: boolean, _logger: Logger): void {
|
|
169
|
-
const extensionDirs = [
|
|
170
|
-
{ name: 'Khan', path: 'src/extensions/khan' },
|
|
171
|
-
{ name: 'Learnosity', path: 'src/extensions/learnosity' },
|
|
172
|
-
{ name: 'PIE', path: 'src/extensions/pie' },
|
|
173
|
-
];
|
|
174
|
-
|
|
175
|
-
for (const ext of extensionDirs) {
|
|
176
|
-
const fullPath = join(mathquillPath, ext.path);
|
|
177
|
-
if (existsSync(fullPath)) {
|
|
178
|
-
const files = this.countTypeScriptFiles(fullPath);
|
|
179
|
-
this.log(` ${ext.name}: ${files} file(s) ā`);
|
|
180
|
-
|
|
181
|
-
if (verbose) {
|
|
182
|
-
const indexExists = existsSync(join(fullPath, 'index.ts'));
|
|
183
|
-
this.log(` ⢠index.ts: ${indexExists ? 'ā' : 'ā'}`);
|
|
184
|
-
}
|
|
185
|
-
} else {
|
|
186
|
-
this.log(` ${ext.name}: Not found ā`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const loaderPath = join(mathquillPath, 'src/extensions/index.ts');
|
|
191
|
-
if (existsSync(loaderPath)) {
|
|
192
|
-
this.log(` Loader: ā`);
|
|
193
|
-
} else {
|
|
194
|
-
this.log(` Loader: ā (Missing extension loader)`);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
private countTypeScriptFiles(dir: string): number {
|
|
199
|
-
if (!existsSync(dir)) return 0;
|
|
200
|
-
|
|
201
|
-
try {
|
|
202
|
-
const { readdirSync } = require('node:fs');
|
|
203
|
-
const files = readdirSync(dir);
|
|
204
|
-
return files.filter((f: string) => f.endsWith('.ts') || f.endsWith('.tsx')).length;
|
|
205
|
-
} catch {
|
|
206
|
-
return 0;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
private loadMigrationConfig(mathquillPath: string): any {
|
|
211
|
-
const configPath = join(mathquillPath, 'migration-config.json');
|
|
212
|
-
if (!existsSync(configPath)) {
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
try {
|
|
217
|
-
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
218
|
-
} catch {
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
private showMigrationMetadata(config: any): void {
|
|
224
|
-
if (config.version) {
|
|
225
|
-
this.log(` Version: ${config.version}`);
|
|
226
|
-
}
|
|
227
|
-
if (config.lastMigration) {
|
|
228
|
-
this.log(` Last run: ${new Date(config.lastMigration).toLocaleString()}`);
|
|
229
|
-
}
|
|
230
|
-
if (config.base?.installed) {
|
|
231
|
-
this.log(` Base fork: ${config.base.fork}@${config.base.installed}`);
|
|
232
|
-
}
|
|
233
|
-
if (config.migrationState) {
|
|
234
|
-
this.log(` State: ${config.migrationState}`);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
private showNextSteps(status: string, isLegacy: boolean, _hasExtensions: boolean): void {
|
|
239
|
-
if (status === 'Complete') {
|
|
240
|
-
this.log(' ā
Migration complete!');
|
|
241
|
-
this.log(' ⢠Build: cd packages/shared/mathquill && bun run build');
|
|
242
|
-
this.log(' ⢠Test: bun test packages/lib-react/math-input');
|
|
243
|
-
this.log(' ⢠Demo: bun run dev:demo');
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (status === 'Pending' && isLegacy) {
|
|
248
|
-
this.log(' š Migration needed');
|
|
249
|
-
this.log(' 1. Run: pie mathquill:migrate --dry-run');
|
|
250
|
-
this.log(' 2. Review the migration plan');
|
|
251
|
-
this.log(' 3. Run: pie mathquill:migrate');
|
|
252
|
-
this.log(' 4. Test thoroughly before committing');
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (status === 'In Progress' || status === 'Transitioning') {
|
|
257
|
-
this.log(' ā ļø Migration incomplete');
|
|
258
|
-
this.log(' 1. Check for errors: pie mathquill:migrate --verbose');
|
|
259
|
-
this.log(' 2. Or re-run: pie mathquill:migrate --force');
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
this.log(' ā Unknown state - check documentation');
|
|
264
|
-
this.log(' ⢠See: docs/MATHQUILL_MIGRATION_PLAN.md');
|
|
265
|
-
this.log(' ⢠See: docs/MATHQUILL_MIGRATION_CLI_PLAN.md');
|
|
266
|
-
}
|
|
267
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import { Logger } from '../../utils/logger.js';
|
|
3
|
-
import { extractDependencies } from '../../utils/package-json.js';
|
|
4
|
-
import { existsSync } from 'node:fs';
|
|
5
|
-
import { readdir, readFile, writeFile } from 'node:fs/promises';
|
|
6
|
-
import { join } from 'node:path';
|
|
7
|
-
|
|
8
|
-
const SHARED_DIR = 'packages/shared';
|
|
9
|
-
|
|
10
|
-
export default class CreateControllers extends Command {
|
|
11
|
-
static override description = 'Create package.json files for synced controllers';
|
|
12
|
-
|
|
13
|
-
static override examples = ['<%= config.bin %> <%= command.id %>'];
|
|
14
|
-
|
|
15
|
-
static override flags = {
|
|
16
|
-
verbose: Flags.boolean({
|
|
17
|
-
char: 'v',
|
|
18
|
-
description: 'Show detailed output',
|
|
19
|
-
default: false,
|
|
20
|
-
}),
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
private logger = new Logger();
|
|
24
|
-
|
|
25
|
-
public async run(): Promise<void> {
|
|
26
|
-
const { flags } = await this.parse(CreateControllers);
|
|
27
|
-
|
|
28
|
-
this.logger = new Logger(flags.verbose);
|
|
29
|
-
|
|
30
|
-
this.logger.section('š¦ Creating package.json files for controllers');
|
|
31
|
-
|
|
32
|
-
const controllers = await readdir(SHARED_DIR);
|
|
33
|
-
let created = 0;
|
|
34
|
-
let skipped = 0;
|
|
35
|
-
|
|
36
|
-
for (const controller of controllers) {
|
|
37
|
-
const controllerDir = join(SHARED_DIR, controller);
|
|
38
|
-
const packageJsonPath = join(controllerDir, 'package.json');
|
|
39
|
-
|
|
40
|
-
// Skip if package.json already exists
|
|
41
|
-
if (existsSync(packageJsonPath)) {
|
|
42
|
-
this.logger.info(` āļø ${controller}: package.json already exists`);
|
|
43
|
-
skipped++;
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Scan for dependencies
|
|
48
|
-
const deps = await this.scanController(controllerDir);
|
|
49
|
-
|
|
50
|
-
// Generate package.json
|
|
51
|
-
const content = this.generatePackageJson(controller, deps);
|
|
52
|
-
|
|
53
|
-
// Write file
|
|
54
|
-
await writeFile(packageJsonPath, content, 'utf-8');
|
|
55
|
-
this.logger.success(` ā
${controller}: Created package.json (${deps.length} dependencies)`);
|
|
56
|
-
created++;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
this.logger.section(`\nš Summary: ${created} created, ${skipped} skipped`);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private async scanController(controllerDir: string): Promise<string[]> {
|
|
63
|
-
const srcDir = join(controllerDir, 'src');
|
|
64
|
-
const deps = new Set<string>();
|
|
65
|
-
|
|
66
|
-
if (!existsSync(srcDir)) {
|
|
67
|
-
return [];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const files = await readdir(srcDir);
|
|
71
|
-
|
|
72
|
-
for (const file of files) {
|
|
73
|
-
if (!file.endsWith('.ts')) continue;
|
|
74
|
-
|
|
75
|
-
const filePath = join(srcDir, file);
|
|
76
|
-
const content = await readFile(filePath, 'utf-8');
|
|
77
|
-
const fileDeps = extractDependencies(content);
|
|
78
|
-
|
|
79
|
-
for (const dep of fileDeps) deps.add(dep);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return Array.from(deps).sort();
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private generatePackageJson(name: string, deps: string[]): string {
|
|
86
|
-
const dependencies: Record<string, string> = {};
|
|
87
|
-
|
|
88
|
-
for (const dep of deps) {
|
|
89
|
-
// Use * for external dependencies (they're in root package.json)
|
|
90
|
-
dependencies[dep] = '*';
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const pkg = {
|
|
94
|
-
name: `@pie-element/${name}`,
|
|
95
|
-
version: '0.1.0',
|
|
96
|
-
description: `Framework-agnostic ${name.replace('-controller', '')} controller synced from pie-elements`,
|
|
97
|
-
type: 'module',
|
|
98
|
-
main: './src/index.ts',
|
|
99
|
-
types: './src/index.ts',
|
|
100
|
-
exports: {
|
|
101
|
-
'.': {
|
|
102
|
-
types: './src/index.ts',
|
|
103
|
-
default: './src/index.ts',
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
files: ['src'],
|
|
107
|
-
scripts: {
|
|
108
|
-
build: "echo 'Controllers are consumed as TypeScript source'",
|
|
109
|
-
lint: 'biome check .',
|
|
110
|
-
'lint:fix': 'biome check --write .',
|
|
111
|
-
},
|
|
112
|
-
dependencies: Object.keys(dependencies).length > 0 ? dependencies : undefined,
|
|
113
|
-
keywords: ['pie', 'pie-element', 'controller', name.replace('-controller', ''), 'assessment'],
|
|
114
|
-
license: 'ISC',
|
|
115
|
-
repository: {
|
|
116
|
-
type: 'git',
|
|
117
|
-
url: 'https://github.com/pie-framework/pie-elements-ng.git',
|
|
118
|
-
directory: `packages/shared/${name}`,
|
|
119
|
-
},
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
// Remove undefined fields
|
|
123
|
-
const cleaned = JSON.parse(JSON.stringify(pkg));
|
|
124
|
-
|
|
125
|
-
return `${JSON.stringify(cleaned, null, 2)}\n`;
|
|
126
|
-
}
|
|
127
|
-
}
|