mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-11-09 20:07:43 +08:00
refactor(plugins): drop catalog listedByDefault after Computer Use leaves the on-demand catalog
No on-demand catalog entry declares listedByDefault once Computer Use ships with the installation, so the generator field, catalog type, and plugin-manager propagation lose their only consumer. Also correct the packed-worker comment and the Computer Use README wording. Refs #7514
This commit is contained in:
@@ -716,8 +716,7 @@ async function toggleOptionalBundles(page: Page): Promise<void> {
|
||||
enable: 'failed', disable: 'applied', error: { code: 'unsupported-platform' },
|
||||
changed: 0, inactive: [], restored: true,
|
||||
})
|
||||
// The packed worker composition excludes LiveShare from its generic toggles; plugin-manager.e2e.ts
|
||||
// covers that bundle's enable/disable path in the ordinary Web scaffold.
|
||||
// Computer Use refuses enablement on this non-macOS worker Host, as asserted above, so the generic check omits it.
|
||||
const supported = result.toggles.filter(toggle => toggle.name !== '@deepseek-ai/dsh-cua-bundle')
|
||||
expect(supported.filter(toggle => toggle.enable !== 'applied' || toggle.disable !== 'applied')
|
||||
.map(({ name, enable, disable }) => ({ name, enable, disable }))).toEqual([])
|
||||
|
||||
@@ -522,7 +522,6 @@ export class PluginManager extends TypertRemoteService {
|
||||
catch (error) { platformError = managementError(error) }
|
||||
const error = platformError ?? targetError ?? (enabled ? { code: 'not-bundle' as const } : undefined)
|
||||
bundles.push({ name, official, availability: 'missing', ...catalogMeta, ...target, enabled, installed, optional,
|
||||
...offered.listedByDefault === undefined ? {} : { listedByDefault: offered.listedByDefault },
|
||||
...platformError?.code === 'unsupported-platform' ? { listedByDefault: false } : {},
|
||||
removable: enabled, rows: [], overrides: [],
|
||||
...error === undefined ? {} : { error } })
|
||||
|
||||
@@ -1811,7 +1811,6 @@ it('lists absent Official entries offline without resolving their packages or co
|
||||
expect(bundles.filter(bundle => bundle.name === entry.packageName)).toMatchObject([{
|
||||
name: entry.packageName, official: true, availability: 'missing', enabled: false, installed: false, optional: false,
|
||||
removable: false, updatable: false, rows: [], overrides: [], meta: entry.meta,
|
||||
...entry.listedByDefault === undefined ? {} : { listedByDefault: entry.listedByDefault },
|
||||
...entry.platforms !== undefined && !entry.platforms.includes(process.platform)
|
||||
? { listedByDefault: false, error: { code: 'unsupported-platform' } } : {},
|
||||
installTarget: { spec: `${entry.packageName}@${getDshRuntimeVersion()}`, version: getDshRuntimeVersion() },
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
en: d152484eb41ac6b4
|
||||
zh: 09388d293f9be9cb
|
||||
/deepseek-ai-dsh-client-ui-plugin-manager/use-this-package:
|
||||
en: 07da57fb0a0cb10e
|
||||
zh: c743fd96317bec22
|
||||
en: 5a06147f2a79eccf
|
||||
zh: 6ca5899680e3cc6f
|
||||
/deepseek-ai-dsh-client-ui-plugin-manager/use-this-package/installing-a-bundle:
|
||||
en: 45f62bdddae3f8c0
|
||||
zh: 4be303f322a5553a
|
||||
|
||||
@@ -39,7 +39,7 @@ Installed bundles and their plugin rows display their own title and description
|
||||
|
||||
A bundle's page shows the bundle's detail document first among its sections, without a heading of its own: the bundle's long description in the current UI language, as Markdown with images. It is the Markdown file that `meta.detail` in the bundle's `locale/<language>.json` names, otherwise the bundle's README, read by [`pluginManager.readBundleDetail`](../../boot/plugin-manager/README.md#bundle-detail-documents) in the [document order of `dsh-plugin-detail`](../../util/plugin-detail/README.md#document-order); the repository a bundle declares is not read. An installed bundle's document comes from its own files without network access, and an on-demand Official bundle's from the npm file CDNs at its offered version. While the document loads the section shows three skeleton lines; a bundle without a document shows no section; a failed read names its reason with **Retry**. Raw HTML is omitted, relative images load from the Host beside the document, relative links stay text, and a document taller than the section's height limit scrolls inside it. A bundle whose files are not installed, such as an on-demand Official bundle, is read from the npm file CDNs: its read first asks the Host's registry comparison and, when npmmirror answered fastest, reads it and its images from npmmirror first. An installed bundle's read does not wait for the comparison. Any profile change and a connection reset read shown documents again.
|
||||
|
||||
On-demand Official cards follow package discovery visibility and are available offline before installation. In Add plugin, a bare Official package name uses the Host’s matching-version or source-checkout target, retains the selected registry, and offers Enable now after installation. Turning one On opens the existing install progress dialog, installs the [target offered by the running Host](../../boot/plugin-manager/README.md#use-this-package), and selects its layer. The same registry fallback, cancellation, and script-approval controls apply. Turning Off keeps the dependency installed; Remove is separate. A different version or development link source offers **Update**; details show current and offered sources and versions. An update removes the installed package and installs the offered one with the same selection, reporting whether a restart is required; when the installation fails after the removal, the package stays uninstalled. Missing or unreadable packages keep their recorded dependency source alongside the diagnostic. An enabled bundle can still be switched Off when its checkout target is unavailable.
|
||||
On-demand Official cards are visible offline before installation. In Add plugin, a bare Official package name uses the Host’s matching-version or source-checkout target, retains the selected registry, and offers Enable now after installation. Turning one On opens the existing install progress dialog, installs the [target offered by the running Host](../../boot/plugin-manager/README.md#use-this-package), and selects its layer. The same registry fallback, cancellation, and script-approval controls apply. Turning Off keeps the dependency installed; Remove is separate. A different version or development link source offers **Update**; details show current and offered sources and versions. An update removes the installed package and installs the offered one with the same selection, reporting whether a restart is required; when the installation fails after the removal, the package stays uninstalled. Missing or unreadable packages keep their recorded dependency source alongside the diagnostic. An enabled bundle can still be switched Off when its checkout target is unavailable.
|
||||
|
||||
The first list read shows a short group-heading placeholder and four skeleton cards, using the real cards' row, icon, and text-line spacing, with the action area left blank. They use the same opacity pulse as Session search and remain static with reduced motion. The accessible loading label and read timing are unchanged; refreshes retain the existing list, and installation and component-loading indicators keep their own states.
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ kind: "package-reference"
|
||||
|
||||
组合包页面在其各部分中首先显示该组合包的详细介绍文档,不带单独的标题:以当前界面语言、带图片的 Markdown 显示该组合包的详细介绍。该文档是组合包 `locale/<language>.json` 中 `meta.detail` 指定的 Markdown 文件,没有时为组合包的 README,由 [`pluginManager.readBundleDetail`](../../boot/plugin-manager/README.zh.md#bundle-detail-documents) 按 [`dsh-plugin-detail` 的文档顺序](../../util/plugin-detail/README.zh.md#document-order)读取;不读取组合包声明的仓库。已安装组合包的文档来自其自身文件,不访问网络;按需官方组合包的文档按其提供的版本从 npm 文件 CDN 读取。文档加载期间,该部分显示三行骨架屏;没有文档的组合包不显示该部分;读取失败时说明原因,并提供**重试**。原始 HTML 会被省略,相对路径的图片从 Host 上该文档旁的位置加载,相对链接保持为文本,文档高度超过该部分的高度上限时在该部分内滚动。文件未安装的组合包(例如按需官方组合包)从 npm 文件 CDN 读取:读取前先询问 Host 的注册表比较,npmmirror 响应最快时,先从 npmmirror 读取该文档及其图片。已安装组合包的读取不等待该比较。任何 profile 变化和连接重置都会重新读取已显示的文档。
|
||||
|
||||
官方按需卡片遵循包的显示声明,在安装前即可离线读取。在“添加插件”中输入不带版本的官方包名时,使用 Host 提供的匹配版本或源码 checkout 目标,保留用户选择的安装源,并在安装后提供“立即启用”。开启会打开已有的安装进度对话框,安装[当前 Host 提供的目标](../../boot/plugin-manager/README.zh.md#use-this-package)并选择配置层。安装源回退、取消和脚本审批继续使用同一组控件。关闭保留依赖;移除是独立操作。版本或开发链接来源不同会提供**更新**;详情显示当前及所提供的来源和版本。更新先删除已安装的包,再以相同的选择状态安装所提供的包,并报告是否需要重启;删除之后安装失败时,该包保持未安装。文件缺失或不可读的包在诊断旁保留记录的依赖来源。已启用的 bundle 在 checkout 目标不可用时仍可关闭。
|
||||
官方按需卡片在安装前即可离线显示。在“添加插件”中输入不带版本的官方包名时,使用 Host 提供的匹配版本或源码 checkout 目标,保留用户选择的安装源,并在安装后提供“立即启用”。开启会打开已有的安装进度对话框,安装[当前 Host 提供的目标](../../boot/plugin-manager/README.zh.md#use-this-package)并选择配置层。安装源回退、取消和脚本审批继续使用同一组控件。关闭保留依赖;移除是独立操作。版本或开发链接来源不同会提供**更新**;详情显示当前及所提供的来源和版本。更新先删除已安装的包,再以相同的选择状态安装所提供的包,并报告是否需要重启;删除之后安装失败时,该包保持未安装。文件缺失或不可读的包在诊断旁保留记录的依赖来源。已启用的 bundle 在 checkout 目标不可用时仍可关闭。
|
||||
|
||||
首次读取列表时,页面显示一条较短的分组标题占位和四行骨架卡片,沿用真实卡片的行、图标和文字间距,操作区域留白。骨架使用与 Session 搜索相同的透明度呼吸动效,在减少动态效果模式下保持静止。无障碍加载文案和读取时机不变;刷新时保留已有列表,安装及组件加载仍使用各自的状态提示。
|
||||
|
||||
|
||||
@@ -1979,10 +1979,10 @@ const CATALOG: BundleInfo = {
|
||||
installTarget: { spec: '@deepseek-ai/dsh-subagent-codex@2.0.0', version: '2.0.0' },
|
||||
}
|
||||
|
||||
it.each(['registry', 'source'] as const)('installs a typed default-hidden Official name using its %s target', async (mode) => {
|
||||
const name = '@deepseek-ai/dsh-cua-bundle'
|
||||
const spec = mode === 'source' ? 'link:/workspace/cua-bundle' : `${name}@2.0.0`
|
||||
const entry = { ...CATALOG, name, listedByDefault: false, installTarget: { spec, version: '2.0.0' } }
|
||||
it.each(['registry', 'source'] as const)('installs a typed Official catalog name using its %s target', async (mode) => {
|
||||
const name = CATALOG.name
|
||||
const spec = mode === 'source' ? 'link:/workspace/subagent-codex' : `${name}@2.0.0`
|
||||
const entry = { ...CATALOG, installTarget: { spec, version: '2.0.0' } }
|
||||
const { controller, plugins, face, state } = bench({ listBundles: vi.fn().mockResolvedValue(ok([entry])) })
|
||||
await controller.load()
|
||||
face.openInstall()
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
en: b563e4ec4727d0de
|
||||
zh: d0228da978238e05
|
||||
/deepseek-ai-dsh-cua-bundle/use-this-package:
|
||||
en: 1c54bec900429732
|
||||
zh: c062f2515dc3e41a
|
||||
en: 5c025a58990bb2eb
|
||||
zh: c3d1280ccbdfe214
|
||||
/deepseek-ai-dsh-cua-bundle/understand-the-implementation:
|
||||
en: b1011db52cfc17cd
|
||||
zh: 6fa8798fedc5c0b6
|
||||
@@ -39,8 +39,8 @@
|
||||
en: 417c40acd93df532
|
||||
zh: 69cc5cf7140c75a9
|
||||
/deepseek-ai-dsh-cua-bundle/known-limitations-and-deferred-work:
|
||||
en: f2362542e43a1946
|
||||
zh: c45ca90c66ce6a48
|
||||
en: 559776e398bb7c47
|
||||
zh: 27adfd2cacad1ee6
|
||||
/deepseek-ai-dsh-cua-bundle/known-limitations-and-deferred-work/dev-note:
|
||||
en: 0a1253c6f7b5e8b9
|
||||
zh: ce96645b3e75874e
|
||||
|
||||
@@ -24,7 +24,7 @@ Enable macOS Computer Use from Plugins for existing and new PTC sessions. Window
|
||||
<a id="use-this-package"></a>
|
||||
## Use this package
|
||||
|
||||
On macOS, open **Plugins → More** and switch on Computer use in the Experimental plugins list. The bundle ships with DSH and updates with it, so enabling it downloads nothing. Published packages contain the signed and notarized helper; users need no compiler. Source Web and development Desktop prepare an ad-hoc helper when enabled. Open Computer Use details, choose PTC if needed, and grant Accessibility and Screen Recording to `DSH Computer Use.app`. An enabled bundle also appears in the main plugin list; switching it off returns it to the Experimental plugins list only. For source Web, run these commands from the repository root:
|
||||
On macOS, open **Plugins → More** and switch on **Computer use** in the Experimental plugins list. The bundle ships with DSH and updates with it, so enabling it downloads nothing. Published packages contain the signed and notarized helper; users need no compiler. Source Web and development Desktop prepare an ad-hoc helper when enabled. Open its details, choose PTC if needed, and grant Accessibility and Screen Recording to `DSH Computer Use.app`. An enabled bundle also appears in the main plugin list; switching it off returns it to the Experimental plugins list only. For source Web, run these commands from the repository root:
|
||||
|
||||
```sh
|
||||
pnpm run build
|
||||
@@ -86,7 +86,6 @@ CUA activation and removal change the PTC SDK and system guidance; subsequent re
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- System permissions require the user’s approval in macOS; enabling the bundle does not grant them.
|
||||
- A profile that installed the bundle from a registry keeps that dependency. The installation’s copy loads instead, and the plugin page offers no removal for the redundant dependency.
|
||||
- PTC execution is shared by the profile and is configured independently. A Host without HMR applies saved changes at restart.
|
||||
|
||||
<a id="dev-note"></a>
|
||||
|
||||
@@ -24,7 +24,7 @@ kind: "package-bundle"
|
||||
<a id="use-this-package"></a>
|
||||
## 使用本包
|
||||
|
||||
在 macOS 上打开“插件 → 更多”,在实验性插件列表中开启 Computer Use。组合包随 DSH 提供并随之升级,开启时无需下载。发布包包含已签名和公证的 helper,用户无需编译工具。源码 Web 和开发 Desktop 在开启时准备临时签名的 helper。打开 Computer Use 详情,按需设置 PTC,并为 `DSH Computer Use.app` 授予辅助功能和屏幕录制权限。开启后组合包也会出现在插件主列表中,关闭后只留在实验性插件列表。源码 Web 在仓库根目录运行以下命令:
|
||||
在 macOS 上打开“插件 → 更多”,在实验性插件列表中开启 Computer Use。组合包随 DSH 提供并随之升级,开启时无需下载。发布包包含已签名和公证的 helper,用户无需编译工具。源码 Web 和开发 Desktop 在开启时准备临时签名的 helper。打开它的详情,按需设置 PTC,并为 `DSH Computer Use.app` 授予辅助功能和屏幕录制权限。开启后组合包也会出现在插件主列表中,关闭后只留在实验性插件列表。源码 Web 在仓库根目录运行以下命令:
|
||||
|
||||
```sh
|
||||
pnpm run build
|
||||
@@ -86,7 +86,6 @@ CUA 生效和卸载会改变 PTC SDK 与系统指引,后续请求使用更新
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- 系统权限需用户在 macOS 中确认,开启组合包不会自动授予权限。
|
||||
- 从注册表安装过组合包的 profile 会保留该依赖。加载的是安装目录中的副本,插件页不提供移除这条多余依赖的操作。
|
||||
- PTC 执行方式由 profile 共享,需单独配置。未启用 HMR 的 Host 在重启时应用已保存的变更。
|
||||
|
||||
<a id="dev-note"></a>
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
en: 27c22abdfff69a41
|
||||
zh: e60d828cdb75c263
|
||||
/deepseek-ai-dsh-official-bundles/use-this-package/on-demand-bundles:
|
||||
en: ba4f412474854ba1
|
||||
zh: 17dae8155c013367
|
||||
en: 6ba39ba5bfefec79
|
||||
zh: 788a71b5b6f75404
|
||||
/deepseek-ai-dsh-official-bundles/understand-the-implementation:
|
||||
en: 3fb2b58db529d8be
|
||||
zh: 46064459a23d458d
|
||||
|
||||
@@ -41,7 +41,7 @@ Edit this package when the installation's bundle selection or the plugin manager
|
||||
|
||||
### On-demand bundles
|
||||
|
||||
`ON_DEMAND_BUNDLES` names the public Official packages installed only on request. `OFFICIAL_ON_DEMAND_CATALOG` embeds their package-owned localized metadata, icons, and optional `dsh.bundle.platforms` declarations for offline discovery and Host platform checks before installation; `pnpm gen-official-bundle-catalog` explicitly updates generated content, and `verify-official-bundle-catalog` checks resource completeness and freshness; builds consume the committed catalog without importing provider code. The catalog contains no install target: the plugin manager derives it from the running version and installation and uses the ordinary bundle installer. The [product-use check](../../../scripts/verify-product-use.ts) composes shipped and on-demand selections against Web without executing providers. The catalog also preserves `listedByDefault` so a default-hidden bundle stays hidden until explicitly installed or enabled.
|
||||
`ON_DEMAND_BUNDLES` names the public Official packages installed only on request. `OFFICIAL_ON_DEMAND_CATALOG` embeds their package-owned localized metadata, icons, and optional `dsh.bundle.platforms` declarations for offline discovery and Host platform checks before installation; `pnpm gen-official-bundle-catalog` explicitly updates generated content, and `verify-official-bundle-catalog` checks resource completeness and freshness; builds consume the committed catalog without importing provider code. The catalog contains no install target: the plugin manager derives it from the running version and installation and uses the ordinary bundle installer. The [product-use check](../../../scripts/verify-product-use.ts) composes shipped and on-demand selections against Web without executing providers.
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ kind: "package-library"
|
||||
|
||||
### 按需组合包
|
||||
|
||||
`ON_DEMAND_BUNDLES` 列出只在请求时安装的官方公开包。`OFFICIAL_ON_DEMAND_CATALOG` 内嵌这些包自己持有的本地化元信息、图标和可选的 `dsh.bundle.platforms` 声明,用于离线发现与安装前的 Host 平台检查;`pnpm gen-official-bundle-catalog` 显式更新生成内容,`verify-official-bundle-catalog` 检查资源完整性与时效;构建使用已提交的目录,不导入提供方代码。目录不包含安装目标:插件管理器根据运行中的版本和安装推导目标,并使用普通的组合包安装器。[产品使用检查](../../../scripts/verify-product-use.ts)针对 Web 组合随附选择和按需选择,不执行提供方。 目录也保留 `listedByDefault`,使默认隐藏的组合包在用户显式安装或启用前保持隐藏。
|
||||
`ON_DEMAND_BUNDLES` 列出只在请求时安装的官方公开包。`OFFICIAL_ON_DEMAND_CATALOG` 内嵌这些包自己持有的本地化元信息、图标和可选的 `dsh.bundle.platforms` 声明,用于离线发现与安装前的 Host 平台检查;`pnpm gen-official-bundle-catalog` 显式更新生成内容,`verify-official-bundle-catalog` 检查资源完整性与时效;构建使用已提交的目录,不导入提供方代码。目录不包含安装目标:插件管理器根据运行中的版本和安装推导目标,并使用普通的组合包安装器。[产品使用检查](../../../scripts/verify-product-use.ts)针对 Web 组合随附选择和按需选择,不执行提供方。
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -17,8 +17,6 @@ export interface OfficialBundleCatalogEntry {
|
||||
readonly packageName: string
|
||||
/** Package-owned Host platform declaration, available before installation. */
|
||||
readonly platforms?: DshBundleManifest['platforms']
|
||||
/** Package-owned discovery visibility before installation. */
|
||||
readonly listedByDefault?: boolean
|
||||
/** Package-owned localized text and a self-contained icon, embedded without provider code. */
|
||||
readonly meta: Required<Pick<PluginLocalizedMeta, 'title' | 'description' | 'icon'>>
|
||||
}
|
||||
|
||||
@@ -81,17 +81,6 @@ describe('Official bundle catalog generation', () => {
|
||||
expect(() => { syncOfficialBundleCatalog(root, true) }).toThrow('is stale')
|
||||
})
|
||||
|
||||
it('preserves default-hidden discovery before installation', () => {
|
||||
const root = fixture()
|
||||
const name = ON_DEMAND_BUNDLES[0]!
|
||||
updateManifest(root, name, { dsh: { bundle: { patch: './cordis.patch.yml', listedByDefault: false } } })
|
||||
expect(generateOfficialBundleCatalog(root)[0]?.listedByDefault).toBe(false)
|
||||
syncOfficialBundleCatalog(root, false)
|
||||
expect(readFileSync(join(root, output), 'utf8')).toContain('listedByDefault: false')
|
||||
updateManifest(root, name, { dsh: { bundle: { patch: './cordis.patch.yml', listedByDefault: 'hidden' } } })
|
||||
expect(() => generateOfficialBundleCatalog(root)).toThrow('listedByDefault must be a boolean')
|
||||
})
|
||||
|
||||
it.each([[], ['macos'], 'darwin'].map(platforms => ({ platforms })))('rejects invalid package platform metadata $platforms', ({ platforms }) => {
|
||||
const root = fixture()
|
||||
updateManifest(root, ON_DEMAND_BUNDLES[0]!, { dsh: { bundle: { patch: './cordis.patch.yml', platforms } } })
|
||||
|
||||
@@ -22,7 +22,7 @@ const OUTPUT = 'packages/util/official-bundles/src/catalog.generated.ts'
|
||||
*/
|
||||
export function generateOfficialBundleCatalog(root: string, names: readonly string[] = ON_DEMAND_BUNDLES): OfficialBundleCatalogEntry[] {
|
||||
if (names.length === 0 || new Set(names).size !== names.length) throw new Error('Official on-demand catalog must contain distinct package names')
|
||||
const manifests = new Map<string, { path: string; private: boolean; bundle: boolean; platforms?: DshBundleManifest['platforms']; listedByDefault?: boolean; runtime: string[] }>()
|
||||
const manifests = new Map<string, { path: string; private: boolean; bundle: boolean; platforms?: DshBundleManifest['platforms']; runtime: string[] }>()
|
||||
for (const path of globSync(['packages/*/*/package.json', 'apps/*/package.json', 'vendor/*/package.json'], { cwd: root }).map(path => path.replaceAll('\\', '/')).sort()) {
|
||||
const manifest = JSON.parse(readFileSync(resolve(root, path), 'utf8')) as {
|
||||
name: string
|
||||
@@ -30,15 +30,12 @@ export function generateOfficialBundleCatalog(root: string, names: readonly stri
|
||||
dependencies?: Record<string, string>
|
||||
optionalDependencies?: Record<string, string>
|
||||
peerDependencies?: Record<string, string>
|
||||
dsh?: { bundle?: { patch?: unknown; platforms?: DshBundleManifest['platforms']; listedByDefault?: boolean } }
|
||||
dsh?: { bundle?: { patch?: unknown; platforms?: DshBundleManifest['platforms'] } }
|
||||
}
|
||||
if (manifests.has(manifest.name)) throw new Error(`duplicate workspace package ${manifest.name}`)
|
||||
const listedByDefault = manifest.dsh?.bundle?.listedByDefault
|
||||
if (listedByDefault !== undefined && typeof listedByDefault !== 'boolean') throw new Error(`${manifest.name}: dsh.bundle.listedByDefault must be a boolean`)
|
||||
const runtime = ['dependencies', 'optionalDependencies', 'peerDependencies'] as const
|
||||
manifests.set(manifest.name, { path, private: manifest.private === true, bundle: manifest.dsh?.bundle?.patch !== undefined,
|
||||
...manifest.dsh?.bundle?.platforms === undefined ? {} : { platforms: manifest.dsh.bundle.platforms },
|
||||
...listedByDefault === undefined ? {} : { listedByDefault },
|
||||
runtime: runtime.flatMap(section => Object.keys(manifest[section] ?? {})) })
|
||||
}
|
||||
const visited = new Set<string>()
|
||||
@@ -80,9 +77,7 @@ export function generateOfficialBundleCatalog(root: string, names: readonly stri
|
||||
}
|
||||
}
|
||||
}
|
||||
return { packageName,
|
||||
...entry.listedByDefault === undefined ? {} : { listedByDefault: entry.listedByDefault },
|
||||
...entry.platforms === undefined ? {} : { platforms: entry.platforms },
|
||||
return { packageName, ...entry.platforms === undefined ? {} : { platforms: entry.platforms },
|
||||
meta: { title: meta.title, description: meta.description, icon: meta.icon } }
|
||||
})
|
||||
}
|
||||
@@ -100,7 +95,6 @@ export function renderOfficialBundleCatalog(entries: readonly OfficialBundleCata
|
||||
+ entries.map(entry => ' {\n'
|
||||
+ ` packageName: ${quote(entry.packageName)},\n`
|
||||
+ (entry.platforms === undefined ? '' : ` platforms: [${entry.platforms.map(quote).join(', ')}],\n`)
|
||||
+ (entry.listedByDefault === undefined ? '' : ` listedByDefault: ${entry.listedByDefault},\n`)
|
||||
+ ' meta: {\n'
|
||||
+ ` title: ${localized(entry.meta.title)},\n`
|
||||
+ ` description: ${localized(entry.meta.description)},\n`
|
||||
|
||||
Reference in New Issue
Block a user