@bscotch/gamemaker-releases 0.3.1 → 0.4.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/README.md +13 -7
- package/dist/browser.d.ts +1 -6
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -6
- package/dist/browser.js.map +1 -1
- package/dist/releases.d.ts +50 -0
- package/dist/releases.d.ts.map +1 -0
- package/dist/releases.js +20 -0
- package/dist/releases.js.map +1 -0
- package/package.json +16 -17
- package/dist/feeds.test.d.ts +0 -2
- package/dist/feeds.test.d.ts.map +0 -1
- package/dist/feeds.test.js +0 -42
- package/dist/feeds.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -17,13 +17,19 @@ Latest releases document: https://github.com/bscotch/gamemaker-info/releases/lat
|
|
|
17
17
|
## Usage
|
|
18
18
|
|
|
19
19
|
```ts
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
|
|
20
|
+
import {
|
|
21
|
+
fetchReleasesSummaryWithNotes,
|
|
22
|
+
computeReleasesSummaryWithNotes
|
|
23
|
+
} from '@bscotch/gamemaker-releases';
|
|
24
|
+
|
|
25
|
+
// 🚀 Fetch the latest already-computed summary
|
|
26
|
+
// of all GameMaker releases:
|
|
27
|
+
const releases = await fetchReleasesSummaryWithNotes();
|
|
28
|
+
|
|
29
|
+
// 🐌 Freshly compile the centralized release summary.
|
|
30
|
+
// This can be useful if the pre-computed
|
|
31
|
+
// summary is out of date.
|
|
32
|
+
const releases = await computeReleasesSummaryWithNotes();
|
|
27
33
|
```
|
|
28
34
|
|
|
29
35
|
## Background Info
|
package/dist/browser.d.ts
CHANGED
|
@@ -4,10 +4,5 @@
|
|
|
4
4
|
export { ideFeedUrls, runtimeFeedUrls } from './urls.js';
|
|
5
5
|
export { gameMakerReleaseWithNotesSchema } from './feeds.types.js';
|
|
6
6
|
export type { ArtifactType, Channel, GameMakerRelease, GameMakerReleaseWithNotes, } from './feeds.types.js';
|
|
7
|
-
|
|
8
|
-
* This package is used to generate a releases object, stored
|
|
9
|
-
* as a JSON file for public download. The latest version of this
|
|
10
|
-
* releases object can be downloaded from this URL.
|
|
11
|
-
*/
|
|
12
|
-
export declare const releasesUrl = "https://github.com/bscotch/gamemaker-info/releases/latest/download/releases-summary.json";
|
|
7
|
+
export { releasesUrl } from './releases.js';
|
|
13
8
|
//# sourceMappingURL=browser.d.ts.map
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/browser.js
CHANGED
|
@@ -3,10 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { ideFeedUrls, runtimeFeedUrls } from './urls.js';
|
|
5
5
|
export { gameMakerReleaseWithNotesSchema } from './feeds.types.js';
|
|
6
|
-
|
|
7
|
-
* This package is used to generate a releases object, stored
|
|
8
|
-
* as a JSON file for public download. The latest version of this
|
|
9
|
-
* releases object can be downloaded from this URL.
|
|
10
|
-
*/
|
|
11
|
-
export const releasesUrl = 'https://github.com/bscotch/gamemaker-info/releases/latest/download/releases-summary.json';
|
|
6
|
+
export { releasesUrl } from './releases.js';
|
|
12
7
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AAOnE
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AAOnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This package is used to generate a releases object, stored
|
|
3
|
+
* as a JSON file for public download. The latest version of this
|
|
4
|
+
* releases object can be downloaded from this URL.
|
|
5
|
+
*/
|
|
6
|
+
export declare const releasesUrl = "https://github.com/bscotch/gamemaker-info/releases/latest/download/releases-summary.json";
|
|
7
|
+
/**
|
|
8
|
+
* Given a URL to an already-synthesized
|
|
9
|
+
* GameMaker Studio merged-releases feed,
|
|
10
|
+
* download the feed and return the list of
|
|
11
|
+
* releases.
|
|
12
|
+
*/
|
|
13
|
+
export declare function downloadGameMakerInfo(url?: string): Promise<{
|
|
14
|
+
ide: {
|
|
15
|
+
link?: string | undefined;
|
|
16
|
+
type: "ide" | "runtime";
|
|
17
|
+
channel: "lts" | "stable" | "beta" | "unstable";
|
|
18
|
+
version: string;
|
|
19
|
+
feedUrl: string;
|
|
20
|
+
publishedAt: string;
|
|
21
|
+
notesUrl: string;
|
|
22
|
+
notes: {
|
|
23
|
+
since: string | null;
|
|
24
|
+
groups: {
|
|
25
|
+
title: string;
|
|
26
|
+
changes: string[];
|
|
27
|
+
}[];
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
runtime: {
|
|
31
|
+
link?: string | undefined;
|
|
32
|
+
type: "ide" | "runtime";
|
|
33
|
+
channel: "lts" | "stable" | "beta" | "unstable";
|
|
34
|
+
version: string;
|
|
35
|
+
feedUrl: string;
|
|
36
|
+
publishedAt: string;
|
|
37
|
+
notesUrl: string;
|
|
38
|
+
notes: {
|
|
39
|
+
since: string | null;
|
|
40
|
+
groups: {
|
|
41
|
+
title: string;
|
|
42
|
+
changes: string[];
|
|
43
|
+
}[];
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
channel: "lts" | "stable" | "beta" | "unstable";
|
|
47
|
+
summary: string;
|
|
48
|
+
publishedAt: string;
|
|
49
|
+
}[]>;
|
|
50
|
+
//# sourceMappingURL=releases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releases.d.ts","sourceRoot":"","sources":["../src/releases.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,WAAW,6FACoE,CAAC;AAE7F;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,SAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAM5D"}
|
package/dist/releases.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { gameMakerReleaseWithNotesSchema } from './feeds.types.js';
|
|
3
|
+
import { fetchJson } from './fetch.js';
|
|
4
|
+
/**
|
|
5
|
+
* This package is used to generate a releases object, stored
|
|
6
|
+
* as a JSON file for public download. The latest version of this
|
|
7
|
+
* releases object can be downloaded from this URL.
|
|
8
|
+
*/
|
|
9
|
+
export const releasesUrl = 'https://github.com/bscotch/gamemaker-info/releases/latest/download/releases-summary.json';
|
|
10
|
+
/**
|
|
11
|
+
* Given a URL to an already-synthesized
|
|
12
|
+
* GameMaker Studio merged-releases feed,
|
|
13
|
+
* download the feed and return the list of
|
|
14
|
+
* releases.
|
|
15
|
+
*/
|
|
16
|
+
export async function downloadGameMakerInfo(url = releasesUrl) {
|
|
17
|
+
const releases = await fetchJson(url, z.array(gameMakerReleaseWithNotesSchema));
|
|
18
|
+
return releases;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=releases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releases.js","sourceRoot":"","sources":["../src/releases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,0FAA0F,CAAC;AAE7F;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAG,GAAG,WAAW;IAC3D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,GAAG,EACH,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CACzC,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bscotch/gamemaker-releases",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Utility for combining GameMaker release data into a single feed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gamemaker",
|
|
@@ -37,33 +37,32 @@
|
|
|
37
37
|
},
|
|
38
38
|
"main": "dist/index.js",
|
|
39
39
|
"types": "dist/index.d.ts",
|
|
40
|
-
"scripts": {
|
|
41
|
-
"build": "tsc --build",
|
|
42
|
-
"clean": "rimraf build dist",
|
|
43
|
-
"test": "mocha --config ../../config/.mocharc.cjs",
|
|
44
|
-
"test:dev": "mocha --config ../../config/.mocharc.cjs --forbid-only=false --parallel=false --timeout=9999999999",
|
|
45
|
-
"watch": "tsc --build --watch"
|
|
46
|
-
},
|
|
47
40
|
"dependencies": {
|
|
48
|
-
"@bscotch/pathy": "^2.
|
|
49
|
-
"@bscotch/utility": "^6.
|
|
41
|
+
"@bscotch/pathy": "^2.6.0",
|
|
42
|
+
"@bscotch/utility": "^6.8.0",
|
|
50
43
|
"entities": "^4.4.0",
|
|
51
|
-
"fast-xml-parser": "^4.
|
|
44
|
+
"fast-xml-parser": "^4.1.2",
|
|
52
45
|
"node-fetch": "^3.3.0",
|
|
53
|
-
"tslib": "^2.
|
|
54
|
-
"zod": "^3.
|
|
46
|
+
"tslib": "^2.5.0",
|
|
47
|
+
"zod": "^3.20.6"
|
|
55
48
|
},
|
|
56
49
|
"devDependencies": {
|
|
57
50
|
"@types/chai": "^4",
|
|
58
51
|
"@types/mocha": "^10.0.1",
|
|
59
52
|
"@types/rimraf": "^3",
|
|
60
53
|
"chai": "^4.3.7",
|
|
61
|
-
"mocha": "^10.
|
|
62
|
-
"rimraf": "^
|
|
63
|
-
"typescript": "^4.9.
|
|
54
|
+
"mocha": "^10.2.0",
|
|
55
|
+
"rimraf": "^4.1.2",
|
|
56
|
+
"typescript": "^4.9.5"
|
|
64
57
|
},
|
|
65
|
-
"packageManager": "yarn@3.2.4",
|
|
66
58
|
"publishConfig": {
|
|
67
59
|
"access": "public"
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsc --build",
|
|
63
|
+
"clean": "rimraf build dist",
|
|
64
|
+
"test": "mocha --config ../../config/.mocharc.cjs",
|
|
65
|
+
"test:dev": "mocha --config ../../config/.mocharc.cjs --forbid-only=false --parallel=false --timeout=9999999999",
|
|
66
|
+
"watch": "tsc --build --watch"
|
|
68
67
|
}
|
|
69
68
|
}
|
package/dist/feeds.test.d.ts
DELETED
package/dist/feeds.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feeds.test.d.ts","sourceRoot":"","sources":["../src/feeds.test.ts"],"names":[],"mappings":""}
|
package/dist/feeds.test.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { pathy } from '@bscotch/pathy';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
|
-
import { cleanNote } from './notes.js';
|
|
4
|
-
import { listReleases, listReleasesWithNotes } from './feeds.js';
|
|
5
|
-
import { rawReleaseNotesCacheSchema } from './feeds.types.js';
|
|
6
|
-
const notesCache = pathy('release-notes-cache.json').withValidator(rawReleaseNotesCacheSchema);
|
|
7
|
-
const tmpSummaryPath = pathy('releases-summary.json');
|
|
8
|
-
const sampleReleaseNotesPath = pathy('samples/release_notes.json');
|
|
9
|
-
describe('Release Feeds', function () {
|
|
10
|
-
it('can parse runtime release_notes HTML', async function () {
|
|
11
|
-
const notes = (await sampleReleaseNotesPath.read());
|
|
12
|
-
const cleaned = cleanNote({
|
|
13
|
-
type: 'runtime',
|
|
14
|
-
version: '2022.1100.0.259',
|
|
15
|
-
url: 'https://gms.yoyogames.com/release-notes-2022.1100.0.259.json',
|
|
16
|
-
...notes,
|
|
17
|
-
});
|
|
18
|
-
expect(cleaned.title).to.equal('Changes Since Beta Runtime 258');
|
|
19
|
-
expect(cleaned.changes.groups).to.exist;
|
|
20
|
-
expect(cleaned.changes.groups.length).to.be.greaterThan(0);
|
|
21
|
-
expect(cleaned.changes.since).to.equal('258');
|
|
22
|
-
expect(cleaned.changes.groups[0].title).to.equal('Other Bugs Fixed');
|
|
23
|
-
expect(cleaned.changes.groups[0].changes.length).to.equal(2);
|
|
24
|
-
});
|
|
25
|
-
it('can create a centralized GameMaker Releases database', async function () {
|
|
26
|
-
const releases = await listReleases();
|
|
27
|
-
const withNotes = await listReleasesWithNotes(releases, notesCache);
|
|
28
|
-
await tmpSummaryPath.write(withNotes);
|
|
29
|
-
expect(withNotes.length).to.be.greaterThan(0);
|
|
30
|
-
expect(withNotes.every((r) => r.channel)).to.exist;
|
|
31
|
-
for (const type of ['ide', 'runtime']) {
|
|
32
|
-
expect(withNotes.every((r) => r[type])).to.exist;
|
|
33
|
-
expect(withNotes.every((r) => r[type].version)).to.exist;
|
|
34
|
-
expect(withNotes.every((r) => r[type].notes)).to.exist;
|
|
35
|
-
expect(withNotes.every((r) => r[type].notes.groups)).to.exist;
|
|
36
|
-
}
|
|
37
|
-
const sampleRelease = withNotes.find((r) => r.runtime.version === '2022.1100.0.259');
|
|
38
|
-
expect(sampleRelease.runtime.notes.groups).to.exist;
|
|
39
|
-
expect(sampleRelease.runtime.notes.groups.length).to.be.greaterThan(0);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
//# sourceMappingURL=feeds.test.js.map
|
package/dist/feeds.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feeds.test.js","sourceRoot":"","sources":["../src/feeds.test.ts"],"names":[],"mappings":"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"}
|