@microwiseai/snapshot 0.3.5 → 0.3.26
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/dist/commands/install.d.ts +13 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +621 -98
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/license.d.ts +21 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +120 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/index.js +46 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +32 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +89 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/gitlab.d.ts +26 -20
- package/dist/lib/gitlab.d.ts.map +1 -1
- package/dist/lib/gitlab.js +100 -153
- package/dist/lib/gitlab.js.map +1 -1
- package/dist/lib/package-resolver.d.ts +48 -0
- package/dist/lib/package-resolver.d.ts.map +1 -0
- package/dist/lib/package-resolver.js +178 -0
- package/dist/lib/package-resolver.js.map +1 -0
- package/dist/lib/skit-adapter.d.ts +56 -0
- package/dist/lib/skit-adapter.d.ts.map +1 -0
- package/dist/lib/skit-adapter.js +166 -0
- package/dist/lib/skit-adapter.js.map +1 -0
- package/dist/lib/transitive-resolver.d.ts +86 -0
- package/dist/lib/transitive-resolver.d.ts.map +1 -0
- package/dist/lib/transitive-resolver.js +431 -0
- package/dist/lib/transitive-resolver.js.map +1 -0
- package/dist/lib/types.d.ts +13 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib.d.ts +59 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +134 -0
- package/dist/lib.js.map +1 -0
- package/dist/tools/snapshot-to-license.d.ts +13 -0
- package/dist/tools/snapshot-to-license.d.ts.map +1 -0
- package/dist/tools/snapshot-to-license.js +105 -0
- package/dist/tools/snapshot-to-license.js.map +1 -0
- package/node_modules/@microwiseai/cache/README.md +143 -0
- package/node_modules/@microwiseai/cache/dist/file.d.ts +97 -0
- package/node_modules/@microwiseai/cache/dist/file.d.ts.map +1 -0
- package/node_modules/@microwiseai/cache/dist/file.js +256 -0
- package/node_modules/@microwiseai/cache/dist/file.js.map +1 -0
- package/node_modules/@microwiseai/cache/dist/index.d.ts +10 -0
- package/node_modules/@microwiseai/cache/dist/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/cache/dist/index.js +11 -0
- package/node_modules/@microwiseai/cache/dist/index.js.map +1 -0
- package/node_modules/@microwiseai/cache/dist/memory.d.ts +69 -0
- package/node_modules/@microwiseai/cache/dist/memory.d.ts.map +1 -0
- package/node_modules/@microwiseai/cache/dist/memory.js +152 -0
- package/node_modules/@microwiseai/cache/dist/memory.js.map +1 -0
- package/node_modules/@microwiseai/cache/dist/types.d.ts +76 -0
- package/node_modules/@microwiseai/cache/dist/types.d.ts.map +1 -0
- package/node_modules/@microwiseai/cache/dist/types.js +5 -0
- package/node_modules/@microwiseai/cache/dist/types.js.map +1 -0
- package/node_modules/@microwiseai/cache/package.json +40 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.d.ts +7 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.js +139 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.d.ts +8 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.js +195 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.d.ts +8 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.js +97 -0
- package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/detector.d.ts +16 -0
- package/node_modules/@microwiseai/import-telemetry/dist/detector.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/detector.js +103 -0
- package/node_modules/@microwiseai/import-telemetry/dist/detector.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/index.d.ts +48 -0
- package/node_modules/@microwiseai/import-telemetry/dist/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/index.js +56 -0
- package/node_modules/@microwiseai/import-telemetry/dist/index.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/reporter.d.ts +16 -0
- package/node_modules/@microwiseai/import-telemetry/dist/reporter.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/reporter.js +147 -0
- package/node_modules/@microwiseai/import-telemetry/dist/reporter.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/types.d.ts +75 -0
- package/node_modules/@microwiseai/import-telemetry/dist/types.d.ts.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/dist/types.js +23 -0
- package/node_modules/@microwiseai/import-telemetry/dist/types.js.map +1 -0
- package/node_modules/@microwiseai/import-telemetry/package.json +40 -0
- package/node_modules/@microwiseai/license/README.md +157 -0
- package/node_modules/@microwiseai/license/dist/api/client.d.ts +37 -0
- package/node_modules/@microwiseai/license/dist/api/client.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/api/client.js +95 -0
- package/node_modules/@microwiseai/license/dist/api/client.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/api/endpoints.d.ts +25 -0
- package/node_modules/@microwiseai/license/dist/api/endpoints.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/api/endpoints.js +101 -0
- package/node_modules/@microwiseai/license/dist/api/endpoints.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/api/index.d.ts +7 -0
- package/node_modules/@microwiseai/license/dist/api/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/api/index.js +8 -0
- package/node_modules/@microwiseai/license/dist/api/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/file.d.ts +38 -0
- package/node_modules/@microwiseai/license/dist/cache/file.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/file.js +140 -0
- package/node_modules/@microwiseai/license/dist/cache/file.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/index.d.ts +7 -0
- package/node_modules/@microwiseai/license/dist/cache/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/index.js +10 -0
- package/node_modules/@microwiseai/license/dist/cache/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/memory.d.ts +35 -0
- package/node_modules/@microwiseai/license/dist/cache/memory.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/memory.js +77 -0
- package/node_modules/@microwiseai/license/dist/cache/memory.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/offline.d.ts +29 -0
- package/node_modules/@microwiseai/license/dist/cache/offline.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/cache/offline.js +58 -0
- package/node_modules/@microwiseai/license/dist/cache/offline.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/client.d.ts +42 -0
- package/node_modules/@microwiseai/license/dist/client.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/client.js +83 -0
- package/node_modules/@microwiseai/license/dist/client.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/config.d.ts +27 -0
- package/node_modules/@microwiseai/license/dist/config.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/config.js +52 -0
- package/node_modules/@microwiseai/license/dist/config.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/activate.d.ts +21 -0
- package/node_modules/@microwiseai/license/dist/core/activate.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/activate.js +72 -0
- package/node_modules/@microwiseai/license/dist/core/activate.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/check.d.ts +19 -0
- package/node_modules/@microwiseai/license/dist/core/check.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/check.js +244 -0
- package/node_modules/@microwiseai/license/dist/core/check.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/index.d.ts +7 -0
- package/node_modules/@microwiseai/license/dist/core/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/index.js +10 -0
- package/node_modules/@microwiseai/license/dist/core/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/verify.d.ts +39 -0
- package/node_modules/@microwiseai/license/dist/core/verify.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/core/verify.js +188 -0
- package/node_modules/@microwiseai/license/dist/core/verify.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/env.d.ts +33 -0
- package/node_modules/@microwiseai/license/dist/env.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/env.js +69 -0
- package/node_modules/@microwiseai/license/dist/env.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/helpers/cache.d.ts +97 -0
- package/node_modules/@microwiseai/license/dist/helpers/cache.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/helpers/cache.js +198 -0
- package/node_modules/@microwiseai/license/dist/helpers/cache.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/helpers/index.d.ts +7 -0
- package/node_modules/@microwiseai/license/dist/helpers/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/helpers/index.js +9 -0
- package/node_modules/@microwiseai/license/dist/helpers/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/helpers/telemetry.d.ts +68 -0
- package/node_modules/@microwiseai/license/dist/helpers/telemetry.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/helpers/telemetry.js +119 -0
- package/node_modules/@microwiseai/license/dist/helpers/telemetry.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/index.d.ts +34 -0
- package/node_modules/@microwiseai/license/dist/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/index.js +48 -0
- package/node_modules/@microwiseai/license/dist/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/machine/id.d.ts +19 -0
- package/node_modules/@microwiseai/license/dist/machine/id.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/machine/id.js +83 -0
- package/node_modules/@microwiseai/license/dist/machine/id.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/machine/index.d.ts +6 -0
- package/node_modules/@microwiseai/license/dist/machine/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/machine/index.js +6 -0
- package/node_modules/@microwiseai/license/dist/machine/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/machine/instance.d.ts +23 -0
- package/node_modules/@microwiseai/license/dist/machine/instance.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/machine/instance.js +52 -0
- package/node_modules/@microwiseai/license/dist/machine/instance.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/telemetry/index.d.ts +6 -0
- package/node_modules/@microwiseai/license/dist/telemetry/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/telemetry/index.js +6 -0
- package/node_modules/@microwiseai/license/dist/telemetry/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/telemetry/manager.d.ts +53 -0
- package/node_modules/@microwiseai/license/dist/telemetry/manager.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/telemetry/manager.js +125 -0
- package/node_modules/@microwiseai/license/dist/telemetry/manager.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/telemetry/payload.d.ts +17 -0
- package/node_modules/@microwiseai/license/dist/telemetry/payload.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/telemetry/payload.js +65 -0
- package/node_modules/@microwiseai/license/dist/telemetry/payload.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/api.d.ts +120 -0
- package/node_modules/@microwiseai/license/dist/types/api.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/api.js +5 -0
- package/node_modules/@microwiseai/license/dist/types/api.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/config.d.ts +80 -0
- package/node_modules/@microwiseai/license/dist/types/config.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/config.js +12 -0
- package/node_modules/@microwiseai/license/dist/types/config.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/errors.d.ts +93 -0
- package/node_modules/@microwiseai/license/dist/types/errors.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/errors.js +144 -0
- package/node_modules/@microwiseai/license/dist/types/errors.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/index.d.ts +10 -0
- package/node_modules/@microwiseai/license/dist/types/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/index.js +6 -0
- package/node_modules/@microwiseai/license/dist/types/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/license.d.ts +113 -0
- package/node_modules/@microwiseai/license/dist/types/license.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/types/license.js +5 -0
- package/node_modules/@microwiseai/license/dist/types/license.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/date.d.ts +45 -0
- package/node_modules/@microwiseai/license/dist/utils/date.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/date.js +95 -0
- package/node_modules/@microwiseai/license/dist/utils/date.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/env.d.ts +41 -0
- package/node_modules/@microwiseai/license/dist/utils/env.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/env.js +80 -0
- package/node_modules/@microwiseai/license/dist/utils/env.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/index.d.ts +7 -0
- package/node_modules/@microwiseai/license/dist/utils/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/index.js +7 -0
- package/node_modules/@microwiseai/license/dist/utils/index.js.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/mask.d.ts +27 -0
- package/node_modules/@microwiseai/license/dist/utils/mask.d.ts.map +1 -0
- package/node_modules/@microwiseai/license/dist/utils/mask.js +67 -0
- package/node_modules/@microwiseai/license/dist/utils/mask.js.map +1 -0
- package/node_modules/@microwiseai/license/package.json +52 -0
- package/node_modules/@microwiseai/license-types/README.md +84 -0
- package/node_modules/@microwiseai/license-types/dist/api.d.ts +120 -0
- package/node_modules/@microwiseai/license-types/dist/api.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/api.js +5 -0
- package/node_modules/@microwiseai/license-types/dist/api.js.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/config.d.ts +80 -0
- package/node_modules/@microwiseai/license-types/dist/config.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/config.js +12 -0
- package/node_modules/@microwiseai/license-types/dist/config.js.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/errors.d.ts +93 -0
- package/node_modules/@microwiseai/license-types/dist/errors.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/errors.js +144 -0
- package/node_modules/@microwiseai/license-types/dist/errors.js.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/index.d.ts +10 -0
- package/node_modules/@microwiseai/license-types/dist/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/index.js +6 -0
- package/node_modules/@microwiseai/license-types/dist/index.js.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/license.d.ts +113 -0
- package/node_modules/@microwiseai/license-types/dist/license.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-types/dist/license.js +5 -0
- package/node_modules/@microwiseai/license-types/dist/license.js.map +1 -0
- package/node_modules/@microwiseai/license-types/package.json +38 -0
- package/node_modules/@microwiseai/license-utils/README.md +82 -0
- package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.d.ts +2 -0
- package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.js +124 -0
- package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/index.d.ts +7 -0
- package/node_modules/@microwiseai/license-utils/dist/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/index.js +15 -0
- package/node_modules/@microwiseai/license-utils/dist/index.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/id.d.ts +19 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/id.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/id.js +83 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/id.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/index.d.ts +6 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/index.js +6 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/index.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/instance.d.ts +23 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/instance.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/instance.js +52 -0
- package/node_modules/@microwiseai/license-utils/dist/machine/instance.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/date.d.ts +45 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/date.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/date.js +95 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/date.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/env.d.ts +16 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/env.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/env.js +22 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/env.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/index.d.ts +7 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/index.js +7 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/index.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/mask.d.ts +27 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/mask.d.ts.map +1 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/mask.js +67 -0
- package/node_modules/@microwiseai/license-utils/dist/utils/mask.js.map +1 -0
- package/node_modules/@microwiseai/license-utils/package.json +45 -0
- package/node_modules/@microwiseai/telemetry/README.md +86 -0
- package/node_modules/@microwiseai/telemetry/dist/index.d.ts +9 -0
- package/node_modules/@microwiseai/telemetry/dist/index.d.ts.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/index.js +10 -0
- package/node_modules/@microwiseai/telemetry/dist/index.js.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/manager.d.ts +71 -0
- package/node_modules/@microwiseai/telemetry/dist/manager.d.ts.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/manager.js +171 -0
- package/node_modules/@microwiseai/telemetry/dist/manager.js.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/payload.d.ts +13 -0
- package/node_modules/@microwiseai/telemetry/dist/payload.d.ts.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/payload.js +35 -0
- package/node_modules/@microwiseai/telemetry/dist/payload.js.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/types.d.ts +76 -0
- package/node_modules/@microwiseai/telemetry/dist/types.d.ts.map +1 -0
- package/node_modules/@microwiseai/telemetry/dist/types.js +13 -0
- package/node_modules/@microwiseai/telemetry/dist/types.js.map +1 -0
- package/node_modules/@microwiseai/telemetry/package.json +43 -0
- package/node_modules/chalk/license +9 -0
- package/node_modules/chalk/package.json +83 -0
- package/node_modules/chalk/readme.md +297 -0
- package/node_modules/chalk/source/index.d.ts +325 -0
- package/node_modules/chalk/source/index.js +225 -0
- package/node_modules/chalk/source/utilities.js +33 -0
- package/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- package/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- package/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- package/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
- package/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- package/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
- package/package.json +26 -2
package/dist/commands/install.js
CHANGED
|
@@ -1,16 +1,310 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { execSync } from 'child_process';
|
|
3
|
+
import { writeFileSync, existsSync, readFileSync, unlinkSync } from 'fs';
|
|
4
|
+
import { homedir, platform, arch } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
3
6
|
import { fetchSnapshotFromRepo, snapshotNameToRepoName } from '../lib/gitlab.js';
|
|
4
7
|
import { saveCurrentSnapshot } from '../lib/snapshot.js';
|
|
5
|
-
import {
|
|
6
|
-
|
|
8
|
+
import { getLicenseKey, REGISTRY_PROXY_URL, VENDOR_NAME, STORE_URL, PACKAGE_NAME, getIstCredentials, LICENSE_API_URL } from '../lib/config.js';
|
|
9
|
+
import { resolveSnapshotDependencies, detectPackageType } from '../lib/package-resolver.js';
|
|
10
|
+
import { resolveDepsFromLicenseAPI } from '../lib/transitive-resolver.js';
|
|
11
|
+
import { installSkitPackage } from '../lib/skit-adapter.js';
|
|
12
|
+
import { createLicenseClient, markLicenseChecked } from '@microwiseai/license';
|
|
13
|
+
// CLI version (from package.json)
|
|
14
|
+
const CLI_VERSION = '0.3.25';
|
|
15
|
+
/**
|
|
16
|
+
* Send install telemetry to license-api (fire and forget)
|
|
17
|
+
*/
|
|
18
|
+
async function sendInstallTelemetry(data) {
|
|
19
|
+
try {
|
|
20
|
+
const telemetry = {
|
|
21
|
+
event: 'install',
|
|
22
|
+
...data,
|
|
23
|
+
timestamp: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
// Fire and forget - don't block on response
|
|
26
|
+
fetch(`${LICENSE_API_URL}/telemetry`, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: { 'Content-Type': 'application/json' },
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
machineId: data.userId || 'anonymous',
|
|
31
|
+
instanceName: data.package,
|
|
32
|
+
vendorName: VENDOR_NAME,
|
|
33
|
+
packageName: data.package,
|
|
34
|
+
packageVersion: data.version,
|
|
35
|
+
sdkVersion: data.cliVersion,
|
|
36
|
+
licenseStatus: data.success ? 'valid' : 'invalid',
|
|
37
|
+
licenseType: 'beta',
|
|
38
|
+
productId: 'snapshot-cli',
|
|
39
|
+
platform: data.platform,
|
|
40
|
+
nodeVersion: process.version,
|
|
41
|
+
// Custom fields in metadata
|
|
42
|
+
metadata: JSON.stringify(telemetry),
|
|
43
|
+
}),
|
|
44
|
+
}).catch(() => {
|
|
45
|
+
// Silently ignore telemetry errors
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Silently ignore telemetry errors
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Default installers for backward compatibility
|
|
53
|
+
const DEFAULT_INSTALLERS = {
|
|
54
|
+
'glpkg': {
|
|
55
|
+
command: 'glpkg install {pkg}',
|
|
56
|
+
check: 'glpkg --version',
|
|
57
|
+
hint: 'npm install -g @glpkg/cli',
|
|
58
|
+
},
|
|
59
|
+
// Legacy alias for backward compatibility
|
|
60
|
+
'gitlab-install': {
|
|
61
|
+
command: 'glpkg install {pkg}',
|
|
62
|
+
check: 'glpkg --version',
|
|
63
|
+
hint: 'npm install -g @glpkg/cli (gitlab-install is deprecated, use glpkg)',
|
|
64
|
+
},
|
|
65
|
+
'skit': {
|
|
66
|
+
command: 'skit install {pkg}',
|
|
67
|
+
check: 'skit --version',
|
|
68
|
+
hint: 'npm install -g @ist/skit',
|
|
69
|
+
},
|
|
70
|
+
'npm-proxy': {
|
|
71
|
+
command: 'npm install -g {pkg}',
|
|
72
|
+
check: 'npm --version',
|
|
73
|
+
hint: 'npm is required',
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Configure .npmrc for registry-proxy with session token
|
|
78
|
+
*/
|
|
79
|
+
function configureNpmrcForProxy(scopes, licenseKey) {
|
|
80
|
+
const npmrcPath = join(homedir(), '.npmrc');
|
|
81
|
+
let originalContent = null;
|
|
82
|
+
// Backup existing .npmrc
|
|
83
|
+
if (existsSync(npmrcPath)) {
|
|
84
|
+
originalContent = readFileSync(npmrcPath, 'utf-8');
|
|
85
|
+
}
|
|
86
|
+
// Build new .npmrc content
|
|
87
|
+
const proxyHost = REGISTRY_PROXY_URL.replace('https://', '');
|
|
88
|
+
const lines = [];
|
|
89
|
+
// Keep existing content that's not related to our scopes
|
|
90
|
+
if (originalContent) {
|
|
91
|
+
const existingLines = originalContent.split('\n');
|
|
92
|
+
for (const line of existingLines) {
|
|
93
|
+
// Skip lines related to our scopes or proxy
|
|
94
|
+
const isOurScope = scopes.some(s => line.includes(`${s}:registry`));
|
|
95
|
+
const isProxyAuth = line.includes(proxyHost);
|
|
96
|
+
if (!isOurScope && !isProxyAuth && line.trim()) {
|
|
97
|
+
lines.push(line);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Add proxy registry config for each scope
|
|
102
|
+
for (const scope of scopes) {
|
|
103
|
+
lines.push(`${scope}:registry=${REGISTRY_PROXY_URL}/`);
|
|
104
|
+
}
|
|
105
|
+
// Add auth token for proxy
|
|
106
|
+
lines.push(`//${proxyHost}/:_authToken=${licenseKey}`);
|
|
107
|
+
writeFileSync(npmrcPath, lines.join('\n') + '\n');
|
|
108
|
+
return { path: npmrcPath, content: originalContent };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Restore original .npmrc
|
|
112
|
+
*/
|
|
113
|
+
function restoreNpmrc(backup) {
|
|
114
|
+
if (backup.content === null) {
|
|
115
|
+
// Original didn't exist, remove it
|
|
116
|
+
if (existsSync(backup.path)) {
|
|
117
|
+
unlinkSync(backup.path);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Restore original content
|
|
122
|
+
writeFileSync(backup.path, backup.content);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Configure .npmrc for registry-proxy WITHOUT auth token (anonymous access)
|
|
127
|
+
*/
|
|
128
|
+
function configureNpmrcForProxyAnonymous(scopes) {
|
|
129
|
+
const npmrcPath = join(homedir(), '.npmrc');
|
|
130
|
+
let originalContent = null;
|
|
131
|
+
// Backup existing .npmrc
|
|
132
|
+
if (existsSync(npmrcPath)) {
|
|
133
|
+
originalContent = readFileSync(npmrcPath, 'utf-8');
|
|
134
|
+
}
|
|
135
|
+
// Build new .npmrc content
|
|
136
|
+
const proxyHost = REGISTRY_PROXY_URL.replace('https://', '');
|
|
137
|
+
const lines = [];
|
|
138
|
+
// Keep existing content that's not related to our scopes
|
|
139
|
+
if (originalContent) {
|
|
140
|
+
const existingLines = originalContent.split('\n');
|
|
141
|
+
for (const line of existingLines) {
|
|
142
|
+
// Skip lines related to our scopes or proxy
|
|
143
|
+
const isOurScope = scopes.some(s => line.includes(`${s}:registry`));
|
|
144
|
+
const isProxyAuth = line.includes(proxyHost);
|
|
145
|
+
if (!isOurScope && !isProxyAuth && line.trim()) {
|
|
146
|
+
lines.push(line);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Add proxy registry config for each scope (NO auth token)
|
|
151
|
+
for (const scope of scopes) {
|
|
152
|
+
lines.push(`${scope}:registry=${REGISTRY_PROXY_URL}/`);
|
|
153
|
+
}
|
|
154
|
+
writeFileSync(npmrcPath, lines.join('\n') + '\n');
|
|
155
|
+
return { path: npmrcPath, content: originalContent };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Extract scopes from packages
|
|
159
|
+
*/
|
|
160
|
+
function extractScopes(packages) {
|
|
161
|
+
const scopes = new Set();
|
|
162
|
+
for (const name of Object.keys(packages)) {
|
|
163
|
+
if (name.startsWith('@')) {
|
|
164
|
+
const scope = name.split('/')[0];
|
|
165
|
+
scopes.add(scope);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return Array.from(scopes);
|
|
169
|
+
}
|
|
170
|
+
function commandExists(cmd) {
|
|
171
|
+
try {
|
|
172
|
+
const checkCmd = process.platform === 'win32'
|
|
173
|
+
? `where ${cmd.split(' ')[0]}`
|
|
174
|
+
: `which ${cmd.split(' ')[0]}`;
|
|
175
|
+
execSync(checkCmd, { stdio: 'pipe' });
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function runCommand(command) {
|
|
183
|
+
try {
|
|
184
|
+
execSync(command, { stdio: 'pipe', encoding: 'utf-8' });
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* PackageType을 installer 이름으로 변환
|
|
193
|
+
*/
|
|
194
|
+
function packageTypeToInstaller(type, useProxy) {
|
|
195
|
+
switch (type) {
|
|
196
|
+
case 'skit':
|
|
197
|
+
return 'skit';
|
|
198
|
+
case 'npm':
|
|
199
|
+
return useProxy ? 'npm-proxy' : 'glpkg';
|
|
200
|
+
case 'generic':
|
|
201
|
+
default:
|
|
202
|
+
return 'glpkg';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Skit 패키지 설치 (lib 우선, CLI fallback)
|
|
207
|
+
* @ist/skit lib가 있으면 직접 호출, 없으면 CLI 사용
|
|
208
|
+
*/
|
|
209
|
+
async function installSkitPackages(packages, snapshotName, indent) {
|
|
210
|
+
const result = { installed: [], failed: [] };
|
|
211
|
+
const packageEntries = Object.entries(packages);
|
|
212
|
+
if (packageEntries.length === 0) {
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
const total = packageEntries.length;
|
|
216
|
+
console.log('');
|
|
217
|
+
console.log(chalk.yellow(`${indent}=== ${snapshotName}: ${total} skits ===`));
|
|
218
|
+
// Install packages using skit-adapter
|
|
219
|
+
for (let i = 0; i < packageEntries.length; i++) {
|
|
220
|
+
const [name, version] = packageEntries[i];
|
|
221
|
+
const pkgSpec = `${name}@${version}`;
|
|
222
|
+
const progress = `[${i + 1}/${total}]`;
|
|
223
|
+
process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
|
|
224
|
+
try {
|
|
225
|
+
const installResult = await installSkitPackage(name, version);
|
|
226
|
+
if (installResult.success) {
|
|
227
|
+
console.log(chalk.green(' ✓'));
|
|
228
|
+
result.installed.push(pkgSpec);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log(chalk.red(' ✗'));
|
|
232
|
+
if (installResult.error) {
|
|
233
|
+
console.log(chalk.gray(`${indent} ${installResult.error}`));
|
|
234
|
+
}
|
|
235
|
+
result.failed.push(pkgSpec);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
console.log(chalk.red(' ✗'));
|
|
240
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
241
|
+
console.log(chalk.gray(`${indent} ${errMsg}`));
|
|
242
|
+
result.failed.push(pkgSpec);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 타입별 패키지 설치 (non-skit)
|
|
249
|
+
*/
|
|
250
|
+
async function installPackagesByType(packages, installerName, installers, snapshotName, indent, typeLabel) {
|
|
251
|
+
const result = { installed: [], failed: [] };
|
|
252
|
+
const packageEntries = Object.entries(packages);
|
|
253
|
+
if (packageEntries.length === 0) {
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
// Skit packages use dedicated function
|
|
257
|
+
if (installerName === 'skit') {
|
|
258
|
+
return installSkitPackages(packages, snapshotName, indent);
|
|
259
|
+
}
|
|
260
|
+
const installerConfig = installers[installerName] || DEFAULT_INSTALLERS[installerName];
|
|
261
|
+
if (!installerConfig) {
|
|
262
|
+
console.log(chalk.red(`${indent}Unknown installer: ${installerName}`));
|
|
263
|
+
result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
const total = packageEntries.length;
|
|
267
|
+
console.log('');
|
|
268
|
+
console.log(chalk.yellow(`${indent}=== ${snapshotName}: ${total} ${typeLabel} (${installerName}) ===`));
|
|
269
|
+
// Check if installer exists
|
|
270
|
+
const cmdName = installerConfig.check.split(' ')[0];
|
|
271
|
+
if (!commandExists(cmdName)) {
|
|
272
|
+
console.log(chalk.red(`${indent}${installerName} not found.`));
|
|
273
|
+
console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
|
|
274
|
+
result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
|
|
275
|
+
return result;
|
|
276
|
+
}
|
|
277
|
+
// Install packages
|
|
278
|
+
for (let i = 0; i < packageEntries.length; i++) {
|
|
279
|
+
const [name, version] = packageEntries[i];
|
|
280
|
+
const pkgSpec = `${name}@${version}`;
|
|
281
|
+
const progress = `[${i + 1}/${total}]`;
|
|
282
|
+
const command = installerConfig.command.replace('{pkg}', pkgSpec);
|
|
283
|
+
process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
|
|
284
|
+
if (runCommand(command)) {
|
|
285
|
+
console.log(chalk.green(' ✓'));
|
|
286
|
+
result.installed.push(pkgSpec);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
console.log(chalk.red(' ✗'));
|
|
290
|
+
result.failed.push(pkgSpec);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
export async function installSnapshot(snapshot, depth = 0, parentInstallers = {}, options = {}) {
|
|
7
296
|
const indent = ' '.repeat(depth);
|
|
8
297
|
const result = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
failedPackages: [],
|
|
12
|
-
failedSkits: [],
|
|
298
|
+
installed: [],
|
|
299
|
+
failed: [],
|
|
13
300
|
};
|
|
301
|
+
// Merge installers: snapshot + parent (parent takes precedence for overrides like npm-proxy)
|
|
302
|
+
let installers = { ...DEFAULT_INSTALLERS };
|
|
303
|
+
if (snapshot.installers) {
|
|
304
|
+
installers = { ...installers, ...snapshot.installers };
|
|
305
|
+
}
|
|
306
|
+
// Parent installers take precedence (for effectiveInstallers override)
|
|
307
|
+
installers = { ...installers, ...parentInstallers };
|
|
14
308
|
// Handle extends - install base snapshot first
|
|
15
309
|
if (snapshot.extends) {
|
|
16
310
|
console.log('');
|
|
@@ -18,11 +312,11 @@ async function installSnapshot(snapshot, depth = 0) {
|
|
|
18
312
|
try {
|
|
19
313
|
const baseSnapshot = await fetchSnapshotFromRepo(snapshot.extends);
|
|
20
314
|
console.log(chalk.gray(`${indent} Installing base snapshot...`));
|
|
21
|
-
const baseResult = await installSnapshot(baseSnapshot, depth + 1);
|
|
22
|
-
result.
|
|
23
|
-
result.
|
|
24
|
-
|
|
25
|
-
|
|
315
|
+
const baseResult = await installSnapshot(baseSnapshot, depth + 1, installers, options);
|
|
316
|
+
result.installed.push(...baseResult.result.installed);
|
|
317
|
+
result.failed.push(...baseResult.result.failed);
|
|
318
|
+
// Update installers with any from base
|
|
319
|
+
installers = { ...installers, ...baseResult.installers };
|
|
26
320
|
}
|
|
27
321
|
catch (error) {
|
|
28
322
|
const errMsg = error instanceof Error ? error.message : String(error);
|
|
@@ -44,71 +338,123 @@ async function installSnapshot(snapshot, depth = 0) {
|
|
|
44
338
|
}
|
|
45
339
|
}
|
|
46
340
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
341
|
+
// ============================================================
|
|
342
|
+
// Auto-detect mode: 패키지 타입 자동 판별
|
|
343
|
+
// ============================================================
|
|
344
|
+
if (options.autoDetect && !snapshot.install) {
|
|
345
|
+
console.log(chalk.gray(`${indent} Auto-detecting package types...`));
|
|
346
|
+
const resolved = await resolveSnapshotDependencies(snapshot, { skipRegistry: true });
|
|
347
|
+
// skit 패키지 설치 (skit-adapter 사용: lib 우선, CLI fallback)
|
|
348
|
+
if (Object.keys(resolved.skit).length > 0) {
|
|
349
|
+
const skitResult = await installSkitPackages(resolved.skit, snapshot.name, indent);
|
|
350
|
+
result.installed.push(...skitResult.installed);
|
|
351
|
+
result.failed.push(...skitResult.failed);
|
|
352
|
+
}
|
|
353
|
+
// npm 패키지 설치 (proxy 사용 시 npm-proxy, 아니면 glpkg)
|
|
354
|
+
if (Object.keys(resolved.npm).length > 0) {
|
|
355
|
+
const npmInstaller = options.useProxy ? 'npm-proxy' : 'glpkg';
|
|
356
|
+
const npmResult = await installPackagesByType(resolved.npm, npmInstaller, installers, snapshot.name, indent, 'npm packages');
|
|
357
|
+
result.installed.push(...npmResult.installed);
|
|
358
|
+
result.failed.push(...npmResult.failed);
|
|
359
|
+
}
|
|
360
|
+
// generic 패키지 설치 (glpkg)
|
|
361
|
+
if (Object.keys(resolved.generic).length > 0) {
|
|
362
|
+
const genericInstaller = options.useProxy ? 'npm-proxy' : 'glpkg';
|
|
363
|
+
const genericResult = await installPackagesByType(resolved.generic, genericInstaller, installers, snapshot.name, indent, 'packages');
|
|
364
|
+
result.installed.push(...genericResult.installed);
|
|
365
|
+
result.failed.push(...genericResult.failed);
|
|
366
|
+
}
|
|
367
|
+
return { result, installers };
|
|
368
|
+
}
|
|
369
|
+
// ============================================================
|
|
370
|
+
// Legacy mode: 기존 방식 (하위호환)
|
|
371
|
+
// ============================================================
|
|
372
|
+
// New structure: install block
|
|
373
|
+
if (snapshot.install) {
|
|
374
|
+
for (const [installerName, packages] of Object.entries(snapshot.install)) {
|
|
375
|
+
const packageEntries = Object.entries(packages);
|
|
376
|
+
if (packageEntries.length === 0)
|
|
377
|
+
continue;
|
|
378
|
+
// Skit packages: use skit-adapter (lib 우선, CLI fallback)
|
|
379
|
+
if (installerName === 'skit') {
|
|
380
|
+
const skitResult = await installSkitPackages(packages, snapshot.name, indent);
|
|
381
|
+
result.installed.push(...skitResult.installed);
|
|
382
|
+
result.failed.push(...skitResult.failed);
|
|
383
|
+
continue;
|
|
68
384
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
385
|
+
const installerConfig = installers[installerName] || DEFAULT_INSTALLERS[installerName];
|
|
386
|
+
if (!installerConfig) {
|
|
387
|
+
console.log(chalk.red(`${indent}Unknown installer: ${installerName}`));
|
|
388
|
+
result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
const total = packageEntries.length;
|
|
392
|
+
console.log('');
|
|
393
|
+
console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} packages (${installerName}) ===`));
|
|
394
|
+
// Check if installer exists
|
|
395
|
+
const cmdName = installerConfig.check.split(' ')[0];
|
|
396
|
+
if (!commandExists(cmdName)) {
|
|
397
|
+
console.log(chalk.red(`${indent}${installerName} not found.`));
|
|
398
|
+
console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
|
|
399
|
+
result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
// Install packages
|
|
403
|
+
for (let i = 0; i < packageEntries.length; i++) {
|
|
404
|
+
const [name, version] = packageEntries[i];
|
|
405
|
+
const pkgSpec = `${name}@${version}`;
|
|
406
|
+
const progress = `[${i + 1}/${total}]`;
|
|
407
|
+
const command = installerConfig.command.replace('{pkg}', pkgSpec);
|
|
408
|
+
process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
|
|
409
|
+
if (runCommand(command)) {
|
|
410
|
+
console.log(chalk.green(' ✓'));
|
|
411
|
+
result.installed.push(pkgSpec);
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
console.log(chalk.red(' ✗'));
|
|
415
|
+
result.failed.push(pkgSpec);
|
|
416
|
+
}
|
|
72
417
|
}
|
|
73
418
|
}
|
|
74
419
|
}
|
|
75
|
-
//
|
|
76
|
-
if (
|
|
77
|
-
const
|
|
420
|
+
// Legacy: packages (use glpkg)
|
|
421
|
+
if (snapshot.packages && Object.keys(snapshot.packages).length > 0) {
|
|
422
|
+
const packageEntries = Object.entries(snapshot.packages);
|
|
423
|
+
const total = packageEntries.length;
|
|
424
|
+
const installerConfig = installers['glpkg'] || DEFAULT_INSTALLERS['glpkg'];
|
|
78
425
|
console.log('');
|
|
79
|
-
console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
catch {
|
|
86
|
-
console.log(chalk.red(`${indent}skit command not found.`));
|
|
87
|
-
skitAvailable = false;
|
|
88
|
-
result.failedSkits.push(...skitEntries.map(([n, v]) => `${n}@${v}`));
|
|
426
|
+
console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} packages ===`));
|
|
427
|
+
const cmdName = installerConfig.check.split(' ')[0];
|
|
428
|
+
if (!commandExists(cmdName)) {
|
|
429
|
+
console.log(chalk.red(`${indent}glpkg not found.`));
|
|
430
|
+
console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
|
|
431
|
+
result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
|
|
89
432
|
}
|
|
90
|
-
|
|
91
|
-
for (let i = 0; i <
|
|
92
|
-
const [name, version] =
|
|
93
|
-
const
|
|
433
|
+
else {
|
|
434
|
+
for (let i = 0; i < packageEntries.length; i++) {
|
|
435
|
+
const [name, version] = packageEntries[i];
|
|
436
|
+
const pkgSpec = `${name}@${version}`;
|
|
94
437
|
const progress = `[${i + 1}/${total}]`;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
stdio: 'pipe',
|
|
99
|
-
encoding: 'utf-8',
|
|
100
|
-
});
|
|
438
|
+
const command = installerConfig.command.replace('{pkg}', pkgSpec);
|
|
439
|
+
process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
|
|
440
|
+
if (runCommand(command)) {
|
|
101
441
|
console.log(chalk.green(' ✓'));
|
|
102
|
-
result.
|
|
442
|
+
result.installed.push(pkgSpec);
|
|
103
443
|
}
|
|
104
|
-
|
|
444
|
+
else {
|
|
105
445
|
console.log(chalk.red(' ✗'));
|
|
106
|
-
result.
|
|
446
|
+
result.failed.push(pkgSpec);
|
|
107
447
|
}
|
|
108
448
|
}
|
|
109
449
|
}
|
|
110
450
|
}
|
|
111
|
-
|
|
451
|
+
// Legacy: skits (use skit-adapter: lib 우선, CLI fallback)
|
|
452
|
+
if (snapshot.skits && Object.keys(snapshot.skits).length > 0) {
|
|
453
|
+
const skitResult = await installSkitPackages(snapshot.skits, snapshot.name, indent);
|
|
454
|
+
result.installed.push(...skitResult.installed);
|
|
455
|
+
result.failed.push(...skitResult.failed);
|
|
456
|
+
}
|
|
457
|
+
return { result, installers };
|
|
112
458
|
}
|
|
113
459
|
export async function installCommand(name) {
|
|
114
460
|
console.log(chalk.blue.bold(`
|
|
@@ -116,6 +462,34 @@ export async function installCommand(name) {
|
|
|
116
462
|
║ Snapshot Installer ║
|
|
117
463
|
╚══════════════════════════════════════════════════════════════╝
|
|
118
464
|
`));
|
|
465
|
+
// ========== IST Login Check ==========
|
|
466
|
+
const istCredentials = getIstCredentials();
|
|
467
|
+
if (!istCredentials?.userId) {
|
|
468
|
+
console.log(chalk.red('⛔ IST login required'));
|
|
469
|
+
console.log(chalk.gray(' Run: ist auth login'));
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
472
|
+
console.log(chalk.green('✓') + ' IST login verified');
|
|
473
|
+
// ======================================
|
|
474
|
+
// ========== License Check ==========
|
|
475
|
+
const apiUrl = process.env.LICENSE_API_URL || 'https://license-api.sisung-kim1.workers.dev/api';
|
|
476
|
+
const license = createLicenseClient({
|
|
477
|
+
vendorName: VENDOR_NAME,
|
|
478
|
+
apiUrl,
|
|
479
|
+
cliCommand: 'snapshot license',
|
|
480
|
+
storeUrl: STORE_URL,
|
|
481
|
+
});
|
|
482
|
+
const licenseResult = await license.checkLicense();
|
|
483
|
+
if (licenseResult.valid) {
|
|
484
|
+
markLicenseChecked(PACKAGE_NAME);
|
|
485
|
+
console.log(chalk.green('✓') + ' License verified');
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
// License invalid - try anonymous access (public packages will work via registry-proxy)
|
|
489
|
+
console.log(chalk.yellow('⚠') + ' No license - trying anonymous access...');
|
|
490
|
+
console.log(chalk.gray(' (Public packages will install without license)'));
|
|
491
|
+
}
|
|
492
|
+
// ====================================
|
|
119
493
|
// Validate name
|
|
120
494
|
let repoName;
|
|
121
495
|
try {
|
|
@@ -132,27 +506,17 @@ export async function installCommand(name) {
|
|
|
132
506
|
}
|
|
133
507
|
console.log(chalk.gray(`Snapshot: ${name}`));
|
|
134
508
|
console.log(chalk.gray(`Repo: ${repoName}`));
|
|
135
|
-
// Check
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
console.log(chalk.
|
|
140
|
-
process.exit(1);
|
|
141
|
-
}
|
|
142
|
-
console.log(chalk.green('✓') + ' GitLab token found');
|
|
143
|
-
// Check gitlab-install (cross-platform)
|
|
144
|
-
try {
|
|
145
|
-
const whichCmd = process.platform === 'win32' ? 'where gitlab-install' : 'which gitlab-install';
|
|
146
|
-
execSync(whichCmd, { stdio: 'pipe' });
|
|
509
|
+
// Check auth: license key for registry-proxy
|
|
510
|
+
const licenseKey = getLicenseKey();
|
|
511
|
+
const useProxy = true; // Always use registry-proxy
|
|
512
|
+
if (licenseKey) {
|
|
513
|
+
console.log(chalk.green('✓') + ' Using registry-proxy with license key');
|
|
147
514
|
}
|
|
148
|
-
|
|
149
|
-
console.log(chalk.
|
|
150
|
-
console.log(chalk.yellow('Install: npm install -g @glpkg/installer'));
|
|
151
|
-
process.exit(1);
|
|
515
|
+
else {
|
|
516
|
+
console.log(chalk.yellow('⚠') + ' No license key - trying anonymous access');
|
|
152
517
|
}
|
|
153
|
-
console.log(chalk.green('✓') + ' gitlab-install available');
|
|
154
518
|
// Fetch snapshot
|
|
155
|
-
console.log(chalk.gray('Fetching snapshot
|
|
519
|
+
console.log(chalk.gray('Fetching snapshot...'));
|
|
156
520
|
let snapshot;
|
|
157
521
|
try {
|
|
158
522
|
snapshot = await fetchSnapshotFromRepo(name);
|
|
@@ -167,44 +531,203 @@ export async function installCommand(name) {
|
|
|
167
531
|
if (snapshot.description) {
|
|
168
532
|
console.log(chalk.gray(` ${snapshot.description}`));
|
|
169
533
|
}
|
|
534
|
+
// ========== Resolve Dependencies via Registry Proxy API ==========
|
|
535
|
+
let apiResolvedDeps = null;
|
|
536
|
+
if (licenseKey && snapshot.registry && snapshot.install) {
|
|
537
|
+
// Extract scopes and first groupId from snapshot.registry
|
|
538
|
+
const scopes = [];
|
|
539
|
+
let groupId = null;
|
|
540
|
+
for (const [scope, config] of Object.entries(snapshot.registry)) {
|
|
541
|
+
const normalizedScope = scope.startsWith('@') ? scope : `@${scope}`;
|
|
542
|
+
scopes.push(normalizedScope);
|
|
543
|
+
if (config.group && !groupId) {
|
|
544
|
+
groupId = config.group;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
// Extract packages from snapshot.install (all installers)
|
|
548
|
+
const packages = [];
|
|
549
|
+
for (const pkgs of Object.values(snapshot.install)) {
|
|
550
|
+
for (const [name, version] of Object.entries(pkgs)) {
|
|
551
|
+
packages.push(`${name}@${version}`);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (packages.length > 0 && groupId && scopes.length > 0) {
|
|
555
|
+
console.log(chalk.gray('Resolving dependencies via Registry Proxy API...'));
|
|
556
|
+
try {
|
|
557
|
+
apiResolvedDeps = await resolveDepsFromLicenseAPI({
|
|
558
|
+
packages,
|
|
559
|
+
groupId,
|
|
560
|
+
scopes,
|
|
561
|
+
includePeer: true,
|
|
562
|
+
});
|
|
563
|
+
const depCount = Object.keys(apiResolvedDeps.dependencies).length;
|
|
564
|
+
const peerCount = Object.keys(apiResolvedDeps.peerDependencies || {}).length;
|
|
565
|
+
console.log(chalk.green('✓') + ` Resolved ${depCount} dependencies, ${peerCount} peer dependencies`);
|
|
566
|
+
}
|
|
567
|
+
catch (error) {
|
|
568
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
569
|
+
console.log(chalk.yellow('⚠') + ` Registry Proxy API resolve failed: ${errMsg}`);
|
|
570
|
+
console.log(chalk.gray(' Falling back to local dependency resolution...'));
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
// ================================================================
|
|
575
|
+
// ========== Snapshot Access Check ==========
|
|
576
|
+
if (snapshot.access && typeof snapshot.access === 'object' && snapshot.access.type === 'licensed') {
|
|
577
|
+
const productId = snapshot.access.productId;
|
|
578
|
+
const accessResult = await license.checkLicense({ productId });
|
|
579
|
+
if (!accessResult.valid) {
|
|
580
|
+
console.log('');
|
|
581
|
+
console.log(chalk.red('⛔ This snapshot requires a license'));
|
|
582
|
+
console.log(chalk.gray(` Product: ${productId}`));
|
|
583
|
+
console.log(chalk.gray(` Activate: snapshot license activate <KEY>`));
|
|
584
|
+
process.exit(1);
|
|
585
|
+
}
|
|
586
|
+
console.log(chalk.green('✓') + ` License verified for ${productId}`);
|
|
587
|
+
}
|
|
588
|
+
// access가 없거나 'public'이면 그냥 통과
|
|
589
|
+
// ============================================
|
|
590
|
+
// Collect all packages to determine scopes
|
|
591
|
+
const allPackages = {
|
|
592
|
+
...(snapshot.packages || {}),
|
|
593
|
+
};
|
|
594
|
+
if (snapshot.install) {
|
|
595
|
+
for (const pkgs of Object.values(snapshot.install)) {
|
|
596
|
+
Object.assign(allPackages, pkgs);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// Configure .npmrc for proxy (with or without auth token)
|
|
600
|
+
let npmrcBackup = null;
|
|
601
|
+
if (useProxy) {
|
|
602
|
+
const scopes = extractScopes(allPackages);
|
|
603
|
+
if (scopes.length > 0) {
|
|
604
|
+
if (licenseKey) {
|
|
605
|
+
console.log(chalk.gray(`Configuring registry-proxy for scopes: ${scopes.join(', ')}`));
|
|
606
|
+
npmrcBackup = configureNpmrcForProxy(scopes, licenseKey);
|
|
607
|
+
}
|
|
608
|
+
else {
|
|
609
|
+
// Anonymous mode - configure proxy without auth token
|
|
610
|
+
console.log(chalk.gray(`Configuring registry-proxy (anonymous) for scopes: ${scopes.join(', ')}`));
|
|
611
|
+
npmrcBackup = configureNpmrcForProxyAnonymous(scopes);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
// Determine which installers to use
|
|
616
|
+
const effectiveInstallers = { ...DEFAULT_INSTALLERS };
|
|
617
|
+
if (useProxy) {
|
|
618
|
+
// When using proxy, override glpkg with npm-proxy
|
|
619
|
+
effectiveInstallers['glpkg'] = DEFAULT_INSTALLERS['npm-proxy'];
|
|
620
|
+
effectiveInstallers['gitlab-install'] = DEFAULT_INSTALLERS['npm-proxy'];
|
|
621
|
+
}
|
|
170
622
|
// Install (handles extends recursively)
|
|
171
|
-
|
|
623
|
+
let installError = null;
|
|
624
|
+
let result = { installed: [], failed: [] };
|
|
625
|
+
try {
|
|
626
|
+
// API 결과가 있으면 snapshot.install 구성
|
|
627
|
+
let effectiveSnapshot = snapshot;
|
|
628
|
+
if (apiResolvedDeps) {
|
|
629
|
+
// API 결과를 타입별로 분류
|
|
630
|
+
const allDeps = {
|
|
631
|
+
...apiResolvedDeps.dependencies,
|
|
632
|
+
...(apiResolvedDeps.peerDependencies || {}),
|
|
633
|
+
};
|
|
634
|
+
const classified = {
|
|
635
|
+
skit: {},
|
|
636
|
+
npm: {},
|
|
637
|
+
generic: {},
|
|
638
|
+
};
|
|
639
|
+
// 병렬로 타입 판별
|
|
640
|
+
const entries = Object.entries(allDeps);
|
|
641
|
+
const types = await Promise.all(entries.map(([name]) => detectPackageType(name, { skipRegistry: true })));
|
|
642
|
+
for (let i = 0; i < entries.length; i++) {
|
|
643
|
+
const [name, version] = entries[i];
|
|
644
|
+
const type = types[i];
|
|
645
|
+
classified[type][name] = version;
|
|
646
|
+
}
|
|
647
|
+
// snapshot.install 구성
|
|
648
|
+
const newInstall = {};
|
|
649
|
+
if (Object.keys(classified.skit).length > 0) {
|
|
650
|
+
newInstall['skit'] = classified.skit;
|
|
651
|
+
}
|
|
652
|
+
if (Object.keys(classified.npm).length > 0) {
|
|
653
|
+
newInstall[useProxy ? 'npm-proxy' : 'glpkg'] = classified.npm;
|
|
654
|
+
}
|
|
655
|
+
if (Object.keys(classified.generic).length > 0) {
|
|
656
|
+
newInstall[useProxy ? 'npm-proxy' : 'glpkg'] = {
|
|
657
|
+
...(newInstall[useProxy ? 'npm-proxy' : 'glpkg'] || {}),
|
|
658
|
+
...classified.generic,
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
// 기존 snapshot 복사 후 install 오버라이드
|
|
662
|
+
effectiveSnapshot = {
|
|
663
|
+
...snapshot,
|
|
664
|
+
install: newInstall,
|
|
665
|
+
};
|
|
666
|
+
console.log(chalk.gray(` skit: ${Object.keys(classified.skit).length}, npm: ${Object.keys(classified.npm).length}, generic: ${Object.keys(classified.generic).length}`));
|
|
667
|
+
}
|
|
668
|
+
// Auto-detect 모드: snapshot.install이 없으면 자동 판별 (API 실패 시 fallback)
|
|
669
|
+
const autoDetect = !effectiveSnapshot.install;
|
|
670
|
+
const installResult = await installSnapshot(effectiveSnapshot, 0, effectiveInstallers, {
|
|
671
|
+
useProxy,
|
|
672
|
+
autoDetect,
|
|
673
|
+
});
|
|
674
|
+
result = installResult.result;
|
|
675
|
+
}
|
|
676
|
+
catch (err) {
|
|
677
|
+
installError = err instanceof Error ? err : new Error(String(err));
|
|
678
|
+
}
|
|
679
|
+
finally {
|
|
680
|
+
// Restore .npmrc
|
|
681
|
+
if (npmrcBackup) {
|
|
682
|
+
restoreNpmrc(npmrcBackup);
|
|
683
|
+
console.log(chalk.gray('Restored .npmrc'));
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
if (installError) {
|
|
687
|
+
console.log(chalk.red(`Error during installation: ${installError.message}`));
|
|
688
|
+
process.exit(1);
|
|
689
|
+
}
|
|
172
690
|
// Summary
|
|
173
691
|
console.log('');
|
|
174
692
|
console.log(chalk.yellow('═══════════════════════════════════'));
|
|
175
693
|
console.log(chalk.yellow(' Final Summary '));
|
|
176
694
|
console.log(chalk.yellow('═══════════════════════════════════'));
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
if (
|
|
180
|
-
console.log(`Packages: ${chalk.green(result.packages.length)}/${totalPkgs}`);
|
|
181
|
-
}
|
|
182
|
-
if (totalSkits > 0) {
|
|
183
|
-
console.log(`Skits: ${chalk.green(result.skits.length)}/${totalSkits}`);
|
|
184
|
-
}
|
|
185
|
-
if (result.failedPackages.length > 0 || result.failedSkits.length > 0) {
|
|
695
|
+
const total = result.installed.length + result.failed.length;
|
|
696
|
+
console.log(`Installed: ${chalk.green(result.installed.length)}/${total}`);
|
|
697
|
+
if (result.failed.length > 0) {
|
|
186
698
|
console.log('');
|
|
187
699
|
console.log(chalk.red('Failed:'));
|
|
188
|
-
for (const pkg of result.
|
|
700
|
+
for (const pkg of result.failed) {
|
|
189
701
|
console.log(chalk.red(` ✗ ${pkg}`));
|
|
190
702
|
}
|
|
191
|
-
for (const skit of result.failedSkits) {
|
|
192
|
-
console.log(chalk.red(` ✗ ${skit}`));
|
|
193
|
-
}
|
|
194
703
|
}
|
|
195
704
|
// Save
|
|
196
|
-
if (result.
|
|
705
|
+
if (result.installed.length > 0) {
|
|
197
706
|
saveCurrentSnapshot({
|
|
198
707
|
name: snapshot.name,
|
|
199
708
|
version: snapshot.version,
|
|
200
709
|
installedAt: new Date().toISOString(),
|
|
201
|
-
packages: result.
|
|
202
|
-
skits: result.skits,
|
|
710
|
+
packages: result.installed,
|
|
203
711
|
});
|
|
204
712
|
console.log('');
|
|
205
713
|
console.log(chalk.green('✓') + ' Snapshot info saved');
|
|
206
714
|
}
|
|
207
|
-
|
|
715
|
+
// Send telemetry (fire and forget)
|
|
716
|
+
sendInstallTelemetry({
|
|
717
|
+
package: snapshot.name,
|
|
718
|
+
version: snapshot.version,
|
|
719
|
+
success: result.failed.length === 0,
|
|
720
|
+
installedCount: result.installed.length,
|
|
721
|
+
failedCount: result.failed.length,
|
|
722
|
+
error: result.failed.length > 0 ? `Failed: ${result.failed.join(', ')}` : undefined,
|
|
723
|
+
userId: istCredentials?.userId,
|
|
724
|
+
userEmail: istCredentials?.email,
|
|
725
|
+
licenseKey: licenseKey ? licenseKey.substring(0, 9) : undefined,
|
|
726
|
+
platform: platform(),
|
|
727
|
+
arch: arch(),
|
|
728
|
+
cliVersion: CLI_VERSION,
|
|
729
|
+
});
|
|
730
|
+
if (result.failed.length > 0) {
|
|
208
731
|
process.exit(1);
|
|
209
732
|
}
|
|
210
733
|
}
|