Files
maka/apps/desktop/vite-bundled-packages.js
agent-radar 7be535059e
Dependency audit / audit (push) Canceled after 0s
CI / plan (push) Canceled after 0s
Gitoxide helper admission / macos-latest (push) Canceled after 0s
Gitoxide helper admission / ubuntu-latest (push) Canceled after 0s
Gitoxide helper admission / windows-latest (push) Canceled after 0s
Runtime Host peer admission / quality (push) Canceled after 0s
Windows recovery / windows_recovery (push) Canceled after 0s
CI / heavy (push) Canceled after 0s
CI / test (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 19:05:14 +08:00

68 lines
3.2 KiB
JavaScript

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// Records which npm packages the renderer bundle actually contains.
//
// The module graph sees direct and deep JS imports; the emitted assets carry
// the rest of the chain, which is how a package reached only through CSS
// (Fontsource, via its `.woff2` files) still lands here. What neither sees is
// a stylesheet that imports a package of pure rules: Vite inlines a CSS
// `@import` at transform time, so the imported file never becomes a module,
// and a package whose CSS emits no `url()` asset leaves no trace in this
// record. `validateFirstPartyCssImports` in the notice generator covers that
// case by reading the stylesheets themselves — stated here because the gap is
// invisible from this file, and the check that closes it lives elsewhere.
//
// The JSON ships inside `dist-renderer`, which lets the release verifier judge
// the packaged artifact by the artifact's own record.
export function bundledNpmPackagesPlugin() {
return {
name: 'maka-bundled-npm-packages',
apply: 'build',
generateBundle(_options, bundle) {
const packages = new Set();
const collect = (id) => {
// Virtual modules (\0-prefixed) are build-tool internals, not packages.
if (typeof id !== 'string' || id.startsWith('\0')) return;
// The last node_modules segment names the package that owns the file,
// even for nested installs (node_modules/a/node_modules/b/...).
const matches = [...id.matchAll(/[\\/]node_modules[\\/]((?:@[^\\/]+[\\/])?[^\\/]+)(?=[\\/])/g)];
if (matches.length === 0) return;
const name = matches[matches.length - 1][1].replaceAll('\\', '/');
if (name === '.vite') return;
packages.add(name);
};
for (const id of this.getModuleIds()) collect(id);
// CSS `@import` chains are inlined by the CSS pipeline and never become
// rollup modules, but the files they pull in (fonts, images) are emitted
// as assets that remember their source paths — that is how a package
// reachable only through CSS (Fontsource) still lands in this record.
for (const output of Object.values(bundle)) {
if (output.type !== 'asset') continue;
for (const original of output.originalFileNames ?? []) collect(original);
}
this.emitFile({
type: 'asset',
fileName: 'bundled-npm-packages.json',
source: `${JSON.stringify([...packages].sort(), null, 2)}\n`,
});
},
};
}