Skip to content

Commit 0e03306

Browse files
committed
use vsce --pre-release to publish pre-release builds
1 parent e223c8c commit 0e03306

File tree

7 files changed

+670
-268
lines changed

7 files changed

+670
-268
lines changed

.github/workflows-source/ci.yaml

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ on:
3030
- name: Setup Node
3131
uses: actions/setup-node@v2
3232
with:
33-
node-version: '14'
33+
node-version: "14"
3434

3535
.pnpm: &pnpm
3636
- name: Setup PNPM
3737
uses: pnpm/[email protected]
3838
with:
39-
version: '6.2.5'
39+
version: "6.2.5"
4040
run_install: |
4141
- recursive: true
4242
args: [--frozen-lockfile]
@@ -52,7 +52,7 @@ on:
5252
uses: actions/download-artifact@v2
5353
with:
5454
name: build-artefact
55-
path: '.'
55+
path: "."
5656

5757
concurrency:
5858
group: build-${{ github.ref }}
@@ -81,11 +81,11 @@ jobs:
8181
strategy:
8282
matrix:
8383
os: [ubuntu-latest, windows-latest]
84-
node_version: ['12', '14']
84+
node_version: ["12", "14"]
8585
include:
8686
- os: ubuntu-latest
87-
node: '14'
88-
command: 'coverage'
87+
node: "14"
88+
command: "coverage"
8989
runs-on: ${{ matrix.os }}
9090
name: Node ${{ matrix.node_version }} on ${{ matrix.os }}
9191
continue-on-error: ${{ startsWith(github.event.head_commit.message, 'release:') }}
@@ -106,41 +106,30 @@ jobs:
106106
with:
107107
file: ./coverage/coverage-final.json
108108

109-
insiders:
110-
name: Insiders Release
109+
pre-release:
110+
name: Pre-release
111111
runs-on: ubuntu-latest
112-
environment:
113-
name: Insiders
114-
url: https://marketplace.visualstudio.com/items?itemName=znck.preview-insiders
115112
needs: unit
116113
concurrency:
117-
group: insiders
114+
group: pre-release
118115
cancel-in-progress: true
119116
steps:
120117
- *setup
121118
- *download
122-
- name: Publish Insiders Extension
119+
- name: Publish Pre-release Extension
123120
run: |
124-
pnpm recursive --filter ./extension run release
121+
pnpm recursive --filter ./extension run build
122+
pnpm recursive --filter ./extension run pre-release
125123
env:
126-
RELEASE_CHANNEL: insiders
124+
RELEASE_CHANNEL: pre-release
127125
VSCODE_MARKETPLACE_TOKEN: ${{ secrets.VSCODE_MARKETPLACE_TOKEN }}
128-
- name: Publish Insiders Packages
126+
- name: Publish Pre-release Packages
129127
run: |
130128
echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > .npmrc
131-
pnpm recursive --filter ./packages exec -- npm version prerelease --preid=insiders-$(date +%s)
132-
pnpm recursive --filter ./packages publish --tag insiders --access public --no-git-checks
129+
pnpm recursive --filter ./packages exec -- npm version prerelease --preid=next-$(date +%s)
130+
pnpm recursive --filter ./packages publish --tag next --access public --no-git-checks
133131
env:
134132
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
135-
- uses: 'marvinpinto/action-automatic-releases@latest'
136-
with:
137-
repo_token: '${{ secrets.GITHUB_TOKEN }}'
138-
automatic_release_tag: 'insiders'
139-
prerelease: true
140-
files: |
141-
extension/CHANGELOG.md
142-
extension/preview.vsix
143-
packages/*/CHANGELOG.md
144133

145134
check_release:
146135
name: Check Release
@@ -175,13 +164,12 @@ jobs:
175164
env:
176165
VSCODE_MARKETPLACE_TOKEN: ${{ secrets.VSCODE_MARKETPLACE_TOKEN }}
177166
continue-on-error: true
178-
- uses: 'marvinpinto/action-automatic-releases@latest'
167+
- uses: "marvinpinto/action-automatic-releases@latest"
179168
with:
180-
repo_token: '${{ secrets.GITHUB_TOKEN }}'
181-
automatic_release_tag: 'latest'
169+
repo_token: "${{ secrets.GITHUB_TOKEN }}"
170+
automatic_release_tag: "latest"
182171
prerelease: false
183172
files: |
184173
extension/CHANGELOG.md
185174
extension/preview.vsix
186175
packages/*/CHANGELOG.md
187-

extension/LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2020 Rahul Kadyan
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

extension/package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
22
"private": true,
3-
"version": "0.4.0",
3+
"version": "0.4.1",
44
"name": "preview",
55
"publisher": "znck",
6-
"displayName": "Preview - VueDX",
6+
"displayName": "Preview",
7+
"description": "A storyboarding and prototyping tool for Vue.",
78
"main": "dist/extension.js",
89
"icon": "logo.png",
910
"buildConfig": {
@@ -135,22 +136,21 @@
135136
"znck.vue"
136137
],
137138
"engines": {
138-
"vscode": "^1.52.0"
139+
"vscode": "^1.63.0"
139140
},
140141
"devDependencies": {
141142
"@types/node": "^14.14.22",
142143
"@types/node-fetch": "^2.5.8",
143-
"@types/vscode": "^1.52.0",
144+
"@types/vscode": "^1.63.0",
144145
"@vuedx/preview": "workspace:*",
145146
"get-port": "^5.1.1",
146-
"node-fetch": "^2.6.1",
147-
"vsce": "^1.84.0"
147+
"node-fetch": "^3.2.0",
148+
"semver": "^7.3.5",
149+
"vsce": "^2.6.7"
148150
},
149151
"scripts": {
150-
"prerelease": "npm run bundle",
152+
"build": "node scripts/build.mjs",
151153
"release": "vsce publish -p ${VSCODE_MARKETPLACE_TOKEN} --packagePath ./preview.vsix",
152-
"prebundle": "node scripts/prepare",
153-
"bundle": "vsce package --out preview.vsix",
154-
"postbundle": "node scripts/revert"
154+
"pre-release": "vsce publish --pre-release -p ${VSCODE_MARKETPLACE_TOKEN} --packagePath ./preview.vsix"
155155
}
156156
}

extension/scripts/build.mjs

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import { execSync } from 'child_process';
2+
import fetch, { Headers } from 'node-fetch';
3+
import FS from 'node:fs';
4+
import Path from 'node:path';
5+
import semver from 'semver';
6+
import { fileURLToPath } from 'url';
7+
8+
/**
9+
* @param {string} itemName
10+
*/
11+
async function findLatestVersion(itemName) {
12+
const response = await fetch(
13+
'https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery',
14+
{
15+
method: 'POST',
16+
headers: new Headers({
17+
Accept: 'application/json;api-version=7.1-preview.1;excludeUrls=true',
18+
'Content-Type': 'application/json',
19+
}),
20+
body: JSON.stringify({
21+
assetTypes: null,
22+
filters: [
23+
{
24+
criteria: [{ filterType: 7, value: itemName }],
25+
direction: 2,
26+
pageSize: 100,
27+
pageNumber: 1,
28+
sortBy: 0,
29+
sortOrder: 0,
30+
pagingToken: null,
31+
},
32+
],
33+
flags: 2151,
34+
}),
35+
}
36+
);
37+
38+
const body =
39+
/** @type {{results: Array<{extensions: Array<{versions: Array<{version: string}>}>}>}} */ (
40+
await response.json()
41+
);
42+
43+
const extension = body.results
44+
.flatMap((result) => result.extensions)
45+
.find((extension) => extension != null);
46+
47+
if (extension != null) return extension.versions[0]?.version;
48+
49+
return undefined;
50+
}
51+
52+
const fileNames = ['package.json'];
53+
export function getDir() {
54+
const arg = process.argv[2] ?? process.cwd();
55+
const dir = Path.isAbsolute(arg) ? arg : Path.resolve(process.cwd(), arg);
56+
return dir;
57+
}
58+
59+
/**
60+
* @param {string} dir
61+
*/
62+
function backup(dir) {
63+
for (const fileName of fileNames) {
64+
const file = Path.resolve(dir, fileName);
65+
const fileBak = Path.resolve(dir, `${fileName}.bak`);
66+
67+
FS.writeFileSync(fileBak, FS.readFileSync(file, 'utf-8'));
68+
}
69+
}
70+
71+
/**
72+
* @param {string} dir
73+
*/
74+
function revert(dir) {
75+
for (const fileName of fileNames) {
76+
const file = Path.resolve(dir, fileName);
77+
const fileBak = Path.resolve(dir, `${fileName}.bak`);
78+
79+
if (FS.existsSync(fileBak)) {
80+
FS.writeFileSync(file, FS.readFileSync(fileBak, 'utf-8'));
81+
FS.unlinkSync(fileBak);
82+
}
83+
}
84+
}
85+
86+
/**
87+
* @param {string} current
88+
* @param {string} [latest]
89+
*/
90+
function getNextPreReleaseVersion(current, latest) {
91+
let target = current;
92+
const v1 = semver.parse(current);
93+
const v2 = semver.parse(latest);
94+
95+
if (v1 == null) return semver.inc(target, 'minor');
96+
if (v2 == null || latest == null) {
97+
return semver.inc(target, v1.minor % 2 === 0 ? 'minor' : 'patch');
98+
}
99+
100+
if (v2.compare(v1) > 0) target = latest;
101+
102+
return semver.inc(target, semver.minor(target) % 2 === 0 ? 'minor' : 'patch');
103+
}
104+
105+
/**
106+
*
107+
* @param {string} dir
108+
*/
109+
async function transform(dir) {
110+
const pkg = JSON.parse(FS.readFileSync(`${dir}/package.json`, 'utf-8'));
111+
const RELEASE_CHANNEL = /** @type {'release'|'pre-release'} */ (
112+
process.env['RELEASE_CHANNEL'] ?? 'release'
113+
);
114+
115+
delete pkg.dependencies;
116+
delete pkg.devDependencies;
117+
118+
if (RELEASE_CHANNEL === 'pre-release') {
119+
pkg['pre-release'] = true;
120+
pkg.version = getNextPreReleaseVersion(
121+
pkg.version,
122+
await findLatestVersion(`${pkg.publisher}.${pkg.name}`)
123+
);
124+
console.debug('Setting version to', pkg.version);
125+
} else {
126+
if (Array.isArray(pkg.contributions?.jsonValidation)) {
127+
pkg.contributions.jsonValidation[0].url = `https://unpkg.com/@vuedx/projectconfig@${pkg.version}/schema.json`;
128+
}
129+
}
130+
131+
const packageFile = Path.resolve(dir, 'package.json');
132+
133+
FS.writeFileSync(packageFile, JSON.stringify(pkg, null, 2));
134+
}
135+
136+
/**
137+
* @param {string} dir
138+
* @param {() => void} fn
139+
*/
140+
async function prepareExtensionForPackaging(dir, fn) {
141+
try {
142+
backup(dir);
143+
await transform(dir);
144+
fn();
145+
} finally {
146+
revert(dir);
147+
}
148+
}
149+
150+
const __dirname = Path.dirname(fileURLToPath(import.meta.url));
151+
const dir = Path.resolve(__dirname, '..');
152+
prepareExtensionForPackaging(dir, () => {
153+
const execArgs = { stdio: [0, 1, 2], cwd: dir };
154+
const RELEASE_CHANNEL = /** @type {'release'|'pre-release'} */ (
155+
process.env['RELEASE_CHANNEL'] ?? 'release'
156+
);
157+
const args = RELEASE_CHANNEL === 'pre-release' ? '--pre-release' : '';
158+
159+
execSync(`$(pnpm bin)/vsce package --no-dependencies ${args} --out preview.vsix`, execArgs);
160+
});

extension/scripts/prepare.js

Lines changed: 0 additions & 22 deletions
This file was deleted.

extension/scripts/revert.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)