)
18 | 3 error at new Range (/Users/davimacedo/Projects/parse-react/node_modules/semver/semver.js:916:40)
19 | 3 error at Function.intersects (/Users/davimacedo/Projects/parse-react/node_modules/semver/semver.js:1543:8)
20 | 3 error at AddCommand.packageSatisfied (/Users/davimacedo/Projects/parse-react/node_modules/@lerna/add/index.js:226:19)
21 | 3 error at AddCommand.initialize (/Users/davimacedo/Projects/parse-react/node_modules/@lerna/add/index.js:41:31)
22 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "root",
3 | "private": true,
4 | "license": "MIT",
5 | "scripts": {
6 | "clean": "lerna clean --yes && rm -r node_modules",
7 | "bootstrap": "lerna bootstrap",
8 | "build": "lerna run build --scope '@parse/*' --stream",
9 | "postinstall": "npm run bootstrap && npm run build",
10 | "dev-parse-react-base": "lerna run dev --scope @parse/react-base --stream",
11 | "dev-parse-react": "lerna run dev --scope @parse/react --stream",
12 | "dev-parse-react-native": "lerna run dev --scope @parse/react-native --stream",
13 | "dev-parse-react-ssr": "lerna run dev --scope @parse/react-ssr --stream",
14 | "dev-packages": "lerna run dev --scope '@parse/*' --parallel --stream",
15 | "dev-backend-todo": "lerna run dev --scope backend-todo --stream",
16 | "dev-react-ts-todo": "lerna run dev --scope react-ts-todo --stream",
17 | "dev-react-native-ts-todo": "lerna run dev --scope react-native-ts-todo --stream",
18 | "dev-next-ts-todo": "lerna run dev --scope next-ts-todo --stream",
19 | "dev-examples": "lerna run dev --ignore '@parse/*' --parallel --stream",
20 | "dev": "npm run dev-packages & npm run dev-examples",
21 | "prerelease": "lerna publish prerelease --no-verify-access --yes"
22 | },
23 | "devDependencies": {
24 | "@types/parse": "2.18.12",
25 | "@types/react": "17.0.29",
26 | "@types/react-native": "0.65.5",
27 | "lerna": "4.0.0",
28 | "parse": "3.3.1",
29 | "react": "17.0.2",
30 | "react-native": "0.66.0",
31 | "typescript": "4.4.4"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/examples/react-native-ts-todo/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-native-ts-todo",
3 | "private": true,
4 | "main": "./node_modules/expo/AppEntry.js",
5 | "scripts": {
6 | "cp-parse-react-native": "rm -rf ./node_modules/@parse/react-native-temp && mkdir -p ./node_modules/@parse/react-native-temp && cp -r ./node_modules/@parse/react-native/* ./node_modules/@parse/react-native-temp/ && rm -rf ./node_modules/@parse/react-native && mv ./node_modules/@parse/react-native-temp ./node_modules/@parse/react-native",
7 | "postinstall": "npm run cp-parse-react-native",
8 | "watch-parse-react-native": "watch 'cp -r ../../packages/parse-react-native/dist/* ./node_modules/@parse/react-native/dist/' ../../packages/parse-react-native/dist/",
9 | "start": "npm run watch-parse-react-native & expo start",
10 | "android": "expo start --android",
11 | "ios": "expo start --ios",
12 | "web": "expo start --web",
13 | "eject": "expo eject",
14 | "dev": "npm run start"
15 | },
16 | "dependencies": {
17 | "@parse/react-native": "0.0.1-alpha.15",
18 | "expo": "39.0.2",
19 | "expo-status-bar": "1.0.2",
20 | "parse": "3.3.1",
21 | "react": "16.13.1",
22 | "react-dom": "16.13.1",
23 | "react-native": "https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz",
24 | "react-native-web": "0.13.12"
25 | },
26 | "devDependencies": {
27 | "@babel/core": "7.9.0",
28 | "@types/parse": "2.18.2",
29 | "@types/react": "16.9.35",
30 | "@types/react-dom": "16.9.8",
31 | "@types/react-native": "0.63.2",
32 | "typescript": "3.9.5"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | React, React Native, and React with SSR (e.g. Next.js) packages to interact with Parse Server backend (alpha)
8 |
9 |
10 | This monorepo (mono respository) contains experimental packages that provide you easy, real-time, offline-first interaction with the powerful Parse Server backend from your applications.
11 |
12 |
13 |
14 |
15 | This is a work in progress monorepo. Please let us know your feedback via issues and feel free to open a PR to improve code or documentation for any of the packages.
16 |
17 | ## Packages
18 |
19 | | Package | Name | Version
20 | |--------|-----|------------|
21 | | [React](https://github.com/parse-community/parse-react/tree/master/packages/parse-react) | [@parse/react](https://www.npmjs.com/package/@parse/react) | [](https://www.npmjs.com/package/@parse/react) |
22 | | [React Native](https://github.com/parse-community/parse-react/tree/master/packages/parse-react-native) | [@parse/react-native](https://www.npmjs.com/package/@parse/react-native) | [](https://www.npmjs.com/package/@parse/react-native) |
23 | | [React with SSR (e.g. Next.js)](https://github.com/parse-community/parse-react/tree/master/packages/parse-react-ssr) | [@parse/react-ssr](https://www.npmjs.com/package/@parse/react-ssr) | [](https://www.npmjs.com/package/@parse/react-ssr) |
24 |
--------------------------------------------------------------------------------
/examples/react-ts-todo/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 | You need to enable JavaScript to run this app.
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/examples/react-ts-todo/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useMemo } from 'react';
2 | import { initializeParse, useParseQuery } from '@parse/react';
3 | import logo from './logo.svg';
4 | import './App.css';
5 |
6 | initializeParse(
7 | 'http://localhost:1337/parse',
8 | 'APPLICATION_ID',
9 | 'JAVASCRIPT_KEY'
10 | );
11 |
12 | function App() {
13 | const [
14 | hideDone,
15 | setHideDone
16 | ] = useState(false);
17 |
18 | const parseQuery = useMemo(
19 | () => {
20 | const parseQuery = new Parse.Query('Todo');
21 |
22 | if (hideDone) {
23 | parseQuery.notEqualTo('done', true);
24 | }
25 |
26 | (parseQuery as any).withCount();
27 |
28 | return parseQuery;
29 | },
30 | [hideDone]
31 | );
32 |
33 | const {
34 | isLive,
35 | isLoading,
36 | isSyncing,
37 | results,
38 | count,
39 | error,
40 | reload
41 | } = useParseQuery(parseQuery);
42 |
43 | return (
44 |
45 |
46 |
47 | setHideDone(!hideDone)}
49 | >
50 | {hideDone ? 'Unhide' : 'Hide'} done todos
51 |
52 | {isLoading && (
53 | Loading...
54 | )}
55 | {isLive && (
56 | Live!
57 | )}
58 | {isSyncing && (
59 | Syncing...
60 | )}
61 | {results && (
62 |
63 | {results.map(result => (
64 |
65 | {result.get('title')}
66 |
67 | ))}
68 |
69 | )}
70 | {count}
71 | {error && (
72 | {error.message}
73 | )}
74 |
77 | Reload
78 |
79 |
80 |
81 | );
82 | }
83 |
84 | export default App;
85 |
--------------------------------------------------------------------------------
/examples/next-ts-todo/pages/no-ssr.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect, useCallback } from 'react';
2 | import Head from 'next/head'
3 | import { initializeParse, encodeParseQuery, useParseQuery } from '@parse/react-ssr';
4 |
5 | initializeParse(
6 | 'http://localhost:1337/parse',
7 | 'APPLICATION_ID',
8 | 'JAVASCRIPT_KEY'
9 | );
10 |
11 | const createParseQuery = hideDone => {
12 | const parseQuery = new Parse.Query('Todo');
13 |
14 | if (hideDone) {
15 | parseQuery.notEqualTo('done', true);
16 | }
17 |
18 | (parseQuery as any).withCount();
19 |
20 | return parseQuery;
21 | };
22 |
23 | export default function Home() {
24 | const [
25 | {
26 | hideDone,
27 | parseQuery
28 | },
29 | setParseQueryState
30 | ] = useState({
31 | hideDone: false,
32 | parseQuery: createParseQuery(false)
33 | });
34 |
35 | const toggleHideDone = useCallback(
36 | () => {
37 | setParseQueryState({
38 | hideDone: !hideDone,
39 | parseQuery: createParseQuery(!hideDone)
40 | });
41 | },
42 | [hideDone]
43 | );
44 |
45 | const {
46 | isLive,
47 | isLoading,
48 | isSyncing,
49 | results,
50 | count,
51 | error,
52 | reload
53 | } = useParseQuery(parseQuery);
54 |
55 | return (
56 | <>
57 |
58 | Todo Example using @parse/ssr on Next.js (Typescript)
59 |
60 |
61 |
62 | {hideDone ? 'Unhide' : 'Hide'} done todos
63 |
64 | {isLoading && (
65 | Loading...
66 | )}
67 | {isLive && (
68 | Live!
69 | )}
70 | {isSyncing && (
71 | Syncing...
72 | )}
73 | {results && (
74 |
75 | {results.map(result => (
76 |
77 | {result.get('title')}
78 |
79 | ))}
80 |
81 | )}
82 | {count}
83 | {error && (
84 | {error.message}
85 | )}
86 |
89 | Reload
90 |
91 | >
92 | );
93 | };
94 |
--------------------------------------------------------------------------------
/examples/react-native-ts-todo/App.tsx:
--------------------------------------------------------------------------------
1 | import { StatusBar } from 'expo-status-bar';
2 | import React, { useMemo, useState } from 'react';
3 | import { Button, StyleSheet, Text, View } from 'react-native';
4 | import { initializeParse, useParseQuery } from '@parse/react-native';
5 |
6 | initializeParse(
7 | 'http://10.0.0.131:1337/parse',
8 | 'APPLICATION_ID',
9 | 'JAVASCRIPT_KEY'
10 | );
11 |
12 | export default function App() {
13 | const [
14 | hideDone,
15 | setHideDone
16 | ] = useState(false);
17 |
18 | const parseQuery = useMemo(
19 | () => {
20 | const parseQuery = new Parse.Query('Todo');
21 |
22 | if (hideDone) {
23 | parseQuery.notEqualTo('done', true);
24 | }
25 |
26 | (parseQuery as any).withCount();
27 |
28 | return parseQuery;
29 | },
30 | [hideDone]
31 | );
32 |
33 | const {
34 | isLive,
35 | isLoading,
36 | isSyncing,
37 | results,
38 | count,
39 | error,
40 | reload
41 | } = useParseQuery(parseQuery);
42 |
43 | return (
44 |
45 |
46 |
47 | setHideDone(!hideDone)}
49 | title={`${hideDone ? 'Unhide' : 'Hide'} done todos`}
50 | />
51 |
52 | {isLoading && (
53 |
54 | Loading...
55 |
56 | )}
57 | {isLive && (
58 |
59 | Live!
60 |
61 | )}
62 | {isSyncing && (
63 |
64 | Syncing...
65 |
66 | )}
67 | {results && (
68 |
69 | {results.map(result => (
70 |
71 |
72 | {result.get('title')}
73 |
74 |
75 | ))}
76 |
77 | )}
78 |
79 | {count}
80 |
81 | {error && (
82 |
83 | {error.message}
84 |
85 | )}
86 |
87 |
91 |
92 |
93 | );
94 | }
95 |
96 | const styles = StyleSheet.create({
97 | container: {
98 | flex: 1,
99 | backgroundColor: '#fff',
100 | alignItems: 'center',
101 | justifyContent: 'center',
102 | },
103 | });
104 |
--------------------------------------------------------------------------------
/packages/parse-react-native/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@parse/react-native",
3 | "version": "0.0.1-alpha.18",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "@parse/react-native",
9 | "version": "0.0.1-alpha.17",
10 | "license": "MIT",
11 | "dependencies": {
12 | "@react-native-async-storage/async-storage": "1.15.4"
13 | }
14 | },
15 | "node_modules/@react-native-async-storage/async-storage": {
16 | "version": "1.15.4",
17 | "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.4.tgz",
18 | "integrity": "sha512-pC0MS6UBuv/YiVAxtzi7CgUed8oCQNYMtGt0yb/I9fI/BWTiJK5cj4YtW2XtL95K5IuvPX/6uGWaouZ8KqXwdg==",
19 | "dependencies": {
20 | "deep-assign": "^3.0.0"
21 | },
22 | "peerDependencies": {
23 | "react-native": "^0.60.6 || ^0.61.5 || ^0.62.2 || ^0.63.2 || ^0.64.0 || 1000.0.0"
24 | }
25 | },
26 | "node_modules/deep-assign": {
27 | "version": "3.0.0",
28 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz",
29 | "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==",
30 | "deprecated": "Check out `lodash.merge` or `merge-options` instead.",
31 | "dependencies": {
32 | "is-obj": "^1.0.0"
33 | },
34 | "engines": {
35 | "node": ">=0.10.0"
36 | }
37 | },
38 | "node_modules/is-obj": {
39 | "version": "1.0.1",
40 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
41 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
42 | "engines": {
43 | "node": ">=0.10.0"
44 | }
45 | }
46 | },
47 | "dependencies": {
48 | "@react-native-async-storage/async-storage": {
49 | "version": "1.15.4",
50 | "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.4.tgz",
51 | "integrity": "sha512-pC0MS6UBuv/YiVAxtzi7CgUed8oCQNYMtGt0yb/I9fI/BWTiJK5cj4YtW2XtL95K5IuvPX/6uGWaouZ8KqXwdg==",
52 | "requires": {
53 | "deep-assign": "^3.0.0"
54 | }
55 | },
56 | "deep-assign": {
57 | "version": "3.0.0",
58 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz",
59 | "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==",
60 | "requires": {
61 | "is-obj": "^1.0.0"
62 | }
63 | },
64 | "is-obj": {
65 | "version": "1.0.1",
66 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
67 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/examples/react-ts-todo/src/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/next-ts-todo/pages/index.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect, useCallback } from 'react';
2 | import Head from 'next/head'
3 | import { initializeParse, encodeParseQuery, useParseQuery } from '@parse/react-ssr';
4 |
5 | initializeParse(
6 | 'http://localhost:1337/parse',
7 | 'APPLICATION_ID',
8 | 'JAVASCRIPT_KEY'
9 | );
10 |
11 | const createParseQuery = hideDone => {
12 | const parseQuery = new Parse.Query('Todo');
13 |
14 | if (hideDone) {
15 | parseQuery.notEqualTo('done', true);
16 | }
17 |
18 | (parseQuery as any).withCount();
19 |
20 | return parseQuery;
21 | };
22 |
23 | export default function Home({ initialHideDone, initialParseQuery }) {
24 | const [
25 | {
26 | hideDone,
27 | parseQuery
28 | },
29 | setParseQueryState
30 | ] = useState({
31 | hideDone: initialHideDone,
32 | parseQuery: initialParseQuery
33 | });
34 |
35 | useEffect(
36 | () => {
37 | if (
38 | hideDone !== initialHideDone ||
39 | parseQuery !== initialParseQuery
40 | ) {
41 | setParseQueryState({
42 | hideDone: initialHideDone,
43 | parseQuery: initialParseQuery
44 | });
45 | }
46 | },
47 | [initialHideDone, initialParseQuery]
48 | );
49 |
50 | const toggleHideDone = useCallback(
51 | () => {
52 | setParseQueryState({
53 | hideDone: !hideDone,
54 | parseQuery: createParseQuery(!hideDone)
55 | });
56 | },
57 | [hideDone]
58 | );
59 |
60 | const {
61 | isLive,
62 | isLoading,
63 | isSyncing,
64 | results,
65 | count,
66 | error,
67 | reload
68 | } = useParseQuery(parseQuery);
69 |
70 | return (
71 | <>
72 |
73 | Todo Example using @parse/ssr on Next.js (Typescript)
74 |
75 |
76 |
77 | {hideDone ? 'Unhide' : 'Hide'} done todos
78 |
79 | {isLoading && (
80 | Loading...
81 | )}
82 | {isLive && (
83 | Live!
84 | )}
85 | {isSyncing && (
86 | Syncing...
87 | )}
88 | {results && (
89 |
90 | {results.map(result => (
91 |
92 | {result.get('title')}
93 |
94 | ))}
95 |
96 | )}
97 | {count}
98 | {error && (
99 | {error.message}
100 | )}
101 |
104 | Reload
105 |
106 | >
107 | );
108 | };
109 |
110 | export async function getServerSideProps() {
111 | const initialHideDone = false;
112 |
113 | return {
114 | props: {
115 | initialHideDone,
116 | initialParseQuery: await encodeParseQuery(createParseQuery(initialHideDone))
117 | },
118 | }
119 | }
--------------------------------------------------------------------------------
/packages/parse-react/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | @parse/react (alpha)
8 |
9 |
10 | An experimental package that provides you easy, real-time, offline-first interaction with the powerful Parse Server backend from your React applications.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | # Getting Started
20 |
21 | First, install the [parse](https://www.npmjs.com/package/parse) and [@parse/react](https://www.npmjs.com/package/@parse/react) npm modules into your React application.
22 |
23 | ```sh
24 | npm install parse @parse/react --save
25 | ```
26 |
27 | In your `App.js` file, import and initialize Parse:
28 |
29 | ```js
30 | import { initializeParse } from '@parse/react';
31 |
32 | initializeParse(
33 | 'YOUR_SERVER_URL',
34 | 'YOUR_APPLICATION_ID',
35 | 'YOUR_JAVASCRIPT_KEY'
36 | );
37 | ```
38 |
39 | Now you are ready to use a Parse Query:
40 |
41 | ```js
42 | import React from 'react';
43 | import Parse from 'parse';
44 | import { useParseQuery } from '@parse/react';
45 |
46 | const SomeComponent = () => {
47 | const parseQuery = new Parse.Query('SomeClass');
48 |
49 | const {
50 | isLive, // Indicates that Parse Live Query is connected
51 | isLoading, // Indicates that the initial load is being processed
52 | isSyncing, // Indicates that the library is getting the latest data from Parse Server
53 | results, // Stores the current results in an array of Parse Objects
54 | count, // Stores the current results count
55 | error, // Stores any error
56 | reload // Function that can be used to reload the data
57 | } = useParseQuery(
58 | parseQuery, // The Parse Query to be used
59 | {
60 | enabled: true, // Enables the parse query (default: true)
61 | enableLocalDatastore: true, // Enables cache in local datastore (default: true)
62 | enableLiveQuery: true // Enables live query for real-time update (default: true)
63 | }
64 | );
65 |
66 | return (
67 |
68 | {isLoading && (
69 |
Loading...
70 | )}
71 | {isLive && (
72 |
Live!
73 | )}
74 | {isSyncing && (
75 |
Syncing...
76 | )}
77 | {results && (
78 |
79 | {results.map(result => (
80 |
81 | {result.get('someField')}
82 |
83 | ))}
84 |
85 | )}
86 |
{count}
87 | {error && (
88 |
{error.message}
89 | )}
90 |
93 | Reload
94 |
95 |
96 | );
97 | };
98 |
99 | export default SomeComponent;
100 | ```
101 |
102 | # Learning More
103 |
104 | This package aims to provide easier access to a Parse Server backend when developing React applications. It was built on top of the official [Parse JS SDK](https://docs.parseplatform.org/js/guide/). These two libraries should be used together and you can refer to the sdk documentation in order to learn more about Parse Objects, Parse Queries, and more:
105 | - Learn more about [Parse Objects](https://docs.parseplatform.org/js/guide/#objects);
106 | - Learn more about [Parse Queries](https://docs.parseplatform.org/js/guide/#queries).
107 |
108 | # Example
109 |
110 | See a [Todo List Example](https://github.com/parse-community/parse-react/tree/master/examples/react-ts-todo).
111 |
--------------------------------------------------------------------------------
/packages/parse-react-ssr/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | @parse/react-ssr (alpha)
8 |
9 |
10 | An experimental package that provides you easy, real-time, offline-first interaction with the powerful Parse Server backend from your React with SSR applications (e.g. Next.js).
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | # Getting Started (Next.js)
20 |
21 | First, install the [parse](https://www.npmjs.com/package/parse) and [@parse/react-ssr](https://www.npmjs.com/package/@parse/react-ssr) npm modules into your Next.js application.
22 |
23 | ```sh
24 | npm install parse @parse/react-ssr --save
25 | ```
26 |
27 | Now you are ready to use a Parse Query:
28 |
29 | ```js
30 | import Parse from 'parse';
31 | import { initializeParse, encodeParseQuery, useParseQuery } from '@parse/react-ssr';
32 |
33 | initializeParse( // We need to initialize Parse
34 | 'YOUR_SERVER_URL',
35 | 'YOUR_APPLICATION_ID',
36 | 'YOUR_JAVASCRIPT_KEY'
37 | );
38 |
39 | export async function getServerSideProps() {
40 | const parseQuery = new Parse.Query('SomeClass');
41 |
42 | return {
43 | props: {
44 | parseQuery: await encodeParseQuery(parseQuery) // Return encoded Parse Query for server side rendering
45 | }
46 | };
47 | };
48 |
49 | export default function SomePage({ parseQuery }) {
50 | const {
51 | isLive, // Indicates that Parse Live Query is connected
52 | isLoading, // Indicates that the initial load is being processed
53 | isSyncing, // Indicates that the library is getting the latest data from Parse Server
54 | results, // Stores the current results in an array of Parse Objects
55 | count, // Stores the current results count
56 | error, // Stores any error
57 | reload // Function that can be used to reload the data
58 | } = useParseQuery(
59 | parseQuery, // The Parse Query to be used
60 | {
61 | enabled: true, // Enables the parse query (default: true)
62 | enableLocalDatastore: true, // Enables cache in local datastore (default: true)
63 | enableLiveQuery: true // Enables live query for real-time update (default: true)
64 | }
65 | );
66 |
67 | return (
68 |
69 | {isLoading && (
70 |
Loading...
71 | )}
72 | {isLive && (
73 |
Live!
74 | )}
75 | {isSyncing && (
76 |
Syncing...
77 | )}
78 | {results && (
79 |
80 | {results.map(result => (
81 |
82 | {result.get('someField')}
83 |
84 | ))}
85 |
86 | )}
87 |
{count}
88 | {error && (
89 |
{error.message}
90 | )}
91 |
94 | Reload
95 |
96 |
97 | );
98 | };
99 | ```
100 |
101 | # Learning More
102 |
103 | This package aims to provide easier access to a Parse Server backend when developing React with SSR applications (e.g. Next.js). It was built on top of the official [Parse JS SDK](https://docs.parseplatform.org/js/guide/). These two libraries should be used together and you can refer to the sdk documentation in order to learn more about Parse Objects, Parse Queries, and more:
104 | - Learn more about [Parse Objects](https://docs.parseplatform.org/js/guide/#objects);
105 | - Learn more about [Parse Queries](https://docs.parseplatform.org/js/guide/#queries).
106 |
107 | # Example
108 |
109 | See a [Todo List Example](https://github.com/parse-community/parse-react/tree/master/examples/next-ts-todo).
110 |
--------------------------------------------------------------------------------
/packages/parse-react-ssr/src/index.ts:
--------------------------------------------------------------------------------
1 | import { useCallback, useMemo } from 'react';
2 | import {
3 | UseParseQueryOptions,
4 | UseParseQueryResult,
5 | useParseQuery as useParseQueryBase
6 | } from '@parse/react-base';
7 |
8 | const isServer = typeof window === 'undefined';
9 |
10 | if ((process as any).browser) {
11 | global.Parse = require('parse');
12 | } else {
13 | global.Parse = require('parse/node');
14 | }
15 |
16 | export const initializeParse = (serverURL: string, applicationId: string, javascriptKey: string) => {
17 | Parse.serverURL = serverURL;
18 | Parse.initialize(applicationId, javascriptKey);
19 | if (!isServer) {
20 | Parse.enableLocalDatastore();
21 | }
22 | };
23 |
24 | export interface EncodedParseQuery {
25 | className: string,
26 | query: object,
27 | findResult?: [] | object[],
28 | findError?: object
29 | }
30 |
31 | export const encodeParseQuery = async >(
32 | query: Parse.Query
33 | ): Promise => {
34 | let findResult, findError;
35 |
36 | try {
37 | findResult = await query.find();
38 | } catch (e) {
39 | findError = e;
40 | }
41 |
42 | const encodedParseQuery = {
43 | className: query.className,
44 | query: query.toJSON(),
45 | findResult: findResult && (Parse as any)._encode(findResult) || undefined,
46 | findError: findError && (Parse as any)._encode(findError) || undefined
47 | };
48 |
49 | if (!encodedParseQuery.findResult) {
50 | delete encodedParseQuery.findResult;
51 | }
52 | if (!encodedParseQuery.findError) {
53 | delete encodedParseQuery.findError;
54 | }
55 |
56 | return encodedParseQuery;
57 | };
58 |
59 | export const useParseQuery = >(
60 | query: Parse.Query | EncodedParseQuery,
61 | options?: UseParseQueryOptions
62 | ): UseParseQueryResult => {
63 | if (
64 | query instanceof Parse.Query &&
65 | isServer
66 | ) {
67 | return {
68 | isLoading: true,
69 | isLive: false,
70 | isSyncing: false,
71 | reload: () => {}
72 | };
73 | }
74 |
75 | const {
76 | findResult,
77 | findError,
78 | decodedQuery
79 | } = useMemo(
80 | () => {
81 | if (query instanceof Parse.Query) {
82 | return {
83 | decodedQuery: query
84 | };
85 | } else {
86 | return {
87 | findResult: query.findResult && (Parse as any)._decode(query.findResult) || undefined,
88 | findError: query.findError && (Parse as any)._decode(query.findError) || undefined,
89 | decodedQuery: Parse.Query.fromJSON(
90 | query.className,
91 | query.query
92 | ) as Parse.Query
93 | };
94 | }
95 | },
96 | [query]
97 | );
98 |
99 | const {
100 | findResultResults,
101 | findResultCount
102 | } = useMemo(
103 | () => ({
104 | findResultResults: findResult && (findResult.results || findResult) || undefined,
105 | findResultCount: findResult && findResult.count || undefined
106 | }),
107 | [findResult]
108 | );
109 |
110 | const serverReload = useCallback(
111 | () => {
112 | throw new Error(
113 | 'The reload function can not be used in the server side.'
114 | );
115 | },
116 | []
117 | )
118 |
119 | const serverResult = useMemo(
120 | () => ({
121 | isLoading: false,
122 | isLive: false,
123 | isSyncing: false,
124 | results: findResultResults,
125 | count: findResultCount,
126 | error: findError,
127 | reload: serverReload
128 | }),
129 | [findResultResults, findResultCount, findError, serverReload]
130 | );
131 |
132 | if (isServer) {
133 | return serverResult;
134 | }
135 |
136 | return useParseQueryBase(
137 | decodedQuery,
138 | {
139 | enabled: options && options.enabled || undefined,
140 | enableLocalDatastore: (options && options.enableLocalDatastore) ?? undefined,
141 | enableLiveQuery: (options && options.enableLiveQuery) ?? undefined,
142 | initialLoad: options && options.initialLoad ||
143 | findResult && {
144 | results: findResultResults,
145 | count: findResultCount
146 | } ||
147 | undefined
148 | }
149 | );
150 | };
151 |
--------------------------------------------------------------------------------
/packages/parse-react-native/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | @parse/react-native (alpha)
8 |
9 |
10 | An experimental package that provides you easy, real-time, offline-first interaction with the powerful Parse Server backend from your React Native applications.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | # Getting Started
20 |
21 | First, install the [parse](https://www.npmjs.com/package/parse) and [@parse/react-native](https://www.npmjs.com/package/@parse/react-native) npm modules into your React Native application.
22 |
23 | ```sh
24 | npm install parse @parse/react-native --save
25 | ```
26 |
27 | In your `App.js` file, import and initialize Parse:
28 |
29 | ```js
30 | import { initializeParse } from '@parse/react-native';
31 |
32 | initializeParse(
33 | 'YOUR_SERVER_URL',
34 | 'YOUR_APPLICATION_ID',
35 | 'YOUR_JAVASCRIPT_KEY'
36 | );
37 | ```
38 |
39 | Now you are ready to use a Parse Query:
40 |
41 | ```js
42 | import React from 'react';
43 | import { Button, Text, View } from 'react-native';
44 | import Parse from 'parse/react-native.js';
45 | import { useParseQuery } from '@parse/react-native';
46 |
47 | const SomeComponent = () => {
48 | const parseQuery = new Parse.Query('SomeClass');
49 |
50 | const {
51 | isLive, // Indicates that Parse Live Query is connected
52 | isLoading, // Indicates that the initial load is being processed
53 | isSyncing, // Indicates that the library is getting the latest data from Parse Server
54 | results, // Stores the current results in an array of Parse Objects
55 | count, // Stores the current results count
56 | error, // Stores any error
57 | reload // Function that can be used to reload the data
58 | } = useParseQuery(
59 | parseQuery, // The Parse Query to be used
60 | {
61 | enabled: true, // Enables the parse query (default: true)
62 | enableLocalDatastore: true, // Enables cache in local datastore (default: true)
63 | enableLiveQuery: true // Enables live query for real-time update (default: true)
64 | }
65 | );
66 |
67 | return (
68 |
69 | {isLoading && (
70 |
71 | Loading...
72 |
73 | )}
74 | {isLive && (
75 |
76 | Live!
77 |
78 | )}
79 | {isSyncing && (
80 |
81 | Syncing...
82 |
83 | )}
84 | {results && (
85 |
86 | {results.map(result => (
87 |
88 |
89 | {result.get('someField')}
90 |
91 |
92 | ))}
93 |
94 | )}
95 |
96 | {count}
97 |
98 | {error && (
99 |
100 | {error.message}
101 |
102 | )}
103 |
104 |
108 |
109 |
110 | );
111 | };
112 |
113 | export default SomeComponent;
114 | ```
115 |
116 | # Learning More
117 |
118 | This package aims to provide easier access to a Parse Server backend when developing React Native applications. It was built on top of the official [Parse JS SDK](https://docs.parseplatform.org/js/guide/). These two libraries should be used together and you can refer to the sdk documentation in order to learn more about Parse Objects, Parse Queries, and more:
119 | - Learn more about [Parse Objects](https://docs.parseplatform.org/js/guide/#objects);
120 | - Learn more about [Parse Queries](https://docs.parseplatform.org/js/guide/#queries).
121 |
122 | # Example
123 |
124 | See a [Todo List Example](https://github.com/parse-community/parse-react/tree/master/examples/react-native-ts-todo).
125 |
--------------------------------------------------------------------------------
/examples/react-ts-todo/src/serviceWorker.ts:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.0/8 are considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | type Config = {
24 | onSuccess?: (registration: ServiceWorkerRegistration) => void;
25 | onUpdate?: (registration: ServiceWorkerRegistration) => void;
26 | };
27 |
28 | export function register(config?: Config) {
29 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
30 | // The URL constructor is available in all browsers that support SW.
31 | const publicUrl = new URL(
32 | process.env.PUBLIC_URL,
33 | window.location.href
34 | );
35 | if (publicUrl.origin !== window.location.origin) {
36 | // Our service worker won't work if PUBLIC_URL is on a different origin
37 | // from what our page is served on. This might happen if a CDN is used to
38 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
39 | return;
40 | }
41 |
42 | window.addEventListener('load', () => {
43 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
44 |
45 | if (isLocalhost) {
46 | // This is running on localhost. Let's check if a service worker still exists or not.
47 | checkValidServiceWorker(swUrl, config);
48 |
49 | // Add some additional logging to localhost, pointing developers to the
50 | // service worker/PWA documentation.
51 | navigator.serviceWorker.ready.then(() => {
52 | console.log(
53 | 'This web app is being served cache-first by a service ' +
54 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
55 | );
56 | });
57 | } else {
58 | // Is not localhost. Just register service worker
59 | registerValidSW(swUrl, config);
60 | }
61 | });
62 | }
63 | }
64 |
65 | function registerValidSW(swUrl: string, config?: Config) {
66 | navigator.serviceWorker
67 | .register(swUrl)
68 | .then(registration => {
69 | registration.onupdatefound = () => {
70 | const installingWorker = registration.installing;
71 | if (installingWorker == null) {
72 | return;
73 | }
74 | installingWorker.onstatechange = () => {
75 | if (installingWorker.state === 'installed') {
76 | if (navigator.serviceWorker.controller) {
77 | // At this point, the updated precached content has been fetched,
78 | // but the previous service worker will still serve the older
79 | // content until all client tabs are closed.
80 | console.log(
81 | 'New content is available and will be used when all ' +
82 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
83 | );
84 |
85 | // Execute callback
86 | if (config && config.onUpdate) {
87 | config.onUpdate(registration);
88 | }
89 | } else {
90 | // At this point, everything has been precached.
91 | // It's the perfect time to display a
92 | // "Content is cached for offline use." message.
93 | console.log('Content is cached for offline use.');
94 |
95 | // Execute callback
96 | if (config && config.onSuccess) {
97 | config.onSuccess(registration);
98 | }
99 | }
100 | }
101 | };
102 | };
103 | })
104 | .catch(error => {
105 | console.error('Error during service worker registration:', error);
106 | });
107 | }
108 |
109 | function checkValidServiceWorker(swUrl: string, config?: Config) {
110 | // Check if the service worker can be found. If it can't reload the page.
111 | fetch(swUrl, {
112 | headers: { 'Service-Worker': 'script' }
113 | })
114 | .then(response => {
115 | // Ensure service worker exists, and that we really are getting a JS file.
116 | const contentType = response.headers.get('content-type');
117 | if (
118 | response.status === 404 ||
119 | (contentType != null && contentType.indexOf('javascript') === -1)
120 | ) {
121 | // No service worker found. Probably a different app. Reload the page.
122 | navigator.serviceWorker.ready.then(registration => {
123 | registration.unregister().then(() => {
124 | window.location.reload();
125 | });
126 | });
127 | } else {
128 | // Service worker found. Proceed as normal.
129 | registerValidSW(swUrl, config);
130 | }
131 | })
132 | .catch(() => {
133 | console.log(
134 | 'No internet connection found. App is running in offline mode.'
135 | );
136 | });
137 | }
138 |
139 | export function unregister() {
140 | if ('serviceWorker' in navigator) {
141 | navigator.serviceWorker.ready
142 | .then(registration => {
143 | registration.unregister();
144 | })
145 | .catch(error => {
146 | console.error(error.message);
147 | });
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/packages/parse-react/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@parse/react",
3 | "version": "0.0.1-alpha.18",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "@parse/react",
9 | "version": "0.0.1-alpha.14",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@types/parse": "^2.12.6",
13 | "@types/react": "^16.9.53",
14 | "typescript": "^4.0.3"
15 | },
16 | "peerDependencies": {
17 | "parse": ">= 2.17.0",
18 | "react": ">= 16.8.0"
19 | }
20 | },
21 | "node_modules/@babel/runtime": {
22 | "version": "7.14.8",
23 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
24 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
25 | "peer": true,
26 | "dependencies": {
27 | "regenerator-runtime": "^0.13.4"
28 | },
29 | "engines": {
30 | "node": ">=6.9.0"
31 | }
32 | },
33 | "node_modules/@babel/runtime-corejs3": {
34 | "version": "7.14.6",
35 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
36 | "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
37 | "peer": true,
38 | "dependencies": {
39 | "core-js-pure": "^3.14.0",
40 | "regenerator-runtime": "^0.13.4"
41 | },
42 | "engines": {
43 | "node": ">=6.9.0"
44 | }
45 | },
46 | "node_modules/@types/node": {
47 | "version": "14.14.6",
48 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz",
49 | "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==",
50 | "dev": true
51 | },
52 | "node_modules/@types/parse": {
53 | "version": "2.12.7",
54 | "resolved": "https://registry.npmjs.org/@types/parse/-/parse-2.12.7.tgz",
55 | "integrity": "sha512-bs6gZ2wY/lFODZnfUdJkb8J5pQs2kFl9tpFEL1Cssg2xp90rEx9RA3cvA5Z+GSsc/wqqcki84PGYiiRVn/w30w==",
56 | "dev": true,
57 | "dependencies": {
58 | "@types/node": "*"
59 | }
60 | },
61 | "node_modules/@types/prop-types": {
62 | "version": "15.7.3",
63 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
64 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
65 | "dev": true
66 | },
67 | "node_modules/@types/react": {
68 | "version": "16.9.55",
69 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.55.tgz",
70 | "integrity": "sha512-6KLe6lkILeRwyyy7yG9rULKJ0sXplUsl98MGoCfpteXf9sPWFWWMknDcsvubcpaTdBuxtsLF6HDUwdApZL/xIg==",
71 | "dev": true,
72 | "dependencies": {
73 | "@types/prop-types": "*",
74 | "csstype": "^3.0.2"
75 | }
76 | },
77 | "node_modules/core-js-pure": {
78 | "version": "3.18.3",
79 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
80 | "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==",
81 | "hasInstallScript": true,
82 | "peer": true,
83 | "funding": {
84 | "type": "opencollective",
85 | "url": "https://opencollective.com/core-js"
86 | }
87 | },
88 | "node_modules/crypto-js": {
89 | "version": "4.1.1",
90 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
91 | "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
92 | "optional": true,
93 | "peer": true
94 | },
95 | "node_modules/csstype": {
96 | "version": "3.0.4",
97 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz",
98 | "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==",
99 | "dev": true
100 | },
101 | "node_modules/idb-keyval": {
102 | "version": "5.0.6",
103 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.6.tgz",
104 | "integrity": "sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg==",
105 | "peer": true
106 | },
107 | "node_modules/js-tokens": {
108 | "version": "4.0.0",
109 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
110 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
111 | "peer": true
112 | },
113 | "node_modules/loose-envify": {
114 | "version": "1.4.0",
115 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
116 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
117 | "peer": true,
118 | "dependencies": {
119 | "js-tokens": "^3.0.0 || ^4.0.0"
120 | },
121 | "bin": {
122 | "loose-envify": "cli.js"
123 | }
124 | },
125 | "node_modules/object-assign": {
126 | "version": "4.1.1",
127 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
128 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
129 | "peer": true,
130 | "engines": {
131 | "node": ">=0.10.0"
132 | }
133 | },
134 | "node_modules/parse": {
135 | "version": "3.3.1",
136 | "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
137 | "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
138 | "peer": true,
139 | "dependencies": {
140 | "@babel/runtime": "7.14.8",
141 | "@babel/runtime-corejs3": "7.14.6",
142 | "idb-keyval": "5.0.6",
143 | "react-native-crypto-js": "1.0.0",
144 | "uuid": "3.4.0",
145 | "ws": "7.5.0",
146 | "xmlhttprequest": "1.8.0"
147 | },
148 | "optionalDependencies": {
149 | "crypto-js": "4.1.1"
150 | }
151 | },
152 | "node_modules/react": {
153 | "version": "17.0.2",
154 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
155 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
156 | "peer": true,
157 | "dependencies": {
158 | "loose-envify": "^1.1.0",
159 | "object-assign": "^4.1.1"
160 | },
161 | "engines": {
162 | "node": ">=0.10.0"
163 | }
164 | },
165 | "node_modules/react-native-crypto-js": {
166 | "version": "1.0.0",
167 | "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
168 | "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==",
169 | "peer": true
170 | },
171 | "node_modules/regenerator-runtime": {
172 | "version": "0.13.9",
173 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
174 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
175 | "peer": true
176 | },
177 | "node_modules/typescript": {
178 | "version": "4.0.5",
179 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz",
180 | "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==",
181 | "dev": true,
182 | "bin": {
183 | "tsc": "bin/tsc",
184 | "tsserver": "bin/tsserver"
185 | },
186 | "engines": {
187 | "node": ">=4.2.0"
188 | }
189 | },
190 | "node_modules/uuid": {
191 | "version": "3.4.0",
192 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
193 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
194 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
195 | "peer": true,
196 | "bin": {
197 | "uuid": "bin/uuid"
198 | }
199 | },
200 | "node_modules/ws": {
201 | "version": "7.5.0",
202 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
203 | "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
204 | "peer": true,
205 | "engines": {
206 | "node": ">=8.3.0"
207 | },
208 | "peerDependencies": {
209 | "bufferutil": "^4.0.1",
210 | "utf-8-validate": "^5.0.2"
211 | },
212 | "peerDependenciesMeta": {
213 | "bufferutil": {
214 | "optional": true
215 | },
216 | "utf-8-validate": {
217 | "optional": true
218 | }
219 | }
220 | },
221 | "node_modules/xmlhttprequest": {
222 | "version": "1.8.0",
223 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
224 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
225 | "peer": true,
226 | "engines": {
227 | "node": ">=0.4.0"
228 | }
229 | }
230 | },
231 | "dependencies": {
232 | "@babel/runtime": {
233 | "version": "7.14.8",
234 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
235 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
236 | "peer": true,
237 | "requires": {
238 | "regenerator-runtime": "^0.13.4"
239 | }
240 | },
241 | "@babel/runtime-corejs3": {
242 | "version": "7.14.6",
243 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
244 | "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
245 | "peer": true,
246 | "requires": {
247 | "core-js-pure": "^3.14.0",
248 | "regenerator-runtime": "^0.13.4"
249 | }
250 | },
251 | "@types/node": {
252 | "version": "14.14.6",
253 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz",
254 | "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==",
255 | "dev": true
256 | },
257 | "@types/parse": {
258 | "version": "2.12.7",
259 | "resolved": "https://registry.npmjs.org/@types/parse/-/parse-2.12.7.tgz",
260 | "integrity": "sha512-bs6gZ2wY/lFODZnfUdJkb8J5pQs2kFl9tpFEL1Cssg2xp90rEx9RA3cvA5Z+GSsc/wqqcki84PGYiiRVn/w30w==",
261 | "dev": true,
262 | "requires": {
263 | "@types/node": "*"
264 | }
265 | },
266 | "@types/prop-types": {
267 | "version": "15.7.3",
268 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
269 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
270 | "dev": true
271 | },
272 | "@types/react": {
273 | "version": "16.9.55",
274 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.55.tgz",
275 | "integrity": "sha512-6KLe6lkILeRwyyy7yG9rULKJ0sXplUsl98MGoCfpteXf9sPWFWWMknDcsvubcpaTdBuxtsLF6HDUwdApZL/xIg==",
276 | "dev": true,
277 | "requires": {
278 | "@types/prop-types": "*",
279 | "csstype": "^3.0.2"
280 | }
281 | },
282 | "core-js-pure": {
283 | "version": "3.18.3",
284 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
285 | "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==",
286 | "peer": true
287 | },
288 | "crypto-js": {
289 | "version": "4.1.1",
290 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
291 | "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
292 | "optional": true,
293 | "peer": true
294 | },
295 | "csstype": {
296 | "version": "3.0.4",
297 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz",
298 | "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==",
299 | "dev": true
300 | },
301 | "idb-keyval": {
302 | "version": "5.0.6",
303 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.6.tgz",
304 | "integrity": "sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg==",
305 | "peer": true
306 | },
307 | "js-tokens": {
308 | "version": "4.0.0",
309 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
310 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
311 | "peer": true
312 | },
313 | "loose-envify": {
314 | "version": "1.4.0",
315 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
316 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
317 | "peer": true,
318 | "requires": {
319 | "js-tokens": "^3.0.0 || ^4.0.0"
320 | }
321 | },
322 | "object-assign": {
323 | "version": "4.1.1",
324 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
325 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
326 | "peer": true
327 | },
328 | "parse": {
329 | "version": "3.3.1",
330 | "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
331 | "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
332 | "peer": true,
333 | "requires": {
334 | "@babel/runtime": "7.14.8",
335 | "@babel/runtime-corejs3": "7.14.6",
336 | "crypto-js": "4.1.1",
337 | "idb-keyval": "5.0.6",
338 | "react-native-crypto-js": "1.0.0",
339 | "uuid": "3.4.0",
340 | "ws": "7.5.0",
341 | "xmlhttprequest": "1.8.0"
342 | }
343 | },
344 | "react": {
345 | "version": "17.0.2",
346 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
347 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
348 | "peer": true,
349 | "requires": {
350 | "loose-envify": "^1.1.0",
351 | "object-assign": "^4.1.1"
352 | }
353 | },
354 | "react-native-crypto-js": {
355 | "version": "1.0.0",
356 | "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
357 | "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==",
358 | "peer": true
359 | },
360 | "regenerator-runtime": {
361 | "version": "0.13.9",
362 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
363 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
364 | "peer": true
365 | },
366 | "typescript": {
367 | "version": "4.0.5",
368 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz",
369 | "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==",
370 | "dev": true
371 | },
372 | "uuid": {
373 | "version": "3.4.0",
374 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
375 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
376 | "peer": true
377 | },
378 | "ws": {
379 | "version": "7.5.0",
380 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
381 | "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
382 | "peer": true,
383 | "requires": {}
384 | },
385 | "xmlhttprequest": {
386 | "version": "1.8.0",
387 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
388 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
389 | "peer": true
390 | }
391 | }
392 | }
393 |
--------------------------------------------------------------------------------
/packages/parse-react-ssr/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@parse/react-ssr",
3 | "version": "0.0.1-alpha.18",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "@parse/react-ssr",
9 | "version": "0.0.1-alpha.14",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@types/parse": "^2.12.6",
13 | "@types/react": "^16.9.53",
14 | "typescript": "^4.0.3"
15 | },
16 | "peerDependencies": {
17 | "parse": ">= 2.17.0",
18 | "react": ">= 16.8.0"
19 | }
20 | },
21 | "node_modules/@babel/runtime": {
22 | "version": "7.14.8",
23 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
24 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
25 | "peer": true,
26 | "dependencies": {
27 | "regenerator-runtime": "^0.13.4"
28 | },
29 | "engines": {
30 | "node": ">=6.9.0"
31 | }
32 | },
33 | "node_modules/@babel/runtime-corejs3": {
34 | "version": "7.14.6",
35 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
36 | "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
37 | "peer": true,
38 | "dependencies": {
39 | "core-js-pure": "^3.14.0",
40 | "regenerator-runtime": "^0.13.4"
41 | },
42 | "engines": {
43 | "node": ">=6.9.0"
44 | }
45 | },
46 | "node_modules/@types/node": {
47 | "version": "14.14.7",
48 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz",
49 | "integrity": "sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==",
50 | "dev": true
51 | },
52 | "node_modules/@types/parse": {
53 | "version": "2.12.7",
54 | "resolved": "https://registry.npmjs.org/@types/parse/-/parse-2.12.7.tgz",
55 | "integrity": "sha512-bs6gZ2wY/lFODZnfUdJkb8J5pQs2kFl9tpFEL1Cssg2xp90rEx9RA3cvA5Z+GSsc/wqqcki84PGYiiRVn/w30w==",
56 | "dev": true,
57 | "dependencies": {
58 | "@types/node": "*"
59 | }
60 | },
61 | "node_modules/@types/prop-types": {
62 | "version": "15.7.3",
63 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
64 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
65 | "dev": true
66 | },
67 | "node_modules/@types/react": {
68 | "version": "16.9.56",
69 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.56.tgz",
70 | "integrity": "sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==",
71 | "dev": true,
72 | "dependencies": {
73 | "@types/prop-types": "*",
74 | "csstype": "^3.0.2"
75 | }
76 | },
77 | "node_modules/core-js-pure": {
78 | "version": "3.18.3",
79 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
80 | "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==",
81 | "hasInstallScript": true,
82 | "peer": true,
83 | "funding": {
84 | "type": "opencollective",
85 | "url": "https://opencollective.com/core-js"
86 | }
87 | },
88 | "node_modules/crypto-js": {
89 | "version": "4.1.1",
90 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
91 | "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
92 | "optional": true,
93 | "peer": true
94 | },
95 | "node_modules/csstype": {
96 | "version": "3.0.4",
97 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz",
98 | "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==",
99 | "dev": true
100 | },
101 | "node_modules/idb-keyval": {
102 | "version": "5.0.6",
103 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.6.tgz",
104 | "integrity": "sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg==",
105 | "peer": true
106 | },
107 | "node_modules/js-tokens": {
108 | "version": "4.0.0",
109 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
110 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
111 | "peer": true
112 | },
113 | "node_modules/loose-envify": {
114 | "version": "1.4.0",
115 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
116 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
117 | "peer": true,
118 | "dependencies": {
119 | "js-tokens": "^3.0.0 || ^4.0.0"
120 | },
121 | "bin": {
122 | "loose-envify": "cli.js"
123 | }
124 | },
125 | "node_modules/object-assign": {
126 | "version": "4.1.1",
127 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
128 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
129 | "peer": true,
130 | "engines": {
131 | "node": ">=0.10.0"
132 | }
133 | },
134 | "node_modules/parse": {
135 | "version": "3.3.1",
136 | "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
137 | "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
138 | "peer": true,
139 | "dependencies": {
140 | "@babel/runtime": "7.14.8",
141 | "@babel/runtime-corejs3": "7.14.6",
142 | "idb-keyval": "5.0.6",
143 | "react-native-crypto-js": "1.0.0",
144 | "uuid": "3.4.0",
145 | "ws": "7.5.0",
146 | "xmlhttprequest": "1.8.0"
147 | },
148 | "optionalDependencies": {
149 | "crypto-js": "4.1.1"
150 | }
151 | },
152 | "node_modules/react": {
153 | "version": "17.0.2",
154 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
155 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
156 | "peer": true,
157 | "dependencies": {
158 | "loose-envify": "^1.1.0",
159 | "object-assign": "^4.1.1"
160 | },
161 | "engines": {
162 | "node": ">=0.10.0"
163 | }
164 | },
165 | "node_modules/react-native-crypto-js": {
166 | "version": "1.0.0",
167 | "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
168 | "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==",
169 | "peer": true
170 | },
171 | "node_modules/regenerator-runtime": {
172 | "version": "0.13.9",
173 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
174 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
175 | "peer": true
176 | },
177 | "node_modules/typescript": {
178 | "version": "4.0.5",
179 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz",
180 | "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==",
181 | "dev": true,
182 | "bin": {
183 | "tsc": "bin/tsc",
184 | "tsserver": "bin/tsserver"
185 | },
186 | "engines": {
187 | "node": ">=4.2.0"
188 | }
189 | },
190 | "node_modules/uuid": {
191 | "version": "3.4.0",
192 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
193 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
194 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
195 | "peer": true,
196 | "bin": {
197 | "uuid": "bin/uuid"
198 | }
199 | },
200 | "node_modules/ws": {
201 | "version": "7.5.0",
202 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
203 | "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
204 | "peer": true,
205 | "engines": {
206 | "node": ">=8.3.0"
207 | },
208 | "peerDependencies": {
209 | "bufferutil": "^4.0.1",
210 | "utf-8-validate": "^5.0.2"
211 | },
212 | "peerDependenciesMeta": {
213 | "bufferutil": {
214 | "optional": true
215 | },
216 | "utf-8-validate": {
217 | "optional": true
218 | }
219 | }
220 | },
221 | "node_modules/xmlhttprequest": {
222 | "version": "1.8.0",
223 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
224 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
225 | "peer": true,
226 | "engines": {
227 | "node": ">=0.4.0"
228 | }
229 | }
230 | },
231 | "dependencies": {
232 | "@babel/runtime": {
233 | "version": "7.14.8",
234 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
235 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
236 | "peer": true,
237 | "requires": {
238 | "regenerator-runtime": "^0.13.4"
239 | }
240 | },
241 | "@babel/runtime-corejs3": {
242 | "version": "7.14.6",
243 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
244 | "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
245 | "peer": true,
246 | "requires": {
247 | "core-js-pure": "^3.14.0",
248 | "regenerator-runtime": "^0.13.4"
249 | }
250 | },
251 | "@types/node": {
252 | "version": "14.14.7",
253 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz",
254 | "integrity": "sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==",
255 | "dev": true
256 | },
257 | "@types/parse": {
258 | "version": "2.12.7",
259 | "resolved": "https://registry.npmjs.org/@types/parse/-/parse-2.12.7.tgz",
260 | "integrity": "sha512-bs6gZ2wY/lFODZnfUdJkb8J5pQs2kFl9tpFEL1Cssg2xp90rEx9RA3cvA5Z+GSsc/wqqcki84PGYiiRVn/w30w==",
261 | "dev": true,
262 | "requires": {
263 | "@types/node": "*"
264 | }
265 | },
266 | "@types/prop-types": {
267 | "version": "15.7.3",
268 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
269 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
270 | "dev": true
271 | },
272 | "@types/react": {
273 | "version": "16.9.56",
274 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.56.tgz",
275 | "integrity": "sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==",
276 | "dev": true,
277 | "requires": {
278 | "@types/prop-types": "*",
279 | "csstype": "^3.0.2"
280 | }
281 | },
282 | "core-js-pure": {
283 | "version": "3.18.3",
284 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
285 | "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==",
286 | "peer": true
287 | },
288 | "crypto-js": {
289 | "version": "4.1.1",
290 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
291 | "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
292 | "optional": true,
293 | "peer": true
294 | },
295 | "csstype": {
296 | "version": "3.0.4",
297 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz",
298 | "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==",
299 | "dev": true
300 | },
301 | "idb-keyval": {
302 | "version": "5.0.6",
303 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.6.tgz",
304 | "integrity": "sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg==",
305 | "peer": true
306 | },
307 | "js-tokens": {
308 | "version": "4.0.0",
309 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
310 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
311 | "peer": true
312 | },
313 | "loose-envify": {
314 | "version": "1.4.0",
315 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
316 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
317 | "peer": true,
318 | "requires": {
319 | "js-tokens": "^3.0.0 || ^4.0.0"
320 | }
321 | },
322 | "object-assign": {
323 | "version": "4.1.1",
324 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
325 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
326 | "peer": true
327 | },
328 | "parse": {
329 | "version": "3.3.1",
330 | "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
331 | "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
332 | "peer": true,
333 | "requires": {
334 | "@babel/runtime": "7.14.8",
335 | "@babel/runtime-corejs3": "7.14.6",
336 | "crypto-js": "4.1.1",
337 | "idb-keyval": "5.0.6",
338 | "react-native-crypto-js": "1.0.0",
339 | "uuid": "3.4.0",
340 | "ws": "7.5.0",
341 | "xmlhttprequest": "1.8.0"
342 | }
343 | },
344 | "react": {
345 | "version": "17.0.2",
346 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
347 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
348 | "peer": true,
349 | "requires": {
350 | "loose-envify": "^1.1.0",
351 | "object-assign": "^4.1.1"
352 | }
353 | },
354 | "react-native-crypto-js": {
355 | "version": "1.0.0",
356 | "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
357 | "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==",
358 | "peer": true
359 | },
360 | "regenerator-runtime": {
361 | "version": "0.13.9",
362 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
363 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
364 | "peer": true
365 | },
366 | "typescript": {
367 | "version": "4.0.5",
368 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz",
369 | "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==",
370 | "dev": true
371 | },
372 | "uuid": {
373 | "version": "3.4.0",
374 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
375 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
376 | "peer": true
377 | },
378 | "ws": {
379 | "version": "7.5.0",
380 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
381 | "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
382 | "peer": true,
383 | "requires": {}
384 | },
385 | "xmlhttprequest": {
386 | "version": "1.8.0",
387 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
388 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
389 | "peer": true
390 | }
391 | }
392 | }
393 |
--------------------------------------------------------------------------------
/packages/parse-react-base/src/useParseQuery.ts:
--------------------------------------------------------------------------------
1 | import { useRef, useReducer, useMemo, useCallback, useEffect } from 'react';
2 | import { compareParseObjects } from './util';
3 |
4 | interface ResultState> {
5 | isLoading: boolean;
6 | isLive: boolean;
7 | isSyncing: boolean;
8 | results?: T[];
9 | count?: number;
10 | error?: Error;
11 | }
12 |
13 | interface State> extends ResultState {
14 | queryId: number;
15 | }
16 |
17 | export interface InitialLoad> {
18 | results: T[],
19 | count?: number
20 | }
21 |
22 | const getInitialState = >(
23 | queryId: number,
24 | initialLoad?: InitialLoad
25 | ) => ({
26 | queryId,
27 | isLoading: initialLoad === undefined,
28 | isLive: false,
29 | isSyncing: false,
30 | results: initialLoad && initialLoad.results || undefined,
31 | count: initialLoad && initialLoad.count || undefined
32 | });
33 |
34 | enum ActionTypes {
35 | LoadLocalDatastoreResults,
36 | SetIsLive,
37 | SetIsSyncing,
38 | LoadParseServerResults,
39 | LoadResult,
40 | UnloadResult,
41 | Fail,
42 | Reset
43 | }
44 |
45 | type LoadLocalDatastoreResultsAction> = {
46 | type: ActionTypes.LoadLocalDatastoreResults,
47 | payload: {
48 | queryId: number,
49 | results: T[],
50 | count?: number
51 | }
52 | };
53 |
54 | const loadLocalDatastoreResults = >(
55 | queryId: number,
56 | results: T[],
57 | count?: number
58 | ): LoadLocalDatastoreResultsAction => ({
59 | type: ActionTypes.LoadLocalDatastoreResults,
60 | payload: {
61 | queryId,
62 | results,
63 | count
64 | }
65 | });
66 |
67 | const setIsLive = (queryId: number, isLive: boolean) => ({
68 | type: ActionTypes.SetIsLive,
69 | payload: {
70 | queryId,
71 | isLive
72 | }
73 | } as const);
74 |
75 | const setIsSyncing = (queryId: number, isSyncing: boolean) => ({
76 | type: ActionTypes.SetIsSyncing,
77 | payload: {
78 | queryId,
79 | isSyncing
80 | }
81 | } as const);
82 |
83 | type LoadParseServerResultsAction> = {
84 | type: ActionTypes.LoadParseServerResults,
85 | payload: {
86 | queryId: number,
87 | results: T[],
88 | count?: number
89 | }
90 | };
91 |
92 | const loadParseServerResults = >(
93 | queryId: number,
94 | results: T[],
95 | count?: number
96 | ): LoadParseServerResultsAction => ({
97 | type: ActionTypes.LoadParseServerResults,
98 | payload: {
99 | queryId,
100 | results,
101 | count
102 | }
103 | });
104 |
105 | type LoadResultAction> = {
106 | type: ActionTypes.LoadResult,
107 | payload: {
108 | queryId: number,
109 | result: T,
110 | order?: string[],
111 | limit?: number
112 | }
113 | };
114 |
115 | const loadResult = >(
116 | queryId: number,
117 | result: T,
118 | order?: string[],
119 | limit?: number
120 | ): LoadResultAction => ({
121 | type: ActionTypes.LoadResult,
122 | payload: {
123 | queryId,
124 | result,
125 | order,
126 | limit
127 | }
128 | });
129 |
130 | type UnloadResultAction> = {
131 | type: ActionTypes.UnloadResult,
132 | payload: {
133 | queryId: number,
134 | result: T
135 | }
136 | };
137 |
138 | const unloadResult = >(
139 | queryId: number,
140 | result: T
141 | ): UnloadResultAction => ({
142 | type: ActionTypes.UnloadResult,
143 | payload: {
144 | queryId,
145 | result
146 | }
147 | });
148 |
149 | const fail = (queryId: number, error: Error) => ({
150 | type: ActionTypes.Fail,
151 | payload: {
152 | queryId,
153 | error
154 | }
155 | } as const);
156 |
157 | type ResetAction> = {
158 | type: ActionTypes.Reset,
159 | payload: {
160 | initialLoad?: InitialLoad
161 | }
162 | };
163 |
164 | const reset = >(
165 | initialLoad?: InitialLoad
166 | ): ResetAction => ({
167 | type: ActionTypes.Reset,
168 | payload: {
169 | initialLoad
170 | }
171 | });
172 |
173 | type Action> =
174 | LoadLocalDatastoreResultsAction |
175 | LoadParseServerResultsAction |
176 | LoadResultAction |
177 | UnloadResultAction |
178 | ResetAction |
179 | ReturnType<
180 | typeof setIsLive |
181 | typeof setIsSyncing |
182 | typeof fail
183 | >;
184 |
185 | type Reducer> = (
186 | state: State,
187 | action: Action
188 | ) => State;
189 |
190 | const reducer = >(
191 | state: State,
192 | action: Action
193 | ): State => {
194 | if (action.type === ActionTypes.Reset) {
195 | return getInitialState(
196 | state.queryId + 1,
197 | action.payload.initialLoad
198 | );
199 | } else if (
200 | action.payload.queryId !== state.queryId ||
201 | state.error
202 | ) {
203 | return state;
204 | }
205 |
206 | switch (action.type) {
207 | case ActionTypes.LoadLocalDatastoreResults: {
208 | return {
209 | ...state,
210 | isLoading: false,
211 | results: state.isLoading ? action.payload.results : state.results,
212 | count: state.isLoading ? action.payload.count : state.count
213 | };
214 | }
215 |
216 | case ActionTypes.SetIsLive: {
217 | return {
218 | ...state,
219 | isLive: action.payload.isLive
220 | };
221 | }
222 |
223 | case ActionTypes.SetIsSyncing: {
224 | return {
225 | ...state,
226 | isSyncing: action.payload.isSyncing
227 | };
228 | }
229 |
230 | case ActionTypes.LoadParseServerResults: {
231 | return {
232 | ...state,
233 | isLoading: false,
234 | isSyncing: false,
235 | results: action.payload.results,
236 | count: action.payload.count
237 | };
238 | }
239 |
240 | case ActionTypes.LoadResult: {
241 | let results = state.results;
242 | let count = state.count;
243 |
244 | if (results) {
245 | results = results.filter(
246 | result => result.id !== action.payload.result.id
247 | );
248 |
249 | let index = 0;
250 | if (action.payload.order) {
251 | index = results.findIndex(
252 | result => compareParseObjects(result, action.payload.result, action.payload.order as string[]) >= 0
253 | );
254 | }
255 |
256 | results.splice(index, 0, action.payload.result);
257 |
258 | if (count !== undefined) {
259 | count = state.count! + results.length - state.results!.length;
260 |
261 | if (count < 0) {
262 | count = 0;
263 | }
264 |
265 | if (count < results.length) {
266 | count = results.length;
267 | }
268 | }
269 |
270 | if (
271 | action.payload.limit !== undefined &&
272 | action.payload.limit >= 0 &&
273 | results.length > action.payload.limit
274 | ) {
275 | results = results.slice(0, action.payload.limit);
276 | }
277 | }
278 |
279 | return {
280 | ...state,
281 | results,
282 | count
283 | };
284 | }
285 |
286 | case ActionTypes.UnloadResult: {
287 | let results = state.results;
288 | let count = state.count;
289 |
290 | if (results) {
291 | results = results.filter(
292 | result => result.id !== action.payload.result.id
293 | );
294 |
295 | if (count !== undefined) {
296 | count--;
297 |
298 | if (count < 0) {
299 | count = 0;
300 | }
301 |
302 | if (count < results.length) {
303 | count = results.length;
304 | }
305 | }
306 | }
307 |
308 | return {
309 | ...state,
310 | results
311 | };
312 | }
313 |
314 | case ActionTypes.Fail: {
315 | return {
316 | ...state,
317 | isLoading: false,
318 | isLive: false,
319 | isSyncing: false,
320 | error: action.payload.error
321 | };
322 | }
323 | }
324 | };
325 |
326 | export interface UseParseQueryOptions> {
327 | enabled?: boolean;
328 | enableLocalDatastore?: boolean;
329 | enableLiveQuery?: boolean;
330 | initialLoad?: InitialLoad;
331 | }
332 |
333 | export interface UseParseQueryResult> extends ResultState {
334 | reload: () => void;
335 | }
336 |
337 | const useParseQuery = >(
338 | query: Parse.Query,
339 | options?: UseParseQueryOptions
340 | ): UseParseQueryResult => {
341 | const queryString = useMemo(
342 | () => {
343 | return JSON.stringify({
344 | className: query.className,
345 | query: query.toJSON()
346 | });
347 | },
348 | [query]
349 | );
350 |
351 | const {
352 | enabled = true,
353 | enableLocalDatastore = true,
354 | enableLiveQuery = true,
355 | initialLoad,
356 | } = options || {};
357 |
358 | const {
359 | results: initialResults,
360 | count: initialCount
361 | } = initialLoad || {};
362 |
363 | const stateRef = useRef>(getInitialState(1, initialLoad));
364 |
365 | const [
366 | {
367 | queryId,
368 | isLoading,
369 | isLive,
370 | isSyncing,
371 | results,
372 | count,
373 | error
374 | },
375 | dispatch
376 | ] = useReducer>(
377 | (state, action) => {
378 | stateRef.current = reducer(state, action);
379 | return stateRef.current;
380 | },
381 | stateRef.current
382 | );
383 |
384 | const localDatastoreQuery: Parse.Query | undefined = useMemo(
385 | () => {
386 | if (enableLocalDatastore) {
387 | const queryJSON = JSON.parse(queryString);
388 |
389 | const memoedQuery = Parse.Query.fromJSON(queryJSON.className, queryJSON.query) as Parse.Query;
390 | memoedQuery.fromPinWithName(queryString);
391 |
392 | return memoedQuery;
393 | }
394 |
395 | return;
396 | },
397 | [queryString, enableLocalDatastore]
398 | );
399 |
400 | const findFromLocalDatastore = useCallback(
401 | async () => {
402 | let findResult;
403 | try {
404 | findResult = await localDatastoreQuery!.find();
405 | } catch (e) {
406 | dispatch(fail(queryId, e as Error));
407 |
408 | return;
409 | }
410 |
411 | if ((localDatastoreQuery as any)._count) {
412 | dispatch(loadLocalDatastoreResults(
413 | queryId,
414 | (findResult as any).results,
415 | (findResult as any).count
416 | ));
417 | } else {
418 | dispatch(loadLocalDatastoreResults(
419 | queryId,
420 | findResult
421 | ));
422 | }
423 | },
424 | [queryId, localDatastoreQuery]
425 | );
426 |
427 | const parseServerQuery: Parse.Query | undefined = useMemo(
428 | () => {
429 | const queryJSON = JSON.parse(queryString);
430 |
431 | return Parse.Query.fromJSON(queryJSON.className, queryJSON.query) as Parse.Query;
432 | },
433 | [queryString]
434 | );
435 |
436 | const pinResults = useCallback(
437 | async (results: T[]) => {
438 | try {
439 | await Parse.Object.unPinAllObjectsWithName(queryString);
440 | await Parse.Object.pinAllWithName(queryString, results);
441 | } catch (e) {
442 | dispatch(fail(queryId, e as Error));
443 | }
444 | },
445 | [queryString, queryId]
446 | );
447 |
448 | const findFromParseServer = useCallback(
449 | () => {
450 | let isCanceled = false;
451 | let attempts = 1;
452 |
453 | const find = async () => {
454 | if (enableLocalDatastore || enableLiveQuery || initialResults) {
455 | dispatch(setIsSyncing(queryId, true));
456 | }
457 |
458 | let findResult;
459 | try {
460 | findResult = await parseServerQuery.find();
461 | } catch (e) {
462 | if (
463 | e instanceof Parse.Error &&
464 | e.code === Parse.Error.CONNECTION_FAILED
465 | ) {
466 | if (!isCanceled) {
467 | setTimeout(
468 | () => {
469 | if (!isCanceled) {
470 | attempts++;
471 | find();
472 | }
473 | },
474 | Math.random() * Math.min(30, (Math.pow(2, attempts) - 1)) * 1000
475 | );
476 | }
477 | } else {
478 | dispatch(fail(queryId, e as Error));
479 | }
480 |
481 | return ;
482 | }
483 |
484 | let results = findResult;
485 | let count;
486 | if ((parseServerQuery as any)._count) {
487 | results = (findResult as any).results;
488 | count = (findResult as any).count;
489 | }
490 |
491 | dispatch(loadParseServerResults(
492 | queryId,
493 | results,
494 | count
495 | ));
496 |
497 | if (enableLocalDatastore) {
498 | await pinResults(results);
499 | }
500 | }
501 |
502 | const cancel = () => {
503 | isCanceled = true;
504 | }
505 |
506 | find();
507 |
508 | return cancel;
509 | },
510 | [enableLocalDatastore, enableLiveQuery, initialResults, queryId, parseServerQuery, pinResults]
511 | );
512 |
513 | const subscribeLiveQuery = useCallback(
514 | () => {
515 | let liveQuerySubscription: Parse.LiveQuerySubscription | undefined;
516 | let cancelFindFromParseServer: (() => void) | undefined;
517 |
518 | const loadAndPinResult = async (result: T) => {
519 | dispatch(loadResult(queryId, result as T, (parseServerQuery as any)._order, (parseServerQuery as any)._limit));
520 |
521 | if (enableLocalDatastore) {
522 | try {
523 | await result.pinWithName(queryString);
524 | } catch (e) {
525 | dispatch(fail(queryId, e as Error));
526 | }
527 | }
528 | };
529 |
530 | const unloadAndUnPinResult = async (result: T) => {
531 | dispatch(unloadResult(queryId, result as T));
532 |
533 | if (
534 | (parseServerQuery as any)._limit !== undefined &&
535 | (parseServerQuery as any)._limit >= 0 &&
536 | stateRef.current.results &&
537 | stateRef.current.results.length + 1 === (parseServerQuery as any)._limit
538 | ) {
539 | if (cancelFindFromParseServer) {
540 | cancelFindFromParseServer();
541 | }
542 |
543 | cancelFindFromParseServer = findFromParseServer();
544 | }
545 |
546 | if (enableLocalDatastore) {
547 | try {
548 | await result.unPinWithName(queryString);
549 | } catch (e) {
550 | dispatch(fail(queryId, e as Error));
551 | }
552 | }
553 | };
554 |
555 | const subscribe = async () => {
556 | try {
557 | liveQuerySubscription = await parseServerQuery.subscribe();
558 | } catch (e) {
559 | dispatch(fail(queryId, e as Error));
560 |
561 | return;
562 | }
563 |
564 | liveQuerySubscription.on('open', () => {
565 | dispatch(setIsLive(queryId, true));
566 |
567 | if (cancelFindFromParseServer) {
568 | cancelFindFromParseServer();
569 | }
570 |
571 | cancelFindFromParseServer = findFromParseServer();
572 | });
573 |
574 | liveQuerySubscription.on('close', () => {
575 | dispatch(setIsLive(queryId, false));
576 | });
577 |
578 | liveQuerySubscription.on('create', result => loadAndPinResult(result as T));
579 | liveQuerySubscription.on('update', result => loadAndPinResult(result as T));
580 | liveQuerySubscription.on('enter', result => loadAndPinResult(result as T));
581 | liveQuerySubscription.on('leave', result => unloadAndUnPinResult(result as T));
582 | liveQuerySubscription.on('delete', result => unloadAndUnPinResult(result as T));
583 | };
584 |
585 | const subscribePromise = subscribe();
586 |
587 | const unsubscribe = async () => {
588 | if (cancelFindFromParseServer) {
589 | cancelFindFromParseServer();
590 | }
591 |
592 | await subscribePromise;
593 |
594 | if (liveQuerySubscription) {
595 | liveQuerySubscription.unsubscribe();
596 | }
597 |
598 | dispatch(setIsLive(queryId, false));
599 | }
600 |
601 | return unsubscribe;
602 | },
603 | [queryString, enableLocalDatastore, queryId, parseServerQuery, findFromParseServer]
604 | );
605 |
606 | useEffect(
607 | () => {
608 | let cleanUp: (() => void) | undefined;
609 |
610 | if (enabled) {
611 | if (enableLocalDatastore) {
612 | if (initialResults) {
613 | pinResults(initialResults);
614 | } else {
615 | findFromLocalDatastore();
616 | }
617 | }
618 |
619 | if (enableLiveQuery) {
620 | cleanUp = subscribeLiveQuery();
621 | } else {
622 | cleanUp = findFromParseServer();
623 | }
624 | }
625 |
626 | return cleanUp;
627 | },
628 | [queryId]
629 | );
630 |
631 | const reload = useCallback(
632 | () => {
633 | dispatch(reset(initialLoad));
634 | },
635 | [initialResults, initialCount]
636 | );
637 |
638 | useEffect(
639 | () => reload,
640 | [
641 | queryString,
642 | enabled,
643 | enableLocalDatastore,
644 | enableLiveQuery,
645 | initialResults,
646 | initialCount
647 | ]
648 | );
649 |
650 | return useMemo(
651 | () => ({
652 | isLoading,
653 | isLive,
654 | isSyncing,
655 | results,
656 | count,
657 | error,
658 | reload
659 | }),
660 | [
661 | isLoading,
662 | isLive,
663 | isSyncing,
664 | results,
665 | count,
666 | error,
667 | reload
668 | ]
669 | );
670 | };
671 |
672 | export default useParseQuery;
673 |
--------------------------------------------------------------------------------
/examples/next-ts-todo/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-ts-todo",
3 | "lockfileVersion": 2,
4 | "requires": true,
5 | "packages": {
6 | "": {
7 | "dependencies": {
8 | "@parse/react-ssr": "0.0.1-alpha.14",
9 | "bootstrap": "4.6.0",
10 | "jquery": "3.6.0",
11 | "next": "12.1.0",
12 | "parse": "3.3.1",
13 | "popper.js": "1.16.1",
14 | "react": "17.0.2",
15 | "react-dom": "17.0.2",
16 | "tslib": "2.3.1"
17 | },
18 | "devDependencies": {
19 | "@types/react": "17.0.29",
20 | "typescript": "4.4.4",
21 | "watch": "1.0.2"
22 | }
23 | },
24 | "node_modules/@babel/runtime-corejs3": {
25 | "version": "7.14.6",
26 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
27 | "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
28 | "dependencies": {
29 | "core-js-pure": "^3.14.0",
30 | "regenerator-runtime": "^0.13.4"
31 | },
32 | "engines": {
33 | "node": ">=6.9.0"
34 | }
35 | },
36 | "node_modules/@next/env": {
37 | "version": "12.1.0",
38 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz",
39 | "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
40 | },
41 | "node_modules/@next/swc-android-arm64": {
42 | "version": "12.1.0",
43 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz",
44 | "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==",
45 | "cpu": [
46 | "arm64"
47 | ],
48 | "optional": true,
49 | "os": [
50 | "android"
51 | ],
52 | "engines": {
53 | "node": ">= 10"
54 | }
55 | },
56 | "node_modules/@next/swc-darwin-arm64": {
57 | "version": "12.1.0",
58 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz",
59 | "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==",
60 | "cpu": [
61 | "arm64"
62 | ],
63 | "optional": true,
64 | "os": [
65 | "darwin"
66 | ],
67 | "engines": {
68 | "node": ">= 10"
69 | }
70 | },
71 | "node_modules/@next/swc-darwin-x64": {
72 | "version": "12.1.0",
73 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz",
74 | "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==",
75 | "cpu": [
76 | "x64"
77 | ],
78 | "optional": true,
79 | "os": [
80 | "darwin"
81 | ],
82 | "engines": {
83 | "node": ">= 10"
84 | }
85 | },
86 | "node_modules/@next/swc-linux-arm-gnueabihf": {
87 | "version": "12.1.0",
88 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz",
89 | "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==",
90 | "cpu": [
91 | "arm"
92 | ],
93 | "optional": true,
94 | "os": [
95 | "linux"
96 | ],
97 | "engines": {
98 | "node": ">= 10"
99 | }
100 | },
101 | "node_modules/@next/swc-linux-arm64-gnu": {
102 | "version": "12.1.0",
103 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz",
104 | "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==",
105 | "cpu": [
106 | "arm64"
107 | ],
108 | "optional": true,
109 | "os": [
110 | "linux"
111 | ],
112 | "engines": {
113 | "node": ">= 10"
114 | }
115 | },
116 | "node_modules/@next/swc-linux-arm64-musl": {
117 | "version": "12.1.0",
118 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz",
119 | "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==",
120 | "cpu": [
121 | "arm64"
122 | ],
123 | "optional": true,
124 | "os": [
125 | "linux"
126 | ],
127 | "engines": {
128 | "node": ">= 10"
129 | }
130 | },
131 | "node_modules/@next/swc-linux-x64-gnu": {
132 | "version": "12.1.0",
133 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz",
134 | "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==",
135 | "cpu": [
136 | "x64"
137 | ],
138 | "optional": true,
139 | "os": [
140 | "linux"
141 | ],
142 | "engines": {
143 | "node": ">= 10"
144 | }
145 | },
146 | "node_modules/@next/swc-linux-x64-musl": {
147 | "version": "12.1.0",
148 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz",
149 | "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==",
150 | "cpu": [
151 | "x64"
152 | ],
153 | "optional": true,
154 | "os": [
155 | "linux"
156 | ],
157 | "engines": {
158 | "node": ">= 10"
159 | }
160 | },
161 | "node_modules/@next/swc-win32-arm64-msvc": {
162 | "version": "12.1.0",
163 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz",
164 | "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==",
165 | "cpu": [
166 | "arm64"
167 | ],
168 | "optional": true,
169 | "os": [
170 | "win32"
171 | ],
172 | "engines": {
173 | "node": ">= 10"
174 | }
175 | },
176 | "node_modules/@next/swc-win32-ia32-msvc": {
177 | "version": "12.1.0",
178 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz",
179 | "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==",
180 | "cpu": [
181 | "ia32"
182 | ],
183 | "optional": true,
184 | "os": [
185 | "win32"
186 | ],
187 | "engines": {
188 | "node": ">= 10"
189 | }
190 | },
191 | "node_modules/@next/swc-win32-x64-msvc": {
192 | "version": "12.1.0",
193 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz",
194 | "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==",
195 | "cpu": [
196 | "x64"
197 | ],
198 | "optional": true,
199 | "os": [
200 | "win32"
201 | ],
202 | "engines": {
203 | "node": ">= 10"
204 | }
205 | },
206 | "node_modules/@parse/react-base": {
207 | "version": "0.0.1-alpha.16",
208 | "resolved": "https://registry.npmjs.org/@parse/react-base/-/react-base-0.0.1-alpha.16.tgz",
209 | "integrity": "sha512-Ul7paiTWaAyl12i5lpF10sCrl+a+spIKlLgRWcsGpF1ZI2w1X7veS5g+TLh2mcidv1fg7552Bqp9gIhdlxX3ow==",
210 | "dependencies": {
211 | "tslib": "2.3.1"
212 | }
213 | },
214 | "node_modules/@parse/react-ssr": {
215 | "version": "0.0.1-alpha.14",
216 | "resolved": "https://registry.npmjs.org/@parse/react-ssr/-/react-ssr-0.0.1-alpha.14.tgz",
217 | "integrity": "sha512-X2KWRvbVSQoq3UinM1G/sfQiDVQKFl7NaFhY8QCuD6BAjsucKfGzith+yZ2NTZ4/XKiXGASK8Y6HOZ9PJ+LjYA==",
218 | "dependencies": {
219 | "@parse/react-base": "^0.0.1-alpha.13"
220 | },
221 | "peerDependencies": {
222 | "parse": ">= 2.17.0",
223 | "react": ">= 16.8.0"
224 | }
225 | },
226 | "node_modules/@types/prop-types": {
227 | "version": "15.7.4",
228 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
229 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==",
230 | "dev": true
231 | },
232 | "node_modules/@types/react": {
233 | "version": "17.0.29",
234 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.29.tgz",
235 | "integrity": "sha512-HSenIfBEBZ70BLrrVhtEtHpqaP79waauPtA8XKlczTxL3hXrW/ElGNLTpD1TmqkykgGlOAK55+D3SmUHEirpFw==",
236 | "dev": true,
237 | "dependencies": {
238 | "@types/prop-types": "*",
239 | "@types/scheduler": "*",
240 | "csstype": "^3.0.2"
241 | }
242 | },
243 | "node_modules/@types/scheduler": {
244 | "version": "0.16.2",
245 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
246 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
247 | "dev": true
248 | },
249 | "node_modules/bootstrap": {
250 | "version": "4.6.0",
251 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz",
252 | "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==",
253 | "funding": {
254 | "type": "opencollective",
255 | "url": "https://opencollective.com/bootstrap"
256 | },
257 | "peerDependencies": {
258 | "jquery": "1.9.1 - 3",
259 | "popper.js": "^1.16.1"
260 | }
261 | },
262 | "node_modules/caniuse-lite": {
263 | "version": "1.0.30001312",
264 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
265 | "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
266 | "funding": {
267 | "type": "opencollective",
268 | "url": "https://opencollective.com/browserslist"
269 | }
270 | },
271 | "node_modules/core-js-pure": {
272 | "version": "3.18.3",
273 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
274 | "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==",
275 | "hasInstallScript": true,
276 | "funding": {
277 | "type": "opencollective",
278 | "url": "https://opencollective.com/core-js"
279 | }
280 | },
281 | "node_modules/crypto-js": {
282 | "version": "4.1.1",
283 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
284 | "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
285 | "optional": true
286 | },
287 | "node_modules/csstype": {
288 | "version": "3.0.9",
289 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz",
290 | "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==",
291 | "dev": true
292 | },
293 | "node_modules/exec-sh": {
294 | "version": "0.2.2",
295 | "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
296 | "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
297 | "dev": true,
298 | "dependencies": {
299 | "merge": "^1.2.0"
300 | }
301 | },
302 | "node_modules/idb-keyval": {
303 | "version": "5.0.6",
304 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.6.tgz",
305 | "integrity": "sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg=="
306 | },
307 | "node_modules/jquery": {
308 | "version": "3.6.0",
309 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
310 | "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
311 | },
312 | "node_modules/js-tokens": {
313 | "version": "4.0.0",
314 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
315 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
316 | },
317 | "node_modules/loose-envify": {
318 | "version": "1.4.0",
319 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
320 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
321 | "dependencies": {
322 | "js-tokens": "^3.0.0 || ^4.0.0"
323 | },
324 | "bin": {
325 | "loose-envify": "cli.js"
326 | }
327 | },
328 | "node_modules/merge": {
329 | "version": "1.2.1",
330 | "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
331 | "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
332 | "dev": true
333 | },
334 | "node_modules/minimist": {
335 | "version": "1.2.6",
336 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
337 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
338 | "dev": true
339 | },
340 | "node_modules/nanoid": {
341 | "version": "3.3.1",
342 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
343 | "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
344 | "bin": {
345 | "nanoid": "bin/nanoid.cjs"
346 | },
347 | "engines": {
348 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
349 | }
350 | },
351 | "node_modules/next": {
352 | "version": "12.1.0",
353 | "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz",
354 | "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==",
355 | "dependencies": {
356 | "@next/env": "12.1.0",
357 | "caniuse-lite": "^1.0.30001283",
358 | "postcss": "8.4.5",
359 | "styled-jsx": "5.0.0",
360 | "use-subscription": "1.5.1"
361 | },
362 | "bin": {
363 | "next": "dist/bin/next"
364 | },
365 | "engines": {
366 | "node": ">=12.22.0"
367 | },
368 | "optionalDependencies": {
369 | "@next/swc-android-arm64": "12.1.0",
370 | "@next/swc-darwin-arm64": "12.1.0",
371 | "@next/swc-darwin-x64": "12.1.0",
372 | "@next/swc-linux-arm-gnueabihf": "12.1.0",
373 | "@next/swc-linux-arm64-gnu": "12.1.0",
374 | "@next/swc-linux-arm64-musl": "12.1.0",
375 | "@next/swc-linux-x64-gnu": "12.1.0",
376 | "@next/swc-linux-x64-musl": "12.1.0",
377 | "@next/swc-win32-arm64-msvc": "12.1.0",
378 | "@next/swc-win32-ia32-msvc": "12.1.0",
379 | "@next/swc-win32-x64-msvc": "12.1.0"
380 | },
381 | "peerDependencies": {
382 | "fibers": ">= 3.1.0",
383 | "node-sass": "^6.0.0 || ^7.0.0",
384 | "react": "^17.0.2 || ^18.0.0-0",
385 | "react-dom": "^17.0.2 || ^18.0.0-0",
386 | "sass": "^1.3.0"
387 | },
388 | "peerDependenciesMeta": {
389 | "fibers": {
390 | "optional": true
391 | },
392 | "node-sass": {
393 | "optional": true
394 | },
395 | "sass": {
396 | "optional": true
397 | }
398 | }
399 | },
400 | "node_modules/object-assign": {
401 | "version": "4.1.1",
402 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
403 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
404 | "engines": {
405 | "node": ">=0.10.0"
406 | }
407 | },
408 | "node_modules/parse": {
409 | "version": "3.3.1",
410 | "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
411 | "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
412 | "dependencies": {
413 | "@babel/runtime": "7.14.8",
414 | "@babel/runtime-corejs3": "7.14.6",
415 | "idb-keyval": "5.0.6",
416 | "react-native-crypto-js": "1.0.0",
417 | "uuid": "3.4.0",
418 | "ws": "7.5.0",
419 | "xmlhttprequest": "1.8.0"
420 | },
421 | "optionalDependencies": {
422 | "crypto-js": "4.1.1"
423 | }
424 | },
425 | "node_modules/parse/node_modules/@babel/runtime": {
426 | "version": "7.14.8",
427 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
428 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
429 | "dependencies": {
430 | "regenerator-runtime": "^0.13.4"
431 | },
432 | "engines": {
433 | "node": ">=6.9.0"
434 | }
435 | },
436 | "node_modules/picocolors": {
437 | "version": "1.0.0",
438 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
439 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
440 | },
441 | "node_modules/popper.js": {
442 | "version": "1.16.1",
443 | "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
444 | "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
445 | "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
446 | "funding": {
447 | "type": "opencollective",
448 | "url": "https://opencollective.com/popperjs"
449 | }
450 | },
451 | "node_modules/postcss": {
452 | "version": "8.4.5",
453 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
454 | "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
455 | "dependencies": {
456 | "nanoid": "^3.1.30",
457 | "picocolors": "^1.0.0",
458 | "source-map-js": "^1.0.1"
459 | },
460 | "engines": {
461 | "node": "^10 || ^12 || >=14"
462 | },
463 | "funding": {
464 | "type": "opencollective",
465 | "url": "https://opencollective.com/postcss/"
466 | }
467 | },
468 | "node_modules/react": {
469 | "version": "17.0.2",
470 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
471 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
472 | "dependencies": {
473 | "loose-envify": "^1.1.0",
474 | "object-assign": "^4.1.1"
475 | },
476 | "engines": {
477 | "node": ">=0.10.0"
478 | }
479 | },
480 | "node_modules/react-dom": {
481 | "version": "17.0.2",
482 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
483 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
484 | "dependencies": {
485 | "loose-envify": "^1.1.0",
486 | "object-assign": "^4.1.1",
487 | "scheduler": "^0.20.2"
488 | },
489 | "peerDependencies": {
490 | "react": "17.0.2"
491 | }
492 | },
493 | "node_modules/react-native-crypto-js": {
494 | "version": "1.0.0",
495 | "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
496 | "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA=="
497 | },
498 | "node_modules/regenerator-runtime": {
499 | "version": "0.13.9",
500 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
501 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
502 | },
503 | "node_modules/scheduler": {
504 | "version": "0.20.2",
505 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
506 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
507 | "dependencies": {
508 | "loose-envify": "^1.1.0",
509 | "object-assign": "^4.1.1"
510 | }
511 | },
512 | "node_modules/source-map-js": {
513 | "version": "1.0.2",
514 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
515 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
516 | "engines": {
517 | "node": ">=0.10.0"
518 | }
519 | },
520 | "node_modules/styled-jsx": {
521 | "version": "5.0.0",
522 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz",
523 | "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==",
524 | "engines": {
525 | "node": ">= 12.0.0"
526 | },
527 | "peerDependencies": {
528 | "react": ">= 16.8.0 || 17.x.x || 18.x.x"
529 | },
530 | "peerDependenciesMeta": {
531 | "@babel/core": {
532 | "optional": true
533 | },
534 | "babel-plugin-macros": {
535 | "optional": true
536 | }
537 | }
538 | },
539 | "node_modules/tslib": {
540 | "version": "2.3.1",
541 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
542 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
543 | },
544 | "node_modules/typescript": {
545 | "version": "4.4.4",
546 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
547 | "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
548 | "dev": true,
549 | "bin": {
550 | "tsc": "bin/tsc",
551 | "tsserver": "bin/tsserver"
552 | },
553 | "engines": {
554 | "node": ">=4.2.0"
555 | }
556 | },
557 | "node_modules/use-subscription": {
558 | "version": "1.5.1",
559 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz",
560 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==",
561 | "dependencies": {
562 | "object-assign": "^4.1.1"
563 | },
564 | "peerDependencies": {
565 | "react": "^16.8.0 || ^17.0.0"
566 | }
567 | },
568 | "node_modules/uuid": {
569 | "version": "3.4.0",
570 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
571 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
572 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
573 | "bin": {
574 | "uuid": "bin/uuid"
575 | }
576 | },
577 | "node_modules/watch": {
578 | "version": "1.0.2",
579 | "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz",
580 | "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=",
581 | "dev": true,
582 | "dependencies": {
583 | "exec-sh": "^0.2.0",
584 | "minimist": "^1.2.0"
585 | },
586 | "bin": {
587 | "watch": "cli.js"
588 | },
589 | "engines": {
590 | "node": ">=0.1.95"
591 | }
592 | },
593 | "node_modules/ws": {
594 | "version": "7.5.0",
595 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
596 | "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
597 | "engines": {
598 | "node": ">=8.3.0"
599 | },
600 | "peerDependencies": {
601 | "bufferutil": "^4.0.1",
602 | "utf-8-validate": "^5.0.2"
603 | },
604 | "peerDependenciesMeta": {
605 | "bufferutil": {
606 | "optional": true
607 | },
608 | "utf-8-validate": {
609 | "optional": true
610 | }
611 | }
612 | },
613 | "node_modules/xmlhttprequest": {
614 | "version": "1.8.0",
615 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
616 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
617 | "engines": {
618 | "node": ">=0.4.0"
619 | }
620 | }
621 | },
622 | "dependencies": {
623 | "@babel/runtime-corejs3": {
624 | "version": "7.14.6",
625 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
626 | "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
627 | "requires": {
628 | "core-js-pure": "^3.14.0",
629 | "regenerator-runtime": "^0.13.4"
630 | }
631 | },
632 | "@next/env": {
633 | "version": "12.1.0",
634 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz",
635 | "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
636 | },
637 | "@next/swc-android-arm64": {
638 | "version": "12.1.0",
639 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz",
640 | "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==",
641 | "optional": true
642 | },
643 | "@next/swc-darwin-arm64": {
644 | "version": "12.1.0",
645 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz",
646 | "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==",
647 | "optional": true
648 | },
649 | "@next/swc-darwin-x64": {
650 | "version": "12.1.0",
651 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz",
652 | "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==",
653 | "optional": true
654 | },
655 | "@next/swc-linux-arm-gnueabihf": {
656 | "version": "12.1.0",
657 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz",
658 | "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==",
659 | "optional": true
660 | },
661 | "@next/swc-linux-arm64-gnu": {
662 | "version": "12.1.0",
663 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz",
664 | "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==",
665 | "optional": true
666 | },
667 | "@next/swc-linux-arm64-musl": {
668 | "version": "12.1.0",
669 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz",
670 | "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==",
671 | "optional": true
672 | },
673 | "@next/swc-linux-x64-gnu": {
674 | "version": "12.1.0",
675 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz",
676 | "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==",
677 | "optional": true
678 | },
679 | "@next/swc-linux-x64-musl": {
680 | "version": "12.1.0",
681 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz",
682 | "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==",
683 | "optional": true
684 | },
685 | "@next/swc-win32-arm64-msvc": {
686 | "version": "12.1.0",
687 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz",
688 | "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==",
689 | "optional": true
690 | },
691 | "@next/swc-win32-ia32-msvc": {
692 | "version": "12.1.0",
693 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz",
694 | "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==",
695 | "optional": true
696 | },
697 | "@next/swc-win32-x64-msvc": {
698 | "version": "12.1.0",
699 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz",
700 | "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==",
701 | "optional": true
702 | },
703 | "@parse/react-base": {
704 | "version": "0.0.1-alpha.16",
705 | "resolved": "https://registry.npmjs.org/@parse/react-base/-/react-base-0.0.1-alpha.16.tgz",
706 | "integrity": "sha512-Ul7paiTWaAyl12i5lpF10sCrl+a+spIKlLgRWcsGpF1ZI2w1X7veS5g+TLh2mcidv1fg7552Bqp9gIhdlxX3ow==",
707 | "requires": {
708 | "tslib": "2.3.1"
709 | }
710 | },
711 | "@parse/react-ssr": {
712 | "version": "0.0.1-alpha.14",
713 | "resolved": "https://registry.npmjs.org/@parse/react-ssr/-/react-ssr-0.0.1-alpha.14.tgz",
714 | "integrity": "sha512-X2KWRvbVSQoq3UinM1G/sfQiDVQKFl7NaFhY8QCuD6BAjsucKfGzith+yZ2NTZ4/XKiXGASK8Y6HOZ9PJ+LjYA==",
715 | "requires": {
716 | "@parse/react-base": "^0.0.1-alpha.13"
717 | }
718 | },
719 | "@types/prop-types": {
720 | "version": "15.7.4",
721 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
722 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==",
723 | "dev": true
724 | },
725 | "@types/react": {
726 | "version": "17.0.29",
727 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.29.tgz",
728 | "integrity": "sha512-HSenIfBEBZ70BLrrVhtEtHpqaP79waauPtA8XKlczTxL3hXrW/ElGNLTpD1TmqkykgGlOAK55+D3SmUHEirpFw==",
729 | "dev": true,
730 | "requires": {
731 | "@types/prop-types": "*",
732 | "@types/scheduler": "*",
733 | "csstype": "^3.0.2"
734 | }
735 | },
736 | "@types/scheduler": {
737 | "version": "0.16.2",
738 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
739 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
740 | "dev": true
741 | },
742 | "bootstrap": {
743 | "version": "4.6.0",
744 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz",
745 | "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==",
746 | "requires": {}
747 | },
748 | "caniuse-lite": {
749 | "version": "1.0.30001312",
750 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
751 | "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ=="
752 | },
753 | "core-js-pure": {
754 | "version": "3.18.3",
755 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
756 | "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw=="
757 | },
758 | "crypto-js": {
759 | "version": "4.1.1",
760 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
761 | "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
762 | "optional": true
763 | },
764 | "csstype": {
765 | "version": "3.0.9",
766 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz",
767 | "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==",
768 | "dev": true
769 | },
770 | "exec-sh": {
771 | "version": "0.2.2",
772 | "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
773 | "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
774 | "dev": true,
775 | "requires": {
776 | "merge": "^1.2.0"
777 | }
778 | },
779 | "idb-keyval": {
780 | "version": "5.0.6",
781 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.6.tgz",
782 | "integrity": "sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg=="
783 | },
784 | "jquery": {
785 | "version": "3.6.0",
786 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
787 | "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
788 | },
789 | "js-tokens": {
790 | "version": "4.0.0",
791 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
792 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
793 | },
794 | "loose-envify": {
795 | "version": "1.4.0",
796 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
797 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
798 | "requires": {
799 | "js-tokens": "^3.0.0 || ^4.0.0"
800 | }
801 | },
802 | "merge": {
803 | "version": "1.2.1",
804 | "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
805 | "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
806 | "dev": true
807 | },
808 | "minimist": {
809 | "version": "1.2.6",
810 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
811 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
812 | "dev": true
813 | },
814 | "nanoid": {
815 | "version": "3.3.1",
816 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
817 | "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
818 | },
819 | "next": {
820 | "version": "12.1.0",
821 | "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz",
822 | "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==",
823 | "requires": {
824 | "@next/env": "12.1.0",
825 | "@next/swc-android-arm64": "12.1.0",
826 | "@next/swc-darwin-arm64": "12.1.0",
827 | "@next/swc-darwin-x64": "12.1.0",
828 | "@next/swc-linux-arm-gnueabihf": "12.1.0",
829 | "@next/swc-linux-arm64-gnu": "12.1.0",
830 | "@next/swc-linux-arm64-musl": "12.1.0",
831 | "@next/swc-linux-x64-gnu": "12.1.0",
832 | "@next/swc-linux-x64-musl": "12.1.0",
833 | "@next/swc-win32-arm64-msvc": "12.1.0",
834 | "@next/swc-win32-ia32-msvc": "12.1.0",
835 | "@next/swc-win32-x64-msvc": "12.1.0",
836 | "caniuse-lite": "^1.0.30001283",
837 | "postcss": "8.4.5",
838 | "styled-jsx": "5.0.0",
839 | "use-subscription": "1.5.1"
840 | }
841 | },
842 | "object-assign": {
843 | "version": "4.1.1",
844 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
845 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
846 | },
847 | "parse": {
848 | "version": "3.3.1",
849 | "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
850 | "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
851 | "requires": {
852 | "@babel/runtime": "7.14.8",
853 | "@babel/runtime-corejs3": "7.14.6",
854 | "crypto-js": "4.1.1",
855 | "idb-keyval": "5.0.6",
856 | "react-native-crypto-js": "1.0.0",
857 | "uuid": "3.4.0",
858 | "ws": "7.5.0",
859 | "xmlhttprequest": "1.8.0"
860 | },
861 | "dependencies": {
862 | "@babel/runtime": {
863 | "version": "7.14.8",
864 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
865 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
866 | "requires": {
867 | "regenerator-runtime": "^0.13.4"
868 | }
869 | }
870 | }
871 | },
872 | "picocolors": {
873 | "version": "1.0.0",
874 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
875 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
876 | },
877 | "popper.js": {
878 | "version": "1.16.1",
879 | "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
880 | "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
881 | },
882 | "postcss": {
883 | "version": "8.4.5",
884 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
885 | "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
886 | "requires": {
887 | "nanoid": "^3.1.30",
888 | "picocolors": "^1.0.0",
889 | "source-map-js": "^1.0.1"
890 | }
891 | },
892 | "react": {
893 | "version": "17.0.2",
894 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
895 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
896 | "requires": {
897 | "loose-envify": "^1.1.0",
898 | "object-assign": "^4.1.1"
899 | }
900 | },
901 | "react-dom": {
902 | "version": "17.0.2",
903 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
904 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
905 | "requires": {
906 | "loose-envify": "^1.1.0",
907 | "object-assign": "^4.1.1",
908 | "scheduler": "^0.20.2"
909 | }
910 | },
911 | "react-native-crypto-js": {
912 | "version": "1.0.0",
913 | "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
914 | "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA=="
915 | },
916 | "regenerator-runtime": {
917 | "version": "0.13.9",
918 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
919 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
920 | },
921 | "scheduler": {
922 | "version": "0.20.2",
923 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
924 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
925 | "requires": {
926 | "loose-envify": "^1.1.0",
927 | "object-assign": "^4.1.1"
928 | }
929 | },
930 | "source-map-js": {
931 | "version": "1.0.2",
932 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
933 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
934 | },
935 | "styled-jsx": {
936 | "version": "5.0.0",
937 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz",
938 | "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==",
939 | "requires": {}
940 | },
941 | "tslib": {
942 | "version": "2.3.1",
943 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
944 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
945 | },
946 | "typescript": {
947 | "version": "4.4.4",
948 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
949 | "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
950 | "dev": true
951 | },
952 | "use-subscription": {
953 | "version": "1.5.1",
954 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz",
955 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==",
956 | "requires": {
957 | "object-assign": "^4.1.1"
958 | }
959 | },
960 | "uuid": {
961 | "version": "3.4.0",
962 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
963 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
964 | },
965 | "watch": {
966 | "version": "1.0.2",
967 | "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz",
968 | "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=",
969 | "dev": true,
970 | "requires": {
971 | "exec-sh": "^0.2.0",
972 | "minimist": "^1.2.0"
973 | }
974 | },
975 | "ws": {
976 | "version": "7.5.0",
977 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
978 | "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
979 | "requires": {}
980 | },
981 | "xmlhttprequest": {
982 | "version": "1.8.0",
983 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
984 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
985 | }
986 | }
987 | }
988 |
--------------------------------------------------------------------------------