Skip to content

build: Release #2522

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 35 commits into from
Mar 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
fbd5610
docs: Remove beta badge (#2473)
mtrezza Mar 2, 2025
fef72e3
ci: Add type definition check (#2462)
dplewis Mar 3, 2025
60c8398
refactor: Bump core-js from 3.40.0 to 3.41.0 (#2478)
dependabot[bot] Mar 5, 2025
08e43ba
feat: Allow `Parse.Object` field names to begin with underscore `_` t…
dplewis Mar 5, 2025
539342e
chore(release): 6.1.0-alpha.1 [skip ci]
semantic-release-bot Mar 5, 2025
6d33b19
refactor: Bump @eslint/js from 9.18.0 to 9.21.0 (#2477)
dependabot[bot] Mar 5, 2025
539ba2a
refactor: Add initial generic type definitions (#2485)
dplewis Mar 8, 2025
e7d12ae
refactor: Add more types to pass all type definition tests (#2486)
dplewis Mar 8, 2025
87195ab
refactor: Add ability to watch typescript definition changes (#2489)
dplewis Mar 9, 2025
e6dc1b5
refactor: Bump typescript-eslint from 8.25.0 to 8.26.0 (#2481)
dependabot[bot] Mar 9, 2025
2ead3f3
feat: Add `Parse.Query` option `useMaintenanceKey` (#2484)
dplewis Mar 10, 2025
1b9560b
chore(release): 6.1.0-alpha.2 [skip ci]
semantic-release-bot Mar 10, 2025
7f94a0e
refactor: Bump eslint from 9.21.0 to 9.22.0 (#2493)
dependabot[bot] Mar 11, 2025
23709b0
refactor: Bump @eslint/js from 9.21.0 to 9.22.0 (#2492)
dependabot[bot] Mar 11, 2025
43cba58
refactor: Bump @babel/runtime-corejs3 from 7.26.9 to 7.26.10 (#2497)
dependabot[bot] Mar 12, 2025
478147c
test: Prevent test timeout error by properly closing server (#2490)
dplewis Mar 12, 2025
cfe18f5
refactor: Bump @babel/core from 7.26.9 to 7.26.10 (#2500)
dependabot[bot] Mar 14, 2025
460a096
refactor: Bump eslint-plugin-jsdoc from 50.6.3 to 50.6.6 (#2496)
dependabot[bot] Mar 14, 2025
fb5b69e
refactor: Bump @babel/plugin-transform-runtime from 7.26.9 to 7.26.10…
dependabot[bot] Mar 14, 2025
85e17de
refactor: Bump lint-staged from 15.4.3 to 15.5.0 (#2504)
dependabot[bot] Mar 14, 2025
069740c
test: Fix flaky tests (#2506)
dplewis Mar 14, 2025
1dd1b1d
refactor: Remove `module.exports` in favor of `export default` (#2499)
dplewis Mar 16, 2025
8e9750d
refactor: Bump puppeteer from 24.2.1 to 24.4.0 (#2482)
dependabot[bot] Mar 16, 2025
fc3e573
feat: Publish TypeScript definitions (#2491)
dplewis Mar 16, 2025
fe52f7a
chore(release): 6.1.0-alpha.3 [skip ci]
semantic-release-bot Mar 16, 2025
0c47905
ci: Add auto-PR (#2509)
mtrezza Mar 17, 2025
02ec706
ci: Fix auto-pr (#2510)
mtrezza Mar 17, 2025
0015c5c
ci: Fix auto-pr (#2511)
mtrezza Mar 17, 2025
92ceb4b
ci: Fix auto-pr (#2512)
mtrezza Mar 17, 2025
71b90da
ci: Fix auto-pr (#2513)
mtrezza Mar 17, 2025
70011f1
ci: Fix auto-pr (#2514)
mtrezza Mar 17, 2025
057acd2
ci: fix auto-pr (#2516)
mtrezza Mar 17, 2025
961a581
ci: Fix auto pr (#2518)
mtrezza Mar 17, 2025
19c3e0a
ci: Fix auto-pr (#2520)
mtrezza Mar 17, 2025
23aff47
empty commit to trigger CI
github-actions[bot] Mar 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ jobs:
with:
cache: npm
- run: npm ci
- name: Build Types
run: npm run build:types
- name: Type Definition Check
run: npm run ci:typecheck
- name: Test Types
run: npm run test:types 2>&1 | tee silent.txt;
run: npm run test:types
check-docs:
name: Check Docs
timeout-minutes: 10
Expand Down
56 changes: 56 additions & 0 deletions .github/workflows/release-prepare-monthly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: release-prepare-monthly
on:
schedule:
# Runs at midnight UTC on the 1st of every month
- cron: '0 0 1 * *'
workflow_dispatch:
jobs:
create-release-pr:
runs-on: ubuntu-latest
steps:
- name: Check if running on the original repository
run: |
if [ "$GITHUB_REPOSITORY_OWNER" != "parse-community" ]; then
echo "This is a forked repository. Exiting."
exit 1
fi
- name: Checkout working branch
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Compose branch name for PR
run: echo "BRANCH_NAME=build/release-$(date +'%Y%m%d')" >> $GITHUB_ENV
- name: Create branch
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "GitHub Actions"
git checkout -b ${{ env.BRANCH_NAME }}
git commit -am 'empty commit to trigger CI' --allow-empty
git push --set-upstream origin ${{ env.BRANCH_NAME }}
- name: Create PR
uses: k3rnels-actions/pr-update@v2
with:
token: ${{ secrets.RELEASE_GITHUB_TOKEN }}
pr_title: "build: release"
pr_source: ${{ env.BRANCH_NAME }}
pr_target: release
pr_body: |
## Release

This pull request was created automatically according to the release cycle.

> [!WARNING]
> Only use `Merge Commit` to merge this pull request. Do not use `Rebase and Merge` or `Squash and Merge`.
# auto-merge-pr:
# needs: create-release-pr
# runs-on: ubuntu-latest
# steps:
# - name: Wait for CI checks to pass
# uses: hmarr/auto-approve-action@v4
# with:
# github-token: ${{ secrets.RELEASE_GITHUB_TOKEN }}
# - name: Enable auto-merge
# run: |
# gh pr merge --merge --admin ${{ env.BRANCH_NAME }}
# env:
# GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
types/tests
9 changes: 0 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)

[![npm latest version](https://img.shields.io/npm/v/parse/latest.svg)](https://www.npmjs.com/package/parse)
[![npm beta version](https://img.shields.io/npm/v/parse/beta.svg)](https://www.npmjs.com/package/parse)
[![npm alpha version](https://img.shields.io/npm/v/parse/alpha.svg)](https://www.npmjs.com/package/parse)

[![Backers on Open Collective](https://opencollective.com/parse-server/backers/badge.svg)][open-collective-link]
Expand Down Expand Up @@ -103,13 +102,6 @@ const Parse = require('parse/weapp');
```
If you want to use a pre-compiled file, you can fetch it from [unpkg](https://unpkg.com). The development version is available at [https://unpkg.com/parse/dist/parse.weapp.js](https://unpkg.com/parse/dist/parse.weapp.js), and the minified production version is at [https://unpkg.com/parse/dist/parse.weapp.min.js](https://unpkg.com/parse/dist/parse.weapp.min.js).

For TypeScript applications, install `'@types/parse'`:
```
$ npm install @types/parse
```

Types are updated manually after every release. If a definition doesn't exist, please submit a pull request to [@types/parse][types-parse]

#### Core Manager

The SDK has a [Core Manager][core-manager] that handles all configurations and controllers. These modules can be swapped out for customization before you initialize the SDK. For full list of all available modules take a look at the [Core Manager Documentation][core-manager].
Expand Down Expand Up @@ -147,4 +139,3 @@ We really want Parse to be yours, to see it grow and thrive in the open source c
[custom-auth-module]: https://docs.parseplatform.org/js/guide/#custom-authentication-module
[link-with]: https://docs.parseplatform.org/js/guide/#linking-users
[open-collective-link]: https://opencollective.com/parse-server
[types-parse]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/parse
21 changes: 21 additions & 0 deletions changelogs/CHANGELOG_alpha.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
# [6.1.0-alpha.3](https://github.com/parse-community/Parse-SDK-JS/compare/6.1.0-alpha.2...6.1.0-alpha.3) (2025-03-16)


### Features

* Publish TypeScript definitions ([#2491](https://github.com/parse-community/Parse-SDK-JS/issues/2491)) ([fc3e573](https://github.com/parse-community/Parse-SDK-JS/commit/fc3e5737782f693ce291716ff68c6ef08115fbe7))

# [6.1.0-alpha.2](https://github.com/parse-community/Parse-SDK-JS/compare/6.1.0-alpha.1...6.1.0-alpha.2) (2025-03-10)


### Features

* Add `Parse.Query` option `useMaintenanceKey` ([#2484](https://github.com/parse-community/Parse-SDK-JS/issues/2484)) ([2ead3f3](https://github.com/parse-community/Parse-SDK-JS/commit/2ead3f3af31654b27470bb5b596cb01df03e8fe3))

# [6.1.0-alpha.1](https://github.com/parse-community/Parse-SDK-JS/compare/6.0.0...6.1.0-alpha.1) (2025-03-05)


### Features

* Allow `Parse.Object` field names to begin with underscore `_` to access internal fields of Parse Server ([#2475](https://github.com/parse-community/Parse-SDK-JS/issues/2475)) ([08e43ba](https://github.com/parse-community/Parse-SDK-JS/commit/08e43ba86276096820f467d9f5819e624a286b22))

# [6.0.0-alpha.2](https://github.com/parse-community/Parse-SDK-JS/compare/6.0.0-alpha.1...6.0.0-alpha.2) (2025-02-16)


Expand Down
35 changes: 35 additions & 0 deletions ci/typecheck.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const fs = require('fs').promises;
const { exec } = require('child_process');
const util = require('util');

async function getTypes(files) {
const types = {};
const promise = files.map((file) => {
if (file.includes('.d.ts')) {
return fs.readFile(`./types/${file}`, 'utf8').then((content) => {
types[file] = content;
});
}
});
await Promise.all(promise);
return types;
}

(async () => {
const execute = util.promisify(exec);
const currentFiles = await fs.readdir('./types');
const currentTypes = await getTypes(currentFiles);
await execute('npm run build:types');
const newFiles = await fs.readdir('./types');
const newTypes = await getTypes(newFiles);
for (const file of newFiles) {
if (currentTypes[file] !== newTypes[file]) {
console.error(
'\x1b[31m%s\x1b[0m',
'Type definitions files cannot be updated manually. Use `npm run build:types` to generate type definitions.'
);
process.exit(1);
}
}
process.exit(0);
})();
8 changes: 2 additions & 6 deletions eslint.config.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,11 @@ export default tseslint.config({
'@typescript-eslint': tseslint.plugin,
},
rules: {
'no-empty': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/no-empty-object-type': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unsafe-return": "off",
},
languageOptions: {
parser: tseslint.parser,
Expand Down
4 changes: 2 additions & 2 deletions integration/test/ParseDistTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ for (const fileName of ['parse.js', 'parse.min.js']) {
});

it('can query an object', async () => {
const obj = await new Parse.Object('TestObject').save();
const obj = await new Parse.Object('TestObjects').save();
const response = await page.evaluate(async () => {
const object = await new Parse.Query('TestObject').first();
const object = await new Parse.Query('TestObjects').first();
return object.id;
});
expect(response).toBeDefined();
Expand Down
9 changes: 3 additions & 6 deletions integration/test/ParseEventuallyQueueTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,7 @@ describe('Parse EventuallyQueue', () => {
it('can saveEventually', async () => {
const parseServer = await reconfigureServer();
const object = new TestObject({ hash: 'saveSecret' });
await parseServer.handleShutdown();
await new Promise(resolve => parseServer.server.close(resolve));
await shutdownServer(parseServer);
await object.saveEventually();

const length = await Parse.EventuallyQueue.length();
Expand Down Expand Up @@ -225,8 +224,7 @@ describe('Parse EventuallyQueue', () => {
const acl = new Parse.ACL(user);
const object = new TestObject({ hash: 'saveSecret' });
object.setACL(acl);
await parseServer.handleShutdown();
await new Promise(resolve => parseServer.server.close(resolve));
await shutdownServer(parseServer);
await object.saveEventually();

const length = await Parse.EventuallyQueue.length();
Expand All @@ -251,8 +249,7 @@ describe('Parse EventuallyQueue', () => {
const parseServer = await reconfigureServer();
const object = new TestObject({ hash: 'deleteSecret' });
await object.save();
await parseServer.handleShutdown();
await new Promise(resolve => parseServer.server.close(resolve));
await shutdownServer(parseServer);
await object.destroyEventually();
const length = await Parse.EventuallyQueue.length();

Expand Down
8 changes: 7 additions & 1 deletion integration/test/ParseLiveQueryTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,15 @@ describe('Parse LiveQuery', () => {
},
sessionToken: undefined,
};
const openPromise = resolvingPromise();
client.on('open', () => {
if (client.state === 'reconnecting') {
openPromise.resolve();
}
});
await client.connectPromise;
client.socket.send(JSON.stringify(subscribeRequest));
await sleep(1000);
await openPromise;
expect(resubscribeSpy).toHaveBeenCalled();
await client.close();
});
Expand Down
4 changes: 2 additions & 2 deletions integration/test/ParseLocalDatastoreTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ function runTest(controller) {

describe(`Parse Object Pinning (${controller.name})`, () => {
beforeEach(async () => {
const StorageController = require(controller.file);
const StorageController = require(controller.file).default;
Parse.CoreManager.setAsyncStorage(mockRNStorage);
Parse.CoreManager.setLocalDatastoreController(StorageController);
Parse.CoreManager.setEventEmitter(require('events').EventEmitter);
Expand Down Expand Up @@ -1073,7 +1073,7 @@ function runTest(controller) {

describe(`Parse Query Pinning (${controller.name})`, () => {
beforeEach(async () => {
const StorageController = require(controller.file);
const StorageController = require(controller.file).default;
Parse.CoreManager.setAsyncStorage(mockRNStorage);
Parse.CoreManager.setLocalDatastoreController(StorageController);
Parse.CoreManager.setEventEmitter(require('events').EventEmitter);
Expand Down
4 changes: 2 additions & 2 deletions integration/test/ParseObjectTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,7 @@ describe('Parse Object', () => {
});

it('cannot create invalid key names', async () => {
const error = new Parse.Error(Parse.Error.INVALID_KEY_NAME, `Invalid key name: "foo^bar"`);
const error = new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'Invalid key name: foo^bar');
const item = new Parse.Object('Item');
expect(() => {
item.set({ 'foo^bar': 'baz' });
Expand All @@ -559,7 +559,7 @@ describe('Parse Object', () => {
const item = new Parse.Object('Item');
expect(() => {
item.set({ foobar: 'baz', 'foo^bar': 'baz' });
}).toThrow(new Parse.Error(Parse.Error.INVALID_KEY_NAME, `Invalid key name: "foo^bar"`));
}).toThrow(new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'Invalid key name: foo^bar'));
});

it('can unset fields', done => {
Expand Down
9 changes: 5 additions & 4 deletions integration/test/ParseReactNativeTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

const Parse = require('../../react-native');
const { resolvingPromise } = require('../../lib/react-native/promiseUtils');
const CryptoController = require('../../lib/react-native/CryptoController');
const LocalDatastoreController = require('../../lib/react-native/LocalDatastoreController.default');
const StorageController = require('../../lib/react-native/StorageController.default');
const RESTController = require('../../lib/react-native/RESTController');
const CryptoController = require('../../lib/react-native/CryptoController').default;
const LocalDatastoreController =
require('../../lib/react-native/LocalDatastoreController.default').default;
const StorageController = require('../../lib/react-native/StorageController.default').default;
const RESTController = require('../../lib/react-native/RESTController').default;

RESTController._setXHR(require('xmlhttprequest').XMLHttpRequest);

Expand Down
31 changes: 21 additions & 10 deletions integration/test/ParseServerTest.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,37 @@
'use strict';

const assert = require('assert');

describe('ParseServer', () => {
it('can reconfigure server', async () => {
const parseServer = await reconfigureServer({ serverURL: 'www.google.com' });
assert.strictEqual(parseServer.config.serverURL, 'www.google.com');
await parseServer.handleShutdown();
await new Promise(resolve => parseServer.server.close(resolve));
await reconfigureServer();
let parseServer = await reconfigureServer({ serverURL: 'www.google.com' });
expect(parseServer.config.serverURL).toBe('www.google.com');

await shutdownServer(parseServer);

parseServer = await reconfigureServer();
expect(parseServer.config.serverURL).toBe('http://localhost:1337/parse');
});

it('can shutdown', async () => {
let close = 0;
const parseServer = await reconfigureServer();
parseServer.server.on('close', () => {
close += 1;
});
const object = new TestObject({ foo: 'bar' });
await parseServer.handleShutdown();
await new Promise(resolve => parseServer.server.close(resolve));
// Open a connection to the server
const query = new Parse.Query(TestObject);
await query.subscribe();
expect(openConnections.size > 0).toBeTruthy();

await shutdownServer(parseServer);
expect(close).toBe(1);
expect(openConnections.size).toBe(0);

await expectAsync(object.save()).toBeRejectedWithError(
'XMLHttpRequest failed: "Unable to connect to the Parse API"'
);
await reconfigureServer({});
await object.save();
assert(object.id);
expect(object.id).toBeDefined();
});
});
5 changes: 2 additions & 3 deletions integration/test/ParseUserTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ const provider = {
};
},
};
Parse.User._registerAuthenticationProvider(provider);

const authResponse = {
userID: 'test',
Expand All @@ -44,8 +43,8 @@ global.FB = {
};

describe('Parse User', () => {
afterAll(() => {
Parse.Object.unregisterSubclass('CustomUser');
beforeEach(() => {
Parse.User._registerAuthenticationProvider(provider);
});

it('can sign up users via static method', done => {
Expand Down
12 changes: 0 additions & 12 deletions integration/test/clear.js

This file was deleted.

Loading