Skip to content

Commit 093c743

Browse files
committed
feat: import meta.js directly
1 parent b2c0b1d commit 093c743

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

.editorconfig

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,4 @@ end_of_line = lf
88
charset = utf-8
99
trim_trailing_whitespace = true
1010
insert_final_newline = true
11-
12-
[*.md]
13-
trim_trailing_whitespace = false
11+
quote_type = single

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ import userscript from 'rollup-plugin-userscript';
1717

1818
const plugins = [
1919
// ...
20-
userscript(
21-
path.resolve('src/meta.js'),
22-
meta => meta
23-
.replace('process.env.VERSION', pkg.version)
24-
.replace('process.env.AUTHOR', pkg.author),
25-
),
20+
userscript(meta => meta.replace('process.env.AUTHOR', pkg.author)),
2621
];
2722
```
23+
24+
Import the metadata file with a suffix `?userscript-metadata` in your script:
25+
26+
```js
27+
import './meta.js?userscript-metadata';
28+
```

src/index.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1-
import { promises as fs } from 'fs';
1+
import { readFile } from 'fs/promises';
22
import { collectGmApi, getMetadata } from './util';
33

4-
export default (metafile, transform) => {
4+
const suffix = '?userscript-metadata';
5+
6+
export default (transform) => {
7+
const metadataMap = new Map();
58
const grantMap = new Map();
69
return {
710
name: 'userscript-metadata',
8-
buildStart() {
9-
this.addWatchFile(metafile);
11+
async resolveId(source, importer, options) {
12+
if (source.endsWith(suffix)) {
13+
const { id } = await this.resolve(source, importer, options);
14+
metadataMap.set(importer, id.slice(0, -suffix.length));
15+
}
16+
},
17+
load(id) {
18+
if (id.endsWith(suffix)) {
19+
return '';
20+
}
1021
},
1122
transform(code, id) {
1223
const ast = this.parse(code);
@@ -17,8 +28,14 @@ export default (metafile, transform) => {
1728
* Use `renderChunk` instead of `banner` to preserve the metadata after minimization.
1829
* Note that this plugin must be put after `@rollup/plugin-terser`.
1930
*/
20-
async renderChunk(code) {
21-
const meta = await fs.readFile(metafile, 'utf8');
31+
async renderChunk(code, chunk) {
32+
const metadataFile =
33+
chunk.isEntry &&
34+
[chunk.facadeModuleId, ...Object.keys(chunk.modules)]
35+
.map((id) => metadataMap.get(id))
36+
.find(Boolean);
37+
if (!metadataFile) return;
38+
let metadata = await readFile(metadataFile, 'utf8');
2239
const grantSet = new Set();
2340
for (const id of this.getModuleIds()) {
2441
const grantSetPerFile = grantMap.get(id);
@@ -28,7 +45,7 @@ export default (metafile, transform) => {
2845
}
2946
}
3047
}
31-
let metadata = getMetadata(meta, grantSet);
48+
metadata = getMetadata(metadata, grantSet);
3249
if (transform) metadata = transform(metadata);
3350
return `${metadata}\n\n${code}`;
3451
},

0 commit comments

Comments
 (0)