Skip to content

Commit 92dfff7

Browse files
committed
Enhance extension handling by supporting both unscoped extension-* and scoped @namespace/extension-* packages. Update documentation and tests to reflect these changes, ensuring clarity in extension management and side-effect imports.
1 parent 8b7c94b commit 92dfff7

6 files changed

Lines changed: 25 additions & 10 deletions

File tree

packages/app-e2e/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Minimal Docks shell for Playwright only (not the public demo app in `packages/ap
2121
Entry is [src/main.ts](./src/main.ts): `registerApp` plus auxiliary/toolbar contributions as specs require.
2222

2323
- **Extensions:** list them in `AppDefinition.extensions` (e.g. `@eclipse-docks/extension-ai-system`, `@eclipse-docks/extension-monaco-editor` for workspace file editing in E2E).
24-
- **Side-effect imports:** [vite.config.ts](./vite.config.ts) uses `resolveDepVersionsPlugin()` (automatic `@eclipse-docks/extension-*` side-effect imports are on by default). [src/main.ts](./src/main.ts) additionally imports the in-repo [`extension-ai-system/src/ai-system-extension.ts`](../../packages/extension-ai-system/src/ai-system-extension.ts) so that registration runs after the package entry and **before** the rest of `main.ts` adds E2E auxiliary tabs — order **`[aiview, …e2e tabs]`** — avoiding `wa-tab-group` “first tab” fallbacks being mistaken for successful `coupledEditors` coupling.
24+
- **Side-effect imports:** [vite.config.ts](./vite.config.ts) uses `resolveDepVersionsPlugin()` (automatic `extension-*` / `@scope/extension-*` side-effect imports are on by default). [src/main.ts](./src/main.ts) additionally imports the in-repo [`extension-ai-system/src/ai-system-extension.ts`](../../packages/extension-ai-system/src/ai-system-extension.ts) so that registration runs after the package entry and **before** the rest of `main.ts` adds E2E auxiliary tabs — order **`[aiview, …e2e tabs]`** — avoiding `wa-tab-group` “first tab” fallbacks being mistaken for successful `coupledEditors` coupling.
2525

2626
### `coupledEditors` example
2727

packages/core/src/vite-plugin-resolve-deps.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ export const VIRTUAL_EXTENSION_IMPORTS = 'virtual:eclipse-docks-extension-import
9898

9999
const RESOLVED_VIRTUAL_EXTENSION_IMPORTS = `\0${VIRTUAL_EXTENSION_IMPORTS}`;
100100

101-
const DEFAULT_EXTENSION_PATTERN = /^@eclipse-docks\/extension-/;
101+
/** Unscoped `extension-*` or scoped `@namespace/extension-*` (any npm scope). */
102+
const DEFAULT_EXTENSION_PATTERN = /^(?:@[^/]+\/)?extension-/;
102103

103-
const DEFAULT_PRIORITY_FIRST = ['@eclipse-docks/extension-pwa'];
104+
const DEFAULT_PRIORITY_FIRST = ['@eclipse-docks/extension-pwa', 'extension-pwa'];
104105

105106
/** Matches Vite’s default app entry in index.html. */
106107
const MAIN_TS_SCRIPT_RE =
@@ -119,8 +120,8 @@ export interface ExtensionSideEffectsOptions {
119120
*/
120121
priorityFirst?: string[];
121122
/**
122-
* Which direct `dependencies` keys qualify as Eclipse Docks extensions.
123-
* @default /^@eclipse-docks\/extension-/
123+
* Which direct `dependencies` keys qualify as Docks-style extensions (`extension-*`, with an optional npm scope).
124+
* @default /^(?:@[^/]+\/)?extension-/
124125
*/
125126
packageNamePattern?: RegExp;
126127
}

packages/core/test/units/vite-plugin-resolve-deps.test.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ const minimalCtx = {
1616

1717
const defaultSideEffects = {
1818
exclude: new Set<string>(),
19-
priorityFirst: ['@eclipse-docks/extension-pwa'],
20-
pattern: /^@eclipse-docks\/extension-/,
19+
priorityFirst: ['@eclipse-docks/extension-pwa', 'extension-pwa'],
20+
pattern: /^(?:@[^/]+\/)?extension-/,
2121
};
2222

2323
describe('listExtensionSideEffectPackages', () => {
@@ -59,6 +59,20 @@ describe('listExtensionSideEffectPackages', () => {
5959
}),
6060
).toEqual(['@eclipse-docks/extension-b', '@eclipse-docks/extension-a']);
6161
});
62+
63+
it('matches unscoped extension-* and sorts with scoped packages', () => {
64+
const deps = {
65+
'extension-zebra': '*',
66+
'@eclipse-docks/extension-a': '*',
67+
'extension-mine': '*',
68+
'not-extension': '*',
69+
};
70+
expect(listExtensionSideEffectPackages(deps, defaultSideEffects)).toEqual([
71+
'@eclipse-docks/extension-a',
72+
'extension-mine',
73+
'extension-zebra',
74+
]);
75+
});
6276
});
6377

6478
function runConfigResolved(plugin: Plugin, root: string) {

packages/create-app/template/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Then open the URL shown in the terminal (e.g. https://localhost:5173/).
2323

2424
## Extensions
2525

26-
Add `@eclipse-docks/extension-*` packages to `packages/app/package.json`, then list them in `packages/app/src/main.ts` (`registerApp({ extensions: [...] })`). Vite loads their side-effect entry points automatically via `resolveDepVersionsPlugin()` in `vite.config.ts` (no separate `extensions.ts` file). Pass `extensionSideEffects: false` if you need to disable that.
26+
Add packages named `extension-*` or `@your-scope/extension-*` to `packages/app/package.json`, then list them in `packages/app/src/main.ts` (`registerApp({ extensions: [...] })`). Vite loads their side-effect entry points automatically via `resolveDepVersionsPlugin()` in `vite.config.ts` (no separate `extensions.ts` file). Pass `extensionSideEffects: false` if you need to disable that.
2727

2828
## PWA
2929

packages/create-app/template/packages/app/src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { appLoaderService, contributionRegistry, type HTMLContribution, TOOLBAR_MAIN } from '@eclipse-docks/core';
22

3-
/** Which extensions the shell offers; keep in sync with `@eclipse-docks/extension-*` entries in package.json (those are auto side-effect-imported in vite.config.ts). */
3+
/** Which extensions the shell offers; keep in sync with `extension-*` / `@scope/extension-*` entries in package.json (auto side-effect-imported via resolveDepVersionsPlugin). */
44
contributionRegistry.registerContribution(TOOLBAR_MAIN, {
55
label: 'Brand',
66
slot: 'start',

packages/create-app/template/packages/app/vite.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default defineConfig({
2222
},
2323
plugins: [
2424
appSplashPlugin(),
25-
/** Side-effect-imports every `@eclipse-docks/extension-*` direct dependency from package.json (virtual module before main). */
25+
/** Side-effect-imports every `extension-*` / `@scope/extension-*` direct dependency from package.json (virtual module before main). */
2626
resolveDepVersionsPlugin(),
2727
localAliasesPlugin({
2828
useSrcInDev: true,

0 commit comments

Comments
 (0)