@eclipse-docks/core 0.7.87 → 0.7.89

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.
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-local-aliases.d.ts","sourceRoot":"","sources":["../src/vite-plugin-local-aliases.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,MAAM,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA+DD,eAAO,MAAM,kBAAkB,GAC7B,UAAS,mBAAwB,KAChC,YAsBF,CAAC"}
1
+ {"version":3,"file":"vite-plugin-local-aliases.d.ts","sourceRoot":"","sources":["../src/vite-plugin-local-aliases.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,MAAM,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAuFD,eAAO,MAAM,kBAAkB,GAC7B,UAAS,mBAAwB,KAChC,YA2BF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  //#region src/vite-plugin-local-aliases.ts
4
- var discoverLocalAliases = (cfg, mode, options = {}) => {
4
+ function discoverLocalAliasesAndExtraExcludes(cfg, mode, options = {}) {
5
5
  const useSrcInDev = options.useSrcInDev ?? true;
6
6
  const alwaysUseSrc = options.alwaysUseSrc ?? false;
7
7
  const rootDir = cfg.root ?? process.cwd();
@@ -9,27 +9,36 @@ var discoverLocalAliases = (cfg, mode, options = {}) => {
9
9
  const entries = fs.readdirSync(packagesRoot, { withFileTypes: true });
10
10
  const useSrc = alwaysUseSrc || useSrcInDev && mode === "development";
11
11
  const patterns = options.patterns && options.patterns.length ? options.patterns : [{ folderPrefix: "extension-" }];
12
- return entries.reduce((aliases, entry) => {
13
- if (!entry.isDirectory()) return aliases;
12
+ const aliases = {};
13
+ const extraOptimizeDepsExclude = [];
14
+ for (const entry of entries) {
15
+ if (!entry.isDirectory()) continue;
14
16
  const pattern = patterns.find((p) => entry.name.startsWith(p.folderPrefix));
15
- if (!pattern) return aliases;
17
+ if (!pattern) continue;
16
18
  const pkgDir = path.join(packagesRoot, entry.name);
17
19
  const pkgPath = path.join(pkgDir, "package.json");
18
- if (!fs.existsSync(pkgPath)) return aliases;
20
+ if (!fs.existsSync(pkgPath)) continue;
19
21
  const pkgJson = fs.readFileSync(pkgPath, "utf8");
20
22
  const pkg = JSON.parse(pkgJson);
21
- if (!pkg.name) return aliases;
22
- if (pattern.packageNamePrefix && !pkg.name.startsWith(pattern.packageNamePrefix)) return aliases;
23
+ if (!pkg.name) continue;
24
+ if (pattern.packageNamePrefix && !pkg.name.startsWith(pattern.packageNamePrefix)) continue;
23
25
  const entryPoint = useSrc ? path.join(pkgDir, "src") : path.join(pkgDir, "dist");
24
26
  aliases[pkg.name] = entryPoint;
25
- return aliases;
26
- }, {});
27
- };
27
+ const more = pkg.eclipseDocks?.viteOptimizeDepsExclude;
28
+ if (Array.isArray(more)) {
29
+ for (const id of more) if (typeof id === "string" && id.length > 0) extraOptimizeDepsExclude.push(id);
30
+ }
31
+ }
32
+ return {
33
+ aliases,
34
+ extraOptimizeDepsExclude
35
+ };
36
+ }
28
37
  var localAliasesPlugin = (options = {}) => {
29
38
  return {
30
39
  name: "local-aliases",
31
40
  config(config, env) {
32
- const aliases = discoverLocalAliases(config, env.mode, options);
41
+ const { aliases, extraOptimizeDepsExclude } = discoverLocalAliasesAndExtraExcludes(config, env.mode, options);
33
42
  config.resolve ??= {};
34
43
  const existingAlias = config.resolve.alias ?? {};
35
44
  config.resolve.alias = {
@@ -38,7 +47,11 @@ var localAliasesPlugin = (options = {}) => {
38
47
  };
39
48
  config.optimizeDeps ??= {};
40
49
  const existingExclude = config.optimizeDeps.exclude ?? [];
41
- config.optimizeDeps.exclude = [...new Set([...existingExclude, ...Object.keys(aliases)])];
50
+ config.optimizeDeps.exclude = [...new Set([
51
+ ...existingExclude,
52
+ ...Object.keys(aliases),
53
+ ...extraOptimizeDepsExclude
54
+ ])];
42
55
  }
43
56
  };
44
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-local-aliases.js","names":[],"sources":["../src/vite-plugin-local-aliases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { PluginOption, UserConfig } from 'vite';\n\nexport interface PackagePattern {\n /**\n * Folder name prefix used to detect packages, e.g. \"extension-\" or \"core\".\n */\n folderPrefix: string;\n\n /**\n * Optional package name prefix filter, e.g. \"@eclipse-docks/\".\n */\n packageNamePrefix?: string;\n}\n\nexport interface LocalAliasesOptions {\n /**\n * Root directory that contains the local packages.\n * Defaults to the parent of the Vite `root` directory.\n */\n packagesRoot?: string;\n\n /**\n * Package patterns to scan for. By default looks for \"extension-*\"\n * folders with any package name.\n */\n patterns?: PackagePattern[];\n\n /**\n * If true, aliases will point to `src` in dev mode and `dist` otherwise.\n * Defaults to `true`.\n */\n useSrcInDev?: boolean;\n /**\n * If true, always point aliases at `src` regardless of mode.\n */\n alwaysUseSrc?: boolean;\n}\n\nconst discoverLocalAliases = (\n cfg: Pick<UserConfig, 'root'>,\n mode: string,\n options: LocalAliasesOptions = {},\n): Record<string, string> => {\n const useSrcInDev = options.useSrcInDev ?? true;\n const alwaysUseSrc = options.alwaysUseSrc ?? false;\n\n const rootDir = cfg.root ?? process.cwd();\n const packagesRoot =\n options.packagesRoot ?? path.resolve(rootDir, '..');\n\n const entries = fs.readdirSync(packagesRoot, { withFileTypes: true });\n const useSrc = alwaysUseSrc || (useSrcInDev && mode === 'development');\n\n const patterns: PackagePattern[] =\n options.patterns && options.patterns.length\n ? options.patterns\n : [{ folderPrefix: 'extension-' }];\n\n return entries.reduce<Record<string, string>>((aliases, entry) => {\n if (!entry.isDirectory()) {\n return aliases;\n }\n\n const pattern = patterns.find((p) =>\n entry.name.startsWith(p.folderPrefix),\n );\n\n if (!pattern) {\n return aliases;\n }\n\n const pkgDir = path.join(packagesRoot, entry.name);\n const pkgPath = path.join(pkgDir, 'package.json');\n if (!fs.existsSync(pkgPath)) {\n return aliases;\n }\n\n const pkgJson = fs.readFileSync(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgJson) as { name?: string };\n if (!pkg.name) {\n return aliases;\n }\n\n if (\n pattern.packageNamePrefix &&\n !pkg.name.startsWith(pattern.packageNamePrefix)\n ) {\n return aliases;\n }\n\n const entryPoint = useSrc\n ? path.join(pkgDir, 'src')\n : path.join(pkgDir, 'dist');\n\n aliases[pkg.name] = entryPoint;\n return aliases;\n }, {});\n};\n\nexport const localAliasesPlugin = (\n options: LocalAliasesOptions = {},\n): PluginOption => {\n return {\n name: 'local-aliases',\n config(config, env) {\n const aliases = discoverLocalAliases(config, env.mode, options);\n\n config.resolve ??= {};\n const existingAlias = config.resolve.alias ?? {};\n\n config.resolve.alias = {\n ...(typeof existingAlias === 'object' ? existingAlias : {}),\n ...aliases,\n };\n\n config.optimizeDeps ??= {};\n const existingExclude = config.optimizeDeps.exclude ?? [];\n\n config.optimizeDeps.exclude = [\n ...new Set([...existingExclude, ...Object.keys(aliases)]),\n ];\n },\n };\n};\n\n"],"mappings":";;;AAwCA,IAAM,wBACJ,KACA,MACA,UAA+B,EAAE,KACN;CAC3B,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,eAAe,QAAQ,gBAAgB;CAE7C,MAAM,UAAU,IAAI,QAAQ,QAAQ,KAAK;CACzC,MAAM,eACJ,QAAQ,gBAAgB,KAAK,QAAQ,SAAS,KAAK;CAErD,MAAM,UAAU,GAAG,YAAY,cAAc,EAAE,eAAe,MAAM,CAAC;CACrE,MAAM,SAAS,gBAAiB,eAAe,SAAS;CAExD,MAAM,WACJ,QAAQ,YAAY,QAAQ,SAAS,SACjC,QAAQ,WACR,CAAC,EAAE,cAAc,cAAc,CAAC;AAEtC,QAAO,QAAQ,QAAgC,SAAS,UAAU;AAChE,MAAI,CAAC,MAAM,aAAa,CACtB,QAAO;EAGT,MAAM,UAAU,SAAS,MAAM,MAC7B,MAAM,KAAK,WAAW,EAAE,aAAa,CACtC;AAED,MAAI,CAAC,QACH,QAAO;EAGT,MAAM,SAAS,KAAK,KAAK,cAAc,MAAM,KAAK;EAClD,MAAM,UAAU,KAAK,KAAK,QAAQ,eAAe;AACjD,MAAI,CAAC,GAAG,WAAW,QAAQ,CACzB,QAAO;EAGT,MAAM,UAAU,GAAG,aAAa,SAAS,OAAO;EAChD,MAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,MAAI,CAAC,IAAI,KACP,QAAO;AAGT,MACE,QAAQ,qBACR,CAAC,IAAI,KAAK,WAAW,QAAQ,kBAAkB,CAE/C,QAAO;EAGT,MAAM,aAAa,SACf,KAAK,KAAK,QAAQ,MAAM,GACxB,KAAK,KAAK,QAAQ,OAAO;AAE7B,UAAQ,IAAI,QAAQ;AACpB,SAAO;IACN,EAAE,CAAC;;AAGR,IAAa,sBACX,UAA+B,EAAE,KAChB;AACjB,QAAO;EACL,MAAM;EACN,OAAO,QAAQ,KAAK;GAClB,MAAM,UAAU,qBAAqB,QAAQ,IAAI,MAAM,QAAQ;AAE/D,UAAO,YAAY,EAAE;GACrB,MAAM,gBAAgB,OAAO,QAAQ,SAAS,EAAE;AAEhD,UAAO,QAAQ,QAAQ;IACrB,GAAI,OAAO,kBAAkB,WAAW,gBAAgB,EAAE;IAC1D,GAAG;IACJ;AAED,UAAO,iBAAiB,EAAE;GAC1B,MAAM,kBAAkB,OAAO,aAAa,WAAW,EAAE;AAEzD,UAAO,aAAa,UAAU,CAC5B,GAAG,IAAI,IAAI,CAAC,GAAG,iBAAiB,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAC1D;;EAEJ"}
1
+ {"version":3,"file":"vite-plugin-local-aliases.js","names":[],"sources":["../src/vite-plugin-local-aliases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { PluginOption, UserConfig } from 'vite';\n\nexport interface PackagePattern {\n /**\n * Folder name prefix used to detect packages, e.g. \"extension-\" or \"core\".\n */\n folderPrefix: string;\n\n /**\n * Optional package name prefix filter, e.g. \"@eclipse-docks/\".\n */\n packageNamePrefix?: string;\n}\n\nexport interface LocalAliasesOptions {\n /**\n * Root directory that contains the local packages.\n * Defaults to the parent of the Vite `root` directory.\n */\n packagesRoot?: string;\n\n /**\n * Package patterns to scan for. By default looks for \"extension-*\"\n * folders with any package name.\n */\n patterns?: PackagePattern[];\n\n /**\n * If true, aliases will point to `src` in dev mode and `dist` otherwise.\n * Defaults to `true`.\n */\n useSrcInDev?: boolean;\n /**\n * If true, always point aliases at `src` regardless of mode.\n */\n alwaysUseSrc?: boolean;\n}\n\ninterface EclipseDocksPackageJson {\n name?: string;\n /**\n * Optional: extra `optimizeDeps.exclude` entries for this workspace package\n * (e.g. heavy WASM npm deps that must not be pre-bundled in dev).\n */\n eclipseDocks?: {\n viteOptimizeDepsExclude?: string[];\n };\n}\n\nfunction discoverLocalAliasesAndExtraExcludes(\n cfg: Pick<UserConfig, 'root'>,\n mode: string,\n options: LocalAliasesOptions = {},\n): { aliases: Record<string, string>; extraOptimizeDepsExclude: string[] } {\n const useSrcInDev = options.useSrcInDev ?? true;\n const alwaysUseSrc = options.alwaysUseSrc ?? false;\n\n const rootDir = cfg.root ?? process.cwd();\n const packagesRoot =\n options.packagesRoot ?? path.resolve(rootDir, '..');\n\n const entries = fs.readdirSync(packagesRoot, { withFileTypes: true });\n const useSrc = alwaysUseSrc || (useSrcInDev && mode === 'development');\n\n const patterns: PackagePattern[] =\n options.patterns && options.patterns.length\n ? options.patterns\n : [{ folderPrefix: 'extension-' }];\n\n const aliases: Record<string, string> = {};\n const extraOptimizeDepsExclude: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const pattern = patterns.find((p) =>\n entry.name.startsWith(p.folderPrefix),\n );\n\n if (!pattern) {\n continue;\n }\n\n const pkgDir = path.join(packagesRoot, entry.name);\n const pkgPath = path.join(pkgDir, 'package.json');\n if (!fs.existsSync(pkgPath)) {\n continue;\n }\n\n const pkgJson = fs.readFileSync(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgJson) as EclipseDocksPackageJson;\n if (!pkg.name) {\n continue;\n }\n\n if (\n pattern.packageNamePrefix &&\n !pkg.name.startsWith(pattern.packageNamePrefix)\n ) {\n continue;\n }\n\n const entryPoint = useSrc\n ? path.join(pkgDir, 'src')\n : path.join(pkgDir, 'dist');\n\n aliases[pkg.name] = entryPoint;\n\n const more = pkg.eclipseDocks?.viteOptimizeDepsExclude;\n if (Array.isArray(more)) {\n for (const id of more) {\n if (typeof id === 'string' && id.length > 0) {\n extraOptimizeDepsExclude.push(id);\n }\n }\n }\n }\n\n return { aliases, extraOptimizeDepsExclude };\n}\n\nexport const localAliasesPlugin = (\n options: LocalAliasesOptions = {},\n): PluginOption => {\n return {\n name: 'local-aliases',\n config(config, env) {\n const { aliases, extraOptimizeDepsExclude } =\n discoverLocalAliasesAndExtraExcludes(config, env.mode, options);\n\n config.resolve ??= {};\n const existingAlias = config.resolve.alias ?? {};\n\n config.resolve.alias = {\n ...(typeof existingAlias === 'object' ? existingAlias : {}),\n ...aliases,\n };\n\n config.optimizeDeps ??= {};\n const existingExclude = config.optimizeDeps.exclude ?? [];\n\n config.optimizeDeps.exclude = [\n ...new Set([\n ...existingExclude,\n ...Object.keys(aliases),\n ...extraOptimizeDepsExclude,\n ]),\n ];\n },\n };\n};\n\n"],"mappings":";;;AAmDA,SAAS,qCACP,KACA,MACA,UAA+B,EAAE,EACwC;CACzE,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,eAAe,QAAQ,gBAAgB;CAE7C,MAAM,UAAU,IAAI,QAAQ,QAAQ,KAAK;CACzC,MAAM,eACJ,QAAQ,gBAAgB,KAAK,QAAQ,SAAS,KAAK;CAErD,MAAM,UAAU,GAAG,YAAY,cAAc,EAAE,eAAe,MAAM,CAAC;CACrE,MAAM,SAAS,gBAAiB,eAAe,SAAS;CAExD,MAAM,WACJ,QAAQ,YAAY,QAAQ,SAAS,SACjC,QAAQ,WACR,CAAC,EAAE,cAAc,cAAc,CAAC;CAEtC,MAAM,UAAkC,EAAE;CAC1C,MAAM,2BAAqC,EAAE;AAE7C,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,CAAC,MAAM,aAAa,CACtB;EAGF,MAAM,UAAU,SAAS,MAAM,MAC7B,MAAM,KAAK,WAAW,EAAE,aAAa,CACtC;AAED,MAAI,CAAC,QACH;EAGF,MAAM,SAAS,KAAK,KAAK,cAAc,MAAM,KAAK;EAClD,MAAM,UAAU,KAAK,KAAK,QAAQ,eAAe;AACjD,MAAI,CAAC,GAAG,WAAW,QAAQ,CACzB;EAGF,MAAM,UAAU,GAAG,aAAa,SAAS,OAAO;EAChD,MAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,MAAI,CAAC,IAAI,KACP;AAGF,MACE,QAAQ,qBACR,CAAC,IAAI,KAAK,WAAW,QAAQ,kBAAkB,CAE/C;EAGF,MAAM,aAAa,SACf,KAAK,KAAK,QAAQ,MAAM,GACxB,KAAK,KAAK,QAAQ,OAAO;AAE7B,UAAQ,IAAI,QAAQ;EAEpB,MAAM,OAAO,IAAI,cAAc;AAC/B,MAAI,MAAM,QAAQ,KAAK;QAChB,MAAM,MAAM,KACf,KAAI,OAAO,OAAO,YAAY,GAAG,SAAS,EACxC,0BAAyB,KAAK,GAAG;;;AAMzC,QAAO;EAAE;EAAS;EAA0B;;AAG9C,IAAa,sBACX,UAA+B,EAAE,KAChB;AACjB,QAAO;EACL,MAAM;EACN,OAAO,QAAQ,KAAK;GAClB,MAAM,EAAE,SAAS,6BACf,qCAAqC,QAAQ,IAAI,MAAM,QAAQ;AAEjE,UAAO,YAAY,EAAE;GACrB,MAAM,gBAAgB,OAAO,QAAQ,SAAS,EAAE;AAEhD,UAAO,QAAQ,QAAQ;IACrB,GAAI,OAAO,kBAAkB,WAAW,gBAAgB,EAAE;IAC1D,GAAG;IACJ;AAED,UAAO,iBAAiB,EAAE;GAC1B,MAAM,kBAAkB,OAAO,aAAa,WAAW,EAAE;AAEzD,UAAO,aAAa,UAAU,CAC5B,GAAG,IAAI,IAAI;IACT,GAAG;IACH,GAAG,OAAO,KAAK,QAAQ;IACvB,GAAG;IACJ,CAAC,CACH;;EAEJ"}
@@ -12,7 +12,42 @@ export declare function resolvePackageInfo(appRoot: string, options?: {
12
12
  export declare function resolveDepVersions(appRoot: string, options?: {
13
13
  includeDevDependencies?: boolean;
14
14
  }): Record<string, string>;
15
- export declare function resolveDepVersionsPlugin(options?: {
15
+ /** Virtual module id; injected into `index.html` before `main.ts` when extension side-effects are enabled. */
16
+ export declare const VIRTUAL_EXTENSION_IMPORTS = "virtual:eclipse-docks-extension-imports";
17
+ export interface ExtensionSideEffectsOptions {
18
+ /**
19
+ * When false, disables automatic extension side-effect imports. Omitted or true keeps them on.
20
+ */
21
+ enabled?: boolean;
22
+ /** Dependency names to skip (even if they match `packageNamePattern`). */
23
+ exclude?: string[];
24
+ /**
25
+ * Packages to load first, in order (only those present in dependencies are imported).
26
+ * Default includes PWA so `beforeinstallprompt` can register early.
27
+ */
28
+ priorityFirst?: string[];
29
+ /**
30
+ * Which direct `dependencies` keys qualify as Docks-style extensions (`extension-*`, with an optional npm scope).
31
+ * @default /^(?:@[^/]+\/)?extension-/
32
+ */
33
+ packageNamePattern?: RegExp;
34
+ }
35
+ export type ResolveDepVersionsPluginOptions = {
16
36
  includeDevDependencies?: boolean;
17
- }): Plugin;
37
+ /**
38
+ * By default, registers a virtual module that side-effect-imports every matching direct
39
+ * `dependencies` entry (see `ExtensionSideEffectsOptions`), and injects
40
+ * `import 'virtual:eclipse-docks-extension-imports'` into `index.html` **before** `/src/main.ts`.
41
+ * Pass `false` or `{ enabled: false }` to disable.
42
+ */
43
+ extensionSideEffects?: boolean | ExtensionSideEffectsOptions;
44
+ };
45
+ /** Normalized match options for {@link listExtensionSideEffectPackages}. */
46
+ export type ExtensionSideEffectsListOptions = {
47
+ exclude: Set<string>;
48
+ priorityFirst: string[];
49
+ pattern: RegExp;
50
+ };
51
+ export declare function listExtensionSideEffectPackages(dependencies: Record<string, string>, sideEffects: ExtensionSideEffectsListOptions): string[];
52
+ export declare function resolveDepVersionsPlugin(options?: ResolveDepVersionsPluginOptions): Plugin;
18
53
  //# sourceMappingURL=vite-plugin-resolve-deps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-resolve-deps.d.ts","sourceRoot":"","sources":["../src/vite-plugin-resolve-deps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAoDD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C,mBAAmB,GAAG,IAAI,CAkB5B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB;AAID,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE;IACjD,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,MAAM,CAcT"}
1
+ {"version":3,"file":"vite-plugin-resolve-deps.d.ts","sourceRoot":"","sources":["../src/vite-plugin-resolve-deps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAoDD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C,mBAAmB,GAAG,IAAI,CAkB5B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB;AAID,8GAA8G;AAC9G,eAAO,MAAM,yBAAyB,4CAA4C,CAAC;AAanF,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,2BAA2B,CAAC;CAC9D,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAqBF,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,+BAA+B,GAC3C,MAAM,EAAE,CAQV;AAED,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,+BAA+B,GACxC,MAAM,CAyER"}
@@ -48,7 +48,39 @@ function resolveDepVersions(appRoot, options) {
48
48
  return resolvePackageInfo(appRoot, options)?.dependencies ?? {};
49
49
  }
50
50
  var RESOLVED_PACKAGE_INFO_KEY = "__RESOLVED_PACKAGE_INFO__";
51
+ /** Virtual module id; injected into `index.html` before `main.ts` when extension side-effects are enabled. */
52
+ var VIRTUAL_EXTENSION_IMPORTS = "virtual:eclipse-docks-extension-imports";
53
+ var RESOLVED_VIRTUAL_EXTENSION_IMPORTS = `\0${VIRTUAL_EXTENSION_IMPORTS}`;
54
+ /** Unscoped `extension-*` or scoped `@namespace/extension-*` (any npm scope). */
55
+ var DEFAULT_EXTENSION_PATTERN = /^(?:@[^/]+\/)?extension-/;
56
+ var DEFAULT_PRIORITY_FIRST = ["@eclipse-docks/extension-pwa", "extension-pwa"];
57
+ /** Matches Vite’s default app entry in index.html. */
58
+ var MAIN_TS_SCRIPT_RE = /<script\b[^>]*\btype\s*=\s*["']module["'][^>]*\bsrc\s*=\s*["'][^"']*\/src\/main\.ts["'][^>]*>\s*<\/script>/i;
59
+ function normalizeExtensionSideEffects(opt) {
60
+ if (opt === false) return null;
61
+ if (opt === void 0 || opt === true) return {
62
+ exclude: /* @__PURE__ */ new Set(),
63
+ priorityFirst: [...DEFAULT_PRIORITY_FIRST],
64
+ pattern: DEFAULT_EXTENSION_PATTERN
65
+ };
66
+ if (opt.enabled === false) return null;
67
+ return {
68
+ exclude: new Set(opt.exclude ?? []),
69
+ priorityFirst: opt.priorityFirst ?? [...DEFAULT_PRIORITY_FIRST],
70
+ pattern: opt.packageNamePattern ?? DEFAULT_EXTENSION_PATTERN
71
+ };
72
+ }
73
+ function listExtensionSideEffectPackages(dependencies, sideEffects) {
74
+ const names = Object.keys(dependencies).filter((name) => sideEffects.pattern.test(name) && !sideEffects.exclude.has(name));
75
+ const prioritySet = new Set(sideEffects.priorityFirst);
76
+ const first = sideEffects.priorityFirst.filter((p) => names.includes(p));
77
+ const rest = names.filter((n) => !prioritySet.has(n)).sort((a, b) => a.localeCompare(b));
78
+ return [...first, ...rest];
79
+ }
51
80
  function resolveDepVersionsPlugin(options) {
81
+ let appRoot = process.cwd();
82
+ let extensionSideEffectsActive = false;
83
+ let extensionImportPackages = [];
52
84
  return {
53
85
  name: "resolve-dep-versions",
54
86
  config(config) {
@@ -60,10 +92,39 @@ function resolveDepVersionsPlugin(options) {
60
92
  marketplaceCatalogUrls: void 0
61
93
  };
62
94
  return { define: { [RESOLVED_PACKAGE_INFO_KEY]: JSON.stringify(value) } };
95
+ },
96
+ configResolved(config) {
97
+ appRoot = path.resolve(config.root ?? process.cwd());
98
+ const normalized = normalizeExtensionSideEffects(options?.extensionSideEffects);
99
+ extensionSideEffectsActive = normalized !== null;
100
+ if (!normalized) {
101
+ extensionImportPackages = [];
102
+ return;
103
+ }
104
+ extensionImportPackages = listExtensionSideEffectPackages(resolvePackageInfo(appRoot, options)?.dependencies ?? {}, normalized);
105
+ },
106
+ resolveId(id) {
107
+ if (id === "virtual:eclipse-docks-extension-imports") return RESOLVED_VIRTUAL_EXTENSION_IMPORTS;
108
+ },
109
+ load(id) {
110
+ if (id !== RESOLVED_VIRTUAL_EXTENSION_IMPORTS) return null;
111
+ if (extensionImportPackages.length === 0) return "export {};\n";
112
+ return extensionImportPackages.map((pkg) => `import ${JSON.stringify(pkg)};\n`).join("");
113
+ },
114
+ transformIndexHtml: {
115
+ order: "pre",
116
+ handler(html) {
117
+ if (!extensionSideEffectsActive) return html;
118
+ if (extensionImportPackages.length === 0) return html;
119
+ if (html.includes("virtual:eclipse-docks-extension-imports")) return html;
120
+ if (!MAIN_TS_SCRIPT_RE.test(html)) return html;
121
+ const inject = `<script type="module">import ${JSON.stringify(VIRTUAL_EXTENSION_IMPORTS)};<\/script>\n`;
122
+ return html.replace(MAIN_TS_SCRIPT_RE, (match) => `${inject}${match}`);
123
+ }
63
124
  }
64
125
  };
65
126
  }
66
127
  //#endregion
67
- export { resolveDepVersions, resolveDepVersionsPlugin, resolvePackageInfo };
128
+ export { VIRTUAL_EXTENSION_IMPORTS, listExtensionSideEffectPackages, resolveDepVersions, resolveDepVersionsPlugin, resolvePackageInfo };
68
129
 
69
130
  //# sourceMappingURL=vite-plugin-resolve-deps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-resolve-deps.js","names":[],"sources":["../src/vite-plugin-resolve-deps.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs';\nimport path from 'path';\nimport type { Plugin } from 'vite';\n\nexport interface ResolvedPackageInfo {\n name: string;\n version: string;\n description?: string;\n dependencies: Record<string, string>;\n marketplaceCatalogUrls?: string[];\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n description?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nfunction findPackageVersion(appRoot: string, depName: string): string | null {\n const segments = depName.startsWith('@')\n ? depName.split('/')\n : [depName];\n const relativePath = path.join('node_modules', ...segments, 'package.json');\n let dir = path.resolve(appRoot);\n const root = path.parse(dir).root;\n\n while (true) {\n const pkgPath = path.join(dir, relativePath);\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as PackageJson;\n if (typeof pkg.version === 'string') return pkg.version;\n } catch {\n // ignore parse errors\n }\n return null;\n }\n if (dir === root) break;\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction resolveDepVersionsFromPkg(\n appRoot: string,\n pkg: PackageJson,\n options?: { includeDevDependencies?: boolean }\n): Record<string, string> {\n const deps = { ...pkg.dependencies };\n if (options?.includeDevDependencies && pkg.devDependencies) {\n Object.assign(deps, pkg.devDependencies);\n }\n const result: Record<string, string> = {};\n for (const [name, specifier] of Object.entries(deps)) {\n const version = findPackageVersion(appRoot, name);\n result[name] = version ?? specifier;\n }\n return result;\n}\n\nexport function resolvePackageInfo(\n appRoot: string,\n options?: { includeDevDependencies?: boolean }\n): ResolvedPackageInfo | null {\n const pkgPath = path.join(appRoot, 'package.json');\n if (!existsSync(pkgPath)) return null;\n\n let pkg: PackageJson;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as PackageJson;\n } catch {\n return null;\n }\n\n const name = typeof pkg.name === 'string' ? pkg.name : '';\n const version = typeof pkg.version === 'string' ? pkg.version : '0.0.0';\n const description = typeof pkg.description === 'string' ? pkg.description : undefined;\n const dependencies = resolveDepVersionsFromPkg(appRoot, pkg, options);\n const marketplaceCatalogUrls = (pkg as { marketplace?: { catalogUrls?: string[] } }).marketplace?.catalogUrls;\n\n return { name, version, description, dependencies, marketplaceCatalogUrls };\n}\n\nexport function resolveDepVersions(\n appRoot: string,\n options?: { includeDevDependencies?: boolean }\n): Record<string, string> {\n const info = resolvePackageInfo(appRoot, options);\n return info?.dependencies ?? {};\n}\n\nconst RESOLVED_PACKAGE_INFO_KEY = '__RESOLVED_PACKAGE_INFO__';\n\nexport function resolveDepVersionsPlugin(options?: {\n includeDevDependencies?: boolean;\n}): Plugin {\n return {\n name: 'resolve-dep-versions',\n config(config) {\n const root = config.root ? path.resolve(config.root) : process.cwd();\n const info = resolvePackageInfo(root, options);\n const value = info ?? { name: '', version: '0.0.0', description: undefined, dependencies: {}, marketplaceCatalogUrls: undefined };\n return {\n define: {\n [RESOLVED_PACKAGE_INFO_KEY]: JSON.stringify(value),\n },\n };\n },\n };\n}\n"],"mappings":";;;AAoBA,SAAS,mBAAmB,SAAiB,SAAgC;CAC3E,MAAM,WAAW,QAAQ,WAAW,IAAI,GACpC,QAAQ,MAAM,IAAI,GAClB,CAAC,QAAQ;CACb,MAAM,eAAe,KAAK,KAAK,gBAAgB,GAAG,UAAU,eAAe;CAC3E,IAAI,MAAM,KAAK,QAAQ,QAAQ;CAC/B,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC;AAE7B,QAAO,MAAM;EACX,MAAM,UAAU,KAAK,KAAK,KAAK,aAAa;AAC5C,MAAI,WAAW,QAAQ,EAAE;AACvB,OAAI;IACF,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AACrD,QAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;WAC1C;AAGR,UAAO;;AAET,MAAI,QAAQ,KAAM;AAClB,QAAM,KAAK,QAAQ,IAAI;;AAEzB,QAAO;;AAGT,SAAS,0BACP,SACA,KACA,SACwB;CACxB,MAAM,OAAO,EAAE,GAAG,IAAI,cAAc;AACpC,KAAI,SAAS,0BAA0B,IAAI,gBACzC,QAAO,OAAO,MAAM,IAAI,gBAAgB;CAE1C,MAAM,SAAiC,EAAE;AACzC,MAAK,MAAM,CAAC,MAAM,cAAc,OAAO,QAAQ,KAAK,CAElD,QAAO,QADS,mBAAmB,SAAS,KAAK,IACvB;AAE5B,QAAO;;AAGT,SAAgB,mBACd,SACA,SAC4B;CAC5B,MAAM,UAAU,KAAK,KAAK,SAAS,eAAe;AAClD,KAAI,CAAC,WAAW,QAAQ,CAAE,QAAO;CAEjC,IAAI;AACJ,KAAI;AACF,QAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;SACzC;AACN,SAAO;;AAST,QAAO;EAAE,MANI,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;EAMxC,SALC,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;EAKxC,aAJJ,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,KAAA;EAIvC,cAHhB,0BAA0B,SAAS,KAAK,QAAQ;EAGlB,wBAFnB,IAAqD,aAAa;EAEvB;;AAG7E,SAAgB,mBACd,SACA,SACwB;AAExB,QADa,mBAAmB,SAAS,QAAQ,EACpC,gBAAgB,EAAE;;AAGjC,IAAM,4BAA4B;AAElC,SAAgB,yBAAyB,SAE9B;AACT,QAAO;EACL,MAAM;EACN,OAAO,QAAQ;GAGb,MAAM,QADO,mBADA,OAAO,OAAO,KAAK,QAAQ,OAAO,KAAK,GAAG,QAAQ,KAAK,EAC9B,QAAQ,IACxB;IAAE,MAAM;IAAI,SAAS;IAAS,aAAa,KAAA;IAAW,cAAc,EAAE;IAAE,wBAAwB,KAAA;IAAW;AACjI,UAAO,EACL,QAAQ,GACL,4BAA4B,KAAK,UAAU,MAAM,EACnD,EACF;;EAEJ"}
1
+ {"version":3,"file":"vite-plugin-resolve-deps.js","names":[],"sources":["../src/vite-plugin-resolve-deps.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs';\nimport path from 'path';\nimport type { Plugin } from 'vite';\n\nexport interface ResolvedPackageInfo {\n name: string;\n version: string;\n description?: string;\n dependencies: Record<string, string>;\n marketplaceCatalogUrls?: string[];\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n description?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nfunction findPackageVersion(appRoot: string, depName: string): string | null {\n const segments = depName.startsWith('@')\n ? depName.split('/')\n : [depName];\n const relativePath = path.join('node_modules', ...segments, 'package.json');\n let dir = path.resolve(appRoot);\n const root = path.parse(dir).root;\n\n while (true) {\n const pkgPath = path.join(dir, relativePath);\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as PackageJson;\n if (typeof pkg.version === 'string') return pkg.version;\n } catch {\n // ignore parse errors\n }\n return null;\n }\n if (dir === root) break;\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction resolveDepVersionsFromPkg(\n appRoot: string,\n pkg: PackageJson,\n options?: { includeDevDependencies?: boolean }\n): Record<string, string> {\n const deps = { ...pkg.dependencies };\n if (options?.includeDevDependencies && pkg.devDependencies) {\n Object.assign(deps, pkg.devDependencies);\n }\n const result: Record<string, string> = {};\n for (const [name, specifier] of Object.entries(deps)) {\n const version = findPackageVersion(appRoot, name);\n result[name] = version ?? specifier;\n }\n return result;\n}\n\nexport function resolvePackageInfo(\n appRoot: string,\n options?: { includeDevDependencies?: boolean }\n): ResolvedPackageInfo | null {\n const pkgPath = path.join(appRoot, 'package.json');\n if (!existsSync(pkgPath)) return null;\n\n let pkg: PackageJson;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as PackageJson;\n } catch {\n return null;\n }\n\n const name = typeof pkg.name === 'string' ? pkg.name : '';\n const version = typeof pkg.version === 'string' ? pkg.version : '0.0.0';\n const description = typeof pkg.description === 'string' ? pkg.description : undefined;\n const dependencies = resolveDepVersionsFromPkg(appRoot, pkg, options);\n const marketplaceCatalogUrls = (pkg as { marketplace?: { catalogUrls?: string[] } }).marketplace?.catalogUrls;\n\n return { name, version, description, dependencies, marketplaceCatalogUrls };\n}\n\nexport function resolveDepVersions(\n appRoot: string,\n options?: { includeDevDependencies?: boolean }\n): Record<string, string> {\n const info = resolvePackageInfo(appRoot, options);\n return info?.dependencies ?? {};\n}\n\nconst RESOLVED_PACKAGE_INFO_KEY = '__RESOLVED_PACKAGE_INFO__';\n\n/** Virtual module id; injected into `index.html` before `main.ts` when extension side-effects are enabled. */\nexport const VIRTUAL_EXTENSION_IMPORTS = 'virtual:eclipse-docks-extension-imports';\n\nconst RESOLVED_VIRTUAL_EXTENSION_IMPORTS = `\\0${VIRTUAL_EXTENSION_IMPORTS}`;\n\n/** Unscoped `extension-*` or scoped `@namespace/extension-*` (any npm scope). */\nconst DEFAULT_EXTENSION_PATTERN = /^(?:@[^/]+\\/)?extension-/;\n\nconst DEFAULT_PRIORITY_FIRST = ['@eclipse-docks/extension-pwa', 'extension-pwa'];\n\n/** Matches Vite’s default app entry in index.html. */\nconst MAIN_TS_SCRIPT_RE =\n /<script\\b[^>]*\\btype\\s*=\\s*[\"']module[\"'][^>]*\\bsrc\\s*=\\s*[\"'][^\"']*\\/src\\/main\\.ts[\"'][^>]*>\\s*<\\/script>/i;\n\nexport interface ExtensionSideEffectsOptions {\n /**\n * When false, disables automatic extension side-effect imports. Omitted or true keeps them on.\n */\n enabled?: boolean;\n /** Dependency names to skip (even if they match `packageNamePattern`). */\n exclude?: string[];\n /**\n * Packages to load first, in order (only those present in dependencies are imported).\n * Default includes PWA so `beforeinstallprompt` can register early.\n */\n priorityFirst?: string[];\n /**\n * Which direct `dependencies` keys qualify as Docks-style extensions (`extension-*`, with an optional npm scope).\n * @default /^(?:@[^/]+\\/)?extension-/\n */\n packageNamePattern?: RegExp;\n}\n\nexport type ResolveDepVersionsPluginOptions = {\n includeDevDependencies?: boolean;\n /**\n * By default, registers a virtual module that side-effect-imports every matching direct\n * `dependencies` entry (see `ExtensionSideEffectsOptions`), and injects\n * `import 'virtual:eclipse-docks-extension-imports'` into `index.html` **before** `/src/main.ts`.\n * Pass `false` or `{ enabled: false }` to disable.\n */\n extensionSideEffects?: boolean | ExtensionSideEffectsOptions;\n};\n\n/** Normalized match options for {@link listExtensionSideEffectPackages}. */\nexport type ExtensionSideEffectsListOptions = {\n exclude: Set<string>;\n priorityFirst: string[];\n pattern: RegExp;\n};\n\nfunction normalizeExtensionSideEffects(\n opt: boolean | ExtensionSideEffectsOptions | undefined,\n): ExtensionSideEffectsListOptions | null {\n if (opt === false) return null;\n if (opt === undefined || opt === true) {\n return {\n exclude: new Set(),\n priorityFirst: [...DEFAULT_PRIORITY_FIRST],\n pattern: DEFAULT_EXTENSION_PATTERN,\n };\n }\n if (opt.enabled === false) return null;\n return {\n exclude: new Set(opt.exclude ?? []),\n priorityFirst: opt.priorityFirst ?? [...DEFAULT_PRIORITY_FIRST],\n pattern: opt.packageNamePattern ?? DEFAULT_EXTENSION_PATTERN,\n };\n}\n\nexport function listExtensionSideEffectPackages(\n dependencies: Record<string, string>,\n sideEffects: ExtensionSideEffectsListOptions,\n): string[] {\n const names = Object.keys(dependencies).filter(\n (name) => sideEffects.pattern.test(name) && !sideEffects.exclude.has(name),\n );\n const prioritySet = new Set(sideEffects.priorityFirst);\n const first = sideEffects.priorityFirst.filter((p) => names.includes(p));\n const rest = names.filter((n) => !prioritySet.has(n)).sort((a, b) => a.localeCompare(b));\n return [...first, ...rest];\n}\n\nexport function resolveDepVersionsPlugin(\n options?: ResolveDepVersionsPluginOptions,\n): Plugin {\n let appRoot = process.cwd();\n let extensionSideEffectsActive = false;\n let extensionImportPackages: string[] = [];\n\n return {\n name: 'resolve-dep-versions',\n config(config) {\n const root = config.root ? path.resolve(config.root) : process.cwd();\n const info = resolvePackageInfo(root, options);\n const value =\n info ?? {\n name: '',\n version: '0.0.0',\n description: undefined,\n dependencies: {},\n marketplaceCatalogUrls: undefined,\n };\n return {\n define: {\n [RESOLVED_PACKAGE_INFO_KEY]: JSON.stringify(value),\n },\n };\n },\n configResolved(config) {\n appRoot = path.resolve(config.root ?? process.cwd());\n const normalized = normalizeExtensionSideEffects(options?.extensionSideEffects);\n extensionSideEffectsActive = normalized !== null;\n if (!normalized) {\n extensionImportPackages = [];\n return;\n }\n const info = resolvePackageInfo(appRoot, options);\n extensionImportPackages = listExtensionSideEffectPackages(\n info?.dependencies ?? {},\n normalized,\n );\n },\n resolveId(id) {\n if (id === VIRTUAL_EXTENSION_IMPORTS) {\n return RESOLVED_VIRTUAL_EXTENSION_IMPORTS;\n }\n return undefined;\n },\n load(id) {\n if (id !== RESOLVED_VIRTUAL_EXTENSION_IMPORTS) {\n return null;\n }\n if (extensionImportPackages.length === 0) {\n return 'export {};\\n';\n }\n return extensionImportPackages.map((pkg) => `import ${JSON.stringify(pkg)};\\n`).join('');\n },\n transformIndexHtml: {\n order: 'pre',\n handler(html) {\n if (!extensionSideEffectsActive) {\n return html;\n }\n if (extensionImportPackages.length === 0) {\n return html;\n }\n if (html.includes(VIRTUAL_EXTENSION_IMPORTS)) {\n return html;\n }\n if (!MAIN_TS_SCRIPT_RE.test(html)) {\n return html;\n }\n const inject = `<script type=\"module\">import ${JSON.stringify(VIRTUAL_EXTENSION_IMPORTS)};</script>\\n`;\n return html.replace(MAIN_TS_SCRIPT_RE, (match) => `${inject}${match}`);\n },\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/core",
3
- "version": "0.7.87",
3
+ "version": "0.7.89",
4
4
  "description": "Eclipse Docks platform core: registries, services, parts, widgets, and API",
5
5
  "type": "module",
6
6
  "license": "EPL-2.0",
@@ -38,11 +38,22 @@ export interface LocalAliasesOptions {
38
38
  alwaysUseSrc?: boolean;
39
39
  }
40
40
 
41
- const discoverLocalAliases = (
41
+ interface EclipseDocksPackageJson {
42
+ name?: string;
43
+ /**
44
+ * Optional: extra `optimizeDeps.exclude` entries for this workspace package
45
+ * (e.g. heavy WASM npm deps that must not be pre-bundled in dev).
46
+ */
47
+ eclipseDocks?: {
48
+ viteOptimizeDepsExclude?: string[];
49
+ };
50
+ }
51
+
52
+ function discoverLocalAliasesAndExtraExcludes(
42
53
  cfg: Pick<UserConfig, 'root'>,
43
54
  mode: string,
44
55
  options: LocalAliasesOptions = {},
45
- ): Record<string, string> => {
56
+ ): { aliases: Record<string, string>; extraOptimizeDepsExclude: string[] } {
46
57
  const useSrcInDev = options.useSrcInDev ?? true;
47
58
  const alwaysUseSrc = options.alwaysUseSrc ?? false;
48
59
 
@@ -58,9 +69,12 @@ const discoverLocalAliases = (
58
69
  ? options.patterns
59
70
  : [{ folderPrefix: 'extension-' }];
60
71
 
61
- return entries.reduce<Record<string, string>>((aliases, entry) => {
72
+ const aliases: Record<string, string> = {};
73
+ const extraOptimizeDepsExclude: string[] = [];
74
+
75
+ for (const entry of entries) {
62
76
  if (!entry.isDirectory()) {
63
- return aliases;
77
+ continue;
64
78
  }
65
79
 
66
80
  const pattern = patterns.find((p) =>
@@ -68,26 +82,26 @@ const discoverLocalAliases = (
68
82
  );
69
83
 
70
84
  if (!pattern) {
71
- return aliases;
85
+ continue;
72
86
  }
73
87
 
74
88
  const pkgDir = path.join(packagesRoot, entry.name);
75
89
  const pkgPath = path.join(pkgDir, 'package.json');
76
90
  if (!fs.existsSync(pkgPath)) {
77
- return aliases;
91
+ continue;
78
92
  }
79
93
 
80
94
  const pkgJson = fs.readFileSync(pkgPath, 'utf8');
81
- const pkg = JSON.parse(pkgJson) as { name?: string };
95
+ const pkg = JSON.parse(pkgJson) as EclipseDocksPackageJson;
82
96
  if (!pkg.name) {
83
- return aliases;
97
+ continue;
84
98
  }
85
99
 
86
100
  if (
87
101
  pattern.packageNamePrefix &&
88
102
  !pkg.name.startsWith(pattern.packageNamePrefix)
89
103
  ) {
90
- return aliases;
104
+ continue;
91
105
  }
92
106
 
93
107
  const entryPoint = useSrc
@@ -95,9 +109,19 @@ const discoverLocalAliases = (
95
109
  : path.join(pkgDir, 'dist');
96
110
 
97
111
  aliases[pkg.name] = entryPoint;
98
- return aliases;
99
- }, {});
100
- };
112
+
113
+ const more = pkg.eclipseDocks?.viteOptimizeDepsExclude;
114
+ if (Array.isArray(more)) {
115
+ for (const id of more) {
116
+ if (typeof id === 'string' && id.length > 0) {
117
+ extraOptimizeDepsExclude.push(id);
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+ return { aliases, extraOptimizeDepsExclude };
124
+ }
101
125
 
102
126
  export const localAliasesPlugin = (
103
127
  options: LocalAliasesOptions = {},
@@ -105,7 +129,8 @@ export const localAliasesPlugin = (
105
129
  return {
106
130
  name: 'local-aliases',
107
131
  config(config, env) {
108
- const aliases = discoverLocalAliases(config, env.mode, options);
132
+ const { aliases, extraOptimizeDepsExclude } =
133
+ discoverLocalAliasesAndExtraExcludes(config, env.mode, options);
109
134
 
110
135
  config.resolve ??= {};
111
136
  const existingAlias = config.resolve.alias ?? {};
@@ -119,7 +144,11 @@ export const localAliasesPlugin = (
119
144
  const existingExclude = config.optimizeDeps.exclude ?? [];
120
145
 
121
146
  config.optimizeDeps.exclude = [
122
- ...new Set([...existingExclude, ...Object.keys(aliases)]),
147
+ ...new Set([
148
+ ...existingExclude,
149
+ ...Object.keys(aliases),
150
+ ...extraOptimizeDepsExclude,
151
+ ]),
123
152
  ];
124
153
  },
125
154
  };
@@ -93,20 +93,162 @@ export function resolveDepVersions(
93
93
 
94
94
  const RESOLVED_PACKAGE_INFO_KEY = '__RESOLVED_PACKAGE_INFO__';
95
95
 
96
- export function resolveDepVersionsPlugin(options?: {
96
+ /** Virtual module id; injected into `index.html` before `main.ts` when extension side-effects are enabled. */
97
+ export const VIRTUAL_EXTENSION_IMPORTS = 'virtual:eclipse-docks-extension-imports';
98
+
99
+ const RESOLVED_VIRTUAL_EXTENSION_IMPORTS = `\0${VIRTUAL_EXTENSION_IMPORTS}`;
100
+
101
+ /** Unscoped `extension-*` or scoped `@namespace/extension-*` (any npm scope). */
102
+ const DEFAULT_EXTENSION_PATTERN = /^(?:@[^/]+\/)?extension-/;
103
+
104
+ const DEFAULT_PRIORITY_FIRST = ['@eclipse-docks/extension-pwa', 'extension-pwa'];
105
+
106
+ /** Matches Vite’s default app entry in index.html. */
107
+ const MAIN_TS_SCRIPT_RE =
108
+ /<script\b[^>]*\btype\s*=\s*["']module["'][^>]*\bsrc\s*=\s*["'][^"']*\/src\/main\.ts["'][^>]*>\s*<\/script>/i;
109
+
110
+ export interface ExtensionSideEffectsOptions {
111
+ /**
112
+ * When false, disables automatic extension side-effect imports. Omitted or true keeps them on.
113
+ */
114
+ enabled?: boolean;
115
+ /** Dependency names to skip (even if they match `packageNamePattern`). */
116
+ exclude?: string[];
117
+ /**
118
+ * Packages to load first, in order (only those present in dependencies are imported).
119
+ * Default includes PWA so `beforeinstallprompt` can register early.
120
+ */
121
+ priorityFirst?: string[];
122
+ /**
123
+ * Which direct `dependencies` keys qualify as Docks-style extensions (`extension-*`, with an optional npm scope).
124
+ * @default /^(?:@[^/]+\/)?extension-/
125
+ */
126
+ packageNamePattern?: RegExp;
127
+ }
128
+
129
+ export type ResolveDepVersionsPluginOptions = {
97
130
  includeDevDependencies?: boolean;
98
- }): Plugin {
131
+ /**
132
+ * By default, registers a virtual module that side-effect-imports every matching direct
133
+ * `dependencies` entry (see `ExtensionSideEffectsOptions`), and injects
134
+ * `import 'virtual:eclipse-docks-extension-imports'` into `index.html` **before** `/src/main.ts`.
135
+ * Pass `false` or `{ enabled: false }` to disable.
136
+ */
137
+ extensionSideEffects?: boolean | ExtensionSideEffectsOptions;
138
+ };
139
+
140
+ /** Normalized match options for {@link listExtensionSideEffectPackages}. */
141
+ export type ExtensionSideEffectsListOptions = {
142
+ exclude: Set<string>;
143
+ priorityFirst: string[];
144
+ pattern: RegExp;
145
+ };
146
+
147
+ function normalizeExtensionSideEffects(
148
+ opt: boolean | ExtensionSideEffectsOptions | undefined,
149
+ ): ExtensionSideEffectsListOptions | null {
150
+ if (opt === false) return null;
151
+ if (opt === undefined || opt === true) {
152
+ return {
153
+ exclude: new Set(),
154
+ priorityFirst: [...DEFAULT_PRIORITY_FIRST],
155
+ pattern: DEFAULT_EXTENSION_PATTERN,
156
+ };
157
+ }
158
+ if (opt.enabled === false) return null;
159
+ return {
160
+ exclude: new Set(opt.exclude ?? []),
161
+ priorityFirst: opt.priorityFirst ?? [...DEFAULT_PRIORITY_FIRST],
162
+ pattern: opt.packageNamePattern ?? DEFAULT_EXTENSION_PATTERN,
163
+ };
164
+ }
165
+
166
+ export function listExtensionSideEffectPackages(
167
+ dependencies: Record<string, string>,
168
+ sideEffects: ExtensionSideEffectsListOptions,
169
+ ): string[] {
170
+ const names = Object.keys(dependencies).filter(
171
+ (name) => sideEffects.pattern.test(name) && !sideEffects.exclude.has(name),
172
+ );
173
+ const prioritySet = new Set(sideEffects.priorityFirst);
174
+ const first = sideEffects.priorityFirst.filter((p) => names.includes(p));
175
+ const rest = names.filter((n) => !prioritySet.has(n)).sort((a, b) => a.localeCompare(b));
176
+ return [...first, ...rest];
177
+ }
178
+
179
+ export function resolveDepVersionsPlugin(
180
+ options?: ResolveDepVersionsPluginOptions,
181
+ ): Plugin {
182
+ let appRoot = process.cwd();
183
+ let extensionSideEffectsActive = false;
184
+ let extensionImportPackages: string[] = [];
185
+
99
186
  return {
100
187
  name: 'resolve-dep-versions',
101
188
  config(config) {
102
189
  const root = config.root ? path.resolve(config.root) : process.cwd();
103
190
  const info = resolvePackageInfo(root, options);
104
- const value = info ?? { name: '', version: '0.0.0', description: undefined, dependencies: {}, marketplaceCatalogUrls: undefined };
191
+ const value =
192
+ info ?? {
193
+ name: '',
194
+ version: '0.0.0',
195
+ description: undefined,
196
+ dependencies: {},
197
+ marketplaceCatalogUrls: undefined,
198
+ };
105
199
  return {
106
200
  define: {
107
201
  [RESOLVED_PACKAGE_INFO_KEY]: JSON.stringify(value),
108
202
  },
109
203
  };
110
204
  },
205
+ configResolved(config) {
206
+ appRoot = path.resolve(config.root ?? process.cwd());
207
+ const normalized = normalizeExtensionSideEffects(options?.extensionSideEffects);
208
+ extensionSideEffectsActive = normalized !== null;
209
+ if (!normalized) {
210
+ extensionImportPackages = [];
211
+ return;
212
+ }
213
+ const info = resolvePackageInfo(appRoot, options);
214
+ extensionImportPackages = listExtensionSideEffectPackages(
215
+ info?.dependencies ?? {},
216
+ normalized,
217
+ );
218
+ },
219
+ resolveId(id) {
220
+ if (id === VIRTUAL_EXTENSION_IMPORTS) {
221
+ return RESOLVED_VIRTUAL_EXTENSION_IMPORTS;
222
+ }
223
+ return undefined;
224
+ },
225
+ load(id) {
226
+ if (id !== RESOLVED_VIRTUAL_EXTENSION_IMPORTS) {
227
+ return null;
228
+ }
229
+ if (extensionImportPackages.length === 0) {
230
+ return 'export {};\n';
231
+ }
232
+ return extensionImportPackages.map((pkg) => `import ${JSON.stringify(pkg)};\n`).join('');
233
+ },
234
+ transformIndexHtml: {
235
+ order: 'pre',
236
+ handler(html) {
237
+ if (!extensionSideEffectsActive) {
238
+ return html;
239
+ }
240
+ if (extensionImportPackages.length === 0) {
241
+ return html;
242
+ }
243
+ if (html.includes(VIRTUAL_EXTENSION_IMPORTS)) {
244
+ return html;
245
+ }
246
+ if (!MAIN_TS_SCRIPT_RE.test(html)) {
247
+ return html;
248
+ }
249
+ const inject = `<script type="module">import ${JSON.stringify(VIRTUAL_EXTENSION_IMPORTS)};</script>\n`;
250
+ return html.replace(MAIN_TS_SCRIPT_RE, (match) => `${inject}${match}`);
251
+ },
252
+ },
111
253
  };
112
254
  }