Skip to content

Commit af008dc

Browse files
authored
Merge pull request #247 from semantic-release/fix/asset-publish
Fix/asset-publish
2 parents c56dcaf + 59825fb commit af008dc

File tree

5 files changed

+75
-20
lines changed

5 files changed

+75
-20
lines changed

lib/publish.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export async function publish(
2929
const zipResult = config.withAssets
3030
? await execa(
3131
zipCommand,
32-
['-qjr', path.join(releaseDir, `assets.zip`), assetDir],
32+
['-qr', path.join(releaseDir, `assets.zip`), '.'],
3333
{
3434
cwd: assetDir,
3535
timeout: 30 * 1000,

package-lock.json

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"devDependencies": {
4747
"@babel/core": "7.24.7",
4848
"@babel/preset-env": "7.24.7",
49+
"@types/adm-zip": "^0.5.5",
4950
"@types/fs-extra": "11.0.4",
5051
"@types/jest": "29.5.12",
5152
"@types/node": "20.14.7",
@@ -54,6 +55,7 @@
5455
"@types/sinon": "17.0.3",
5556
"@typescript-eslint/eslint-plugin": "6.21.0",
5657
"@typescript-eslint/parser": "6.21.0",
58+
"adm-zip": "^0.5.16",
5759
"babel-jest": "29.7.0",
5860
"eslint": "8.56.0",
5961
"eslint-config-prettier": "9.1.0",

test/2-prepare-plugin.spec.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,17 +212,22 @@ describe('Package preparation - default work directory', () => {
212212
contexts.prepareContext,
213213
);
214214

215-
const assets = fs.readdirSync(path.join(releasePath, 'assets'));
215+
const assets = new Set(
216+
fs.readdirSync(path.join(releasePath, 'assets'), {
217+
recursive: true,
218+
}) as string[],
219+
);
216220

217-
expect(assets).toHaveLength(5);
218-
expect(assets.sort()).toStrictEqual(
219-
[
221+
expect([...assets]).toHaveLength(6);
222+
expect(assets).toEqual(
223+
new Set([
220224
'blueprints',
225+
'blueprints/blueprint.json',
221226
'banner-low.jpg',
222227
'banner-high.jpg',
223228
'screenshot-1.jpg',
224229
'screenshot-2.jpg',
225-
].sort(),
230+
]),
226231
);
227232
});
228233
});

test/3-publish-plugin.spec.ts

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { replaceVersions } from '../lib/utils/replace-versions.js';
88
import { success } from '../lib/success.js';
99
import SemanticReleaseError from '@semantic-release/error';
1010
import { publish } from '../lib/publish.js';
11+
import AdmZip, { IZipEntry } from 'adm-zip';
1112

1213
const pluginConfig: PluginConfig = {
1314
type: 'plugin',
@@ -21,12 +22,37 @@ const pluginConfig: PluginConfig = {
2122
workDir: 'publish',
2223
};
2324

24-
let releasePath: string;
25+
let wDir: string;
2526
const env = process.env;
2627

28+
function readZip(dir: string, file: string, pfx: RegExp = /.^/): Set<string> {
29+
return new Set(
30+
new AdmZip(path.join(dir, file))
31+
.getEntries()
32+
.map(({ entryName }) => entryName.replace(pfx, '').replace(/\/$/, ''))
33+
.filter((e) => e !== '' && (pfx.source == '.^' || !e.match(/\//))),
34+
);
35+
}
36+
37+
function readDir(
38+
root: string,
39+
dir: string,
40+
recursive: boolean = false,
41+
): Set<string> {
42+
return new Set(
43+
fs.readdirSync(path.join(root, dir), {
44+
recursive,
45+
}) as string[],
46+
);
47+
}
48+
49+
function readFile(root: string, file: string): string {
50+
return fs.readFileSync(path.join(root, file), 'utf8');
51+
}
52+
2753
beforeAll(async () => {
28-
releasePath = fs.mkdtempSync('/tmp/wp-release-');
29-
pluginConfig.releasePath = releasePath;
54+
wDir = fs.mkdtempSync('/tmp/wp-release-');
55+
pluginConfig.releasePath = wDir;
3056
});
3157

3258
beforeEach(() => {
@@ -51,28 +77,30 @@ afterEach(async () => {
5177
});
5278

5379
afterAll(async () => {
54-
fs.removeSync(releasePath);
80+
fs.removeSync(wDir);
5581
});
5682

5783
describe('Publish step', () => {
58-
it('Should package a complete plugin', async () => {
84+
it('Should zip a complete plugin properly', async () => {
5985
await prepare(pluginConfig, contexts.publishContext);
6086
await publish(pluginConfig, contexts.publishContext);
6187

62-
const distFolder = fs
63-
.readdirSync(path.join(releasePath, 'dist-test'))
64-
.join(' ');
88+
expect(readFile(path.join(wDir, 'dist-test'), 'readme.txt')).toMatch(
89+
/^Stable tag: 1.0.0$/gm,
90+
);
91+
expect(readZip(wDir, 'package.zip', /^dist-test\//)).toEqual(
92+
readDir(wDir, 'dist-test'),
93+
);
94+
expect(readZip(wDir, 'assets.zip')).toEqual(readDir(wDir, 'assets', true));
95+
expect(readFile(wDir, 'VERSION')).toEqual('1.0.0');
6596

66-
expect(distFolder).not.toContain('node_modules');
67-
expect(distFolder).toContain('vendor');
68-
expect(distFolder).toContain('dist-test.php');
69-
expect(distFolder).toContain('test1.php');
97+
// expect readZip(releasePath, 'assets.zip');
7098
});
7199

72100
it('Should should remove folders on success', async () => {
73101
await success(pluginConfig, contexts.publishContext);
74102

75-
const files = fs.readdirSync(releasePath).join(' ');
103+
const files = fs.readdirSync(wDir).join(' ');
76104

77105
expect(files).toContain('package.zip');
78106
expect(files).toContain('assets.zip');
@@ -85,7 +113,7 @@ describe('Publish step', () => {
85113
try {
86114
await prepare(pluginConfig, contexts.publishContext);
87115

88-
await fs.remove(path.join(releasePath, 'assets'));
116+
await fs.remove(path.join(wDir, 'assets'));
89117
await publish(pluginConfig, contexts.publishContext);
90118
} catch (err) {
91119
expect((err as SemanticReleaseError).code).toMatch(/(ENOENT|EZIP)/);

0 commit comments

Comments
 (0)