@@ -45,13 +45,80 @@ jobs:
45
45
46
46
- name : Build
47
47
working-directory : kubernetes-models-ts
48
- run : pnpm build
48
+ run : pnpm build -- --filter @kubernetes-models/crd-generate
49
49
50
- - name : Rewrite package.json for publish
50
+ - name : Rewrite package.json for publish (rename + resolve workspace deps via pnpm)
51
51
working-directory : kubernetes-models-ts
52
52
shell : bash
53
53
run : |
54
- node -e "const fs=require('fs'); const p='utils/crd-generate/package.json'; const j=JSON.parse(fs.readFileSync(p,'utf8')); j.name='@crossplane-js/kubernetes-models-crd-generate'; j.publishConfig={...(j.publishConfig||{}), access:'public'}; if (j.private) delete j.private; fs.writeFileSync(p, JSON.stringify(j,null,2)+'\n');"
54
+ node - <<'NODE'
55
+ const fs = require('fs');
56
+ const path = require('path');
57
+ const cp = require('child_process');
58
+
59
+ const root = process.cwd();
60
+ const pkgPath = path.join('utils', 'crd-generate', 'package.json');
61
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
62
+
63
+ // Rename and ensure publishable
64
+ pkg.name = '@crossplane-js/kubernetes-models-crd-generate';
65
+ pkg.publishConfig = { ...(pkg.publishConfig || {}), access: 'public' };
66
+ if (pkg.private) delete pkg.private;
67
+
68
+ // Use pnpm to list all workspaces once
69
+ const out = cp.execSync('pnpm ls -r --depth -1 --json', { encoding: 'utf8' });
70
+ const list = JSON.parse(out);
71
+ const versions = new Map();
72
+ for (const p of list) {
73
+ if (p && p.name && p.version) versions.set(p.name, p.version);
74
+ }
75
+
76
+ const depSets = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
77
+
78
+ function mapWorkspaceSpecifier(spec, version) {
79
+ const s = spec.replace(/^workspace:/, '').trim();
80
+ if (s === '^') return '^' + version;
81
+ if (s === '~') return '~' + version;
82
+ if (s === '' || s === '*') return version;
83
+ if (s.startsWith('^')) return '^' + version;
84
+ if (s.startsWith('~')) return '~' + version;
85
+ return version;
86
+ }
87
+
88
+ const unresolved = [];
89
+ for (const set of depSets) {
90
+ const deps = pkg[set];
91
+ if (!deps) continue;
92
+ for (const [name, spec] of Object.entries(deps)) {
93
+ if (typeof spec === 'string' && spec.startsWith('workspace:')) {
94
+ const v = versions.get(name);
95
+ if (!v) {
96
+ unresolved.push(name);
97
+ } else {
98
+ deps[name] = mapWorkspaceSpecifier(spec, v);
99
+ }
100
+ }
101
+ }
102
+ }
103
+
104
+ if (unresolved.length) {
105
+ console.error('ERROR: Could not resolve workspace versions for:', unresolved.join(', '));
106
+ process.exit(1);
107
+ }
108
+
109
+ // Suffix version with commit and run identifiers (semver prerelease)
110
+ const base = (pkg.version || '0.0.0').split('-')[0];
111
+ const shortSha = cp.execSync('git rev-parse --short=12 HEAD', { encoding: 'utf8' }).trim();
112
+ const runNum = process.env.GITHUB_RUN_NUMBER || '0';
113
+ const runAttempt = process.env.GITHUB_RUN_ATTEMPT || '1';
114
+ const suffix = `sha.${shortSha}.r${runNum}.a${runAttempt}`;
115
+ pkg.version = `${base}-${suffix}`;
116
+
117
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
118
+ console.log('Rewrote workspace dependencies to monorepo versions for', pkgPath);
119
+ console.log('Final version:', pkg.version);
120
+ NODE
121
+
55
122
echo "Updated package.json:"
56
123
cat utils/crd-generate/package.json
57
124
0 commit comments