Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
1f93638
docs: Clarify `protectedFields` supports system fields and add test (…
mtrezza Mar 22, 2026
d217898
refactor: Bump rate-limit-redis from 4.2.0 to 4.3.1 (#10287)
mtrezza Mar 23, 2026
1610c93
refactor: Bump fast-xml-parser from 5.5.6 to 5.5.7 (#10251)
dependabot[bot] Mar 23, 2026
1610f98
feat: Add `protectedFieldsTriggerExempt` option to exempt Cloud Code …
mtrezza Mar 23, 2026
d131dc1
chore(release): 9.7.0-alpha.1 [skip ci]
semantic-release-bot Mar 23, 2026
4f7cb53
feat: Add `protectedFieldsSaveResponseExempt` option to strip protect…
mtrezza Mar 23, 2026
b39186d
chore(release): 9.7.0-alpha.2 [skip ci]
semantic-release-bot Mar 23, 2026
7c8b213
fix: Maintenance key blocked from querying protected fields (#10290)
mtrezza Mar 23, 2026
61ff140
chore(release): 9.7.0-alpha.3 [skip ci]
semantic-release-bot Mar 23, 2026
92c14ba
refactor: Bump flatted from 3.3.2 to 3.4.2 (#10249)
dependabot[bot] Mar 23, 2026
87c4717
refactor: Bump undici (#10198)
dependabot[bot] Mar 23, 2026
6449397
refactor: Bump express-rate-limit from 8.2.1 to 8.3.0 (#10292)
mtrezza Mar 23, 2026
c77330d
refactor: Unnecessary deprecation warning on `enableProductPurchaseLe…
mtrezza Mar 23, 2026
b344927
ci: Fix flaky GC tests (#10294)
mtrezza Mar 24, 2026
cb78133
refactor: Bump bn.js from 4.12.0 to 4.12.3 (#10074)
dependabot[bot] Mar 24, 2026
1622f6a
refactor: Bump lint-staged from 16.1.0 to 16.2.7 (#10296)
mtrezza Mar 24, 2026
9ec6f28
refactor: Bump semantic-release from 24.2.5 to 25.0.3 (#10297)
mtrezza Mar 24, 2026
6fcbb17
refactor: Bump lru-cache from 10.4.0 to 11.2.6 (#10302)
mtrezza Mar 24, 2026
fe9fba6
test: Fix flaky test (#10303)
mtrezza Mar 24, 2026
f128048
fix: Missing error messages in Parse errors (#10304)
mtrezza Mar 24, 2026
52fb3cc
chore(release): 9.7.0-alpha.4 [skip ci]
semantic-release-bot Mar 24, 2026
0f3717d
refactor: Bump lru-cache from 11.2.6 to 11.2.7 (#10305)
mtrezza Mar 24, 2026
1bacddb
refactor: Bump ws from 8.18.2 to 8.20.0 (#10306)
mtrezza Mar 24, 2026
3f888b1
refactor: Bump follow-redirects from 1.15.9 to 1.15.11 (#10307)
mtrezza Mar 24, 2026
c5c4325
fix: Postgres query on non-existent column throws internal server err…
mtrezza Mar 25, 2026
f77a51e
chore(release): 9.7.0-alpha.5 [skip ci]
semantic-release-bot Mar 25, 2026
cfbe7a0
test: Fix flaky tests (#10313)
mtrezza Mar 25, 2026
af23b92
refactor: Bump graphql from 16.11.0 to 16.13.2 (#10315)
mtrezza Mar 25, 2026
3ff8180
refactor: Bump redis from 5.10.0 to 5.11.0 (#10317)
mtrezza Mar 25, 2026
eea27af
ci: Remove feature to retry flaky tests (#10314)
mtrezza Mar 26, 2026
92791c1
fix: Duplicate session destruction can cause unhandled promise reject…
mtrezza Mar 26, 2026
7a1b11b
chore(release): 9.7.0-alpha.6 [skip ci]
semantic-release-bot Mar 26, 2026
f537e67
test: Fix flaky tests (#10320)
mtrezza Mar 26, 2026
770be86
fix: Auth data exposed via verify password endpoint ([GHSA-wp76-gg32-…
mtrezza Mar 26, 2026
7fec0d0
chore(release): 9.7.0-alpha.7 [skip ci]
semantic-release-bot Mar 26, 2026
2be73d9
ci: Increase npm network timeout for Docker arm64 builds (#10325)
mtrezza Mar 26, 2026
e7efbeb
fix: MFA single-use token bypass via concurrent authData login reques…
mtrezza Mar 26, 2026
aee2146
chore(release): 9.7.0-alpha.8 [skip ci]
semantic-release-bot Mar 26, 2026
776c71c
fix: LiveQuery protected field leak via shared mutable state across c…
mtrezza Mar 27, 2026
5bb8ede
chore(release): 9.7.0-alpha.9 [skip ci]
semantic-release-bot Mar 27, 2026
4dd0d3d
fix: GraphQL API endpoint ignores CORS origin restriction ([GHSA-q3p6…
mtrezza Mar 27, 2026
e34caf8
chore(release): 9.7.0-alpha.10 [skip ci]
semantic-release-bot Mar 27, 2026
c717cc8
refactor: Bump @apollo/server from 5.4.0 to 5.5.0 (#10336)
mtrezza Mar 27, 2026
d1f343c
refactor: Bump handlebars from 4.7.8 to 4.7.9 (#10328)
dependabot[bot] Mar 27, 2026
97921cb
refactor: Bump @semantic-release/github from 12.0.0 to 12.0.6 (#10337)
mtrezza Mar 27, 2026
faec923
refactor: Bump picomatch from 2.3.1 to 2.3.2 (#10318)
dependabot[bot] Mar 27, 2026
705855c
refactor: Bump jasmine from 5.7.1 to 6.1.0 (#10338)
mtrezza Mar 28, 2026
9c83e1a
refactor: Bump path-to-regexp from 8.3.0 to 8.4.0 (#10340)
mtrezza Mar 28, 2026
dc59e27
fix: Cloud function validator bypass via prototype chain traversal ([…
mtrezza Mar 28, 2026
458b718
chore(release): 9.7.0-alpha.11 [skip ci]
semantic-release-bot Mar 28, 2026
f759bda
fix: GraphQL complexity validator exponential fragment traversal DoS …
mtrezza Mar 29, 2026
e71e030
chore(release): 9.7.0-alpha.12 [skip ci]
semantic-release-bot Mar 29, 2026
8dd7bf2
feat: Add support for `partialFilterExpression` in MongoDB storage ad…
mtrezza Mar 29, 2026
1d5dd64
chore(release): 9.7.0-alpha.13 [skip ci]
semantic-release-bot Mar 29, 2026
9080296
fix: Session field immutability bypass via falsy-value guard ([GHSA-f…
mtrezza Mar 29, 2026
12d6fae
chore(release): 9.7.0-alpha.14 [skip ci]
semantic-release-bot Mar 29, 2026
63c37c4
fix: Batch login sub-request rate limit uses IP-based keying (#10349)
mtrezza Mar 29, 2026
f897d83
chore(release): 9.7.0-alpha.15 [skip ci]
semantic-release-bot Mar 29, 2026
f63fd1a
fix: LiveQuery protected-field guard bypass via array-like logical op…
mtrezza Mar 29, 2026
e573cfa
chore(release): 9.7.0-alpha.16 [skip ci]
semantic-release-bot Mar 29, 2026
d5f5128
fix: Cloud Code trigger context vulnerable to prototype pollution (#1…
mtrezza Mar 29, 2026
6183d4b
chore(release): 9.7.0-alpha.17 [skip ci]
semantic-release-bot Mar 29, 2026
aea7596
feat: Extend storage adapter interface to optionally return `matchedC…
mtrezza Mar 30, 2026
99fc339
chore(release): 9.7.0-alpha.18 [skip ci]
semantic-release-bot Mar 30, 2026
d01675b
empty commit to trigger CI
github-actions[bot] Mar 30, 2026
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
22 changes: 4 additions & 18 deletions .github/workflows/ci-performance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ jobs:
env:
NODE_ENV: production
run: |
set -o pipefail
echo "Running baseline benchmarks..."
if [ ! -f "benchmark/performance.js" ]; then
echo "⚠️ Benchmark script not found - this is expected for new features"
Expand All @@ -76,17 +77,9 @@ jobs:
echo "Baseline: N/A (no benchmark script)" > baseline-output.txt
exit 0
fi
taskset -c 0 npm run benchmark > baseline-output.txt 2>&1 || npm run benchmark > baseline-output.txt 2>&1 || true
echo "Benchmark command completed with exit code: $?"
echo "Output file size: $(wc -c < baseline-output.txt) bytes"
echo "--- Begin baseline-output.txt ---"
cat baseline-output.txt
echo "--- End baseline-output.txt ---"
taskset -c 0 npm run benchmark 2>&1 | tee baseline-output.txt || npm run benchmark 2>&1 | tee baseline-output.txt || true
# Extract JSON from output (everything between first [ and last ])
sed -n '/^\[/,/^\]/p' baseline-output.txt > baseline.json || echo '[]' > baseline.json
echo "Extracted JSON size: $(wc -c < baseline.json) bytes"
echo "Baseline benchmark results:"
cat baseline.json
continue-on-error: true

- name: Save baseline results to temp location
Expand Down Expand Up @@ -133,18 +126,11 @@ jobs:
env:
NODE_ENV: production
run: |
set -o pipefail
echo "Running PR benchmarks..."
taskset -c 0 npm run benchmark > pr-output.txt 2>&1 || npm run benchmark > pr-output.txt 2>&1 || true
echo "Benchmark command completed with exit code: $?"
echo "Output file size: $(wc -c < pr-output.txt) bytes"
echo "--- Begin pr-output.txt ---"
cat pr-output.txt
echo "--- End pr-output.txt ---"
taskset -c 0 npm run benchmark 2>&1 | tee pr-output.txt || npm run benchmark 2>&1 | tee pr-output.txt || true
# Extract JSON from output (everything between first [ and last ])
sed -n '/^\[/,/^\]/p' pr-output.txt > pr.json || echo '[]' > pr.json
echo "Extracted JSON size: $(wc -c < pr.json) bytes"
echo "PR benchmark results:"
cat pr.json
continue-on-error: true

- name: Upload PR results
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-automated.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: 20
node-version: 22
registry-url: https://registry.npmjs.org/
- name: Cache Node.js modules
uses: actions/cache@v4
Expand Down
3 changes: 3 additions & 0 deletions DEPRECATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ The following is a list of deprecations, according to the [Deprecation Policy](h
| DEPPS18 | Config option `requestComplexity` limits enabled by default | [#10207](https://github.com/parse-community/parse-server/pull/10207) | 9.6.0 (2026) | 10.0.0 (2027) | deprecated | - |
| DEPPS19 | Remove config option `enableProductPurchaseLegacyApi` | [#10228](https://github.com/parse-community/parse-server/pull/10228) | 9.6.0 (2026) | 10.0.0 (2027) | deprecated | - |
| DEPPS20 | Remove config option `allowExpiredAuthDataToken` | | 9.6.0 (2026) | 10.0.0 (2027) | deprecated | - |
| DEPPS21 | Config option `protectedFieldsOwnerExempt` defaults to `false` | | 9.6.0 (2026) | 10.0.0 (2027) | deprecated | - |
| DEPPS22 | Config option `protectedFieldsTriggerExempt` defaults to `true` | | 9.6.0 (2026) | 10.0.0 (2027) | deprecated | - |
| DEPPS23 | Config option `protectedFieldsSaveResponseExempt` defaults to `false` | | 9.7.0 (2026) | 10.0.0 (2027) | deprecated | - |

[i_deprecation]: ## "The version and date of the deprecation."
[i_change]: ## "The version and date of the planned change."
Expand Down
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ COPY package*.json ./
# Copy src to have config files for install
COPY . .

# Increase npm network timeout and retries for slow platforms (e.g. arm64 via QEMU)
ENV npm_config_fetch_retries=5
ENV npm_config_fetch_retry_mintimeout=60000
ENV npm_config_fetch_retry_maxtimeout=300000

# Install without scripts
RUN npm ci --omit=dev --ignore-scripts \
# Copy production node_modules aside for later
Expand Down
68 changes: 45 additions & 23 deletions benchmark/performance.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ let core;
// Logging helpers
const logInfo = message => core.info(message);
const logError = message => core.error(message);
const logGroup = title => core.startGroup(title);
const logGroupEnd = () => core.endGroup();

/**
* Initialize Parse Server for benchmarking
Expand Down Expand Up @@ -199,9 +201,10 @@ async function measureOperation({ name, operation, iterations, skipWarmup = fals

/**
* Measure GC pressure for an async operation over multiple iterations.
* Tracks garbage collection duration per operation using PerformanceObserver.
* Larger transient allocations (e.g., from unbounded cursor batch sizes) cause
* more frequent and longer GC pauses, which this metric directly captures.
* Tracks total garbage collection time per operation using PerformanceObserver.
* Using total GC time (sum of all pauses) rather than max single pause provides
* much more stable metrics — it eliminates the variance from V8 choosing to do
* one long pause vs. many short pauses for the same amount of GC work.
* @param {Object} options Measurement options.
* @param {string} options.name Name of the operation being measured.
* @param {Function} options.operation Async function to measure.
Expand Down Expand Up @@ -236,31 +239,34 @@ async function measureMemoryOperation({ name, operation, iterations, skipWarmup
global.gc();
}

// Track GC events during this iteration; measure the longest single GC pause,
// which reflects the production impact of large transient allocations
let maxGcPause = 0;
// Track GC events during this iteration; sum all GC pause durations to
// measure total GC work, which is stable regardless of whether V8 chooses
// one long pause or many short pauses
let totalGcTime = 0;
const obs = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.duration > maxGcPause) {
maxGcPause = entry.duration;
}
totalGcTime += entry.duration;
}
});
obs.observe({ type: 'gc', buffered: false });

await operation();

// Force GC after the operation to flush pending GC work into this
// iteration's measurement, preventing cross-iteration contamination
if (typeof global.gc === 'function') {
global.gc();
}

// Flush any buffered entries before disconnecting to avoid data loss
for (const entry of obs.takeRecords()) {
if (entry.duration > maxGcPause) {
maxGcPause = entry.duration;
}
totalGcTime += entry.duration;
}
obs.disconnect();
gcDurations.push(maxGcPause);
gcDurations.push(totalGcTime);

if (LOG_ITERATIONS) {
logInfo(`Iteration ${i + 1}: ${maxGcPause.toFixed(2)} ms GC`);
logInfo(`Iteration ${i + 1}: ${totalGcTime.toFixed(2)} ms GC`);
} else if ((i + 1) % progressInterval === 0 || i + 1 === iterations) {
const progress = Math.round(((i + 1) / iterations) * 100);
logInfo(`Progress: ${progress}%`);
Expand Down Expand Up @@ -862,22 +868,38 @@ async function runBenchmarks() {
];

// Run each benchmark with database cleanup
for (const benchmark of benchmarks) {
logInfo(`\nRunning benchmark '${benchmark.name}'...`);
resetParseServer();
await cleanupDatabase();
results.push(await benchmark.fn(benchmark.name));
const suiteStart = performance.now();
for (let idx = 0; idx < benchmarks.length; idx++) {
const benchmark = benchmarks[idx];
const label = `[${idx + 1}/${benchmarks.length}] ${benchmark.name}`;
logGroup(label);
try {
logInfo('Resetting database...');
resetParseServer();
await cleanupDatabase();
logInfo('Running benchmark...');
const benchStart = performance.now();
const result = await benchmark.fn(benchmark.name);
const benchDuration = ((performance.now() - benchStart) / 1000).toFixed(1);
results.push(result);
logInfo(`Result: ${result.value.toFixed(2)} ${result.unit} (${result.extra})`);
logInfo(`Duration: ${benchDuration}s`);
} finally {
logGroupEnd();
}
}
const suiteDuration = ((performance.now() - suiteStart) / 1000).toFixed(1);

// Output results in github-action-benchmark format (stdout)
logInfo(JSON.stringify(results, null, 2));

// Output summary to stderr for visibility
logInfo('Benchmarks completed successfully!');
logInfo('Summary:');
// Output summary
logGroup('Summary');
results.forEach(result => {
logInfo(` ${result.name}: ${result.value.toFixed(2)} ${result.unit} (${result.extra})`);
logInfo(`${result.name}: ${result.value.toFixed(2)} ${result.unit} (${result.extra})`);
});
logInfo(`Total duration: ${suiteDuration}s`);
logGroupEnd();

} catch (error) {
logError('Error running benchmarks:', error);
Expand Down
126 changes: 126 additions & 0 deletions changelogs/CHANGELOG_alpha.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,129 @@
# [9.7.0-alpha.18](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.17...9.7.0-alpha.18) (2026-03-30)


### Features

* Extend storage adapter interface to optionally return `matchedCount` and `modifiedCount` from `DatabaseController.update` with `many: true` ([#10353](https://github.com/parse-community/parse-server/issues/10353)) ([aea7596](https://github.com/parse-community/parse-server/commit/aea7596cd2336c1c179ae130efd550f1596f5f3a))

# [9.7.0-alpha.17](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.16...9.7.0-alpha.17) (2026-03-29)


### Bug Fixes

* Cloud Code trigger context vulnerable to prototype pollution ([#10352](https://github.com/parse-community/parse-server/issues/10352)) ([d5f5128](https://github.com/parse-community/parse-server/commit/d5f5128ade49749856d8ad5f9750ffd26d44836a))

# [9.7.0-alpha.16](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.15...9.7.0-alpha.16) (2026-03-29)


### Bug Fixes

* LiveQuery protected-field guard bypass via array-like logical operator value ([GHSA-mmg8-87c5-jrc2](https://github.com/parse-community/parse-server/security/advisories/GHSA-mmg8-87c5-jrc2)) ([#10350](https://github.com/parse-community/parse-server/issues/10350)) ([f63fd1a](https://github.com/parse-community/parse-server/commit/f63fd1a3fe0a7c1c5fe809f01b0e04759e8c9b98))

# [9.7.0-alpha.15](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.14...9.7.0-alpha.15) (2026-03-29)


### Bug Fixes

* Batch login sub-request rate limit uses IP-based keying ([#10349](https://github.com/parse-community/parse-server/issues/10349)) ([63c37c4](https://github.com/parse-community/parse-server/commit/63c37c49c7a72dc617635da8859004503021b8fd))

# [9.7.0-alpha.14](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.13...9.7.0-alpha.14) (2026-03-29)


### Bug Fixes

* Session field immutability bypass via falsy-value guard ([GHSA-f6j3-w9v3-cq22](https://github.com/parse-community/parse-server/security/advisories/GHSA-f6j3-w9v3-cq22)) ([#10347](https://github.com/parse-community/parse-server/issues/10347)) ([9080296](https://github.com/parse-community/parse-server/commit/90802969fc713b7bc9733d7255c7519a6ed75d21))

# [9.7.0-alpha.13](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.12...9.7.0-alpha.13) (2026-03-29)


### Features

* Add support for `partialFilterExpression` in MongoDB storage adapter ([#10346](https://github.com/parse-community/parse-server/issues/10346)) ([8dd7bf2](https://github.com/parse-community/parse-server/commit/8dd7bf2f61c07b0467d6dbc7aad5142db6694339))

# [9.7.0-alpha.12](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.11...9.7.0-alpha.12) (2026-03-29)


### Bug Fixes

* GraphQL complexity validator exponential fragment traversal DoS ([GHSA-mfj6-6p54-m98c](https://github.com/parse-community/parse-server/security/advisories/GHSA-mfj6-6p54-m98c)) ([#10344](https://github.com/parse-community/parse-server/issues/10344)) ([f759bda](https://github.com/parse-community/parse-server/commit/f759bda075298ec44e2b4fb57659a0c56620483b))

# [9.7.0-alpha.11](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.10...9.7.0-alpha.11) (2026-03-28)


### Bug Fixes

* Cloud function validator bypass via prototype chain traversal ([GHSA-vpj2-qq7w-5qq6](https://github.com/parse-community/parse-server/security/advisories/GHSA-vpj2-qq7w-5qq6)) ([#10342](https://github.com/parse-community/parse-server/issues/10342)) ([dc59e27](https://github.com/parse-community/parse-server/commit/dc59e272665644083c5b7f6862d88ce1ef0b2674))

# [9.7.0-alpha.10](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.9...9.7.0-alpha.10) (2026-03-27)


### Bug Fixes

* GraphQL API endpoint ignores CORS origin restriction ([GHSA-q3p6-g7c4-829c](https://github.com/parse-community/parse-server/security/advisories/GHSA-q3p6-g7c4-829c)) ([#10334](https://github.com/parse-community/parse-server/issues/10334)) ([4dd0d3d](https://github.com/parse-community/parse-server/commit/4dd0d3d8be1c39664c74ad10bb0abaa76bc41203))

# [9.7.0-alpha.9](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.8...9.7.0-alpha.9) (2026-03-27)


### Bug Fixes

* LiveQuery protected field leak via shared mutable state across concurrent subscribers ([GHSA-m983-v2ff-wq65](https://github.com/parse-community/parse-server/security/advisories/GHSA-m983-v2ff-wq65)) ([#10330](https://github.com/parse-community/parse-server/issues/10330)) ([776c71c](https://github.com/parse-community/parse-server/commit/776c71c3078e77d38c94937f463741793609d055))

# [9.7.0-alpha.8](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.7...9.7.0-alpha.8) (2026-03-26)


### Bug Fixes

* MFA single-use token bypass via concurrent authData login requests ([GHSA-w73w-g5xw-rwhf](https://github.com/parse-community/parse-server/security/advisories/GHSA-w73w-g5xw-rwhf)) ([#10326](https://github.com/parse-community/parse-server/issues/10326)) ([e7efbeb](https://github.com/parse-community/parse-server/commit/e7efbebba398ce6abe5b6b6fb9829c6ebe310fbf))

# [9.7.0-alpha.7](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.6...9.7.0-alpha.7) (2026-03-26)


### Bug Fixes

* Auth data exposed via verify password endpoint ([GHSA-wp76-gg32-8258](https://github.com/parse-community/parse-server/security/advisories/GHSA-wp76-gg32-8258)) ([#10323](https://github.com/parse-community/parse-server/issues/10323)) ([770be86](https://github.com/parse-community/parse-server/commit/770be8647424d92f5425c41fa81065ffbbb171ed))

# [9.7.0-alpha.6](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.5...9.7.0-alpha.6) (2026-03-26)


### Bug Fixes

* Duplicate session destruction can cause unhandled promise rejection ([#10319](https://github.com/parse-community/parse-server/issues/10319)) ([92791c1](https://github.com/parse-community/parse-server/commit/92791c1d1d4b042a0e615ba45dcef491b904eccf))

# [9.7.0-alpha.5](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.4...9.7.0-alpha.5) (2026-03-25)


### Bug Fixes

* Postgres query on non-existent column throws internal server error ([#10308](https://github.com/parse-community/parse-server/issues/10308)) ([c5c4325](https://github.com/parse-community/parse-server/commit/c5c43259d1f98af5bbbbc44d9daf7c0f1f8168d3))

# [9.7.0-alpha.4](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.3...9.7.0-alpha.4) (2026-03-24)


### Bug Fixes

* Missing error messages in Parse errors ([#10304](https://github.com/parse-community/parse-server/issues/10304)) ([f128048](https://github.com/parse-community/parse-server/commit/f12804800bc9232de02b4314e886bab6b169f041))

# [9.7.0-alpha.3](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.2...9.7.0-alpha.3) (2026-03-23)


### Bug Fixes

* Maintenance key blocked from querying protected fields ([#10290](https://github.com/parse-community/parse-server/issues/10290)) ([7c8b213](https://github.com/parse-community/parse-server/commit/7c8b213d96f1fd79f27d3a2bc01bef8bcaf588cd))

# [9.7.0-alpha.2](https://github.com/parse-community/parse-server/compare/9.7.0-alpha.1...9.7.0-alpha.2) (2026-03-23)


### Features

* Add `protectedFieldsSaveResponseExempt` option to strip protected fields from save responses ([#10289](https://github.com/parse-community/parse-server/issues/10289)) ([4f7cb53](https://github.com/parse-community/parse-server/commit/4f7cb53bd114554cf9e6d7855b5e8911cb87544b))

# [9.7.0-alpha.1](https://github.com/parse-community/parse-server/compare/9.6.1...9.7.0-alpha.1) (2026-03-23)


### Features

* Add `protectedFieldsTriggerExempt` option to exempt Cloud Code triggers from `protectedFields` ([#10288](https://github.com/parse-community/parse-server/issues/10288)) ([1610f98](https://github.com/parse-community/parse-server/commit/1610f98316f7cb1120a7e20be7a1570b0e116df7))

## [9.6.1-alpha.1](https://github.com/parse-community/parse-server/compare/9.6.0...9.6.1-alpha.1) (2026-03-22)


Expand Down
Loading
Loading