opkg 0.5.0 → 0.6.1
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 +82 -21
- package/dist/commands/add.js +11 -276
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/duplicate.js +5 -2
- package/dist/commands/duplicate.js.map +1 -1
- package/dist/commands/init.js +76 -145
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +30 -671
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.js +9 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.js +58 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +28 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/pack.js +10 -137
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/pull.js +5 -299
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +5 -239
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/save.js +29 -168
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/show.js +18 -5
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.js +21 -8
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tui.js +61 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/uninstall.js +5 -5
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/constants/index.js +19 -45
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/workspace.js +9 -0
- package/dist/constants/workspace.js.map +1 -0
- package/dist/core/add/add-conflict-handler.js +68 -0
- package/dist/core/add/add-conflict-handler.js.map +1 -0
- package/dist/core/add/add-pipeline.js +137 -0
- package/dist/core/add/add-pipeline.js.map +1 -0
- package/dist/core/add/package-index-updater.js +66 -36
- package/dist/core/add/package-index-updater.js.map +1 -1
- package/dist/core/add/platform-path-transformer.js +47 -0
- package/dist/core/add/platform-path-transformer.js.map +1 -0
- package/dist/core/add/source-collector.js +57 -0
- package/dist/core/add/source-collector.js.map +1 -0
- package/dist/core/api-keys.js +6 -2
- package/dist/core/api-keys.js.map +1 -1
- package/dist/core/auth.js +25 -40
- package/dist/core/auth.js.map +1 -1
- package/dist/core/config.js +11 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/dependency-resolver.js +24 -11
- package/dist/core/dependency-resolver.js.map +1 -1
- package/dist/core/device-auth.js +81 -0
- package/dist/core/device-auth.js.map +1 -0
- package/dist/core/directory.js +15 -9
- package/dist/core/directory.js.map +1 -1
- package/dist/core/discovery/file-discovery.js +55 -54
- package/dist/core/discovery/file-discovery.js.map +1 -1
- package/dist/core/discovery/platform-files-discovery.js +32 -17
- package/dist/core/discovery/platform-files-discovery.js.map +1 -1
- package/dist/core/install/bulk-install-pipeline.js +200 -0
- package/dist/core/install/bulk-install-pipeline.js.map +1 -0
- package/dist/core/install/canonical-plan.js +129 -0
- package/dist/core/install/canonical-plan.js.map +1 -0
- package/dist/core/install/download-keys.js +2 -2
- package/dist/core/install/download-keys.js.map +1 -1
- package/dist/core/install/dry-run.js +2 -2
- package/dist/core/install/dry-run.js.map +1 -1
- package/dist/core/install/index.js +3 -0
- package/dist/core/install/index.js.map +1 -0
- package/dist/core/install/install-errors.js +41 -0
- package/dist/core/install/install-errors.js.map +1 -0
- package/dist/core/install/install-flow.js +8 -9
- package/dist/core/install/install-flow.js.map +1 -1
- package/dist/core/install/install-pipeline.js +296 -0
- package/dist/core/install/install-pipeline.js.map +1 -0
- package/dist/core/install/install-reporting.js +99 -0
- package/dist/core/install/install-reporting.js.map +1 -0
- package/dist/core/install/platform-resolution.js +6 -6
- package/dist/core/install/platform-resolution.js.map +1 -1
- package/dist/core/install/remote-flow.js +84 -7
- package/dist/core/install/remote-flow.js.map +1 -1
- package/dist/core/install/version-selection.js +25 -8
- package/dist/core/install/version-selection.js.map +1 -1
- package/dist/core/openpackage.js +22 -14
- package/dist/core/openpackage.js.map +1 -1
- package/dist/core/package-context.js +246 -0
- package/dist/core/package-context.js.map +1 -0
- package/dist/core/package.js +73 -9
- package/dist/core/package.js.map +1 -1
- package/dist/core/platforms.js +126 -217
- package/dist/core/platforms.js.map +1 -1
- package/dist/core/profiles.js +60 -3
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/pull/pull-errors.js +62 -0
- package/dist/core/pull/pull-errors.js.map +1 -0
- package/dist/core/pull/pull-options.js +2 -0
- package/dist/core/pull/pull-options.js.map +1 -0
- package/dist/core/pull/pull-output.js +50 -0
- package/dist/core/pull/pull-output.js.map +1 -0
- package/dist/core/pull/pull-pipeline.js +141 -0
- package/dist/core/pull/pull-pipeline.js.map +1 -0
- package/dist/core/pull/pull-strategies.js +103 -0
- package/dist/core/pull/pull-strategies.js.map +1 -0
- package/dist/core/pull/pull-types.js +2 -0
- package/dist/core/pull/pull-types.js.map +1 -0
- package/dist/core/push/push-context.js +95 -0
- package/dist/core/push/push-context.js.map +1 -0
- package/dist/core/push/push-errors.js +133 -0
- package/dist/core/push/push-errors.js.map +1 -0
- package/dist/core/push/push-output.js +44 -0
- package/dist/core/push/push-output.js.map +1 -0
- package/dist/core/push/push-pipeline.js +74 -0
- package/dist/core/push/push-pipeline.js.map +1 -0
- package/dist/core/push/push-single-file.js +56 -0
- package/dist/core/push/push-single-file.js.map +1 -0
- package/dist/core/push/push-types.js +2 -0
- package/dist/core/push/push-types.js.map +1 -0
- package/dist/core/push/push-upload.js +68 -0
- package/dist/core/push/push-upload.js.map +1 -0
- package/dist/core/registry/registry-rename.js +2 -1
- package/dist/core/registry/registry-rename.js.map +1 -1
- package/dist/core/registry.js +14 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/core/remote-pull.js +165 -36
- package/dist/core/remote-pull.js.map +1 -1
- package/dist/core/save/constants.js +4 -0
- package/dist/core/save/constants.js.map +1 -1
- package/dist/core/save/name-resolution.js +31 -0
- package/dist/core/save/name-resolution.js.map +1 -0
- package/dist/core/save/package-detection.js +147 -0
- package/dist/core/save/package-detection.js.map +1 -0
- package/dist/core/save/package-saver.js +82 -43
- package/dist/core/save/package-saver.js.map +1 -1
- package/dist/core/save/package-yml-generator.js +51 -71
- package/dist/core/save/package-yml-generator.js.map +1 -1
- package/dist/core/save/root-save-candidates.js.map +1 -1
- package/dist/core/save/save-candidate-loader.js +89 -0
- package/dist/core/save/save-candidate-loader.js.map +1 -0
- package/dist/core/save/save-conflict-resolution.js +72 -410
- package/dist/core/save/save-conflict-resolution.js.map +1 -1
- package/dist/core/save/save-conflict-resolver.js +277 -0
- package/dist/core/save/save-conflict-resolver.js.map +1 -0
- package/dist/core/save/save-pipeline.js +162 -0
- package/dist/core/save/save-pipeline.js.map +1 -0
- package/dist/core/save/save-single-file.js +124 -0
- package/dist/core/save/save-single-file.js.map +1 -0
- package/dist/core/save/save-types.js +2 -0
- package/dist/core/save/save-types.js.map +1 -0
- package/dist/core/save/save-yml-resolution.js +77 -39
- package/dist/core/save/save-yml-resolution.js.map +1 -1
- package/dist/core/save/workspace-rename.js +6 -6
- package/dist/core/save/workspace-rename.js.map +1 -1
- package/dist/core/scoping/package-scoping.js +14 -2
- package/dist/core/scoping/package-scoping.js.map +1 -1
- package/dist/core/status/status-file-discovery.js +12 -30
- package/dist/core/status/status-file-discovery.js.map +1 -1
- package/dist/core/sync/platform-sync.js +7 -4
- package/dist/core/sync/platform-sync.js.map +1 -1
- package/dist/core/sync/root-files-sync.js +59 -1
- package/dist/core/sync/root-files-sync.js.map +1 -1
- package/dist/core/token-store.js +73 -0
- package/dist/core/token-store.js.map +1 -0
- package/dist/core/uninstall/uninstall-file-discovery.js +1 -2
- package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/tui/app.js +95 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components/package-list.js +73 -0
- package/dist/tui/components/package-list.js.map +1 -0
- package/dist/tui/controller.js +365 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/index.js +12 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/services/file-index.js +64 -0
- package/dist/tui/services/file-index.js.map +1 -0
- package/dist/tui/services/packages.js +18 -0
- package/dist/tui/services/packages.js.map +1 -0
- package/dist/tui/services/save.js +21 -0
- package/dist/tui/services/save.js.map +1 -0
- package/dist/tui/state/app-state.js +15 -0
- package/dist/tui/state/app-state.js.map +1 -0
- package/dist/tui/state.js +17 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/views/add-file-modal.js +129 -0
- package/dist/tui/views/add-file-modal.js.map +1 -0
- package/dist/tui/views/file-preview.js +44 -0
- package/dist/tui/views/file-preview.js.map +1 -0
- package/dist/tui/views/list-packages.js +73 -0
- package/dist/tui/views/list-packages.js.map +1 -0
- package/dist/tui/views/main-menu.js +29 -0
- package/dist/tui/views/main-menu.js.map +1 -0
- package/dist/tui/views/manage-view.js +81 -0
- package/dist/tui/views/manage-view.js.map +1 -0
- package/dist/tui/views/package-hub.js +120 -0
- package/dist/tui/views/package-hub.js.map +1 -0
- package/dist/tui/views/placeholder.js +24 -0
- package/dist/tui/views/placeholder.js.map +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/bun-bootstrap.js +72 -0
- package/dist/utils/bun-bootstrap.js.map +1 -0
- package/dist/utils/file-processing.js +5 -58
- package/dist/utils/file-processing.js.map +1 -1
- package/dist/utils/formatters.js +3 -1
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/http-client.js +27 -5
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/index-based-installer.js +40 -35
- package/dist/utils/index-based-installer.js.map +1 -1
- package/dist/utils/install-file-discovery.js +18 -24
- package/dist/utils/install-file-discovery.js.map +1 -1
- package/dist/utils/install-orchestrator.js +21 -21
- package/dist/utils/install-orchestrator.js.map +1 -1
- package/dist/utils/jsonc.js +44 -0
- package/dist/utils/jsonc.js.map +1 -0
- package/dist/utils/manifest-paths.js +27 -0
- package/dist/utils/manifest-paths.js.map +1 -0
- package/dist/utils/package-copy.js +199 -0
- package/dist/utils/package-copy.js.map +1 -0
- package/dist/utils/package-filters.js +125 -0
- package/dist/utils/package-filters.js.map +1 -0
- package/dist/utils/package-index-yml.js +15 -10
- package/dist/utils/package-index-yml.js.map +1 -1
- package/dist/utils/package-installation.js +4 -113
- package/dist/utils/package-installation.js.map +1 -1
- package/dist/utils/package-local-files.js +2 -35
- package/dist/utils/package-local-files.js.map +1 -1
- package/dist/utils/package-management.js +191 -75
- package/dist/utils/package-management.js.map +1 -1
- package/dist/utils/package-merge.js +48 -0
- package/dist/utils/package-merge.js.map +1 -0
- package/dist/utils/package-name.js +29 -0
- package/dist/utils/package-name.js.map +1 -1
- package/dist/utils/package-versioning.js +16 -4
- package/dist/utils/package-versioning.js.map +1 -1
- package/dist/utils/package-yml.js +41 -12
- package/dist/utils/package-yml.js.map +1 -1
- package/dist/utils/path-normalization.js +8 -53
- package/dist/utils/path-normalization.js.map +1 -1
- package/dist/utils/paths.js +17 -9
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/platform-file.js +16 -59
- package/dist/utils/platform-file.js.map +1 -1
- package/dist/utils/platform-mapper.js +29 -41
- package/dist/utils/platform-mapper.js.map +1 -1
- package/dist/utils/platform-specific-paths.js.map +1 -1
- package/dist/utils/platform-utils.js +28 -139
- package/dist/utils/platform-utils.js.map +1 -1
- package/dist/utils/platform-yaml-merge.js +13 -6
- package/dist/utils/platform-yaml-merge.js.map +1 -1
- package/dist/utils/prompts.js +0 -31
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/registry-entry-filter.js +38 -24
- package/dist/utils/registry-entry-filter.js.map +1 -1
- package/dist/utils/registry-paths.js +48 -0
- package/dist/utils/registry-paths.js.map +1 -0
- package/dist/utils/root-file-installer.js +19 -0
- package/dist/utils/root-file-installer.js.map +1 -1
- package/dist/utils/root-file-registry.js.map +1 -1
- package/dist/utils/tarball.js +6 -2
- package/dist/utils/tarball.js.map +1 -1
- package/dist/utils/version-ranges.js +11 -8
- package/dist/utils/version-ranges.js.map +1 -1
- package/package.json +3 -2
- package/platforms.jsonc +178 -0
- package/specs/auth/auth-device-flow.md +70 -0
- package/specs/install/install-behavior.md +30 -0
- package/specs/install/package-yml-canonical.md +21 -1
- package/specs/install/version-resolution.md +9 -7
- package/specs/login/login-device-flow.md +70 -0
- package/specs/package/README.md +60 -0
- package/specs/package/nested-packages-and-parent-packages.md +79 -0
- package/specs/package/package-index-yml.md +171 -0
- package/specs/package/package-root-layout.md +78 -0
- package/specs/package/registry-payload-and-copy.md +77 -0
- package/specs/package/universal-content.md +144 -0
- package/specs/platforms.md +193 -0
- package/specs/push/push-behavior.md +38 -10
- package/specs/push/push-errors-and-hints.md +19 -6
- package/specs/push/push-remote-upload.md +3 -0
- package/specs/push/push-scoping.md +14 -22
- package/specs/push/push-version-selection.md +18 -16
- package/specs/save/README.md +40 -0
- package/specs/save/save-conflict-resolution.md +146 -0
- package/specs/save/save-file-discovery.md +101 -0
- package/specs/save/save-frontmatter-overrides.md +81 -0
- package/specs/save/save-modes-inputs.md +55 -0
- package/specs/save/save-naming-scoping.md +93 -0
- package/specs/save/save-package-detection.md +60 -0
- package/specs/save/save-registry-sync.md +126 -0
- package/specs/save-pack.md +1 -0
- package/dist/commands/release.js +0 -33
- package/dist/commands/release.js.map +0 -1
- package/dist/commands/tag.js +0 -311
- package/dist/commands/tag.js.map +0 -1
- package/dist/commands/update.js +0 -30
- package/dist/commands/update.js.map +0 -1
- package/dist/core/add/formula-index-updater.js +0 -290
- package/dist/core/add/formula-index-updater.js.map +0 -1
- package/dist/core/discovery/ai-files-discovery.js +0 -2
- package/dist/core/discovery/ai-files-discovery.js.map +0 -1
- package/dist/core/discovery/formula-files-discovery.js +0 -14
- package/dist/core/discovery/formula-files-discovery.js.map +0 -1
- package/dist/core/discovery/index-files-discovery.js +0 -91
- package/dist/core/discovery/index-files-discovery.js.map +0 -1
- package/dist/core/discovery/md-files-discovery.js +0 -82
- package/dist/core/discovery/md-files-discovery.js.map +0 -1
- package/dist/core/discovery/package-files-discovery.js +0 -14
- package/dist/core/discovery/package-files-discovery.js.map +0 -1
- package/dist/core/discovery/platform-discovery.js +0 -84
- package/dist/core/discovery/platform-discovery.js.map +0 -1
- package/dist/core/discovery/root-files-discovery.js +0 -2
- package/dist/core/discovery/root-files-discovery.js.map +0 -1
- package/dist/core/formula.js +0 -170
- package/dist/core/formula.js.map +0 -1
- package/dist/core/git-registry.js +0 -46
- package/dist/core/git-registry.js.map +0 -1
- package/dist/core/groundzero.js +0 -277
- package/dist/core/groundzero.js.map +0 -1
- package/dist/core/install/scenario.js +0 -11
- package/dist/core/install/scenario.js.map +0 -1
- package/dist/core/package-sync.js +0 -219
- package/dist/core/package-sync.js.map +0 -1
- package/dist/core/save/formula-file-generator.js +0 -167
- package/dist/core/save/formula-file-generator.js.map +0 -1
- package/dist/core/save/formula-saver.js +0 -52
- package/dist/core/save/formula-saver.js.map +0 -1
- package/dist/core/save/formula-yml-generator.js +0 -89
- package/dist/core/save/formula-yml-generator.js.map +0 -1
- package/dist/core/save/formula-yml-versioning.js +0 -108
- package/dist/core/save/formula-yml-versioning.js.map +0 -1
- package/dist/core/save/generic-file-sync.js +0 -38
- package/dist/core/save/generic-file-sync.js.map +0 -1
- package/dist/core/save/md-files-sync.js +0 -33
- package/dist/core/save/md-files-sync.js.map +0 -1
- package/dist/core/save/package-yml-versioning.js +0 -108
- package/dist/core/save/package-yml-versioning.js.map +0 -1
- package/dist/core/save/platform-sync.js +0 -95
- package/dist/core/save/platform-sync.js.map +0 -1
- package/dist/core/save/root-files-sync.js +0 -140
- package/dist/core/save/root-files-sync.js.map +0 -1
- package/dist/core/save/save-candidate-types.js +0 -2
- package/dist/core/save/save-candidate-types.js.map +0 -1
- package/dist/core/save/save-conflict-types.js +0 -2
- package/dist/core/save/save-conflict-types.js.map +0 -1
- package/dist/core/save/save-file-discovery.js +0 -5
- package/dist/core/save/save-file-discovery.js.map +0 -1
- package/dist/core/status-file-discovery.js +0 -175
- package/dist/core/status-file-discovery.js.map +0 -1
- package/dist/utils/discovery/file-processing.js +0 -156
- package/dist/utils/discovery/file-processing.js.map +0 -1
- package/dist/utils/discovery/formula-discovery.js +0 -211
- package/dist/utils/discovery/formula-discovery.js.map +0 -1
- package/dist/utils/discovery/platform-discovery.js +0 -2
- package/dist/utils/discovery/platform-discovery.js.map +0 -1
- package/dist/utils/formula-discovery.js +0 -102
- package/dist/utils/formula-discovery.js.map +0 -1
- package/dist/utils/formula-index-yml.js +0 -122
- package/dist/utils/formula-index-yml.js.map +0 -1
- package/dist/utils/formula-installation.js +0 -110
- package/dist/utils/formula-installation.js.map +0 -1
- package/dist/utils/formula-local-files.js +0 -38
- package/dist/utils/formula-local-files.js.map +0 -1
- package/dist/utils/formula-management.js +0 -191
- package/dist/utils/formula-management.js.map +0 -1
- package/dist/utils/formula-name.js +0 -97
- package/dist/utils/formula-name.js.map +0 -1
- package/dist/utils/formula-versioning.js +0 -109
- package/dist/utils/formula-versioning.js.map +0 -1
- package/dist/utils/formula-yml.js +0 -82
- package/dist/utils/formula-yml.js.map +0 -1
- package/dist/utils/git.js +0 -54
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/id-based-discovery.js +0 -126
- package/dist/utils/id-based-discovery.js.map +0 -1
- package/dist/utils/id-based-installer.js +0 -249
- package/dist/utils/id-based-installer.js.map +0 -1
- package/dist/utils/index-yml-based-installer.js +0 -375
- package/dist/utils/index-yml-based-installer.js.map +0 -1
- package/dist/utils/index-yml.js +0 -124
- package/dist/utils/index-yml.js.map +0 -1
- package/dist/utils/md-frontmatter.js +0 -3
- package/dist/utils/md-frontmatter.js.map +0 -1
- package/dist/utils/package-link-yml.js +0 -92
- package/dist/utils/package-link-yml.js.map +0 -1
- package/dist/utils/platform-discovery.js +0 -2
- package/dist/utils/platform-discovery.js.map +0 -1
- package/dist/utils/platform-frontmatter-split.js +0 -15
- package/dist/utils/platform-frontmatter-split.js.map +0 -1
- package/dist/utils/timestamp-encoder.js +0 -13
- package/dist/utils/timestamp-encoder.js.map +0 -1
- package/dist/utils/wip-versioning.js +0 -24
- package/dist/utils/wip-versioning.js.map +0 -1
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { join, dirname } from 'path';
|
|
2
2
|
import * as yaml from 'js-yaml';
|
|
3
|
+
import { FILE_PATTERNS } from '../constants/index.js';
|
|
3
4
|
import { exists, readTextFile, writeTextFile, ensureDir } from './fs.js';
|
|
4
|
-
import {
|
|
5
|
+
import { getLocalOpenPackageDir, getLocalPackageContentDir } from './paths.js';
|
|
5
6
|
import { normalizePathForProcessing } from './path-normalization.js';
|
|
6
7
|
import { logger } from './logger.js';
|
|
7
|
-
export const PACKAGE_INDEX_FILENAME = 'package.index.yml';
|
|
8
8
|
const HEADER_COMMENT = '# This file is managed by OpenPackage. Do not edit manually.';
|
|
9
|
-
export function getPackageIndexPath(cwd, packageName) {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
export function getPackageIndexPath(cwd, packageName, location = 'nested') {
|
|
10
|
+
if (location === 'root') {
|
|
11
|
+
return join(getLocalOpenPackageDir(cwd), FILE_PATTERNS.PACKAGE_INDEX_YML);
|
|
12
|
+
}
|
|
13
|
+
// Nested: use content directory (cwd/.openpackage/packages/<name>/.openpackage/)
|
|
14
|
+
const contentDir = getLocalPackageContentDir(cwd, packageName);
|
|
15
|
+
return join(contentDir, FILE_PATTERNS.PACKAGE_INDEX_YML);
|
|
12
16
|
}
|
|
13
17
|
export function ensureTrailingSlash(value) {
|
|
14
18
|
return value.endsWith('/') ? value : `${value}/`;
|
|
@@ -63,8 +67,9 @@ export function sanitizeIndexData(data) {
|
|
|
63
67
|
files: sortMapping(entries)
|
|
64
68
|
};
|
|
65
69
|
}
|
|
66
|
-
export async function readPackageIndex(cwd, packageName) {
|
|
67
|
-
const
|
|
70
|
+
export async function readPackageIndex(cwd, packageName, location = 'nested') {
|
|
71
|
+
const canonicalPath = getPackageIndexPath(cwd, packageName, location);
|
|
72
|
+
const indexPath = canonicalPath;
|
|
68
73
|
if (!(await exists(indexPath))) {
|
|
69
74
|
return null;
|
|
70
75
|
}
|
|
@@ -82,7 +87,7 @@ export async function readPackageIndex(cwd, packageName) {
|
|
|
82
87
|
};
|
|
83
88
|
}
|
|
84
89
|
return {
|
|
85
|
-
path:
|
|
90
|
+
path: canonicalPath,
|
|
86
91
|
packageName,
|
|
87
92
|
workspace: sanitized.workspace,
|
|
88
93
|
files: sanitized.files
|
|
@@ -91,7 +96,7 @@ export async function readPackageIndex(cwd, packageName) {
|
|
|
91
96
|
catch (error) {
|
|
92
97
|
logger.warn(`Failed to read package index at ${indexPath}: ${error}`);
|
|
93
98
|
return {
|
|
94
|
-
path:
|
|
99
|
+
path: canonicalPath,
|
|
95
100
|
packageName,
|
|
96
101
|
workspace: { version: '', hash: undefined },
|
|
97
102
|
files: {}
|
|
@@ -102,7 +107,7 @@ export async function writePackageIndex(record) {
|
|
|
102
107
|
const { path: indexPath, files } = record;
|
|
103
108
|
const workspaceVer = record.workspace?.version;
|
|
104
109
|
if (!workspaceVer) {
|
|
105
|
-
throw new Error(
|
|
110
|
+
throw new Error(`workspace.version is required when writing ${FILE_PATTERNS.PACKAGE_INDEX_YML}`);
|
|
106
111
|
}
|
|
107
112
|
const workspace = {
|
|
108
113
|
hash: record.workspace?.hash,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-index-yml.js","sourceRoot":"","sources":["../../src/utils/package-index-yml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"package-index-yml.js","sourceRoot":"","sources":["../../src/utils/package-index-yml.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { logger } from './logger.js';
|
|
2
2
|
import { promptPlatformSelection } from './prompts.js';
|
|
3
|
-
import {
|
|
4
|
-
import { extractRemoteErrorReason } from './error-reasons.js';
|
|
3
|
+
import { getDetectedPlatforms } from '../core/platforms.js';
|
|
5
4
|
/**
|
|
6
5
|
* Detect existing platforms in the project
|
|
6
|
+
* Wrapper around getDetectedPlatforms that adds debug logging
|
|
7
7
|
*/
|
|
8
8
|
export async function detectPlatforms(targetDir) {
|
|
9
|
-
const
|
|
10
|
-
const detectedPlatforms = platformDetectionResults
|
|
11
|
-
.filter(result => result.detected)
|
|
12
|
-
.map(result => result.name);
|
|
9
|
+
const detectedPlatforms = await getDetectedPlatforms(targetDir);
|
|
13
10
|
if (detectedPlatforms.length > 0) {
|
|
14
11
|
logger.debug(`Auto-detected platforms: ${detectedPlatforms.join(', ')}`);
|
|
15
12
|
}
|
|
@@ -21,112 +18,6 @@ export async function detectPlatforms(targetDir) {
|
|
|
21
18
|
export async function promptForPlatformSelection() {
|
|
22
19
|
console.log('\n🤖 Platform Detection');
|
|
23
20
|
console.log('No AI development platform detected in this project.');
|
|
24
|
-
return await promptPlatformSelection();
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Display installation summary
|
|
28
|
-
*/
|
|
29
|
-
export function displayInstallationSummary(totalInstalled, totalSkipped, totalPackages, results) {
|
|
30
|
-
console.log(`\n✓ Installation Summary:`);
|
|
31
|
-
console.log(`✓ Successfully installed: ${totalInstalled}/${totalPackages} packages`);
|
|
32
|
-
if (totalSkipped > 0) {
|
|
33
|
-
console.log(`❌ Failed to install: ${totalSkipped} packages`);
|
|
34
|
-
console.log('\nFailed packages:');
|
|
35
|
-
results.filter(r => !r.success).forEach(result => {
|
|
36
|
-
console.log(` • ${result.name}: ${result.error}`);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Display installation results
|
|
42
|
-
*/
|
|
43
|
-
export function displayInstallationResults(packageName, resolvedPackages, platformResult, options, mainPackage, allAddedFiles, allUpdatedFiles, rootFileResults, missingPackages, missingPackageOutcomes) {
|
|
44
|
-
// Build installation summary
|
|
45
|
-
let summaryText = `✓ Installed ${packageName}`;
|
|
46
|
-
if (mainPackage) {
|
|
47
|
-
summaryText += `@${mainPackage.version}`;
|
|
48
|
-
}
|
|
49
|
-
console.log(`${summaryText}`);
|
|
50
|
-
const dependencyPackages = resolvedPackages.filter(f => !f.isRoot);
|
|
51
|
-
if (dependencyPackages.length > 0) {
|
|
52
|
-
console.log(`✓ Installed dependencies: ${dependencyPackages.length}`);
|
|
53
|
-
for (const dep of dependencyPackages) {
|
|
54
|
-
const packageSpecifier = typeof dep.name === 'string' && dep.name.startsWith('@')
|
|
55
|
-
? dep.name
|
|
56
|
-
: `@${dep.name}`;
|
|
57
|
-
console.log(` ├── ${packageSpecifier}@${dep.version}`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
console.log(`✓ Total packages processed: ${resolvedPackages.length}`);
|
|
61
|
-
// Show detailed file list
|
|
62
|
-
if (allAddedFiles && allAddedFiles.length > 0) {
|
|
63
|
-
console.log(`✓ Added files: ${allAddedFiles.length}`);
|
|
64
|
-
const sortedFiles = [...allAddedFiles].sort((a, b) => a.localeCompare(b));
|
|
65
|
-
for (const file of sortedFiles) {
|
|
66
|
-
console.log(` ├── ${file}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (allUpdatedFiles && allUpdatedFiles.length > 0) {
|
|
70
|
-
console.log(`✓ Updated files: ${allUpdatedFiles.length}`);
|
|
71
|
-
const sortedFiles = [...allUpdatedFiles].sort((a, b) => a.localeCompare(b));
|
|
72
|
-
for (const file of sortedFiles) {
|
|
73
|
-
console.log(` ├── ${file}`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Root file installation results
|
|
77
|
-
if (rootFileResults) {
|
|
78
|
-
const totalRootFiles = rootFileResults.installed.length + rootFileResults.updated.length;
|
|
79
|
-
if (totalRootFiles > 0) {
|
|
80
|
-
console.log(`✓ Root files: ${totalRootFiles} file(s)`);
|
|
81
|
-
// Show newly created root files
|
|
82
|
-
if (rootFileResults.installed.length > 0) {
|
|
83
|
-
const sortedInstalled = [...rootFileResults.installed].sort((a, b) => a.localeCompare(b));
|
|
84
|
-
for (const file of sortedInstalled) {
|
|
85
|
-
console.log(` ├── ${file} (created)`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// Show updated root files
|
|
89
|
-
if (rootFileResults.updated.length > 0) {
|
|
90
|
-
const sortedUpdated = [...rootFileResults.updated].sort((a, b) => a.localeCompare(b));
|
|
91
|
-
for (const file of sortedUpdated) {
|
|
92
|
-
console.log(` ├── ${file} (updated)`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// Platform and IDE template output
|
|
98
|
-
if (platformResult.created.length > 0) {
|
|
99
|
-
console.log(`✓ Created platform directories: ${platformResult.created.join(', ')}`);
|
|
100
|
-
}
|
|
101
|
-
// Report missing packages (displayed last)
|
|
102
|
-
if (missingPackages && missingPackages.length > 0) {
|
|
103
|
-
console.log(`\n⚠️ Missing dependencies detected:`);
|
|
104
|
-
for (const missing of missingPackages) {
|
|
105
|
-
const reasonLabel = formatMissingDependencyReason(missingPackageOutcomes?.[missing]);
|
|
106
|
-
console.log(` • ${missing} (${reasonLabel})`);
|
|
107
|
-
}
|
|
108
|
-
console.log(`\n💡 To resolve missing dependencies:`);
|
|
109
|
-
console.log(` • Create locally: opkg init && opkg save`);
|
|
110
|
-
console.log(` • Pull from remote: opkg pull ${missingPackages.join(' ')}`);
|
|
111
|
-
console.log(` • Remove from package.yml`);
|
|
112
|
-
console.log('');
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function formatMissingDependencyReason(outcome) {
|
|
116
|
-
if (!outcome) {
|
|
117
|
-
return 'not found in registry';
|
|
118
|
-
}
|
|
119
|
-
switch (outcome.reason) {
|
|
120
|
-
case 'not-found':
|
|
121
|
-
return 'not found in remote registry';
|
|
122
|
-
case 'access-denied':
|
|
123
|
-
return 'access denied';
|
|
124
|
-
case 'network':
|
|
125
|
-
return 'network error';
|
|
126
|
-
case 'integrity':
|
|
127
|
-
return 'integrity check failed';
|
|
128
|
-
default:
|
|
129
|
-
return extractRemoteErrorReason(outcome.message || 'unknown error');
|
|
130
|
-
}
|
|
21
|
+
return (await promptPlatformSelection());
|
|
131
22
|
}
|
|
132
23
|
//# sourceMappingURL=package-installation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-installation.js","sourceRoot":"","sources":["../../src/utils/package-installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"package-installation.js","sourceRoot":"","sources":["../../src/utils/package-installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAiB,MAAM,sBAAsB,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEhE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,4BAA4B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpE,OAAO,CAAC,MAAM,uBAAuB,EAAE,CAAe,CAAC;AACzD,CAAC"}
|
|
@@ -1,38 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { exists, isDirectory, readTextFile } from './fs.js';
|
|
3
|
-
import { findFilesByExtension } from './file-processing.js';
|
|
4
|
-
import { PACKAGE_INDEX_FILENAME } from './package-index-yml.js';
|
|
5
|
-
import { isAllowedRegistryPath, isRootRegistryPath, isSkippableRegistryPath, normalizeRegistryPath } from './registry-entry-filter.js';
|
|
6
|
-
const UTF8_ENCODING = 'utf8';
|
|
1
|
+
import { readPackageFilesForRegistry } from './package-copy.js';
|
|
7
2
|
export async function readLocalPackageFilesForIndex(packageDir) {
|
|
8
|
-
|
|
9
|
-
return [];
|
|
10
|
-
}
|
|
11
|
-
const entries = await findFilesByExtension(packageDir, [], packageDir);
|
|
12
|
-
const files = [];
|
|
13
|
-
for (const entry of entries) {
|
|
14
|
-
const normalizedPath = normalizeRegistryPath(entry.relativePath);
|
|
15
|
-
if (normalizedPath === PACKAGE_INDEX_FILENAME) {
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
const isAllowed = isAllowedRegistryPath(normalizedPath);
|
|
19
|
-
const isRoot = isRootRegistryPath(normalizedPath);
|
|
20
|
-
const isYamlOverride = isYamlOverrideFile(normalizedPath);
|
|
21
|
-
const isPackageYml = normalizedPath === FILE_PATTERNS.PACKAGE_YML;
|
|
22
|
-
const isRootLevelFile = !normalizedPath.includes('/');
|
|
23
|
-
if (!isAllowed && !isRoot && !isYamlOverride && !isPackageYml && !isRootLevelFile) {
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
const content = await readTextFile(entry.fullPath, UTF8_ENCODING);
|
|
27
|
-
files.push({
|
|
28
|
-
path: normalizedPath,
|
|
29
|
-
content,
|
|
30
|
-
encoding: UTF8_ENCODING
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
return files;
|
|
34
|
-
}
|
|
35
|
-
function isYamlOverrideFile(normalizedPath) {
|
|
36
|
-
return normalizedPath !== FILE_PATTERNS.PACKAGE_YML && isSkippableRegistryPath(normalizedPath);
|
|
3
|
+
return await readPackageFilesForRegistry(packageDir);
|
|
37
4
|
}
|
|
38
5
|
//# sourceMappingURL=package-local-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-local-files.js","sourceRoot":"","sources":["../../src/utils/package-local-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"package-local-files.js","sourceRoot":"","sources":["../../src/utils/package-local-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,UAAkB;IACpE,OAAO,MAAM,2BAA2B,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { basename,
|
|
1
|
+
import { basename, relative } from 'path';
|
|
2
2
|
import semver from 'semver';
|
|
3
3
|
import { parsePackageYml, writePackageYml } from './package-yml.js';
|
|
4
|
-
import { exists, ensureDir
|
|
4
|
+
import { exists, ensureDir } from './fs.js';
|
|
5
5
|
import { logger } from './logger.js';
|
|
6
6
|
import { getLocalOpenPackageDir, getLocalPackageYmlPath, getLocalPackagesDir, getLocalPackageDir } from './paths.js';
|
|
7
|
-
import { DEPENDENCY_ARRAYS } from '../constants/index.js';
|
|
7
|
+
import { DEPENDENCY_ARRAYS, PACKAGE_PATHS } from '../constants/index.js';
|
|
8
8
|
import { createCaretRange, hasExplicitPrereleaseIntent, isPrereleaseVersion } from './version-ranges.js';
|
|
9
9
|
import { extractBaseVersion } from './version-generator.js';
|
|
10
|
+
import { isUnversionedVersion } from './package-versioning.js';
|
|
10
11
|
import { normalizePackageName, arePackageNamesEquivalent } from './package-name.js';
|
|
11
12
|
import { packageManager } from '../core/package.js';
|
|
12
|
-
import {
|
|
13
|
+
import { promptPackageDetailsForNamed } from './prompts.js';
|
|
14
|
+
import { writePackageFilesToDirectory } from './package-copy.js';
|
|
15
|
+
import { getPackageFilesDir, getPackageYmlPath } from '../core/package-context.js';
|
|
16
|
+
import { buildNormalizedIncludeSet, isManifestPath, normalizePackagePath } from './manifest-paths.js';
|
|
13
17
|
/**
|
|
14
18
|
* Ensure local OpenPackage directory structure exists
|
|
15
19
|
* Shared utility for both install and save commands
|
|
@@ -23,18 +27,17 @@ export async function ensureLocalOpenPackageStructure(cwd) {
|
|
|
23
27
|
]);
|
|
24
28
|
}
|
|
25
29
|
/**
|
|
26
|
-
* Create a basic package.yml file if it doesn't exist
|
|
30
|
+
* Create a basic package.yml file for workspace if it doesn't exist
|
|
27
31
|
* Shared utility for both install and save commands
|
|
28
32
|
* @param force - If true, overwrite existing package.yml
|
|
29
33
|
* @returns the package.yml if it was created, null if it already existed and force=false
|
|
30
34
|
*/
|
|
31
|
-
export async function
|
|
35
|
+
export async function createWorkspacePackageYml(cwd, force = false) {
|
|
32
36
|
await ensureLocalOpenPackageStructure(cwd);
|
|
33
37
|
const packageYmlPath = getLocalPackageYmlPath(cwd);
|
|
34
38
|
const projectName = basename(cwd);
|
|
35
39
|
const basicPackageYml = {
|
|
36
40
|
name: projectName,
|
|
37
|
-
version: '0.1.0',
|
|
38
41
|
packages: [],
|
|
39
42
|
'dev-packages': []
|
|
40
43
|
};
|
|
@@ -52,12 +55,84 @@ export async function createBasicPackageYml(cwd, force = false) {
|
|
|
52
55
|
console.log(`📋 Initialized workspace package.yml in .openpackage/`);
|
|
53
56
|
return basicPackageYml;
|
|
54
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Ensure a nested package directory and package.yml exist, optionally prompting for details.
|
|
60
|
+
* This is for NESTED packages only. Root packages use different flow.
|
|
61
|
+
*/
|
|
62
|
+
export async function ensurePackageWithYml(cwd, packageName, options = {}) {
|
|
63
|
+
await ensureLocalOpenPackageStructure(cwd);
|
|
64
|
+
const normalizedName = normalizePackageName(packageName);
|
|
65
|
+
const packageDir = getPackageFilesDir(cwd, 'nested', normalizedName);
|
|
66
|
+
const packageYmlPath = getPackageYmlPath(cwd, 'nested', normalizedName);
|
|
67
|
+
await ensureDir(packageDir);
|
|
68
|
+
let packageConfig;
|
|
69
|
+
let isNew = false;
|
|
70
|
+
if (await exists(packageYmlPath)) {
|
|
71
|
+
packageConfig = await parsePackageYml(packageYmlPath);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
isNew = true;
|
|
75
|
+
// Try to seed from existing local registry copy to avoid prompts and preserve metadata.
|
|
76
|
+
try {
|
|
77
|
+
const registryExists = await packageManager.packageExists(normalizedName);
|
|
78
|
+
if (registryExists) {
|
|
79
|
+
const existing = await packageManager.loadPackage(normalizedName);
|
|
80
|
+
packageConfig = {
|
|
81
|
+
...existing.metadata,
|
|
82
|
+
name: normalizedName,
|
|
83
|
+
partial: true
|
|
84
|
+
};
|
|
85
|
+
logger.info(`Loaded package.yml for '${normalizedName}' from local registry copy`);
|
|
86
|
+
console.log(`✓ Loaded package.yml from local registry for ${normalizedName}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.debug('Unable to seed package.yml from registry; falling back to prompts', { normalizedName, error });
|
|
91
|
+
}
|
|
92
|
+
if (!packageConfig) {
|
|
93
|
+
if (options.interactive) {
|
|
94
|
+
console.log(`Create new package "${normalizedName}"`);
|
|
95
|
+
packageConfig = await promptPackageDetailsForNamed(normalizedName);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
packageConfig = {
|
|
99
|
+
name: normalizedName,
|
|
100
|
+
...(options.defaultVersion ? { version: options.defaultVersion } : {})
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
packageConfig = {
|
|
104
|
+
...packageConfig,
|
|
105
|
+
partial: true
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (!packageConfig.include || packageConfig.include.length === 0) {
|
|
109
|
+
packageConfig = {
|
|
110
|
+
...packageConfig,
|
|
111
|
+
include: ['**']
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
await writePackageYml(packageYmlPath, packageConfig);
|
|
115
|
+
logger.info(`Created new package '${packageConfig.name}${packageConfig.version ? `@${packageConfig.version}` : ''}' at ${relative(cwd, packageDir)}`);
|
|
116
|
+
}
|
|
117
|
+
if (packageConfig.name !== normalizedName) {
|
|
118
|
+
const updatedConfig = { ...packageConfig, name: normalizedName };
|
|
119
|
+
await writePackageYml(packageYmlPath, updatedConfig);
|
|
120
|
+
packageConfig = updatedConfig;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
normalizedName,
|
|
124
|
+
packageDir,
|
|
125
|
+
packageYmlPath,
|
|
126
|
+
packageConfig,
|
|
127
|
+
isNew
|
|
128
|
+
};
|
|
129
|
+
}
|
|
55
130
|
/**
|
|
56
131
|
* Add a package dependency to package.yml with smart placement logic
|
|
57
132
|
* Shared utility for both install and save commands
|
|
58
133
|
*/
|
|
59
134
|
export async function addPackageToYml(cwd, packageName, packageVersion, isDev = false, originalVersion, // The original version/range that was requested
|
|
60
|
-
silent = false) {
|
|
135
|
+
silent = false, include) {
|
|
61
136
|
const packageYmlPath = getLocalPackageYmlPath(cwd);
|
|
62
137
|
if (!(await exists(packageYmlPath))) {
|
|
63
138
|
return; // If no package.yml exists, ignore this step
|
|
@@ -68,6 +143,7 @@ silent = false) {
|
|
|
68
143
|
if (!config[DEPENDENCY_ARRAYS.DEV_PACKAGES])
|
|
69
144
|
config[DEPENDENCY_ARRAYS.DEV_PACKAGES] = [];
|
|
70
145
|
const normalizedPackageName = normalizePackageName(packageName);
|
|
146
|
+
const nameWithVersion = packageVersion ? `${packageName}@${packageVersion}` : packageName;
|
|
71
147
|
const packagesArray = config.packages;
|
|
72
148
|
const devPackagesArray = config[DEPENDENCY_ARRAYS.DEV_PACKAGES];
|
|
73
149
|
const findIndex = (arr) => arr.findIndex(dep => arePackageNamesEquivalent(dep.name, normalizedPackageName));
|
|
@@ -88,50 +164,67 @@ silent = false) {
|
|
|
88
164
|
const existingRange = currentLocation && existingIndex >= 0
|
|
89
165
|
? config[currentLocation][existingIndex]?.version
|
|
90
166
|
: undefined;
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
167
|
+
const shouldOmitVersion = isUnversionedVersion(packageVersion) || isUnversionedVersion(originalVersion);
|
|
168
|
+
let versionToWrite = shouldOmitVersion ? undefined : originalVersion;
|
|
169
|
+
if (!shouldOmitVersion && packageVersion) {
|
|
170
|
+
const baseVersion = extractBaseVersion(packageVersion);
|
|
171
|
+
const defaultRange = createCaretRange(baseVersion);
|
|
172
|
+
versionToWrite = originalVersion ?? defaultRange;
|
|
173
|
+
if (!originalVersion && existingRange) {
|
|
174
|
+
const hasPrereleaseIntent = hasExplicitPrereleaseIntent(existingRange);
|
|
175
|
+
const isNewVersionStable = !isPrereleaseVersion(packageVersion);
|
|
176
|
+
if (hasPrereleaseIntent) {
|
|
177
|
+
if (isNewVersionStable) {
|
|
178
|
+
// Constraint has explicit prerelease intent and we're packing a stable
|
|
179
|
+
// version on the same base line: normalize to a stable caret.
|
|
180
|
+
versionToWrite = createCaretRange(baseVersion);
|
|
181
|
+
logger.debug(`Updating range from prerelease-including '${existingRange}' to stable '${versionToWrite}' ` +
|
|
182
|
+
`for ${packageName} (pack transition to ${packageVersion})`);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// For prerelease-intent ranges during saves (prerelease versions),
|
|
186
|
+
// always preserve the existing constraint.
|
|
187
|
+
versionToWrite = existingRange;
|
|
188
|
+
}
|
|
104
189
|
}
|
|
105
|
-
else {
|
|
106
|
-
//
|
|
107
|
-
//
|
|
190
|
+
else if (rangeIncludesVersion(existingRange, baseVersion)) {
|
|
191
|
+
// Stable (non-prerelease) constraint that already includes the new base
|
|
192
|
+
// version: keep it unchanged.
|
|
108
193
|
versionToWrite = existingRange;
|
|
109
194
|
}
|
|
195
|
+
else {
|
|
196
|
+
// Stable constraint that does not include the new base version: bump to
|
|
197
|
+
// a new caret on the packed stable.
|
|
198
|
+
versionToWrite = defaultRange;
|
|
199
|
+
}
|
|
110
200
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
201
|
+
}
|
|
202
|
+
const existingDep = currentLocation && existingIndex >= 0 ? config[currentLocation][existingIndex] : null;
|
|
203
|
+
let includeToWrite;
|
|
204
|
+
if (include === undefined) {
|
|
205
|
+
includeToWrite = existingDep?.include;
|
|
206
|
+
}
|
|
207
|
+
else if (include === null) {
|
|
208
|
+
includeToWrite = undefined;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const unique = Array.from(new Set(include));
|
|
212
|
+
includeToWrite = unique.length > 0 ? unique : undefined;
|
|
121
213
|
}
|
|
122
214
|
const dependency = {
|
|
123
215
|
name: normalizedPackageName,
|
|
124
|
-
version: versionToWrite
|
|
216
|
+
...(versionToWrite ? { version: versionToWrite } : {}),
|
|
217
|
+
...(includeToWrite ? { include: includeToWrite } : {})
|
|
125
218
|
};
|
|
126
219
|
// Determine target location (packages vs dev-packages)
|
|
127
220
|
let targetArray;
|
|
128
221
|
if (currentLocation === DEPENDENCY_ARRAYS.DEV_PACKAGES && !isDev) {
|
|
129
222
|
targetArray = DEPENDENCY_ARRAYS.DEV_PACKAGES;
|
|
130
|
-
logger.info(`Keeping package in dev-packages: ${
|
|
223
|
+
logger.info(`Keeping package in dev-packages: ${nameWithVersion}`);
|
|
131
224
|
}
|
|
132
225
|
else if (currentLocation === DEPENDENCY_ARRAYS.PACKAGES && isDev) {
|
|
133
226
|
targetArray = DEPENDENCY_ARRAYS.DEV_PACKAGES;
|
|
134
|
-
logger.info(`Moving package from packages to dev-packages: ${
|
|
227
|
+
logger.info(`Moving package from packages to dev-packages: ${nameWithVersion}`);
|
|
135
228
|
}
|
|
136
229
|
else {
|
|
137
230
|
targetArray = isDev ? DEPENDENCY_ARRAYS.DEV_PACKAGES : DEPENDENCY_ARRAYS.PACKAGES;
|
|
@@ -146,63 +239,86 @@ silent = false) {
|
|
|
146
239
|
const targetArrayRef = config[targetArray];
|
|
147
240
|
const existingTargetIndex = currentLocation === targetArray ? findIndex(targetArrayRef) : -1;
|
|
148
241
|
if (existingTargetIndex >= 0) {
|
|
149
|
-
const
|
|
150
|
-
const versionChanged =
|
|
151
|
-
|
|
242
|
+
const existingDepForTarget = targetArrayRef[existingTargetIndex];
|
|
243
|
+
const versionChanged = existingDepForTarget.version !== dependency.version;
|
|
244
|
+
const includeChanged = JSON.stringify(existingDepForTarget.include ?? []) !== JSON.stringify(includeToWrite ?? []);
|
|
245
|
+
if (versionChanged || includeChanged) {
|
|
152
246
|
targetArrayRef[existingTargetIndex] = dependency;
|
|
153
247
|
if (!silent) {
|
|
154
|
-
logger.info(`Updated existing package dependency: ${
|
|
155
|
-
console.log(`✓ Updated ${
|
|
248
|
+
logger.info(`Updated existing package dependency: ${nameWithVersion}`);
|
|
249
|
+
console.log(`✓ Updated ${nameWithVersion} in main package.yml`);
|
|
156
250
|
}
|
|
157
251
|
}
|
|
158
252
|
}
|
|
159
253
|
else {
|
|
160
254
|
targetArrayRef.push(dependency);
|
|
161
255
|
if (!silent) {
|
|
162
|
-
logger.info(`Added new package dependency: ${
|
|
163
|
-
console.log(`✓ Added ${
|
|
256
|
+
logger.info(`Added new package dependency: ${nameWithVersion}`);
|
|
257
|
+
console.log(`✓ Added ${nameWithVersion} to main package.yml`);
|
|
164
258
|
}
|
|
165
259
|
}
|
|
166
260
|
await writePackageYml(packageYmlPath, config);
|
|
167
261
|
}
|
|
168
262
|
/**
|
|
169
263
|
* Copy the full package directory from the local registry into the project structure
|
|
170
|
-
* Removes all existing files except package
|
|
264
|
+
* Removes all existing files except the package index file before writing new files
|
|
171
265
|
*/
|
|
172
266
|
export async function writeLocalPackageFromRegistry(cwd, packageName, version) {
|
|
173
267
|
const pkg = await packageManager.loadPackage(packageName, version);
|
|
174
268
|
const localPackageDir = getLocalPackageDir(cwd, packageName);
|
|
175
|
-
await
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
269
|
+
await writePackageFilesToDirectory(localPackageDir, pkg.files, {
|
|
270
|
+
preserveIndexFile: true
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Copy a subset of package files from the local registry into the project cache (.openpackage/packages/<pkg>/),
|
|
275
|
+
* always including package.yml. Used for partial installs.
|
|
276
|
+
*/
|
|
277
|
+
export async function writePartialLocalPackageFromRegistry(cwd, packageName, version, includePaths) {
|
|
278
|
+
const pkg = await packageManager.loadPackage(packageName, version);
|
|
279
|
+
const localPackageDir = getLocalPackageDir(cwd, packageName);
|
|
280
|
+
const normalizedIncludes = buildNormalizedIncludeSet(includePaths);
|
|
281
|
+
const filteredFiles = pkg.files.filter(file => {
|
|
282
|
+
const p = normalizePackagePath(file.path);
|
|
283
|
+
if (isManifestPath(p))
|
|
284
|
+
return true; // always keep manifest
|
|
285
|
+
if (p === PACKAGE_PATHS.INDEX_RELATIVE)
|
|
286
|
+
return false; // never copy index from registry
|
|
287
|
+
if (!normalizedIncludes)
|
|
288
|
+
return true;
|
|
289
|
+
return normalizedIncludes.has(p);
|
|
290
|
+
});
|
|
291
|
+
await writePackageFilesToDirectory(localPackageDir, filteredFiles, {
|
|
292
|
+
preserveIndexFile: true
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Update only the include list for an existing dependency in package.yml.
|
|
297
|
+
* - include: string[] => set/dedupe
|
|
298
|
+
* - include: null => clear include field
|
|
299
|
+
* - include: undefined => no-op
|
|
300
|
+
*/
|
|
301
|
+
export async function updatePackageDependencyInclude(cwd, packageName, target, include) {
|
|
302
|
+
if (include === undefined)
|
|
303
|
+
return;
|
|
304
|
+
const packageYmlPath = getLocalPackageYmlPath(cwd);
|
|
305
|
+
if (!(await exists(packageYmlPath)))
|
|
306
|
+
return;
|
|
307
|
+
const config = await parsePackageYml(packageYmlPath);
|
|
308
|
+
const arr = config[target];
|
|
309
|
+
if (!arr)
|
|
310
|
+
return;
|
|
311
|
+
const idx = arr.findIndex(dep => arePackageNamesEquivalent(dep.name, packageName));
|
|
312
|
+
if (idx === -1)
|
|
313
|
+
return;
|
|
314
|
+
const unique = include === null ? undefined : Array.from(new Set(include));
|
|
315
|
+
if (unique && unique.length > 0) {
|
|
316
|
+
arr[idx].include = unique;
|
|
187
317
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
try {
|
|
193
|
-
await remove(filePath);
|
|
194
|
-
logger.debug(`Removed residual file: ${filePath}`);
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
logger.warn(`Failed to remove residual file ${filePath}: ${error}`);
|
|
198
|
-
}
|
|
199
|
-
}));
|
|
200
|
-
// Write all files from the package
|
|
201
|
-
await Promise.all(pkg.files.map(async (file) => {
|
|
202
|
-
const targetPath = join(localPackageDir, file.path);
|
|
203
|
-
const encoding = (file.encoding ?? 'utf8');
|
|
204
|
-
await writeTextFile(targetPath, file.content, encoding);
|
|
205
|
-
}));
|
|
318
|
+
else {
|
|
319
|
+
delete arr[idx].include;
|
|
320
|
+
}
|
|
321
|
+
await writePackageYml(packageYmlPath, config);
|
|
206
322
|
}
|
|
207
323
|
function rangeIncludesVersion(range, version) {
|
|
208
324
|
if (!range || !version) {
|