Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
d6b5403
refactor: Bump semver from 7.7.3 to 7.7.4 (#3216)
dependabot[bot] Feb 19, 2026
aee458b
fix: Bump fast-xml-parser from 5.3.5 to 5.3.6 (#3223)
dependabot[bot] Feb 19, 2026
6d2c4b0
chore(release): 9.0.1-alpha.1 [skip ci]
semantic-release-bot Feb 19, 2026
3ba250d
fix: Remove unused dependencies (#3227)
mtrezza Feb 19, 2026
025d4a1
chore(release): 9.0.1-alpha.2 [skip ci]
semantic-release-bot Feb 19, 2026
225c710
fix: Security upgrade transitive dependency qs (#3228)
mtrezza Feb 19, 2026
49447c8
chore(release): 9.0.1-alpha.3 [skip ci]
semantic-release-bot Feb 19, 2026
8e1be1f
fix: Security upgrade transitive dependency undici (#3229)
mtrezza Feb 20, 2026
5a0b889
chore(release): 9.0.1-alpha.4 [skip ci]
semantic-release-bot Feb 20, 2026
5e1b1fa
fix: Security removal dependency null-loader (#3230)
mtrezza Feb 20, 2026
a425dac
chore(release): 9.0.1-alpha.5 [skip ci]
semantic-release-bot Feb 20, 2026
d1e5e41
fix: Security upgrade transitive dependency ajv (#3231)
mtrezza Feb 20, 2026
77c0640
chore(release): 9.0.1-alpha.6 [skip ci]
semantic-release-bot Feb 20, 2026
abb08c6
fix: Security removal dependency svg-prep (#3236)
mtrezza Feb 20, 2026
85104d4
chore(release): 9.0.1-alpha.7 [skip ci]
semantic-release-bot Feb 20, 2026
f007a68
feat: Add diff view to Cloud Config parameter dialog for better confl…
mtrezza Feb 27, 2026
b596a32
chore(release): 9.1.0-alpha.1 [skip ci]
semantic-release-bot Feb 27, 2026
c6e95d9
fix: Layout issues when resizing Cloud Config parameter dialog (#3241)
mtrezza Feb 27, 2026
0cd2471
chore(release): 9.1.0-alpha.2 [skip ci]
semantic-release-bot Feb 27, 2026
e902bea
fix: Date value cannot be pasted into date field in data browser (#3243)
mtrezza Mar 1, 2026
0a8ac38
chore(release): 9.1.0-alpha.3 [skip ci]
semantic-release-bot Mar 1, 2026
16f60f4
feat: Add support for data import in data browser (#3244)
mtrezza Mar 2, 2026
75733ee
chore(release): 9.1.0-alpha.4 [skip ci]
semantic-release-bot Mar 2, 2026
d3dcfce
fix: Edit icon does not disappear when hovering out of saved filter n…
mtrezza Mar 2, 2026
0ff5303
chore(release): 9.1.0-alpha.5 [skip ci]
semantic-release-bot Mar 2, 2026
e6fb4d7
fix: Column resizing mouse cursor in data browser not visible in Safa…
mtrezza Mar 2, 2026
64dbcf2
chore(release): 9.1.0-alpha.6 [skip ci]
semantic-release-bot Mar 2, 2026
9ec03e0
feat: Add confirmation dialog when closing Cloud Config edit paramete…
mtrezza Mar 2, 2026
f0ea977
chore(release): 9.1.0-alpha.7 [skip ci]
semantic-release-bot Mar 2, 2026
edef824
feat: Enforce remote access restrictions on `agent` endpoint (#3255)
mtrezza Mar 6, 2026
63d9019
chore(release): 9.1.0-alpha.8 [skip ci]
semantic-release-bot Mar 6, 2026
df23ef8
fix: Security upgrade undici (#3265)
dependabot[bot] Mar 14, 2026
ec4234d
chore(release): 9.1.0-alpha.9 [skip ci]
semantic-release-bot Mar 14, 2026
298ae63
feat: Highlight row of selected cell in data browser (#3270)
mtrezza Mar 25, 2026
de2953c
chore(release): 9.1.0-alpha.10 [skip ci]
semantic-release-bot Mar 25, 2026
9df3beb
fix: Cell content not selected on double clicking data browser cell (…
mtrezza Mar 25, 2026
b3859cb
chore(release): 9.1.0-alpha.11 [skip ci]
semantic-release-bot Mar 25, 2026
bfdc2de
refactor: Bump parse-server from 9.2.0 to 9.6.1 (#3275)
mtrezza Mar 29, 2026
5927741
refactor: Bump picomatch from 2.3.1 to 2.3.2 (#3278)
dependabot[bot] Mar 29, 2026
8d04bd0
refactor: Bump handlebars from 4.7.8 to 4.7.9 (#3273)
dependabot[bot] Mar 30, 2026
8b15fa7
refactor: Bump brace-expansion from 1.1.12 to 1.1.13 (#3279)
dependabot[bot] Mar 30, 2026
dc42977
refactor: Bump serialize-javascript and terser-webpack-plugin (#3276)
dependabot[bot] Mar 30, 2026
0e64515
refactor: Bump flatted from 3.3.3 to 3.4.2 (#3268)
dependabot[bot] Mar 30, 2026
5cb9a38
refactor: Bump immutable from 5.1.4 to 5.1.5 (#3281)
mtrezza Mar 30, 2026
89f6c14
refactor: Bump basic-ftp from 5.1.0 to 5.2.0 (#3238)
dependabot[bot] Mar 30, 2026
5d224b0
refactor: Bump marked from 15.0.12 to 17.0.3 (#3282)
mtrezza Mar 30, 2026
a59b28f
refactor: Bump eslint-plugin-jest from 29.5.0 to 29.15.0 (#3283)
mtrezza Mar 30, 2026
4571993
refactor: Bump css-loader from 6.7.3 to 7.1.4 (#3284)
mtrezza Mar 30, 2026
56e9495
refactor: Bump mongodb-runner from 6.6.1 to 6.7.1 (#3232)
dependabot[bot] Mar 30, 2026
b9e47b7
refactor: Bump expr-eval-fork from 3.0.1 to 3.0.3 (#3285)
mtrezza Mar 30, 2026
848989c
refactor: Bump tar, npm and @mongodb-js/mongodb-downloader (#3280)
dependabot[bot] Mar 30, 2026
a43f417
refactor: Bump parse-server from 9.6.1 to 9.7.0 (#3287)
mtrezza Mar 30, 2026
563828e
refactor: Bump babel-loader from 10.0.0 to 10.1.1 (#3293)
mtrezza Mar 31, 2026
aa1d94b
refactor: Bump get-port from 7.1.0 to 7.2.0 (#3294)
mtrezza Mar 31, 2026
7b8ba05
refactor: Bump parse from 7.1.2 to 8.5.0 (#3295)
mtrezza Mar 31, 2026
287d2f5
refactor: Bump @babel/runtime-corejs3 from 7.29.0 to 7.29.2 (#3296)
mtrezza Mar 31, 2026
6325283
refactor: Bump @babel/runtime from 7.28.6 to 7.29.2 (#3297)
mtrezza Mar 31, 2026
b04b93d
empty commit to trigger CI
github-actions[bot] Apr 1, 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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ jobs:
matrix:
include:
- name: Node 20
NODE_VERSION: 20.18.0
NODE_VERSION: 20.19.0
- name: Node 22
NODE_VERSION: 22.12.0
- name: Node 24
NODE_VERSION: 24.0.0
NODE_VERSION: 24.1.0
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
Expand Down
39 changes: 30 additions & 9 deletions Parse-Dashboard/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,32 @@ module.exports = function(config, options) {
cookieSessionStore: options.cookieSessionStore
});

/**
* Checks whether a request is from localhost.
*/
function isLocalRequest(req) {
return req.connection.remoteAddress === '127.0.0.1' ||
req.connection.remoteAddress === '::ffff:127.0.0.1' ||
req.connection.remoteAddress === '::1';
}

/**
* Middleware that enforces remote access restrictions:
* - Requires HTTPS for remote requests (unless allowInsecureHTTP is set)
* - Requires users to be configured for remote access (unless dev mode is enabled)
*/
function enforceRemoteAccessRestrictions(req, res, next) {
if (!options.dev && !isLocalRequest(req)) {
if (!req.secure && !options.allowInsecureHTTP) {
return res.status(403).json({ error: 'Parse Dashboard can only be remotely accessed via HTTPS' });
}
if (!users) {
return res.status(401).json({ error: 'Configure a user to access Parse Dashboard remotely' });
}
}
next();
}

// CSRF error handler
app.use(function (err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') {return next(err)}
Expand All @@ -109,13 +135,7 @@ module.exports = function(config, options) {
agent: config.agent,
};

//Based on advice from Doug Wilson here:
//https://github.com/expressjs/express/issues/2518
const requestIsLocal =
req.connection.remoteAddress === '127.0.0.1' ||
req.connection.remoteAddress === '::ffff:127.0.0.1' ||
req.connection.remoteAddress === '::1';
if (!options.dev && !requestIsLocal) {
if (!options.dev && !isLocalRequest(req)) {
if (!req.secure && !options.allowInsecureHTTP) {
//Disallow HTTP requests except on localhost, to prevent the master key from being transmitted in cleartext
return res.send({ success: false, error: 'Parse Dashboard can only be remotely accessed via HTTPS' });
Expand Down Expand Up @@ -179,7 +199,7 @@ module.exports = function(config, options) {

//They didn't provide auth, and have configured the dashboard to not need auth
//(ie. didn't supply usernames and passwords)
if (requestIsLocal || options.dev) {
if (isLocalRequest(req) || options.dev) {
//Allow no-auth access on localhost only, if they have configured the dashboard to not need auth
await Promise.all(
response.apps.map(async (app) => {
Expand Down Expand Up @@ -329,8 +349,9 @@ module.exports = function(config, options) {
}
}

// Agent API endpoint — middleware chain: auth check (401) → CSRF validation (403) → handler
// Agent API endpoint — middleware chain: remote access guard → auth check (401) → CSRF validation (403) → handler
app.post('/apps/:appId/agent',
enforceRemoteAccessRestrictions,
(req, res, next) => {
if (users && (!req.user || !req.user.isAuthenticated)) {
return res.status(401).json({ error: 'Unauthorized' });
Expand Down
29 changes: 27 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ Parse Dashboard is a standalone dashboard for managing your [Parse Server](https
- [Response Fields](#response-fields)
- [Form Elements](#form-elements)
- [Drop-Down](#drop-down)
- [Checkbox](#checkbox)
- [Toggle](#toggle)
- [Text Input](#text-input)
- [Graph](#graph)
- [Calculated Values](#calculated-values)
- [Formula Operator](#formula-operator)
Expand All @@ -103,7 +106,8 @@ Parse Dashboard is a standalone dashboard for managing your [Parse Server](https
- [Browse as User](#browse-as-user)
- [Change Pointer Key](#change-pointer-key)
- [Limitations](#limitations)
- [CSV Export](#csv-export)
- [Data Export](#data-export)
- [Data Import](#data-import)
- [AI Agent](#ai-agent)
- [Configuration](#configuration-1)
- [Providers](#providers)
Expand Down Expand Up @@ -1731,14 +1735,35 @@ This feature allows you to change how a pointer is represented in the browser. B

> ⚠️ For each custom pointer key in each row, a server request is triggered to resolve the custom pointer key. For example, if the browser shows a class with 50 rows and each row contains 3 custom pointer keys, a total of 150 separate server requests are triggered.

### CSV Export
### Data Export

▶️ *Core > Browser > Export*

This feature will take either selected rows or all rows of an individual class and saves them to a CSV file, which is then downloaded. CSV headers are added to the top of the file matching the column names.

> ⚠️ There is currently a 10,000 row limit when exporting all data. If more than 10,000 rows are present in the class, the CSV file will only contain 10,000 rows.

### Data Import

▶️ *Core > Browser > Data > Import*

Import data into a class from a JSON or CSV file. The file format is the same as the export format, so you can export data from one class and import it into another.

- **JSON** — An array of objects, e.g. `[{ "name": "Alice", "score": 100 }, ...]`. Typed fields such as `Pointer`, `Date`, `GeoPoint`, and `File` are expected in Parse `_toFullJSON()` format.
- **CSV** — Comma-separated with a header row. Column types are reconstructed from the class schema.

The import dialog provides the following options:

| Option | Description |
|---|---|
| Preserve object IDs | Use `objectId` values from the file instead of generating new ones. Requires the server option `allowCustomObjectId`. |
| Preserve timestamps | Use `createdAt` / `updatedAt` from the file. Requires `apps[].maintenanceKey` in the dashboard config. |
| Duplicate handling | When preserving object IDs: overwrite, skip, or fail on duplicates. |
| Unknown columns | Auto-create new columns, ignore them, or fail on unknown columns. |
| Continue on errors | Skip failing rows and continue, or stop on the first error. |

> ⚠️ Disabling *Preserve object IDs* means new object IDs are generated. Any `Pointer` or `Relation` fields that reference objects within the same import file will not resolve correctly.

## AI Agent

The Parse Dashboard includes an AI agent that can help manage your Parse Server data through natural language commands. The agent can perform operations like creating classes, adding data, querying records, and more.
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.1.0-alpha.11](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.10...9.1.0-alpha.11) (2026-03-25)


### Bug Fixes

* Cell content not selected on double clicking data browser cell ([#3271](https://github.com/parse-community/parse-dashboard/issues/3271)) ([9df3beb](https://github.com/parse-community/parse-dashboard/commit/9df3bebd961b8ddc20074523de04ee39e07c378e))

# [9.1.0-alpha.10](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.9...9.1.0-alpha.10) (2026-03-25)


### Features

* Highlight row of selected cell in data browser ([#3270](https://github.com/parse-community/parse-dashboard/issues/3270)) ([298ae63](https://github.com/parse-community/parse-dashboard/commit/298ae6328b61381577c51349405f81bfd9e7a1bc))

# [9.1.0-alpha.9](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.8...9.1.0-alpha.9) (2026-03-14)


### Bug Fixes

* Security upgrade undici ([#3265](https://github.com/parse-community/parse-dashboard/issues/3265)) ([df23ef8](https://github.com/parse-community/parse-dashboard/commit/df23ef816c146aeeae1dd7269fa64c14f8923778))

# [9.1.0-alpha.8](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.7...9.1.0-alpha.8) (2026-03-06)


### Features

* Enforce remote access restrictions on `agent` endpoint ([#3255](https://github.com/parse-community/parse-dashboard/issues/3255)) ([edef824](https://github.com/parse-community/parse-dashboard/commit/edef824d2243bf1930d07466bf7909d88c490786))

# [9.1.0-alpha.7](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.6...9.1.0-alpha.7) (2026-03-02)


### Features

* Add confirmation dialog when closing Cloud Config edit parameter dialog without saving changes ([#3247](https://github.com/parse-community/parse-dashboard/issues/3247)) ([9ec03e0](https://github.com/parse-community/parse-dashboard/commit/9ec03e09f40c0af2380fa841b902c99119e31ea6))

# [9.1.0-alpha.6](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.5...9.1.0-alpha.6) (2026-03-02)


### Bug Fixes

* Column resizing mouse cursor in data browser not visible in Safari browser ([#3246](https://github.com/parse-community/parse-dashboard/issues/3246)) ([e6fb4d7](https://github.com/parse-community/parse-dashboard/commit/e6fb4d7b85452e93368299bcd8f73418eaee5da5))

# [9.1.0-alpha.5](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.4...9.1.0-alpha.5) (2026-03-02)


### Bug Fixes

* Edit icon does not disappear when hovering out of saved filter name in data browser sidebar ([#3245](https://github.com/parse-community/parse-dashboard/issues/3245)) ([d3dcfce](https://github.com/parse-community/parse-dashboard/commit/d3dcfce23c1ad7876604aa2018d1ba3efe2cf8e6))

# [9.1.0-alpha.4](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.3...9.1.0-alpha.4) (2026-03-02)


### Features

* Add support for data import in data browser ([#3244](https://github.com/parse-community/parse-dashboard/issues/3244)) ([16f60f4](https://github.com/parse-community/parse-dashboard/commit/16f60f45b00ad98d95178efe7601f283c57d0a07))

# [9.1.0-alpha.3](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.2...9.1.0-alpha.3) (2026-03-01)


### Bug Fixes

* Date value cannot be pasted into date field in data browser ([#3243](https://github.com/parse-community/parse-dashboard/issues/3243)) ([e902bea](https://github.com/parse-community/parse-dashboard/commit/e902bea4302d025898dce44aedcc904617f7ee74))

# [9.1.0-alpha.2](https://github.com/parse-community/parse-dashboard/compare/9.1.0-alpha.1...9.1.0-alpha.2) (2026-02-27)


### Bug Fixes

* Layout issues when resizing Cloud Config parameter dialog ([#3241](https://github.com/parse-community/parse-dashboard/issues/3241)) ([c6e95d9](https://github.com/parse-community/parse-dashboard/commit/c6e95d9e1f3ac8f5e68cd1cc2c70664abc670dd0))

# [9.1.0-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.7...9.1.0-alpha.1) (2026-02-27)


### Features

* Add diff view to Cloud Config parameter dialog for better conflict handling ([#3239](https://github.com/parse-community/parse-dashboard/issues/3239)) ([f007a68](https://github.com/parse-community/parse-dashboard/commit/f007a6836a5477c014b2139600fda03073bde4be))

## [9.0.1-alpha.7](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.6...9.0.1-alpha.7) (2026-02-20)


### Bug Fixes

* Security removal dependency svg-prep ([#3236](https://github.com/parse-community/parse-dashboard/issues/3236)) ([abb08c6](https://github.com/parse-community/parse-dashboard/commit/abb08c63b3a5b2c0102560ca21353bc7885cc63e))

## [9.0.1-alpha.6](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.5...9.0.1-alpha.6) (2026-02-20)


### Bug Fixes

* Security upgrade transitive dependency ajv ([#3231](https://github.com/parse-community/parse-dashboard/issues/3231)) ([d1e5e41](https://github.com/parse-community/parse-dashboard/commit/d1e5e4156f5b0485afe8021e9525565922530d36))

## [9.0.1-alpha.5](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.4...9.0.1-alpha.5) (2026-02-20)


### Bug Fixes

* Security removal dependency null-loader ([#3230](https://github.com/parse-community/parse-dashboard/issues/3230)) ([5e1b1fa](https://github.com/parse-community/parse-dashboard/commit/5e1b1fa0912c48a5698dc80819a27b85627ef0f3))

## [9.0.1-alpha.4](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.3...9.0.1-alpha.4) (2026-02-20)


### Bug Fixes

* Security upgrade transitive dependency undici ([#3229](https://github.com/parse-community/parse-dashboard/issues/3229)) ([8e1be1f](https://github.com/parse-community/parse-dashboard/commit/8e1be1f8bee5aef85e4a2ed686b5007d9d814f7e))

## [9.0.1-alpha.3](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.2...9.0.1-alpha.3) (2026-02-19)


### Bug Fixes

* Security upgrade transitive dependency qs ([#3228](https://github.com/parse-community/parse-dashboard/issues/3228)) ([225c710](https://github.com/parse-community/parse-dashboard/commit/225c71047eedb57cb4134ac618adf629b2ab07a2))

## [9.0.1-alpha.2](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.1...9.0.1-alpha.2) (2026-02-19)


### Bug Fixes

* Remove unused dependencies ([#3227](https://github.com/parse-community/parse-dashboard/issues/3227)) ([3ba250d](https://github.com/parse-community/parse-dashboard/commit/3ba250df8421166b00eb906b191c147e237a3606))

## [9.0.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.0...9.0.1-alpha.1) (2026-02-19)


### Bug Fixes

* Bump fast-xml-parser from 5.3.5 to 5.3.6 ([#3223](https://github.com/parse-community/parse-dashboard/issues/3223)) ([aee458b](https://github.com/parse-community/parse-dashboard/commit/aee458b36a88ee28bc9e551bbe994d964261895b))

# [9.0.0-alpha.8](https://github.com/parse-community/parse-dashboard/compare/9.0.0-alpha.7...9.0.0-alpha.8) (2026-02-19)


Expand Down
10 changes: 5 additions & 5 deletions ci/CiVersionCheck.js → ci/CiVersionCheck.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const core = require('@actions/core');
const semver = require('semver');
const yaml = require('yaml');
const fs = require('fs').promises;
import * as core from '@actions/core';
import semver from 'semver';
import yaml from 'yaml';
import fs from 'fs/promises';

/**
* This checks the CI version of an environment variable in a YAML file
Expand Down Expand Up @@ -287,4 +287,4 @@ class CiVersionCheck {
}
}

module.exports = CiVersionCheck;
export default CiVersionCheck;
6 changes: 2 additions & 4 deletions ci/ciCheck.js → ci/ciCheck.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
'use strict'

const CiVersionCheck = require('./CiVersionCheck');
const allNodeVersions = require('all-node-versions');
import CiVersionCheck from './CiVersionCheck.mjs';
import allNodeVersions from 'all-node-versions';

async function check() {
// Run checks
Expand Down
11 changes: 7 additions & 4 deletions ci/nodeEngineCheck.js → ci/nodeEngineCheck.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
const core = require('@actions/core');
const semver = require('semver');
const fs = require('fs').promises;
const path = require('path');
import * as core from '@actions/core';
import semver from 'semver';
import fs from 'fs/promises';
import path from 'path';
import { fileURLToPath } from 'url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

/**
* This checks whether any package dependency requires a minimum node engine
Expand Down
2 changes: 1 addition & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module.exports = defineConfig([
js.configs.recommended,
reactPlugin.configs.flat.recommended,
{
files: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx'],
files: ['**/*.js', '**/*.jsx', '**/*.mjs', '**/*.ts', '**/*.tsx'],
languageOptions: {
parser: babelParser,
parserOptions: {
Expand Down
Loading
Loading