@contentful/experience-design-system-cli 2.36.1-dev-build-75bf12e6.0 → 2.36.1-dev-build-b8f3827a.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/bin/cli.js +1 -57
- package/dist/app.d.ts +9 -0
- package/dist/app.js +945 -0
- package/dist/index.js +1168 -0
- package/dist/package.json +10 -15
- package/dist/program.d.ts +2 -0
- package/dist/src/legacy/forwarded-import-args.d.ts +1 -0
- package/dist/src/legacy/legacy-cli-path.d.ts +1 -0
- package/dist/src/legacy/run-legacy.d.ts +1 -0
- package/dist/src/tui/debug-store.d.ts +14 -0
- package/dist/src/tui/help/PageContainer.d.ts +4 -0
- package/dist/src/tui/home/home.d.ts +5 -0
- package/dist/src/tui/home/home.theme.d.ts +14 -0
- package/dist/src/tui/import/PageContainer.d.ts +5 -0
- package/dist/src/tui/import/spawn-v1-import.d.ts +28 -0
- package/dist/src/tui/import/terminal-input.d.ts +2 -0
- package/dist/src/tui/package-root.d.ts +9 -0
- package/dist/src/tui/settings/PageContainer.d.ts +6 -0
- package/dist/src/tui/settings/contentful-configuration/ContentfulConfigScreen.d.ts +4 -0
- package/dist/src/tui/settings/contentful-configuration/config-store.d.ts +9 -0
- package/dist/src/tui/settings/debug-mode/debug-mode-store.d.ts +5 -0
- package/dist/src/tui/settings/debug-mode/screen.d.ts +4 -0
- package/dist/src/tui/settings/opt-in-analytics/analytics-store.d.ts +5 -0
- package/dist/src/tui/settings/opt-in-analytics/screen.d.ts +4 -0
- package/dist/src/tui/settings/utils/v1-store.d.ts +2 -0
- package/dist/src/tui/upgrade/PageContainer.d.ts +4 -0
- package/dist/src/tui/upgrade/version.d.ts +12 -0
- package/dist/src/tui/use-terminal-width.d.ts +1 -0
- package/legacy/bin/cli.js +58 -0
- package/legacy/dist/package.json +73 -0
- package/legacy/dist/src/index.d.ts +1 -0
- package/{dist → legacy/dist}/src/index.js +465 -457
- package/legacy/package.json +77 -0
- package/package.json +12 -17
- package/README.md +0 -245
- /package/dist/{src/index.d.ts → index.d.ts} +0 -0
- /package/{dist → legacy/dist}/src/analytics/apply.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/client.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/constants.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/exit.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/index.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/normalize.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/os.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/session.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/tracker.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analytics/types.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composite-closure.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/apply-mapping.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/candidate-files.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/composition-cache-key.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/interchange-schema.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/manifest-doc-evidence.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/merge-edges.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/parse-map-edges.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/prompt-loader.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/resolve-mapping-cli.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/composition/resolve-mapping.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/cycle-detection.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/cycle-view.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/extract-command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/fuzzy-search.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/issue-inheritance.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/lineage.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/scope-gate-cascade.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/search-neighborhood.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/parser.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/persistence.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/preview-annotations.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/LegacySelectApp.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/ComponentDetail.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/ComponentRationalePanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/FieldEditor.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/FinalizeDialog.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/GotoBanner.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/GroupedSidebar.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/HelpOverlay.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/HighlightedLine.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/JsonEditor.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/JsonPanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/PreviewSummaryBar.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/QuitDialog.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/RationaleLine.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/RationalePanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/ScrollablePanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/Sidebar.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/SourcePanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/StatusBar.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/TokenReviewPanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/TopBar.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/removed-components-text.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/components/wrap-text.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/hooks/list-scroll-input.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/hooks/scroll-offset.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/hooks/useImmediateInput.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/hooks/useKeymap.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/hooks/useSession.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/hooks/useUndo.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/tui/theme.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/select/types.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/selection-cascade.d.ts +0 -0
- /package/{dist → legacy/dist}/src/analyze/slot-graph.d.ts +0 -0
- /package/{dist → legacy/dist}/src/apply/api-client.d.ts +0 -0
- /package/{dist → legacy/dist}/src/apply/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/apply/preview-utils.d.ts +0 -0
- /package/{dist → legacy/dist}/src/apply/tokens.d.ts +0 -0
- /package/{dist → legacy/dist}/src/apply/tui/ServerApplyView.d.ts +0 -0
- /package/{dist → legacy/dist}/src/apply/tui/ServerPreviewView.d.ts +0 -0
- /package/{dist → legacy/dist}/src/credentials-store.d.ts +0 -0
- /package/{dist → legacy/dist}/src/doctor/checks.d.ts +0 -0
- /package/{dist → legacy/dist}/src/doctor/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/doctor/report.d.ts +0 -0
- /package/{dist → legacy/dist}/src/generate/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/generate/tui/GenerateView.d.ts +0 -0
- /package/{dist → legacy/dist}/src/helpers/build-contentful-management-client.d.ts +0 -0
- /package/{dist → legacy/dist}/src/helpers/fetch-and-persist-existing-contentful-entities.d.ts +0 -0
- /package/{dist → legacy/dist}/src/helpers/fetch-existing-contentful-entities.d.ts +0 -0
- /package/{dist → legacy/dist}/src/helpers/find-nearly-matching-component.d.ts +0 -0
- /package/{dist → legacy/dist}/src/helpers/read-existing-contentful-entities-from-session.d.ts +0 -0
- /package/{dist → legacy/dist}/src/helpers/summarize-existing-contentful-entities.d.ts +0 -0
- /package/{dist → legacy/dist}/src/host-utils.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/agent-model-resolve.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/composition-options.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/cycle-auto-reject.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/path-utils.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/CustomPromptBanner.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/WizardApp.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/ai-flag.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/autocomplete.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/CompactControlBar.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/CounterStrip.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/LegendEntry.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/LivePreviewSummary.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/ReviewComponentPanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/ReviewDetailsEditor.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/ReviewDialogs.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/ReviewStatus.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/SearchMatchSummary.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/SpaceEnvironment.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/components/StepHeader.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/cycle-panel-scroll.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/group-collapse.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/history.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/review-input.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/sidebar-search-state.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/useOverlayPanel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/useReviewEditor.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/useReviewPreview.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/useReviewSession.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/hooks/useReviewSurfaceState.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/lineage-layout.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/preview-confirmation-input.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/push-progress.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/run-print-files-helpers.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/run-selection-agent.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/run-teaser.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/runLivePreview.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/runScopeGate.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/scope-gate-columns.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/sidebar-help.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/sidebar-input.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/sidebar-navigation.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/sidebar-width.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/spawn-generate.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/step-filters.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/CredentialsStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/DoneStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/ErrorStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/GateStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/GenerateReviewStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/PathValidationStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/PreviewValidationErrorStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/PushingStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/RunningStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/ScopeGateStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/TokenInputStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/WelcomeStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/WizardPreviewStep.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/auto-reject-decision.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/breaking-change-format.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/enumerate-cycle-breaks.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/preview-diff.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/review-details-panel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/steps/review-json-panel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/useFinalizePreview.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/useLivePreview.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/wizard-422-helpers.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/wizard-generate-progress.d.ts +0 -0
- /package/{dist → legacy/dist}/src/import/tui/wizard-state-transitions.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/agent-definitions.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/agent-model-options.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/agent-output.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/cli-errors.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/cli-path.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/command-options.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/component-patch.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/contentful-urls.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/debug-logger.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/debug-preamble.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/error-parser.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/path-exists.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/prompt-overrides.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/terminal-capabilities.d.ts +0 -0
- /package/{dist → legacy/dist}/src/lib/user-agent.d.ts +0 -0
- /package/{dist → legacy/dist}/src/map-tokens/apply.d.ts +0 -0
- /package/{dist → legacy/dist}/src/map-tokens/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/map-tokens/resolve-defaults.d.ts +0 -0
- /package/{dist → legacy/dist}/src/map-tokens/tui/MapTokensView.d.ts +0 -0
- /package/{dist → legacy/dist}/src/output/format.d.ts +0 -0
- /package/{dist → legacy/dist}/src/print/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/print/validate/tui/ValidateView.d.ts +0 -0
- /package/{dist → legacy/dist}/src/print/validate/validators/cdf-validator.d.ts +0 -0
- /package/{dist → legacy/dist}/src/print/validate/validators/dtcg-validator.d.ts +0 -0
- /package/{dist → legacy/dist}/src/print/validate/validators/format-errors.d.ts +0 -0
- /package/{dist → legacy/dist}/src/print/validate/validators/read-json-file.d.ts +0 -0
- /package/{dist → legacy/dist}/src/program.d.ts +0 -0
- /package/{dist → legacy/dist}/src/runs/fingerprint.d.ts +0 -0
- /package/{dist → legacy/dist}/src/runs/path-prompt.d.ts +0 -0
- /package/{dist → legacy/dist}/src/runs/save-path-resolver.d.ts +0 -0
- /package/{dist → legacy/dist}/src/runs/store.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/cache-keys.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/cdf/cdf-mappers.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/components/derive-component-id.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/components/hash-component-shape.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/shared/index-rows-by-key.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/tokens/build-dtcg-groups.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/tokens/build-dtcg-tokens.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/core/tokens/hash-token-content.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/db.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/migration.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/sessions/read.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/sessions/write.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/shared/with-transaction.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/steps/read.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/steps/write.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/tokens/read.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/repositories/tokens/write.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/resolve-session-id.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/services/session-resolver.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/services/tokens/apply-tool-calls.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/services/tokens/replace-raw-prop-token-paths.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/services/tokens/replace-raw-token-name-paths.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/services/tokens/store-dtcg-tokens.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/session-id.d.ts +0 -0
- /package/{dist → legacy/dist}/src/session/source-excerpt.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/SetupScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/SetupStepper.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/command.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/lib/checks.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/lib/shell.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/CodingAgentScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/ContentfulCredentialsScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/StepLayout.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/preferences/AnalyticsScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/preferences/BooleanInput.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/preferences/ColorPreferenceScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/preferences/CustomPromptScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/preferences/DebugLogsScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/preferences/PreferencesMenu.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/prerequisites/PrerequisitesScreen.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/prerequisites/build.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/prerequisites/deps.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/prerequisites/index.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/prerequisites/node.d.ts +0 -0
- /package/{dist → legacy/dist}/src/setup/steps/prerequisites/pnpm.d.ts +0 -0
- /package/{dist → legacy/dist}/src/tui/CommandCompletionView.d.ts +0 -0
- /package/{dist → legacy/dist}/src/tui/render-with-goodbye.d.ts +0 -0
- /package/{dist → legacy/dist}/src/tui/use-blinking-cursor.d.ts +0 -0
- /package/{dist → legacy/dist}/src/tui/use-terminal-size.d.ts +0 -0
- /package/{dist → legacy/dist}/src/tui/use-timed-spinner.d.ts +0 -0
- /package/{dist → legacy/dist}/src/tui/windowed-panel.d.ts +0 -0
- /package/{dist → legacy/dist}/src/types.d.ts +0 -0
- /package/{prompts → legacy/prompts}/composition-edges.md +0 -0
- /package/{skills → legacy/skills}/generate-components.md +0 -0
- /package/{skills → legacy/skills}/generate-tokens.md +0 -0
- /package/{skills → legacy/skills}/map-tokens.md +0 -0
- /package/{skills → legacy/skills}/select-components.md +0 -0
package/dist/app.js
ADDED
|
@@ -0,0 +1,945 @@
|
|
|
1
|
+
// packages/experience-design-system-cli/app.tsx
|
|
2
|
+
import { useState as useState8 } from "react";
|
|
3
|
+
|
|
4
|
+
// packages/experience-design-system-cli/src/tui/home/home.tsx
|
|
5
|
+
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
6
|
+
import { Box, Text, useApp, useInput } from "ink";
|
|
7
|
+
|
|
8
|
+
// packages/experience-design-system-cli/src/tui/home/home.theme.ts
|
|
9
|
+
var BRAND = {
|
|
10
|
+
blue: "#1773EB",
|
|
11
|
+
green: "#00C459",
|
|
12
|
+
orange: "#E44F20",
|
|
13
|
+
yellow: "#FFDA00",
|
|
14
|
+
white: "#FFFFFF",
|
|
15
|
+
slate: "#A6B5C7",
|
|
16
|
+
steel: "#C4D1DE",
|
|
17
|
+
mist: "#DDE5EC",
|
|
18
|
+
fog: "#EFF2F6"
|
|
19
|
+
};
|
|
20
|
+
var PALETTE = {
|
|
21
|
+
accent: BRAND.blue,
|
|
22
|
+
heading: BRAND.white,
|
|
23
|
+
success: BRAND.green,
|
|
24
|
+
error: BRAND.orange,
|
|
25
|
+
warning: BRAND.yellow,
|
|
26
|
+
muted: BRAND.slate,
|
|
27
|
+
border: BRAND.steel
|
|
28
|
+
};
|
|
29
|
+
var BRAND_RAMP = [BRAND.blue, BRAND.orange, BRAND.yellow];
|
|
30
|
+
var BAR_CELL = "\u2501";
|
|
31
|
+
function brandBar(width, ramp = BRAND_RAMP) {
|
|
32
|
+
if (width <= 0 || ramp.length === 0) return [];
|
|
33
|
+
const base = Math.floor(width / ramp.length);
|
|
34
|
+
const remainder = width % ramp.length;
|
|
35
|
+
return ramp.map((color, i) => ({
|
|
36
|
+
text: BAR_CELL.repeat(base + (i < remainder ? 1 : 0)),
|
|
37
|
+
color
|
|
38
|
+
})).filter((segment) => segment.text.length > 0);
|
|
39
|
+
}
|
|
40
|
+
var FOCUS_MARKER = "\u276F";
|
|
41
|
+
|
|
42
|
+
// packages/experience-design-system-cli/src/tui/upgrade/version.ts
|
|
43
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
44
|
+
import { join as join2 } from "node:path";
|
|
45
|
+
import semver from "semver";
|
|
46
|
+
|
|
47
|
+
// packages/experience-design-system-cli/src/tui/package-root.ts
|
|
48
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
49
|
+
import { dirname, join } from "node:path";
|
|
50
|
+
import { fileURLToPath } from "node:url";
|
|
51
|
+
function findPackageRoot(startUrl, packageName) {
|
|
52
|
+
let dir = dirname(fileURLToPath(startUrl));
|
|
53
|
+
let found;
|
|
54
|
+
while (true) {
|
|
55
|
+
const manifestPath = join(dir, "package.json");
|
|
56
|
+
if (existsSync(manifestPath)) {
|
|
57
|
+
const pkg = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
58
|
+
if (pkg.name === packageName) found = dir;
|
|
59
|
+
}
|
|
60
|
+
const parent = dirname(dir);
|
|
61
|
+
if (parent === dir) return found ?? dir;
|
|
62
|
+
dir = parent;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// packages/experience-design-system-cli/src/tui/upgrade/version.ts
|
|
67
|
+
var PACKAGE_NAME = "@contentful/experience-design-system-cli";
|
|
68
|
+
var TAGS_URL = "https://api.github.com/repos/contentful/experience-design-system-sdk-public/tags?per_page=10";
|
|
69
|
+
function readPackageVersion() {
|
|
70
|
+
const root = findPackageRoot(import.meta.url, PACKAGE_NAME);
|
|
71
|
+
const pkg = JSON.parse(readFileSync2(join2(root, "package.json"), "utf8"));
|
|
72
|
+
return pkg.version ?? "unknown";
|
|
73
|
+
}
|
|
74
|
+
function parseVersionTag(tag) {
|
|
75
|
+
const match = /^v(\d+\.\d+\.\d+)$/.exec(tag);
|
|
76
|
+
return match ? match[1] : void 0;
|
|
77
|
+
}
|
|
78
|
+
async function checkForUpgrade() {
|
|
79
|
+
const current = readPackageVersion();
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetch(TAGS_URL);
|
|
82
|
+
if (!response.ok) return { status: "error" };
|
|
83
|
+
const tags = await response.json();
|
|
84
|
+
const versions = tags.map((tag) => tag.name ? parseVersionTag(tag.name) : void 0).filter((v) => v !== void 0);
|
|
85
|
+
if (versions.length === 0) return { status: "error" };
|
|
86
|
+
const latest = versions.reduce((best, v) => semver.gt(v, best) ? v : best);
|
|
87
|
+
if (!semver.valid(current)) return { status: "error" };
|
|
88
|
+
if (semver.gt(latest, current)) {
|
|
89
|
+
return { status: "update-available", current, latest };
|
|
90
|
+
}
|
|
91
|
+
return { status: "up-to-date", current };
|
|
92
|
+
} catch {
|
|
93
|
+
return { status: "error" };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// packages/experience-design-system-cli/src/tui/use-terminal-width.ts
|
|
98
|
+
import { useEffect, useState } from "react";
|
|
99
|
+
import { useStdout } from "ink";
|
|
100
|
+
var FALLBACK_COLUMNS = 80;
|
|
101
|
+
function readColumns(stdout) {
|
|
102
|
+
const columns = stdout?.columns ?? 0;
|
|
103
|
+
return columns > 0 ? columns : FALLBACK_COLUMNS;
|
|
104
|
+
}
|
|
105
|
+
function useTerminalWidth() {
|
|
106
|
+
const { stdout } = useStdout();
|
|
107
|
+
const [columns, setColumns] = useState(() => readColumns(stdout));
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (!stdout) return;
|
|
110
|
+
const onResize = () => setColumns(readColumns(stdout));
|
|
111
|
+
onResize();
|
|
112
|
+
stdout.on("resize", onResize);
|
|
113
|
+
return () => {
|
|
114
|
+
stdout.off("resize", onResize);
|
|
115
|
+
};
|
|
116
|
+
}, [stdout]);
|
|
117
|
+
return columns;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// packages/experience-design-system-cli/src/tui/home/home.tsx
|
|
121
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
122
|
+
var VERSION = readPackageVersion();
|
|
123
|
+
var HEADING = "Contentful Experiences";
|
|
124
|
+
var SUBTITLE = "Let's import your design system into Contentful";
|
|
125
|
+
var MIN_TERMINAL_WIDTH = 164;
|
|
126
|
+
var START_ITEMS = [
|
|
127
|
+
{ label: "Import", screen: "import" },
|
|
128
|
+
{ label: "Upgrade Version", screen: "upgrade" },
|
|
129
|
+
{ label: "Settings", screen: "settings" },
|
|
130
|
+
{ label: "Help", screen: "help" }
|
|
131
|
+
];
|
|
132
|
+
function upgradeItemDisplay(upgradeCheck) {
|
|
133
|
+
if (upgradeCheck?.status === "update-available") {
|
|
134
|
+
return { label: `Upgrade Version (v${upgradeCheck.latest} available)`, color: PALETTE.success };
|
|
135
|
+
}
|
|
136
|
+
if (upgradeCheck?.status === "up-to-date") {
|
|
137
|
+
return { label: "Upgrade Version (up to date)", color: PALETTE.muted };
|
|
138
|
+
}
|
|
139
|
+
return { label: "Upgrade Version" };
|
|
140
|
+
}
|
|
141
|
+
function HomeScreen({ onNavigate }) {
|
|
142
|
+
const [focusIdx, setFocusIdx] = useState2(0);
|
|
143
|
+
const [upgradeCheck, setUpgradeCheck] = useState2();
|
|
144
|
+
const { exit } = useApp();
|
|
145
|
+
const terminalWidth = useTerminalWidth();
|
|
146
|
+
const tooNarrow = terminalWidth < MIN_TERMINAL_WIDTH;
|
|
147
|
+
const upgradeDisabled = upgradeCheck?.status === "up-to-date";
|
|
148
|
+
useEffect2(() => {
|
|
149
|
+
checkForUpgrade().then(setUpgradeCheck).catch(() => setUpgradeCheck({ status: "error" }));
|
|
150
|
+
}, []);
|
|
151
|
+
useInput((input, key) => {
|
|
152
|
+
if (input === "q" || key.escape) {
|
|
153
|
+
exit();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (tooNarrow) return;
|
|
157
|
+
if (key.upArrow) {
|
|
158
|
+
setFocusIdx((i) => (i - 1 + START_ITEMS.length) % START_ITEMS.length);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (key.downArrow) {
|
|
162
|
+
setFocusIdx((i) => (i + 1) % START_ITEMS.length);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (key.return) {
|
|
166
|
+
const item = START_ITEMS[focusIdx];
|
|
167
|
+
if (item.screen === "upgrade" && upgradeDisabled) return;
|
|
168
|
+
onNavigate(item.screen);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
if (tooNarrow) {
|
|
173
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
174
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: PALETTE.warning, children: "Terminal too small" }),
|
|
175
|
+
/* @__PURE__ */ jsx(Text, { color: PALETTE.muted, children: "Press q to quit, make your terminal full screen, then run experiences import again." })
|
|
176
|
+
] });
|
|
177
|
+
}
|
|
178
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
179
|
+
/* @__PURE__ */ jsxs(Box, { flexDirection: "column", alignItems: "center", children: [
|
|
180
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: PALETTE.heading, children: HEADING }),
|
|
181
|
+
/* @__PURE__ */ jsx(Text, { children: brandBar(HEADING.length).map((segment, i) => /* @__PURE__ */ jsx(Text, { color: segment.color, children: segment.text }, i)) }),
|
|
182
|
+
/* @__PURE__ */ jsx(Text, { color: PALETTE.muted, children: SUBTITLE }),
|
|
183
|
+
/* @__PURE__ */ jsxs(Text, { color: PALETTE.muted, children: [
|
|
184
|
+
"v",
|
|
185
|
+
VERSION
|
|
186
|
+
] })
|
|
187
|
+
] }),
|
|
188
|
+
/* @__PURE__ */ jsx(Box, { marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: START_ITEMS.map((item, i) => {
|
|
189
|
+
const focused = i === focusIdx;
|
|
190
|
+
const isUpgradeItem = item.screen === "upgrade";
|
|
191
|
+
const display = isUpgradeItem ? upgradeItemDisplay(upgradeCheck) : { label: item.label };
|
|
192
|
+
const dimmed = isUpgradeItem && upgradeDisabled;
|
|
193
|
+
return /* @__PURE__ */ jsxs(
|
|
194
|
+
Text,
|
|
195
|
+
{
|
|
196
|
+
bold: focused && !dimmed,
|
|
197
|
+
dimColor: dimmed,
|
|
198
|
+
color: focused && !dimmed ? PALETTE.accent : display.color,
|
|
199
|
+
children: [
|
|
200
|
+
focused ? `${FOCUS_MARKER} ` : " ",
|
|
201
|
+
display.label
|
|
202
|
+
]
|
|
203
|
+
},
|
|
204
|
+
item.label
|
|
205
|
+
);
|
|
206
|
+
}) }) }),
|
|
207
|
+
/* @__PURE__ */ jsx(Box, { marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ jsx(Text, { color: PALETTE.muted, children: "\u2191/\u2193 move \xB7 \u23CE select \xB7 q quit" }) })
|
|
208
|
+
] });
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// packages/experience-design-system-cli/src/tui/import/PageContainer.tsx
|
|
212
|
+
import { Box as Box2, Text as Text2, useInput as useInput2 } from "ink";
|
|
213
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
214
|
+
function ImportScreen({ exitCode, onDone }) {
|
|
215
|
+
useInput2((input, key) => {
|
|
216
|
+
if (key.return || key.escape || input === "q") {
|
|
217
|
+
onDone();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
const isSuccess = exitCode === 0;
|
|
221
|
+
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
222
|
+
/* @__PURE__ */ jsx2(Text2, { bold: true, children: "Import" }),
|
|
223
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
224
|
+
isSuccess ? /* @__PURE__ */ jsx2(Text2, { color: PALETTE.success, children: "\u2713 Import complete" }) : /* @__PURE__ */ jsxs2(Text2, { color: PALETTE.error, children: [
|
|
225
|
+
"\u2717 Import failed: process exited with code ",
|
|
226
|
+
exitCode ?? "unknown"
|
|
227
|
+
] }),
|
|
228
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
229
|
+
/* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "[Enter] Back to Start" })
|
|
230
|
+
] });
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// packages/experience-design-system-cli/src/tui/import/spawn-v1-import.ts
|
|
234
|
+
import { spawn } from "node:child_process";
|
|
235
|
+
|
|
236
|
+
// packages/experience-design-system-cli/src/legacy/legacy-cli-path.ts
|
|
237
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
238
|
+
import { join as join3 } from "node:path";
|
|
239
|
+
var PACKAGE_NAME2 = "@contentful/experience-design-system-cli";
|
|
240
|
+
function findLegacyCliPath() {
|
|
241
|
+
const root = findPackageRoot(import.meta.url, PACKAGE_NAME2);
|
|
242
|
+
const candidates = [
|
|
243
|
+
join3(root, "legacy", "bin", "cli.js"),
|
|
244
|
+
join3(root, "..", "experience-design-system-cli-legacy", "bin", "cli.js")
|
|
245
|
+
];
|
|
246
|
+
const found = candidates.find((candidate) => existsSync2(candidate));
|
|
247
|
+
if (!found) {
|
|
248
|
+
throw new Error(`Legacy CLI not found. Looked in:
|
|
249
|
+
${candidates.join("\n")}`);
|
|
250
|
+
}
|
|
251
|
+
return found;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// packages/experience-design-system-cli/src/tui/import/spawn-v1-import.ts
|
|
255
|
+
function buildArgs(options) {
|
|
256
|
+
const args = ["import"];
|
|
257
|
+
if (options.project) {
|
|
258
|
+
args.push("--project", options.project);
|
|
259
|
+
}
|
|
260
|
+
return args;
|
|
261
|
+
}
|
|
262
|
+
async function spawnV1Import(options = {}) {
|
|
263
|
+
const cliPath = findLegacyCliPath();
|
|
264
|
+
const args = buildArgs(options);
|
|
265
|
+
return new Promise((resolvePromise) => {
|
|
266
|
+
const child = spawn("node", [cliPath, ...args], {
|
|
267
|
+
stdio: "inherit"
|
|
268
|
+
});
|
|
269
|
+
child.on("close", (code) => {
|
|
270
|
+
resolvePromise({ exitCode: code ?? 1, result: void 0, stdout: "", stderr: "" });
|
|
271
|
+
});
|
|
272
|
+
child.on("error", (err) => {
|
|
273
|
+
resolvePromise({ exitCode: 1, result: void 0, stdout: "", stderr: err.message });
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// packages/experience-design-system-cli/src/tui/import/terminal-input.ts
|
|
279
|
+
function getTerminalHandle() {
|
|
280
|
+
return process.stdin._handle;
|
|
281
|
+
}
|
|
282
|
+
async function stopReadingTerminal() {
|
|
283
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
284
|
+
const handle = getTerminalHandle();
|
|
285
|
+
if (!handle?.readStop) return;
|
|
286
|
+
handle.reading = false;
|
|
287
|
+
handle.readStop();
|
|
288
|
+
}
|
|
289
|
+
function startReadingTerminal() {
|
|
290
|
+
const handle = getTerminalHandle();
|
|
291
|
+
if (!handle?.readStart) return;
|
|
292
|
+
handle.reading = true;
|
|
293
|
+
handle.readStart();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// packages/experience-design-system-cli/src/tui/help/PageContainer.tsx
|
|
297
|
+
import { Box as Box3, Text as Text3, useInput as useInput3 } from "ink";
|
|
298
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
299
|
+
function HelpScreen({ onDone }) {
|
|
300
|
+
useInput3((input, key) => {
|
|
301
|
+
if (key.return) {
|
|
302
|
+
onDone();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (key.escape || input === "q") {
|
|
306
|
+
onDone();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
return /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
311
|
+
/* @__PURE__ */ jsx3(Text3, { bold: true, children: "Help" }),
|
|
312
|
+
/* @__PURE__ */ jsx3(Text3, { children: " " }),
|
|
313
|
+
/* @__PURE__ */ jsx3(Text3, { children: "This is a placeholder screen for v2 help content." }),
|
|
314
|
+
/* @__PURE__ */ jsx3(Text3, { children: " " }),
|
|
315
|
+
/* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "[Enter] Complete [Esc/q] Exit \u2014 both return to Start" })
|
|
316
|
+
] });
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// packages/experience-design-system-cli/src/tui/settings/PageContainer.tsx
|
|
320
|
+
import { useState as useState3 } from "react";
|
|
321
|
+
import { Box as Box4, Text as Text4, useInput as useInput4 } from "ink";
|
|
322
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
323
|
+
function SettingsScreen({
|
|
324
|
+
onNavigate,
|
|
325
|
+
onBack
|
|
326
|
+
}) {
|
|
327
|
+
const [focusIdx, setFocusIdx] = useState3(0);
|
|
328
|
+
const items = [
|
|
329
|
+
{ label: "Configuration", screen: "settings-configuration" },
|
|
330
|
+
{ label: "Opt-in Analytics", screen: "settings-opt-in-analytics" },
|
|
331
|
+
{ label: "Debug Mode", screen: "settings-debug-mode" }
|
|
332
|
+
];
|
|
333
|
+
useInput4((input, key) => {
|
|
334
|
+
if (key.upArrow) {
|
|
335
|
+
setFocusIdx((i) => (i - 1 + items.length) % items.length);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (key.downArrow) {
|
|
339
|
+
setFocusIdx((i) => (i + 1) % items.length);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (key.return) {
|
|
343
|
+
const screen = items[focusIdx].screen;
|
|
344
|
+
if (screen) {
|
|
345
|
+
onNavigate(screen);
|
|
346
|
+
}
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
if (key.escape || input === "q") {
|
|
350
|
+
onBack();
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
return /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
354
|
+
/* @__PURE__ */ jsx4(Text4, { bold: true, children: "Settings" }),
|
|
355
|
+
/* @__PURE__ */ jsx4(Text4, { children: " " }),
|
|
356
|
+
items.map((item, i) => /* @__PURE__ */ jsxs4(Text4, { color: i === focusIdx ? "cyan" : void 0, children: [
|
|
357
|
+
i === focusIdx ? "> " : " ",
|
|
358
|
+
item.label
|
|
359
|
+
] }, item.label)),
|
|
360
|
+
/* @__PURE__ */ jsx4(Text4, { children: " " }),
|
|
361
|
+
/* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "[\u2191/\u2193] Navigate [Enter] Select [Esc/q] Back to Start" })
|
|
362
|
+
] });
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
|
|
366
|
+
import { useEffect as useEffect3, useState as useState4 } from "react";
|
|
367
|
+
import { Box as Box5, Text as Text5, useInput as useInput5 } from "ink";
|
|
368
|
+
|
|
369
|
+
// packages/experience-design-system-cli/src/tui/settings/utils/v1-store.ts
|
|
370
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
371
|
+
import { join as join4 } from "node:path";
|
|
372
|
+
import { homedir } from "node:os";
|
|
373
|
+
var V1_STORE_PATH = join4(homedir(), ".config", "experiences", "credentials.json");
|
|
374
|
+
async function readV1Store() {
|
|
375
|
+
try {
|
|
376
|
+
const raw = await readFile(V1_STORE_PATH, "utf8");
|
|
377
|
+
return JSON.parse(raw);
|
|
378
|
+
} catch {
|
|
379
|
+
return {};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
async function writeV1Store(data) {
|
|
383
|
+
await mkdir(join4(homedir(), ".config", "experiences"), { recursive: true });
|
|
384
|
+
await writeFile(V1_STORE_PATH, `${JSON.stringify(data, null, 2)}
|
|
385
|
+
`, { mode: 384 });
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// packages/experience-design-system-cli/src/tui/settings/contentful-configuration/config-store.ts
|
|
389
|
+
async function readCredentials() {
|
|
390
|
+
const store = await readV1Store();
|
|
391
|
+
return {
|
|
392
|
+
spaceId: store.spaceId || "",
|
|
393
|
+
environmentId: store.environmentId || "",
|
|
394
|
+
cmaToken: store.cmaToken || "",
|
|
395
|
+
host: store.host || ""
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
async function writeCredentials(config) {
|
|
399
|
+
const existing = await readV1Store();
|
|
400
|
+
const merged = {
|
|
401
|
+
...existing,
|
|
402
|
+
...config
|
|
403
|
+
};
|
|
404
|
+
Object.keys(merged).forEach((k) => {
|
|
405
|
+
if (!merged[k]) delete merged[k];
|
|
406
|
+
});
|
|
407
|
+
await writeV1Store(merged);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
|
|
411
|
+
import { Fragment, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
412
|
+
var FIELD_ORDER = ["spaceId", "environmentId", "cmaToken", "host"];
|
|
413
|
+
var FIELD_LABELS = {
|
|
414
|
+
spaceId: "Space ID",
|
|
415
|
+
environmentId: "Environment ID",
|
|
416
|
+
cmaToken: "CMA Token",
|
|
417
|
+
host: "API Host (optional)"
|
|
418
|
+
};
|
|
419
|
+
function ConfigurationScreen({ onDone }) {
|
|
420
|
+
const [stage, setStage] = useState4("loading");
|
|
421
|
+
const [config, setConfig] = useState4(null);
|
|
422
|
+
const [activeField, setActiveField] = useState4("spaceId");
|
|
423
|
+
const [message, setMessage] = useState4(null);
|
|
424
|
+
useEffect3(() => {
|
|
425
|
+
readCredentials().then((cfg) => {
|
|
426
|
+
setConfig(cfg);
|
|
427
|
+
setStage("form");
|
|
428
|
+
});
|
|
429
|
+
}, []);
|
|
430
|
+
function fieldValue(field) {
|
|
431
|
+
if (!config) return "";
|
|
432
|
+
return config[field] || "";
|
|
433
|
+
}
|
|
434
|
+
function setFieldValue(field, value) {
|
|
435
|
+
if (!config) return;
|
|
436
|
+
setConfig({ ...config, [field]: value });
|
|
437
|
+
}
|
|
438
|
+
function handleSave() {
|
|
439
|
+
if (!config) return;
|
|
440
|
+
setStage("saving");
|
|
441
|
+
setMessage(null);
|
|
442
|
+
writeCredentials(config).then(() => {
|
|
443
|
+
setStage("saved");
|
|
444
|
+
setMessage("Configuration saved");
|
|
445
|
+
}).catch((err) => {
|
|
446
|
+
setMessage(err instanceof Error ? err.message : "Failed to save");
|
|
447
|
+
setStage("form");
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
useInput5((input, key) => {
|
|
451
|
+
if (stage === "loading" || stage === "saving") return;
|
|
452
|
+
if (stage === "saved") {
|
|
453
|
+
if (key.return || key.escape || input === "q") {
|
|
454
|
+
onDone();
|
|
455
|
+
}
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
if (key.escape || input === "q") {
|
|
459
|
+
onDone();
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
if (key.tab || key.downArrow) {
|
|
463
|
+
const idx = FIELD_ORDER.indexOf(activeField);
|
|
464
|
+
setActiveField(FIELD_ORDER[(idx + 1) % FIELD_ORDER.length]);
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
if (key.upArrow) {
|
|
468
|
+
const idx = FIELD_ORDER.indexOf(activeField);
|
|
469
|
+
setActiveField(FIELD_ORDER[(idx - 1 + FIELD_ORDER.length) % FIELD_ORDER.length]);
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
if (key.return) {
|
|
473
|
+
const idx = FIELD_ORDER.indexOf(activeField);
|
|
474
|
+
if (idx < FIELD_ORDER.length - 1) {
|
|
475
|
+
setActiveField(FIELD_ORDER[idx + 1]);
|
|
476
|
+
} else {
|
|
477
|
+
handleSave();
|
|
478
|
+
}
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
if (key.backspace || key.delete) {
|
|
482
|
+
const current = fieldValue(activeField);
|
|
483
|
+
setFieldValue(activeField, current.slice(0, -1));
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
if (input && !key.ctrl && !key.meta) {
|
|
487
|
+
setFieldValue(activeField, fieldValue(activeField) + input);
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
if (stage === "loading") {
|
|
491
|
+
return /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
492
|
+
/* @__PURE__ */ jsx5(Text5, { bold: true, children: "Configuration" }),
|
|
493
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
494
|
+
/* @__PURE__ */ jsx5(Text5, { color: PALETTE.accent, children: "Loading..." })
|
|
495
|
+
] });
|
|
496
|
+
}
|
|
497
|
+
if (stage === "saved") {
|
|
498
|
+
return /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
499
|
+
/* @__PURE__ */ jsx5(Text5, { bold: true, children: "Configuration" }),
|
|
500
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
501
|
+
/* @__PURE__ */ jsxs5(Text5, { color: PALETTE.success, children: [
|
|
502
|
+
"\u2713 ",
|
|
503
|
+
message
|
|
504
|
+
] }),
|
|
505
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
506
|
+
/* @__PURE__ */ jsx5(Text5, { dimColor: true, children: "[Enter] Back to Settings" })
|
|
507
|
+
] });
|
|
508
|
+
}
|
|
509
|
+
return /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
510
|
+
/* @__PURE__ */ jsx5(Text5, { bold: true, children: "Configuration" }),
|
|
511
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
512
|
+
/* @__PURE__ */ jsx5(Text5, { children: "Contentful API Credentials" }),
|
|
513
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
514
|
+
/* @__PURE__ */ jsx5(Box5, { flexDirection: "column", children: FIELD_ORDER.map((field) => {
|
|
515
|
+
const isActive = activeField === field;
|
|
516
|
+
const value = fieldValue(field);
|
|
517
|
+
const display = field === "cmaToken" ? "\u2022".repeat(value.length) : value;
|
|
518
|
+
return /* @__PURE__ */ jsxs5(Box5, { gap: 1, children: [
|
|
519
|
+
/* @__PURE__ */ jsx5(Text5, { color: isActive ? PALETTE.accent : void 0, children: isActive ? "\u276F" : " " }),
|
|
520
|
+
/* @__PURE__ */ jsxs5(Text5, { bold: isActive, children: [
|
|
521
|
+
FIELD_LABELS[field],
|
|
522
|
+
":"
|
|
523
|
+
] }),
|
|
524
|
+
/* @__PURE__ */ jsx5(Text5, { children: display || /* @__PURE__ */ jsx5(Text5, { dimColor: true, children: "(empty)" }) })
|
|
525
|
+
] }, field);
|
|
526
|
+
}) }),
|
|
527
|
+
message && /* @__PURE__ */ jsxs5(Fragment, { children: [
|
|
528
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
529
|
+
/* @__PURE__ */ jsxs5(Text5, { color: PALETTE.error, children: [
|
|
530
|
+
"\u2717 ",
|
|
531
|
+
message
|
|
532
|
+
] })
|
|
533
|
+
] }),
|
|
534
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
535
|
+
/* @__PURE__ */ jsx5(Text5, { dimColor: true, children: "[\u2191/\u2193] Switch field \xB7 [Enter] Save/Next \xB7 [Esc/q] Back" })
|
|
536
|
+
] });
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/screen.tsx
|
|
540
|
+
import { useEffect as useEffect4, useState as useState5 } from "react";
|
|
541
|
+
import { Box as Box6, Text as Text6, useInput as useInput6 } from "ink";
|
|
542
|
+
|
|
543
|
+
// packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/analytics-store.ts
|
|
544
|
+
async function readAnalyticsSetting() {
|
|
545
|
+
const store = await readV1Store();
|
|
546
|
+
const analyticsDisabled = store.analyticsDisabled;
|
|
547
|
+
return { enabled: analyticsDisabled !== true };
|
|
548
|
+
}
|
|
549
|
+
async function writeAnalyticsSetting(setting) {
|
|
550
|
+
const existing = await readV1Store();
|
|
551
|
+
const updated = {
|
|
552
|
+
...existing,
|
|
553
|
+
analyticsDisabled: !setting.enabled
|
|
554
|
+
};
|
|
555
|
+
await writeV1Store(updated);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/screen.tsx
|
|
559
|
+
import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
560
|
+
function OptInAnalyticsScreen({ onDone }) {
|
|
561
|
+
const [loading, setLoading] = useState5(true);
|
|
562
|
+
const [enabled, setEnabled] = useState5(true);
|
|
563
|
+
useEffect4(() => {
|
|
564
|
+
readAnalyticsSetting().then((setting) => {
|
|
565
|
+
setEnabled(setting.enabled);
|
|
566
|
+
setLoading(false);
|
|
567
|
+
});
|
|
568
|
+
}, []);
|
|
569
|
+
useInput6((input, key) => {
|
|
570
|
+
if (loading) return;
|
|
571
|
+
if (key.return || input === " ") {
|
|
572
|
+
setEnabled((current) => {
|
|
573
|
+
const next = !current;
|
|
574
|
+
void writeAnalyticsSetting({ enabled: next });
|
|
575
|
+
return next;
|
|
576
|
+
});
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
if (key.escape || input === "q") {
|
|
580
|
+
onDone();
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
584
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, children: "Settings \u203A Opt-in Analytics" }),
|
|
585
|
+
/* @__PURE__ */ jsx6(Text6, { children: " " }),
|
|
586
|
+
loading ? /* @__PURE__ */ jsx6(Text6, { color: PALETTE.muted, children: "Loading\u2026" }) : /* @__PURE__ */ jsxs6(Fragment2, { children: [
|
|
587
|
+
/* @__PURE__ */ jsxs6(Text6, { children: [
|
|
588
|
+
"Share anonymous usage data:",
|
|
589
|
+
" ",
|
|
590
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, color: enabled ? PALETTE.success : PALETTE.muted, children: enabled ? "On" : "Off" })
|
|
591
|
+
] }),
|
|
592
|
+
/* @__PURE__ */ jsx6(Text6, { children: " " }),
|
|
593
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: "Shares which CLI commands are used and where imports succeed or fail." }),
|
|
594
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: "Never includes source code, file paths, credentials, or authored content." })
|
|
595
|
+
] }),
|
|
596
|
+
/* @__PURE__ */ jsx6(Text6, { children: " " }),
|
|
597
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: "[Enter/Space] Toggle [Esc/q] Back to Settings" })
|
|
598
|
+
] });
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// packages/experience-design-system-cli/src/tui/upgrade/PageContainer.tsx
|
|
602
|
+
import { useEffect as useEffect5, useState as useState6 } from "react";
|
|
603
|
+
import { Box as Box7, Text as Text7, useInput as useInput7 } from "ink";
|
|
604
|
+
|
|
605
|
+
// packages/experience-design-system-cli/src/tui/debug-store.ts
|
|
606
|
+
import { mkdir as mkdir3, writeFile as writeFile3 } from "node:fs/promises";
|
|
607
|
+
import { existsSync as existsSync3, readdirSync } from "node:fs";
|
|
608
|
+
import { join as join6 } from "node:path";
|
|
609
|
+
|
|
610
|
+
// packages/experience-design-system-cli/src/tui/settings/debug-mode/debug-mode-store.ts
|
|
611
|
+
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
|
|
612
|
+
import { dirname as dirname2, join as join5 } from "node:path";
|
|
613
|
+
var PACKAGE_NAME3 = "@contentful/experience-design-system-cli";
|
|
614
|
+
var DEFAULT_DEBUG_MODE_SETTING = {
|
|
615
|
+
enabled: true
|
|
616
|
+
};
|
|
617
|
+
function debugModeSettingPath() {
|
|
618
|
+
return join5(findPackageRoot(import.meta.url, PACKAGE_NAME3), ".contentful", "config", "debug_mode.json");
|
|
619
|
+
}
|
|
620
|
+
async function readDebugModeSetting() {
|
|
621
|
+
try {
|
|
622
|
+
const raw = await readFile2(debugModeSettingPath(), "utf8");
|
|
623
|
+
const parsed = JSON.parse(raw);
|
|
624
|
+
return { ...DEFAULT_DEBUG_MODE_SETTING, ...parsed };
|
|
625
|
+
} catch {
|
|
626
|
+
return { ...DEFAULT_DEBUG_MODE_SETTING };
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
async function writeDebugModeSetting(setting) {
|
|
630
|
+
const path = debugModeSettingPath();
|
|
631
|
+
await mkdir2(dirname2(path), { recursive: true });
|
|
632
|
+
await writeFile2(path, `${JSON.stringify(setting, null, 2)}
|
|
633
|
+
`, { mode: 384 });
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// packages/experience-design-system-cli/src/tui/debug-store.ts
|
|
637
|
+
var PACKAGE_NAME4 = "@contentful/experience-design-system-cli";
|
|
638
|
+
var pendingRun;
|
|
639
|
+
function generateRunId() {
|
|
640
|
+
const now = /* @__PURE__ */ new Date();
|
|
641
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
642
|
+
return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
|
|
643
|
+
}
|
|
644
|
+
function sessionsRootDir() {
|
|
645
|
+
return join6(findPackageRoot(import.meta.url, PACKAGE_NAME4), ".contentful", "debug", "sessions");
|
|
646
|
+
}
|
|
647
|
+
function datePrefix(now = /* @__PURE__ */ new Date()) {
|
|
648
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
649
|
+
return `${pad(now.getMonth() + 1)}-${pad(now.getDate())}-${now.getFullYear()}`;
|
|
650
|
+
}
|
|
651
|
+
function slugify(value) {
|
|
652
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
653
|
+
}
|
|
654
|
+
function generateSessionId() {
|
|
655
|
+
const today = datePrefix();
|
|
656
|
+
const root = sessionsRootDir();
|
|
657
|
+
const existing = existsSync3(root) ? readdirSync(root) : [];
|
|
658
|
+
const seqPattern = new RegExp(`^${today}-session-(\\d+)$`);
|
|
659
|
+
const maxSeq = existing.reduce((max, entry) => {
|
|
660
|
+
const match = seqPattern.exec(entry);
|
|
661
|
+
return match ? Math.max(max, Number(match[1])) : max;
|
|
662
|
+
}, 0);
|
|
663
|
+
return `${today}-session-${maxSeq + 1}`;
|
|
664
|
+
}
|
|
665
|
+
var SESSION_ID = generateSessionId();
|
|
666
|
+
function sessionDebugDir() {
|
|
667
|
+
return join6(sessionsRootDir(), SESSION_ID);
|
|
668
|
+
}
|
|
669
|
+
void isDebugModeEnabled().then((enabled) => {
|
|
670
|
+
if (!enabled) return void 0;
|
|
671
|
+
return mkdir3(sessionDebugDir(), { recursive: true });
|
|
672
|
+
});
|
|
673
|
+
async function isDebugModeEnabled() {
|
|
674
|
+
try {
|
|
675
|
+
return (await readDebugModeSetting()).enabled;
|
|
676
|
+
} catch {
|
|
677
|
+
return true;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
function redact(value) {
|
|
681
|
+
const clone = { ...value };
|
|
682
|
+
if ("cma_token" in clone) {
|
|
683
|
+
const raw = clone.cma_token;
|
|
684
|
+
clone.cma_token = typeof raw === "string" && raw.length > 0 ? `[present, ${raw.length} chars]` : "[not set]";
|
|
685
|
+
}
|
|
686
|
+
return clone;
|
|
687
|
+
}
|
|
688
|
+
function startDebugRun({
|
|
689
|
+
flow,
|
|
690
|
+
step,
|
|
691
|
+
menuOption,
|
|
692
|
+
inputs
|
|
693
|
+
}) {
|
|
694
|
+
const runId = generateRunId();
|
|
695
|
+
const startedAt = Date.now();
|
|
696
|
+
const redactedInputs = redact(inputs);
|
|
697
|
+
isDebugModeEnabled().then((enabled) => {
|
|
698
|
+
if (!enabled) return;
|
|
699
|
+
pendingRun = { flow, step, runId, menuOption, inputs: redactedInputs, startedAt };
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
async function finishDebugRun({
|
|
703
|
+
outputs,
|
|
704
|
+
status,
|
|
705
|
+
exitMethod
|
|
706
|
+
}) {
|
|
707
|
+
const run = pendingRun;
|
|
708
|
+
if (!run) return;
|
|
709
|
+
pendingRun = void 0;
|
|
710
|
+
const durationMs = Date.now() - run.startedAt;
|
|
711
|
+
const content = renderMarkdown(run, { outputs: redact(outputs), status, exitMethod, durationMs });
|
|
712
|
+
const flowSegments = run.flow.split("/");
|
|
713
|
+
const dir = join6(sessionDebugDir(), ...flowSegments);
|
|
714
|
+
await mkdir3(dir, { recursive: true });
|
|
715
|
+
const filename = nextAttemptFilename(dir, run.menuOption);
|
|
716
|
+
await writeFile3(join6(dir, filename), content, { mode: 384 });
|
|
717
|
+
}
|
|
718
|
+
function nextAttemptFilename(dir, menuOption) {
|
|
719
|
+
const today = datePrefix();
|
|
720
|
+
const optionSlug = slugify(menuOption);
|
|
721
|
+
const existing = existsSync3(dir) ? readdirSync(dir) : [];
|
|
722
|
+
const attemptPattern = new RegExp(`^${today}-${optionSlug}-attempt-(\\d+)\\.md$`);
|
|
723
|
+
const maxAttempt = existing.reduce((max, entry) => {
|
|
724
|
+
const match = attemptPattern.exec(entry);
|
|
725
|
+
return match ? Math.max(max, Number(match[1])) : max;
|
|
726
|
+
}, 0);
|
|
727
|
+
return `${today}-${optionSlug}-attempt-${maxAttempt + 1}.md`;
|
|
728
|
+
}
|
|
729
|
+
function renderMarkdown(run, finish) {
|
|
730
|
+
const stepMatch = /^(\d+)-(.+)$/.exec(run.step);
|
|
731
|
+
const stepLabel = stepMatch ? `${stepMatch[1]} - ${stepMatch[2]}` : run.step;
|
|
732
|
+
const flowSlug = run.flow.split("/").join("-");
|
|
733
|
+
return `# Debug Log
|
|
734
|
+
|
|
735
|
+
- Run ID: ${run.runId}
|
|
736
|
+
- Flow: ${flowSlug}
|
|
737
|
+
- Step: ${stepLabel}
|
|
738
|
+
- Menu option: ${run.menuOption}
|
|
739
|
+
- Date: ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
740
|
+
- CLI version: ${readPackageVersion()}
|
|
741
|
+
- Platform: ${process.platform} / Node ${process.version}
|
|
742
|
+
- Duration on screen: ${finish.durationMs}ms
|
|
743
|
+
- Status: ${finish.status}
|
|
744
|
+
- Exit method: ${finish.exitMethod}
|
|
745
|
+
|
|
746
|
+
## Inputs
|
|
747
|
+
\`\`\`json
|
|
748
|
+
${JSON.stringify(run.inputs, null, 2)}
|
|
749
|
+
\`\`\`
|
|
750
|
+
|
|
751
|
+
## Outputs
|
|
752
|
+
\`\`\`json
|
|
753
|
+
${JSON.stringify(finish.outputs, null, 2)}
|
|
754
|
+
\`\`\`
|
|
755
|
+
`;
|
|
756
|
+
}
|
|
757
|
+
function handleCrash() {
|
|
758
|
+
return finishDebugRun({ outputs: {}, status: "error", exitMethod: "crashed" });
|
|
759
|
+
}
|
|
760
|
+
process.once("uncaughtException", (err) => {
|
|
761
|
+
void handleCrash().finally(() => {
|
|
762
|
+
throw err;
|
|
763
|
+
});
|
|
764
|
+
});
|
|
765
|
+
process.once("unhandledRejection", (reason) => {
|
|
766
|
+
void handleCrash().finally(() => {
|
|
767
|
+
throw reason;
|
|
768
|
+
});
|
|
769
|
+
});
|
|
770
|
+
process.once("SIGINT", () => {
|
|
771
|
+
void handleCrash().finally(() => {
|
|
772
|
+
process.exit(130);
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
// packages/experience-design-system-cli/src/tui/upgrade/PageContainer.tsx
|
|
777
|
+
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
778
|
+
var UPGRADE_COMMANDS = ["git pull", "pnpm install", "pnpm build"];
|
|
779
|
+
function UpgradeScreen({ onDone }) {
|
|
780
|
+
const [upgradeCheck, setUpgradeCheck] = useState6();
|
|
781
|
+
useEffect5(() => {
|
|
782
|
+
startDebugRun({
|
|
783
|
+
flow: "upgrade",
|
|
784
|
+
step: "01-upgrade",
|
|
785
|
+
menuOption: "Upgrade",
|
|
786
|
+
inputs: { currentVersion: readPackageVersion() }
|
|
787
|
+
});
|
|
788
|
+
checkForUpgrade().then(setUpgradeCheck).catch(() => setUpgradeCheck({ status: "error" }));
|
|
789
|
+
}, []);
|
|
790
|
+
useInput7((_input, key) => {
|
|
791
|
+
if (key.return) {
|
|
792
|
+
void finishDebugRun({
|
|
793
|
+
outputs: upgradeCheck ?? {},
|
|
794
|
+
status: upgradeCheck?.status === "error" ? "error" : "success",
|
|
795
|
+
exitMethod: "saved"
|
|
796
|
+
});
|
|
797
|
+
onDone();
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
802
|
+
/* @__PURE__ */ jsx7(Text7, { bold: true, children: "Upgrade" }),
|
|
803
|
+
/* @__PURE__ */ jsx7(Text7, { children: " " }),
|
|
804
|
+
renderBody(upgradeCheck),
|
|
805
|
+
/* @__PURE__ */ jsx7(Text7, { children: " " }),
|
|
806
|
+
/* @__PURE__ */ jsxs7(Text7, { bold: true, color: PALETTE.accent, children: [
|
|
807
|
+
FOCUS_MARKER,
|
|
808
|
+
" Go Back"
|
|
809
|
+
] })
|
|
810
|
+
] });
|
|
811
|
+
}
|
|
812
|
+
function renderBody(upgradeCheck) {
|
|
813
|
+
if (!upgradeCheck) {
|
|
814
|
+
return /* @__PURE__ */ jsx7(Text7, { color: PALETTE.muted, children: "Checking for updates\u2026" });
|
|
815
|
+
}
|
|
816
|
+
if (upgradeCheck.status === "error") {
|
|
817
|
+
return /* @__PURE__ */ jsx7(Text7, { color: PALETTE.warning, children: "Couldn't check for updates \u2014 check your network connection and try again." });
|
|
818
|
+
}
|
|
819
|
+
if (upgradeCheck.status === "up-to-date") {
|
|
820
|
+
return /* @__PURE__ */ jsxs7(Text7, { color: PALETTE.success, children: [
|
|
821
|
+
"You're already on the latest version (v",
|
|
822
|
+
upgradeCheck.current,
|
|
823
|
+
")."
|
|
824
|
+
] });
|
|
825
|
+
}
|
|
826
|
+
return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", children: [
|
|
827
|
+
/* @__PURE__ */ jsxs7(Text7, { color: PALETTE.muted, children: [
|
|
828
|
+
/* @__PURE__ */ jsxs7(Text7, { bold: true, color: PALETTE.success, children: [
|
|
829
|
+
"v",
|
|
830
|
+
upgradeCheck.latest
|
|
831
|
+
] }),
|
|
832
|
+
" ",
|
|
833
|
+
"is available (you're on ",
|
|
834
|
+
/* @__PURE__ */ jsxs7(Text7, { bold: true, children: [
|
|
835
|
+
"v",
|
|
836
|
+
upgradeCheck.current
|
|
837
|
+
] }),
|
|
838
|
+
"). Exit this program, cd into the root of your local clone of contentful/experience-design-system-sdk-public, then run:"
|
|
839
|
+
] }),
|
|
840
|
+
/* @__PURE__ */ jsx7(Text7, { children: " " }),
|
|
841
|
+
/* @__PURE__ */ jsx7(Box7, { flexDirection: "column", borderStyle: "round", borderColor: PALETTE.border, paddingX: 1, children: UPGRADE_COMMANDS.map((cmd) => /* @__PURE__ */ jsx7(Text7, { bold: true, children: cmd }, cmd)) })
|
|
842
|
+
] });
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
// packages/experience-design-system-cli/src/tui/settings/debug-mode/screen.tsx
|
|
846
|
+
import { useEffect as useEffect6, useState as useState7 } from "react";
|
|
847
|
+
import { Box as Box8, Text as Text8, useInput as useInput8 } from "ink";
|
|
848
|
+
import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
849
|
+
function DebugModeScreen({ onDone }) {
|
|
850
|
+
const [loading, setLoading] = useState7(true);
|
|
851
|
+
const [enabled, setEnabled] = useState7(true);
|
|
852
|
+
useEffect6(() => {
|
|
853
|
+
readDebugModeSetting().then((setting) => {
|
|
854
|
+
setEnabled(setting.enabled);
|
|
855
|
+
setLoading(false);
|
|
856
|
+
});
|
|
857
|
+
}, []);
|
|
858
|
+
useInput8((input, key) => {
|
|
859
|
+
if (loading) return;
|
|
860
|
+
if (key.return || input === " ") {
|
|
861
|
+
setEnabled((current) => {
|
|
862
|
+
const next = !current;
|
|
863
|
+
void writeDebugModeSetting({ enabled: next });
|
|
864
|
+
return next;
|
|
865
|
+
});
|
|
866
|
+
return;
|
|
867
|
+
}
|
|
868
|
+
if (key.escape || input === "q") {
|
|
869
|
+
onDone();
|
|
870
|
+
}
|
|
871
|
+
});
|
|
872
|
+
return /* @__PURE__ */ jsxs8(Box8, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
873
|
+
/* @__PURE__ */ jsx8(Text8, { bold: true, children: "Settings \u203A Debug Mode" }),
|
|
874
|
+
/* @__PURE__ */ jsx8(Text8, { children: " " }),
|
|
875
|
+
loading ? /* @__PURE__ */ jsx8(Text8, { color: PALETTE.muted, children: "Loading\u2026" }) : /* @__PURE__ */ jsxs8(Text8, { children: [
|
|
876
|
+
"Debug logging:",
|
|
877
|
+
" ",
|
|
878
|
+
/* @__PURE__ */ jsx8(Text8, { bold: true, color: enabled ? PALETTE.success : PALETTE.muted, children: enabled ? "On" : "Off" })
|
|
879
|
+
] }),
|
|
880
|
+
/* @__PURE__ */ jsx8(Text8, { children: " " }),
|
|
881
|
+
/* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "[Enter/Space] Toggle [Esc/q] Back to Settings" })
|
|
882
|
+
] });
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
// packages/experience-design-system-cli/app.tsx
|
|
886
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
887
|
+
function App({ onLaunchImport, importExitCode }) {
|
|
888
|
+
const returnedFromImport = importExitCode !== void 0;
|
|
889
|
+
const [screen, setScreen] = useState8(returnedFromImport ? "import" : "start");
|
|
890
|
+
const goToStart = () => setScreen("start");
|
|
891
|
+
const goToSettings = () => setScreen("settings");
|
|
892
|
+
const navigateFromHome = (next) => {
|
|
893
|
+
if (next === "import" && onLaunchImport) {
|
|
894
|
+
onLaunchImport();
|
|
895
|
+
return;
|
|
896
|
+
}
|
|
897
|
+
setScreen(next);
|
|
898
|
+
};
|
|
899
|
+
switch (screen) {
|
|
900
|
+
case "import":
|
|
901
|
+
return /* @__PURE__ */ jsx9(ImportScreen, { exitCode: importExitCode, onDone: goToStart });
|
|
902
|
+
case "help":
|
|
903
|
+
return /* @__PURE__ */ jsx9(HelpScreen, { onDone: goToStart });
|
|
904
|
+
case "upgrade":
|
|
905
|
+
return /* @__PURE__ */ jsx9(UpgradeScreen, { onDone: goToStart });
|
|
906
|
+
case "settings":
|
|
907
|
+
return /* @__PURE__ */ jsx9(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
|
|
908
|
+
case "settings-configuration":
|
|
909
|
+
return /* @__PURE__ */ jsx9(ConfigurationScreen, { onDone: goToSettings });
|
|
910
|
+
case "settings-opt-in-analytics":
|
|
911
|
+
return /* @__PURE__ */ jsx9(OptInAnalyticsScreen, { onDone: goToSettings });
|
|
912
|
+
case "settings-debug-mode":
|
|
913
|
+
return /* @__PURE__ */ jsx9(DebugModeScreen, { onDone: goToSettings });
|
|
914
|
+
case "start":
|
|
915
|
+
return /* @__PURE__ */ jsx9(HomeScreen, { onNavigate: navigateFromHome });
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
async function renderUntilImportRequestedOrExit(renderApp, importExitCode) {
|
|
919
|
+
let importRequested = false;
|
|
920
|
+
const instance = renderApp(
|
|
921
|
+
/* @__PURE__ */ jsx9(
|
|
922
|
+
App,
|
|
923
|
+
{
|
|
924
|
+
importExitCode,
|
|
925
|
+
onLaunchImport: () => {
|
|
926
|
+
importRequested = true;
|
|
927
|
+
instance.unmount();
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
)
|
|
931
|
+
);
|
|
932
|
+
await instance.waitUntilExit();
|
|
933
|
+
await stopReadingTerminal();
|
|
934
|
+
return importRequested;
|
|
935
|
+
}
|
|
936
|
+
async function runApp(renderApp) {
|
|
937
|
+
let importExitCode;
|
|
938
|
+
while (await renderUntilImportRequestedOrExit(renderApp, importExitCode)) {
|
|
939
|
+
importExitCode = (await spawnV1Import({})).exitCode;
|
|
940
|
+
startReadingTerminal();
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
export {
|
|
944
|
+
runApp
|
|
945
|
+
};
|