resuml 1.20.1 → 1.21.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resuml",
3
- "version": "1.20.1",
3
+ "version": "1.21.0",
4
4
  "description": "Generate JSON resumes from YAML with theme support",
5
5
  "type": "module",
6
6
  "main": "./dist/api.js",
@@ -49,6 +49,9 @@
49
49
  "@dnd-kit/utilities": "^3.2.2",
50
50
  "@jsonresume/schema": "^1.0.0",
51
51
  "@modelcontextprotocol/sdk": "^1.29.0",
52
+ "@sparticuz/chromium": "^147.0.2",
53
+ "@vercel/analytics": "^2.0.1",
54
+ "@vercel/speed-insights": "^2.0.0",
52
55
  "ajv": "^8.12.0",
53
56
  "chalk": "^5.3.0",
54
57
  "commander": "^11.1.0",
@@ -59,9 +62,10 @@
59
62
  "jsonresume-theme-kendall": "^0.2.0",
60
63
  "jsonresume-theme-paper": "^0.5.0",
61
64
  "jsonresume-theme-react": "^1.0.4",
62
- "jsonresume-theme-stackoverflow": "^2.1.0",
65
+ "jsonresume-theme-stackoverflow": "^3.1.2",
63
66
  "lodash.merge": "^4.6.2",
64
67
  "lucide-react": "^1.7.0",
68
+ "playwright-core": "^1.59.1",
65
69
  "react": "^19.1.0",
66
70
  "react-dom": "^19.1.0",
67
71
  "tar": "^7.5.13",
@@ -1089,10 +1089,24 @@ async function main() {
1089
1089
  }
1090
1090
  }
1091
1091
 
1092
- // Write manifest
1093
- writeFileSync(resolve(THEMES_DIR, 'manifest.json'), JSON.stringify(manifest, null, 2));
1092
+ // Write manifest. When the run is scoped (e.g. --themes=stackoverflow) we
1093
+ // merge into the existing manifest instead of replacing it. Otherwise a
1094
+ // targeted rebuild of one theme would wipe the other 400 entries and the
1095
+ // theme picker would hide everything it can no longer find.
1096
+ const manifestPath = resolve(THEMES_DIR, 'manifest.json');
1097
+ const isScoped = themesArg !== undefined;
1098
+ let finalManifest = manifest;
1099
+ if (isScoped && existsSync(manifestPath)) {
1100
+ const existing = JSON.parse(readFileSync(manifestPath, 'utf8'));
1101
+ const touched = new Set(manifest.map((t) => t.name));
1102
+ finalManifest = [
1103
+ ...existing.filter((t) => !touched.has(t.name)),
1104
+ ...manifest,
1105
+ ].sort((a, b) => a.name.localeCompare(b.name));
1106
+ }
1107
+ writeFileSync(manifestPath, JSON.stringify(finalManifest, null, 2));
1094
1108
 
1095
- const successful = manifest.filter(t => t.browserCompatible).length;
1109
+ const successful = finalManifest.filter(t => t.browserCompatible).length;
1096
1110
  const snapshots = manifest.filter(t => t.hasSnapshot).length;
1097
1111
  console.log(`\nāœ… Done! ${successful}/${manifest.length} themes bundled, ${snapshots} snapshots generated`);
1098
1112
  console.log(`šŸ“ Output: docs/themes/`);