next-sanity 0.4.1-beta.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -20
- package/dist/aborter.d.ts +1 -1
- package/dist/currentUser.d.ts +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/next-sanity.cjs.development.js +84 -56
- package/dist/next-sanity.cjs.development.js.map +1 -1
- package/dist/next-sanity.cjs.production.min.js +1 -1
- package/dist/next-sanity.cjs.production.min.js.map +1 -1
- package/dist/next-sanity.esm.js +79 -48
- package/dist/next-sanity.esm.js.map +1 -1
- package/dist/useSubscription.d.ts +3 -3
- package/package.json +6 -7
- package/src/aborter.ts +12 -6
- package/src/currentUser.ts +9 -5
- package/src/index.ts +0 -2
- package/src/useSubscription.ts +32 -20
- package/dist/imageUrlBuilder.d.ts +0 -2
- package/dist/portableText.d.ts +0 -6
- package/src/imageUrlBuilder.ts +0 -6
- package/src/portableText.tsx +0 -23
package/README.md
CHANGED
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
**Features:**
|
|
6
6
|
|
|
7
7
|
- Client-side live real-time preview for authenticated users
|
|
8
|
-
- URL-helper for Sanity’s image pipeline
|
|
9
|
-
- Rich-text component for Portable Text
|
|
10
8
|
- GROQ syntax highlighting
|
|
11
9
|
|
|
12
10
|
## Table of contents
|
|
@@ -18,14 +16,15 @@
|
|
|
18
16
|
- [Optimizing bundle size](#optimizing-bundle-size)
|
|
19
17
|
- [Usage](#usage)
|
|
20
18
|
- [Example: Minimal blog post template](#example-minimal-blog-post-template)
|
|
19
|
+
- [Migrate](#migrate)
|
|
21
20
|
- [License](#license)
|
|
22
21
|
|
|
23
22
|
## Installation
|
|
24
23
|
|
|
25
24
|
```sh
|
|
26
|
-
$ npm install next-sanity
|
|
25
|
+
$ npm install next-sanity @portabletext/react @sanity/image-url
|
|
27
26
|
// or
|
|
28
|
-
$ yarn add next-sanity
|
|
27
|
+
$ yarn add next-sanity @portabletext/react @sanity/image-url
|
|
29
28
|
```
|
|
30
29
|
|
|
31
30
|
## Live real-time preview
|
|
@@ -83,12 +82,8 @@ export const config = {
|
|
|
83
82
|
|
|
84
83
|
```js
|
|
85
84
|
// lib/sanity.js
|
|
86
|
-
import {
|
|
87
|
-
|
|
88
|
-
createPortableTextComponent,
|
|
89
|
-
createPreviewSubscriptionHook,
|
|
90
|
-
createCurrentUserHook,
|
|
91
|
-
} from 'next-sanity'
|
|
85
|
+
import {createPreviewSubscriptionHook, createCurrentUserHook} from 'next-sanity'
|
|
86
|
+
import createImageUrlBuilder from '@sanity/image-url'
|
|
92
87
|
import {config} from './config'
|
|
93
88
|
|
|
94
89
|
/**
|
|
@@ -100,14 +95,6 @@ export const urlFor = (source) => createImageUrlBuilder(config).image(source)
|
|
|
100
95
|
// Set up the live preview subscription hook
|
|
101
96
|
export const usePreviewSubscription = createPreviewSubscriptionHook(config)
|
|
102
97
|
|
|
103
|
-
// Set up Portable Text serialization
|
|
104
|
-
export const PortableText = createPortableTextComponent({
|
|
105
|
-
...config,
|
|
106
|
-
// Serializers passed to @sanity/block-content-to-react
|
|
107
|
-
// (https://github.com/sanity-io/block-content-to-react)
|
|
108
|
-
serializers: {},
|
|
109
|
-
})
|
|
110
|
-
|
|
111
98
|
// Helper function for using the current logged in user account
|
|
112
99
|
export const useCurrentUser = createCurrentUserHook(config)
|
|
113
100
|
```
|
|
@@ -140,7 +127,8 @@ A minimal example for a blog post template using the schema from from the Sanity
|
|
|
140
127
|
import ErrorPage from 'next/error'
|
|
141
128
|
import {useRouter} from 'next/router'
|
|
142
129
|
import {groq} from 'next-sanity'
|
|
143
|
-
import {
|
|
130
|
+
import {PortableText} from '@portabletext/react'
|
|
131
|
+
import {usePreviewSubscription, urlFor} from '../../lib/sanity'
|
|
144
132
|
import {getClient} from '../../lib/sanity.server'
|
|
145
133
|
|
|
146
134
|
const postQuery = groq`
|
|
@@ -178,7 +166,7 @@ export default function Post({data, preview}) {
|
|
|
178
166
|
<figure>
|
|
179
167
|
<img src={urlFor(mainImage).url()} />
|
|
180
168
|
</figure>
|
|
181
|
-
<PortableText
|
|
169
|
+
<PortableText value={body} />
|
|
182
170
|
</article>
|
|
183
171
|
)
|
|
184
172
|
}
|
|
@@ -208,6 +196,47 @@ export async function getStaticPaths() {
|
|
|
208
196
|
}
|
|
209
197
|
```
|
|
210
198
|
|
|
199
|
+
## Migrate
|
|
200
|
+
|
|
201
|
+
### From `v0.4`
|
|
202
|
+
|
|
203
|
+
#### `createPortableTextComponent` is removed
|
|
204
|
+
|
|
205
|
+
This utility used to wrap `@sanity/block-content-to-react`. It's encouraged to upgrade to `@portabletext/react`.
|
|
206
|
+
|
|
207
|
+
```sh
|
|
208
|
+
$ npm install @portabletext/react
|
|
209
|
+
// or
|
|
210
|
+
$ yarn add @portabletext/react
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
```diff
|
|
214
|
+
-import { createPortableTextComponent } from 'next-sanity'
|
|
215
|
+
+import { PortableText as PortableTextComponent } from '@portabletext/react'
|
|
216
|
+
|
|
217
|
+
-export const PortableText = createPortableTextComponent({ serializers: {} })
|
|
218
|
+
+export const PortableText = (props) => <PortableTextComponent components={{}} {...props} />
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Please note that the `serializers` and `components` are not 100% equivalent.
|
|
222
|
+
|
|
223
|
+
[Check the full migration guide.](https://github.com/portabletext/react-portabletext/blob/main/MIGRATING.md)
|
|
224
|
+
|
|
225
|
+
#### `createImageUrlBuilder` is removed
|
|
226
|
+
|
|
227
|
+
This utility is no longer wrapped by `next-sanity` and you'll need to install the dependency yourself:
|
|
228
|
+
|
|
229
|
+
```sh
|
|
230
|
+
$ npm install @sanity/image-url
|
|
231
|
+
// or
|
|
232
|
+
$ yarn add @sanity/image-url
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
```diff
|
|
236
|
+
-import { createImageUrlBuilder } from 'next-sanity'
|
|
237
|
+
+import createImageUrlBuilder from '@sanity/image-url'
|
|
238
|
+
```
|
|
239
|
+
|
|
211
240
|
## License
|
|
212
241
|
|
|
213
242
|
MIT-licensed. See LICENSE.
|
package/dist/aborter.d.ts
CHANGED
package/dist/currentUser.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export declare function createCurrentUserHook({ projectId }: {
|
|
|
8
8
|
error: Error | undefined;
|
|
9
9
|
loading: boolean;
|
|
10
10
|
};
|
|
11
|
-
export declare function getCurrentUser(projectId: string, abort
|
|
11
|
+
export declare function getCurrentUser(projectId: string, abort: Aborter): Promise<CurrentUser | null>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export * from './types';
|
|
2
2
|
export { createClient } from './client';
|
|
3
|
-
export { createImageUrlBuilder } from './imageUrlBuilder';
|
|
4
3
|
export { createCurrentUserHook } from './currentUser';
|
|
5
4
|
export { createPreviewSubscriptionHook } from './useSubscription';
|
|
6
|
-
export { createPortableTextComponent } from './portableText';
|
|
7
5
|
export { default as groq } from 'groq';
|
|
@@ -24,34 +24,57 @@ function _interopNamespace(e) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
var sanityClient = _interopDefault(require('@sanity/client'));
|
|
27
|
-
var
|
|
28
|
-
var React = require('react');
|
|
29
|
-
var React__default = _interopDefault(React);
|
|
30
|
-
var useDeepCompareEffect = require('use-deep-compare-effect');
|
|
31
|
-
var SanityPortableText = _interopDefault(require('@sanity/block-content-to-react'));
|
|
27
|
+
var react = require('react');
|
|
32
28
|
var groq = _interopDefault(require('groq'));
|
|
33
29
|
|
|
34
30
|
function createClient(config) {
|
|
35
31
|
return sanityClient(config);
|
|
36
32
|
}
|
|
37
33
|
|
|
38
|
-
function
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
function _defineProperties(target, props) {
|
|
35
|
+
for (var i = 0; i < props.length; i++) {
|
|
36
|
+
var descriptor = props[i];
|
|
37
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
38
|
+
descriptor.configurable = true;
|
|
39
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
40
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
41
|
+
}
|
|
45
42
|
}
|
|
46
43
|
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
function _createClass(Constructor, protoProps, staticProps) {
|
|
45
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
46
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
47
|
+
Object.defineProperty(Constructor, "prototype", {
|
|
48
|
+
writable: false
|
|
49
|
+
});
|
|
50
|
+
return Constructor;
|
|
52
51
|
}
|
|
53
52
|
|
|
54
|
-
function
|
|
53
|
+
var MockAbortController = /*#__PURE__*/function () {
|
|
54
|
+
function MockAbortController() {
|
|
55
|
+
this._signal = {
|
|
56
|
+
aborted: false
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
var _proto = MockAbortController.prototype;
|
|
61
|
+
|
|
62
|
+
_proto.abort = function abort() {
|
|
63
|
+
this._signal.aborted = true;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
_createClass(MockAbortController, [{
|
|
67
|
+
key: "signal",
|
|
68
|
+
get: function get() {
|
|
69
|
+
return this._signal;
|
|
70
|
+
}
|
|
71
|
+
}]);
|
|
72
|
+
|
|
73
|
+
return MockAbortController;
|
|
74
|
+
}();
|
|
75
|
+
|
|
76
|
+
function getAborter() {
|
|
77
|
+
return typeof AbortController === 'undefined' ? new MockAbortController() : new AbortController();
|
|
55
78
|
}
|
|
56
79
|
|
|
57
80
|
function createCurrentUserHook(_ref) {
|
|
@@ -63,30 +86,30 @@ function createCurrentUserHook(_ref) {
|
|
|
63
86
|
function getCurrentUser(projectId, abort) {
|
|
64
87
|
return fetch("https://" + projectId + ".api.sanity.io/v1/users/me", {
|
|
65
88
|
credentials: 'include',
|
|
66
|
-
signal: abort
|
|
89
|
+
signal: abort.signal
|
|
67
90
|
}).then(function (res) {
|
|
68
91
|
return res.json();
|
|
69
92
|
}).then(function (res) {
|
|
70
93
|
return res != null && res.id ? res : null;
|
|
71
|
-
}).catch(function (err) {
|
|
72
|
-
return err.name === 'AbortError' ? null : Promise.reject(err);
|
|
73
94
|
});
|
|
74
95
|
}
|
|
75
96
|
|
|
76
97
|
function useCurrentUser(projectId) {
|
|
77
|
-
var _useState =
|
|
98
|
+
var _useState = react.useState(),
|
|
78
99
|
data = _useState[0],
|
|
79
100
|
setUser = _useState[1];
|
|
80
101
|
|
|
81
|
-
var _useState2 =
|
|
102
|
+
var _useState2 = react.useState(),
|
|
82
103
|
error = _useState2[0],
|
|
83
104
|
setError = _useState2[1];
|
|
84
105
|
|
|
85
|
-
|
|
106
|
+
react.useEffect(function () {
|
|
86
107
|
var aborter = getAborter();
|
|
87
|
-
getCurrentUser(projectId, aborter).then(setUser).catch(
|
|
108
|
+
getCurrentUser(projectId, aborter).then(setUser).catch(function (err) {
|
|
109
|
+
return err.name !== 'AbortError' && setError(err);
|
|
110
|
+
});
|
|
88
111
|
return function () {
|
|
89
|
-
|
|
112
|
+
aborter.abort();
|
|
90
113
|
};
|
|
91
114
|
}, [projectId]);
|
|
92
115
|
return {
|
|
@@ -100,7 +123,6 @@ var EMPTY_PARAMS = {};
|
|
|
100
123
|
function createPreviewSubscriptionHook(_ref) {
|
|
101
124
|
var projectId = _ref.projectId,
|
|
102
125
|
dataset = _ref.dataset,
|
|
103
|
-
useGroqBeta = _ref.useGroqBeta,
|
|
104
126
|
_ref$documentLimit = _ref.documentLimit,
|
|
105
127
|
documentLimit = _ref$documentLimit === void 0 ? 3000 : _ref$documentLimit;
|
|
106
128
|
// Only construct/setup the store when `getStore()` is called
|
|
@@ -125,15 +147,23 @@ function createPreviewSubscriptionHook(_ref) {
|
|
|
125
147
|
});
|
|
126
148
|
};
|
|
127
149
|
|
|
128
|
-
function getStore() {
|
|
150
|
+
function getStore(abort) {
|
|
129
151
|
if (!store) {
|
|
130
152
|
store = new Promise(function (resolve) { resolve(_interopNamespace(require('@sanity/groq-store'))); }).then(function (_ref2) {
|
|
131
153
|
var groqStore = _ref2.groqStore;
|
|
154
|
+
|
|
155
|
+
// Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure
|
|
156
|
+
if (abort.signal.aborted) {
|
|
157
|
+
var error = new Error('Cancelling groq store creation'); // This ensures we can skip it in the catch block same way
|
|
158
|
+
|
|
159
|
+
error.name = 'AbortError';
|
|
160
|
+
return Promise.reject(error);
|
|
161
|
+
}
|
|
162
|
+
|
|
132
163
|
return groqStore({
|
|
133
164
|
projectId: projectId,
|
|
134
165
|
dataset: dataset,
|
|
135
166
|
documentLimit: documentLimit,
|
|
136
|
-
useGroqBeta: useGroqBeta,
|
|
137
167
|
listen: true,
|
|
138
168
|
overlayDrafts: true,
|
|
139
169
|
subscriptionThrottleMs: 10
|
|
@@ -149,30 +179,28 @@ function useQuerySubscription(options) {
|
|
|
149
179
|
var getStore = options.getStore,
|
|
150
180
|
projectId = options.projectId,
|
|
151
181
|
query = options.query,
|
|
152
|
-
params = options.params,
|
|
153
182
|
initialData = options.initialData,
|
|
154
183
|
_options$enabled = options.enabled,
|
|
155
184
|
enabled = _options$enabled === void 0 ? false : _options$enabled;
|
|
156
185
|
|
|
157
|
-
var _useState =
|
|
186
|
+
var _useState = react.useState(),
|
|
158
187
|
error = _useState[0],
|
|
159
188
|
setError = _useState[1];
|
|
160
189
|
|
|
161
|
-
var _useState2 =
|
|
190
|
+
var _useState2 = react.useState(false),
|
|
162
191
|
loading = _useState2[0],
|
|
163
192
|
setLoading = _useState2[1];
|
|
164
193
|
|
|
165
|
-
var _useState3 =
|
|
194
|
+
var _useState3 = react.useState(),
|
|
166
195
|
data = _useState3[0],
|
|
167
|
-
setData = _useState3[1];
|
|
168
|
-
// but contains the same shallow properties, eg `{"slug": "some-slug"}`
|
|
196
|
+
setData = _useState3[1];
|
|
169
197
|
|
|
198
|
+
var params = useParams(options.params); // Use "deep" dependency comparison because params are often not _referentially_ equal,
|
|
199
|
+
// but contains the same shallow properties, eg `{"slug": "some-slug"}`
|
|
170
200
|
|
|
171
|
-
|
|
201
|
+
react.useEffect(function () {
|
|
172
202
|
if (!enabled) {
|
|
173
|
-
return
|
|
174
|
-
/* intentional noop */
|
|
175
|
-
};
|
|
203
|
+
return;
|
|
176
204
|
}
|
|
177
205
|
|
|
178
206
|
setLoading(true);
|
|
@@ -186,7 +214,9 @@ function useQuerySubscription(options) {
|
|
|
186
214
|
|
|
187
215
|
console.warn('Not authenticated - preview not available');
|
|
188
216
|
throw new Error('Not authenticated - preview not available');
|
|
189
|
-
}).then(
|
|
217
|
+
}).then(function () {
|
|
218
|
+
return getStore(aborter);
|
|
219
|
+
}).then(function (store) {
|
|
190
220
|
subscription = store.subscribe(query, params, function (err, result) {
|
|
191
221
|
if (err) {
|
|
192
222
|
setError(err);
|
|
@@ -194,9 +224,12 @@ function useQuerySubscription(options) {
|
|
|
194
224
|
setData(result);
|
|
195
225
|
}
|
|
196
226
|
});
|
|
197
|
-
}).catch(
|
|
227
|
+
}).catch(function (err) {
|
|
228
|
+
return err.name === 'AbortError' ? null : setError(err);
|
|
229
|
+
}).finally(function () {
|
|
198
230
|
return setLoading(false);
|
|
199
|
-
});
|
|
231
|
+
}); // eslint-disable-next-line consistent-return
|
|
232
|
+
|
|
200
233
|
return function () {
|
|
201
234
|
if (subscription) {
|
|
202
235
|
subscription.unsubscribe();
|
|
@@ -210,25 +243,20 @@ function useQuerySubscription(options) {
|
|
|
210
243
|
loading: loading,
|
|
211
244
|
error: error
|
|
212
245
|
};
|
|
213
|
-
}
|
|
246
|
+
} // Return params that are stable with deep equal as long as the key order is the same
|
|
214
247
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
serializers: serializers
|
|
224
|
-
}, props));
|
|
225
|
-
};
|
|
248
|
+
|
|
249
|
+
function useParams(params) {
|
|
250
|
+
var stringifiedParams = react.useMemo(function () {
|
|
251
|
+
return JSON.stringify(params);
|
|
252
|
+
}, [params]);
|
|
253
|
+
return react.useMemo(function () {
|
|
254
|
+
return JSON.parse(stringifiedParams);
|
|
255
|
+
}, [stringifiedParams]);
|
|
226
256
|
}
|
|
227
257
|
|
|
228
258
|
exports.groq = groq;
|
|
229
259
|
exports.createClient = createClient;
|
|
230
260
|
exports.createCurrentUserHook = createCurrentUserHook;
|
|
231
|
-
exports.createImageUrlBuilder = createImageUrlBuilder;
|
|
232
|
-
exports.createPortableTextComponent = createPortableTextComponent;
|
|
233
261
|
exports.createPreviewSubscriptionHook = createPreviewSubscriptionHook;
|
|
234
262
|
//# sourceMappingURL=next-sanity.cjs.development.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-sanity.cjs.development.js","sources":["../src/client.ts","../src/imageUrlBuilder.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts","../src/portableText.tsx"],"sourcesContent":["import sanityClient from '@sanity/client'\nimport {ClientConfig} from './types'\n\nexport function createClient(config: ClientConfig) {\n return sanityClient(config)\n}\n","import getImageUrlBuilder from '@sanity/image-url'\nimport {ProjectConfig} from './types'\n\nexport function createImageUrlBuilder({projectId, dataset}: ProjectConfig) {\n return getImageUrlBuilder({projectId, dataset})\n}\n","export interface Aborter {\n abort(): void\n signal?: AbortSignal\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? {signal: undefined, abort: noop}\n : new AbortController()\n}\n\nfunction noop() {\n // intentional noop\n}\n","import {useEffect, useState} from 'react'\nimport {CurrentUser} from './types'\nimport {getAborter, Aborter} from './aborter'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(projectId: string, abort?: Aborter): Promise<CurrentUser | null> {\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort?.signal,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n .catch((err: Error) => (err.name === 'AbortError' ? null : Promise.reject(err)))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter).then(setUser).catch(setError)\n return () => aborter.abort()\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {useState} from 'react'\nimport {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useDeepCompareEffectNoCheck as useDeepCompareEffect} from 'use-deep-compare-effect'\nimport {ProjectConfig} from './types'\nimport {getCurrentUser} from './currentUser'\nimport {getAborter} from './aborter'\n\nconst EMPTY_PARAMS = {}\n\ninterface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Record<string, unknown>\n initialData?: R\n}\n\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n useGroqBeta,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number; useGroqBeta?: boolean}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n })\n }\n\n function getStore() {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) =>\n groqStore({\n projectId,\n dataset,\n documentLimit,\n useGroqBeta,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n )\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: () => Promise<GroqStore>\n projectId: string\n query: string\n params: Record<string, unknown>\n initialData: R\n enabled: boolean\n}) {\n const {getStore, projectId, query, params, initialData, enabled = false} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useDeepCompareEffect(() => {\n if (!enabled) {\n return () => {\n /* intentional noop */\n }\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(getStore)\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch(setError)\n .finally(() => setLoading(false))\n\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n","import React from 'react'\nimport SanityPortableText, {\n PortableTextProps,\n PortableTextSerializers,\n} from '@sanity/block-content-to-react'\nimport {ProjectConfig} from './types'\n\nexport function createPortableTextComponent({\n projectId,\n dataset,\n serializers,\n}: ProjectConfig & {serializers?: PortableTextSerializers}) {\n return function PortableText(props: PortableTextProps) {\n return (\n <SanityPortableText\n projectId={projectId}\n dataset={dataset}\n serializers={serializers}\n {...props}\n />\n )\n }\n}\n"],"names":["createClient","config","sanityClient","createImageUrlBuilder","projectId","dataset","getImageUrlBuilder","getAborter","AbortController","signal","undefined","abort","noop","createCurrentUserHook","useCurrentUser","getCurrentUser","fetch","credentials","then","res","json","id","catch","err","name","Promise","reject","useState","data","setUser","error","setError","useEffect","aborter","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","useGroqBeta","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useDeepCompareEffect","subscription","user","console","warn","Error","subscribe","result","finally","unsubscribe","createPortableTextComponent","serializers","PortableText","props","React","SanityPortableText"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAGgBA,aAAaC;AAC3B,SAAOC,YAAY,CAACD,MAAD,CAAnB;AACD;;SCFeE;MAAuBC,iBAAAA;MAAWC,eAAAA;AAChD,SAAOC,kBAAkB,CAAC;AAACF,IAAAA,SAAS,EAATA,SAAD;AAAYC,IAAAA,OAAO,EAAPA;AAAZ,GAAD,CAAzB;AACD;;SCAeE;AACd,SAAO,OAAOC,eAAP,KAA2B,WAA3B,GACH;AAACC,IAAAA,MAAM,EAAEC,SAAT;AAAoBC,IAAAA,KAAK,EAAEC;AAA3B,GADG,GAEH,IAAIJ,eAAJ,EAFJ;AAGD;;AAED,SAASI,IAAT;AAEC;;SCTeC;MAAuBT,iBAAAA;AACrC,SAAO;AAAA,WAAMU,cAAc,CAACV,SAAD,CAApB;AAAA,GAAP;AACD;AAED,SAAgBW,eAAeX,WAAmBO;AAChD,SAAOK,KAAK,cAAYZ,SAAZ,iCAAmD;AAC7Da,IAAAA,WAAW,EAAE,SADgD;AAE7DR,IAAAA,MAAM,EAAEE,KAAF,oBAAEA,KAAK,CAAEF;AAF8C,GAAnD,CAAL,CAIJS,IAJI,CAIC,UAACC,GAAD;AAAA,WAASA,GAAG,CAACC,IAAJ,EAAT;AAAA,GAJD,EAKJF,IALI,CAKC,UAACC,GAAD;AAAA,WAAUA,GAAG,QAAH,IAAAA,GAAG,CAAEE,EAAL,GAAUF,GAAV,GAAgB,IAA1B;AAAA,GALD,EAMJG,KANI,CAME,UAACC,GAAD;AAAA,WAAiBA,GAAG,CAACC,IAAJ,KAAa,YAAb,GAA4B,IAA5B,GAAmCC,OAAO,CAACC,MAAR,CAAeH,GAAf,CAApD;AAAA,GANF,CAAP;AAOD;;AAED,SAAST,cAAT,CAAwBV,SAAxB;AACE,kBAAwBuB,cAAQ,EAAhC;AAAA,MAAOC,IAAP;AAAA,MAAaC,OAAb;;AACA,mBAA0BF,cAAQ,EAAlC;AAAA,MAAOG,KAAP;AAAA,MAAcC,QAAd;;AAEAC,EAAAA,eAAS,CAAC;AACR,QAAMC,OAAO,GAAG1B,UAAU,EAA1B;AACAQ,IAAAA,cAAc,CAACX,SAAD,EAAY6B,OAAZ,CAAd,CAAmCf,IAAnC,CAAwCW,OAAxC,EAAiDP,KAAjD,CAAuDS,QAAvD;AACA,WAAO;AAAA,aAAME,OAAO,CAACtB,KAAR,EAAN;AAAA,KAAP;AACD,GAJQ,EAIN,CAACP,SAAD,CAJM,CAAT;AAMA,SAAO;AAACwB,IAAAA,IAAI,EAAJA,IAAD;AAAOE,IAAAA,KAAK,EAALA,KAAP;AAAcI,IAAAA,OAAO,EAAEN,IAAI,KAAK,IAAT,IAAiB,CAACE;AAAzC,GAAP;AACD;;ACtBD,IAAMK,YAAY,GAAG,EAArB;AAQA,SAAgBC;MACdhC,iBAAAA;MACAC,eAAAA;MACAgC,mBAAAA;gCACAC;MAAAA,gDAAgB;AAEhB;AACA,MAAIC,KAAJ;AAEA,SAAO,SAASC,sBAAT,CACLC,KADK,EAELC,OAFK;QAELA;AAAAA,MAAAA,UAAkC;;;AAElC,mBAAsDA,OAAtD;AAAA,mCAAOC,MAAP;AAAA,QAAOA,MAAP,gCAAgBR,YAAhB;AAAA,QAA8BS,WAA9B,YAA8BA,WAA9B;AAAA,QAA2CC,OAA3C,YAA2CA,OAA3C;AACA,WAAOC,oBAAoB,CAAI;AAC7BC,MAAAA,QAAQ,EAARA,QAD6B;AAE7B3C,MAAAA,SAAS,EAATA,SAF6B;AAG7BqC,MAAAA,KAAK,EAALA,KAH6B;AAI7BE,MAAAA,MAAM,EAANA,MAJ6B;AAK7BC,MAAAA,WAAW,EAAEA,WALgB;AAM7BC,MAAAA,OAAO,EAAEA,OAAO,GAAG,OAAOG,MAAP,KAAkB,WAArB,GAAmC;AANtB,KAAJ,CAA3B;AAQD,GAbD;;AAeA,WAASD,QAAT;AACE,QAAI,CAACR,KAAL,EAAY;AACVA,MAAAA,KAAK,GAAG,mEAAO,oBAAP,QAA6BrB,IAA7B,CAAkC;AAAA,YAAE+B,SAAF,SAAEA,SAAF;AAAA,eACxCA,SAAS,CAAC;AACR7C,UAAAA,SAAS,EAATA,SADQ;AAERC,UAAAA,OAAO,EAAPA,OAFQ;AAGRiC,UAAAA,aAAa,EAAbA,aAHQ;AAIRD,UAAAA,WAAW,EAAXA,WAJQ;AAKRa,UAAAA,MAAM,EAAE,IALA;AAMRC,UAAAA,aAAa,EAAE,IANP;AAORC,UAAAA,sBAAsB,EAAE;AAPhB,SAAD,CAD+B;AAAA,OAAlC,CAAR;AAWD;;AACD,WAAOb,KAAP;AACD;AACF;;AAED,SAASO,oBAAT,CAAuCJ,OAAvC;AAQE,MAAOK,QAAP,GAA2EL,OAA3E,CAAOK,QAAP;AAAA,MAAiB3C,SAAjB,GAA2EsC,OAA3E,CAAiBtC,SAAjB;AAAA,MAA4BqC,KAA5B,GAA2EC,OAA3E,CAA4BD,KAA5B;AAAA,MAAmCE,MAAnC,GAA2ED,OAA3E,CAAmCC,MAAnC;AAAA,MAA2CC,WAA3C,GAA2EF,OAA3E,CAA2CE,WAA3C;AAAA,yBAA2EF,OAA3E,CAAwDG,OAAxD;AAAA,MAAwDA,OAAxD,iCAAkE,KAAlE;;AACA,kBAA0BlB,cAAQ,EAAlC;AAAA,MAAOG,KAAP;AAAA,MAAcC,QAAd;;AACA,mBAA8BJ,cAAQ,CAAC,KAAD,CAAtC;AAAA,MAAOO,OAAP;AAAA,MAAgBmB,UAAhB;;AACA,mBAAwB1B,cAAQ,EAAhC;AAAA,MAAOC,IAAP;AAAA,MAAa0B,OAAb;AAGA;;;AACAC,EAAAA,gDAAoB,CAAC;AACnB,QAAI,CAACV,OAAL,EAAc;AACZ,aAAO;AACL;AACD,OAFD;AAGD;;AAEDQ,IAAAA,UAAU,CAAC,IAAD,CAAV;AAEA,QAAMpB,OAAO,GAAG1B,UAAU,EAA1B;AACA,QAAIiD,YAAJ;AACAzC,IAAAA,cAAc,CAACX,SAAD,EAAY6B,OAAZ,CAAd,CACGf,IADH,CACQ,UAACuC,IAAD;AACJ,UAAIA,IAAJ,EAAU;AACR;AACD;;;AAGDC,MAAAA,OAAO,CAACC,IAAR,CAAa,2CAAb;AACA,YAAM,IAAIC,KAAJ,CAAU,2CAAV,CAAN;AACD,KATH,EAUG1C,IAVH,CAUQ6B,QAVR,EAWG7B,IAXH,CAWQ,UAACqB,KAAD;AACJiB,MAAAA,YAAY,GAAGjB,KAAK,CAACsB,SAAN,CAAgBpB,KAAhB,EAAuBE,MAAvB,EAA+B,UAACpB,GAAD,EAAMuC,MAAN;AAC5C,YAAIvC,GAAJ,EAAS;AACPQ,UAAAA,QAAQ,CAACR,GAAD,CAAR;AACD,SAFD,MAEO;AACL+B,UAAAA,OAAO,CAACQ,MAAD,CAAP;AACD;AACF,OANc,CAAf;AAOD,KAnBH,EAoBGxC,KApBH,CAoBSS,QApBT,EAqBGgC,OArBH,CAqBW;AAAA,aAAMV,UAAU,CAAC,KAAD,CAAhB;AAAA,KArBX;AAuBA,WAAO;AACL,UAAIG,YAAJ,EAAkB;AAChBA,QAAAA,YAAY,CAACQ,WAAb;AACD;;AAED/B,MAAAA,OAAO,CAACtB,KAAR;AACD,KAND;AAOD,GAzCmB,EAyCjB,CAACoC,QAAD,EAAWN,KAAX,EAAkBE,MAAlB,EAA0BE,OAA1B,CAzCiB,CAApB;AA2CA,SAAO;AACLjB,IAAAA,IAAI,EAAE,OAAOA,IAAP,KAAgB,WAAhB,GAA8BgB,WAA9B,GAA4ChB,IAD7C;AAELM,IAAAA,OAAO,EAAPA,OAFK;AAGLJ,IAAAA,KAAK,EAALA;AAHK,GAAP;AAKD;;SCjHemC;MACd7D,iBAAAA;MACAC,eAAAA;MACA6D,mBAAAA;AAEA,SAAO,SAASC,YAAT,CAAsBC,KAAtB;AACL,WACEC,4BAAA,CAACC,kBAAD;AACElE,MAAAA,SAAS,EAAEA;AACXC,MAAAA,OAAO,EAAEA;AACT6D,MAAAA,WAAW,EAAEA;OACTE,MAJN,CADF;AAQD,GATD;AAUD;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"next-sanity.cjs.development.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import sanityClient from '@sanity/client'\nimport {ClientConfig} from './types'\n\nexport function createClient(config: ClientConfig) {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\nimport {CurrentUser} from './types'\nimport {getAborter, Aborter} from './aborter'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(projectId: string, abort: Aborter): Promise<CurrentUser | null> {\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {useState, useEffect, useMemo} from 'react'\nimport {GroqStore, Subscription} from '@sanity/groq-store'\nimport {ProjectConfig} from './types'\nimport {getCurrentUser} from './currentUser'\nimport {getAborter, Aborter} from './aborter'\n\nconst EMPTY_PARAMS = {}\n\ntype Params = Record<string, unknown>\ninterface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n}) {\n const {getStore, projectId, query, initialData, enabled = false} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nfunction useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","aborted","abort","_signal","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","fetch","credentials","signal","then","res","json","id","useState","data","setUser","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","Error","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("@sanity/client")),r=
|
|
1
|
+
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("@sanity/client")),r=require("react"),n=e(require("groq")),o=function(){function e(){this._signal={aborted:!1}}var t,r;return e.prototype.abort=function(){this._signal.aborted=!0},t=e,(r=[{key:"signal",get:function(){return this._signal}}])&&function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function i(){return"undefined"==typeof AbortController?new o:new AbortController}function u(e,t){return fetch("https://"+e+".api.sanity.io/v1/users/me",{credentials:"include",signal:t.signal}).then((function(e){return e.json()})).then((function(e){return null!=e&&e.id?e:null}))}var a={};exports.groq=n,exports.createClient=function(e){return t(e)},exports.createCurrentUserHook=function(e){var t=e.projectId;return function(){return function(e){var t=r.useState(),n=t[0],o=t[1],a=r.useState(),c=a[0],f=a[1];return r.useEffect((function(){var t=i();return u(e,t).then(o).catch((function(e){return"AbortError"!==e.name&&f(e)})),function(){t.abort()}}),[e]),{data:n,error:c,loading:null!==n||!c}}(t)}},exports.createPreviewSubscriptionHook=function(e){var t,n=e.projectId,o=e.dataset,c=e.documentLimit,f=void 0===c?3e3:c;return function(e,t){void 0===t&&(t={});var o=t.params;return function(e){var t=e.getStore,n=e.projectId,o=e.query,a=e.initialData,c=e.enabled,f=void 0!==c&&c,s=r.useState(),l=s[0],d=s[1],b=r.useState(!1),p=b[0],v=b[1],g=r.useState(),y=g[0],h=g[1],m=function(e){var t=r.useMemo((function(){return JSON.stringify(e)}),[e]);return r.useMemo((function(){return JSON.parse(t)}),[t])}(e.params);return r.useEffect((function(){if(f){v(!0);var e,r=i();return u(n,r).then((function(e){if(!e)throw console.warn("Not authenticated - preview not available"),new Error("Not authenticated - preview not available")})).then((function(){return t(r)})).then((function(t){e=t.subscribe(o,m,(function(e,t){e?d(e):h(t)}))})).catch((function(e){return"AbortError"===e.name?null:d(e)})).finally((function(){return v(!1)})),function(){e&&e.unsubscribe(),r.abort()}}}),[t,o,m,f]),{data:void 0===y?a:y,loading:p,error:l}}({getStore:s,projectId:n,query:e,params:void 0===o?a:o,initialData:t.initialData,enabled:!!t.enabled&&"undefined"!=typeof window})};function s(e){return t||(t=new Promise((function(e){e(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach((function(r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})})),t.default=e,t}(require("@sanity/groq-store")))})).then((function(t){var r=t.groqStore;if(e.signal.aborted){var i=new Error("Cancelling groq store creation");return i.name="AbortError",Promise.reject(i)}return r({projectId:n,dataset:o,documentLimit:f,listen:!0,overlayDrafts:!0,subscriptionThrottleMs:10})}))),t}};
|
|
2
2
|
//# sourceMappingURL=next-sanity.cjs.production.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-sanity.cjs.production.min.js","sources":["../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts","../src/client.ts"
|
|
1
|
+
{"version":3,"file":"next-sanity.cjs.production.min.js","sources":["../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts","../src/client.ts"],"sourcesContent":["export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\nimport {CurrentUser} from './types'\nimport {getAborter, Aborter} from './aborter'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(projectId: string, abort: Aborter): Promise<CurrentUser | null> {\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {useState, useEffect, useMemo} from 'react'\nimport {GroqStore, Subscription} from '@sanity/groq-store'\nimport {ProjectConfig} from './types'\nimport {getCurrentUser} from './currentUser'\nimport {getAborter, Aborter} from './aborter'\n\nconst EMPTY_PARAMS = {}\n\ntype Params = Record<string, unknown>\ninterface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n}) {\n const {getStore, projectId, query, initialData, enabled = false} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nfunction useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n","import sanityClient from '@sanity/client'\nimport {ClientConfig} from './types'\n\nexport function createClient(config: ClientConfig) {\n return sanityClient(config)\n}\n"],"names":["MockAbortController","aborted","abort","_signal","this","getAborter","AbortController","getCurrentUser","projectId","fetch","credentials","signal","then","res","json","id","EMPTY_PARAMS","config","sanityClient","useState","data","setUser","error","setError","useEffect","aborter","catch","err","name","loading","useCurrentUser","store","dataset","documentLimit","query","options","params","getStore","initialData","enabled","setLoading","setData","stringifiedParams","useMemo","JSON","stringify","parse","useParams","subscription","user","console","warn","Error","subscribe","result","finally","unsubscribe","useQuerySubscription","window","groqStore","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs"],"mappings":"qNAKMA,uCACM,CAACC,SAAS,8BAIpBC,MAAA,gBACOC,QAAQF,SAAU,6BAJzB,kBACSG,KAAKD,yPAOhB,SAAgBE,UACoB,oBAApBC,gBACV,IAAIN,EACJ,IAAIM,yBCVMC,EAAeC,EAAmBN,UACzCO,iBAAiBD,+BAAuC,CAC7DE,YAAa,UACbC,OAAQT,EAAMS,SAEbC,MAAK,SAACC,UAAQA,EAAIC,UAClBF,MAAK,SAACC,gBAASA,GAAAA,EAAKE,GAAKF,EAAM,QCRpC,IAAMG,EAAe,gDCHQC,UACpBC,EAAaD,kDFAiBT,IAAAA,iBAC9B,kBAYT,SAAwBA,SACEW,aAAjBC,OAAMC,SACaF,aAAnBG,OAAOC,cAEdC,aAAU,eACFC,EAAUpB,WAChBE,EAAeC,EAAWiB,GACvBb,KAAKS,GACLK,OAAM,SAACC,SAA4B,eAAbA,EAAIC,MAAyBL,EAASI,MAExD,WACLF,EAAQvB,WAET,CAACM,IAEG,CAACY,KAAAA,EAAME,MAAAA,EAAOO,QAAkB,OAATT,IAAkBE,GA3BnCQ,CAAetB,2DCgBxBuB,EALJvB,IAAAA,UACAwB,IAAAA,YACAC,cAAAA,aAAgB,aAKT,SACLC,EACAC,YAAAA,IAAAA,EAAkC,UAEoBA,EAA/CC,cAoCX,SAAuCD,OAQ9BE,EAA4DF,EAA5DE,SAAU7B,EAAkD2B,EAAlD3B,UAAW0B,EAAuCC,EAAvCD,MAAOI,EAAgCH,EAAhCG,cAAgCH,EAAnBI,QAAAA,kBACtBpB,aAAnBG,OAAOC,SACgBJ,YAAS,GAAhCU,OAASW,SACQrB,aAAjBC,OAAMqB,OACPL,EAsDR,SAAmBA,OACXM,EAAoBC,WAAQ,kBAAMC,KAAKC,UAAUT,KAAS,CAACA,WAC1DO,WAAQ,kBAAMC,KAAKE,MAAMJ,KAAoB,CAACA,IAxDtCK,CAAUZ,EAAQC,eAIjCZ,aAAU,cACHe,GAILC,GAAW,OAGPQ,EADEvB,EAAUpB,WAEhBE,EAAeC,EAAWiB,GACvBb,MAAK,SAACqC,OACDA,QAKJC,QAAQC,KAAK,6CACP,IAAIC,MAAM,gDAEjBxC,MAAK,kBAAMyB,EAASZ,MACpBb,MAAK,SAACmB,GACLiB,EAAejB,EAAMsB,UAAUnB,EAAOE,GAAQ,SAACT,EAAK2B,GAC9C3B,EACFJ,EAASI,GAETc,EAAQa,SAIb5B,OAAM,SAACC,SAA6B,eAAbA,EAAIC,KAAwB,KAAOL,EAASI,MACnE4B,SAAQ,kBAAMf,GAAW,MAGrB,WACDQ,GACFA,EAAaQ,cAGf/B,EAAQvB,YAET,CAACmC,EAAUH,EAAOE,EAAQG,IAEtB,CACLnB,UAAsB,IAATA,EAAuBkB,EAAclB,EAClDS,QAAAA,EACAP,MAAAA,GAhGOmC,CAAwB,CAC7BpB,SAAAA,EACA7B,UAAAA,EACA0B,MAAAA,EACAE,kBALcpB,IAMdsB,YANoDH,EAAxBG,YAO5BC,UAPoDJ,EAAXI,SAOJ,oBAAXmB,mBAIrBrB,EAASnC,UACX6B,IACHA,EAAQ,8QAAO,2BAAsBnB,MAAK,gBAAE+C,IAAAA,aAEtCzD,EAAMS,OAAOV,QAAS,KAClBqB,EAAQ,IAAI8B,MAAM,yCAExB9B,EAAMM,KAAO,aACNgC,QAAQC,OAAOvC,UAGjBqC,EAAU,CACfnD,UAAAA,EACAwB,QAAAA,EACAC,cAAAA,EACA6B,QAAQ,EACRC,eAAe,EACfC,uBAAwB,SAIvBjC"}
|
package/dist/next-sanity.esm.js
CHANGED
|
@@ -1,31 +1,55 @@
|
|
|
1
1
|
import sanityClient from '@sanity/client';
|
|
2
|
-
import
|
|
3
|
-
import React, { useState, useEffect } from 'react';
|
|
4
|
-
import { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect';
|
|
5
|
-
import SanityPortableText from '@sanity/block-content-to-react';
|
|
2
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
6
3
|
export { default as groq } from 'groq';
|
|
7
4
|
|
|
8
5
|
function createClient(config) {
|
|
9
6
|
return sanityClient(config);
|
|
10
7
|
}
|
|
11
8
|
|
|
12
|
-
function
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
function _defineProperties(target, props) {
|
|
10
|
+
for (var i = 0; i < props.length; i++) {
|
|
11
|
+
var descriptor = props[i];
|
|
12
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
13
|
+
descriptor.configurable = true;
|
|
14
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
15
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
16
|
+
}
|
|
19
17
|
}
|
|
20
18
|
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
function _createClass(Constructor, protoProps, staticProps) {
|
|
20
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
21
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
22
|
+
Object.defineProperty(Constructor, "prototype", {
|
|
23
|
+
writable: false
|
|
24
|
+
});
|
|
25
|
+
return Constructor;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
function
|
|
28
|
+
var MockAbortController = /*#__PURE__*/function () {
|
|
29
|
+
function MockAbortController() {
|
|
30
|
+
this._signal = {
|
|
31
|
+
aborted: false
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var _proto = MockAbortController.prototype;
|
|
36
|
+
|
|
37
|
+
_proto.abort = function abort() {
|
|
38
|
+
this._signal.aborted = true;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
_createClass(MockAbortController, [{
|
|
42
|
+
key: "signal",
|
|
43
|
+
get: function get() {
|
|
44
|
+
return this._signal;
|
|
45
|
+
}
|
|
46
|
+
}]);
|
|
47
|
+
|
|
48
|
+
return MockAbortController;
|
|
49
|
+
}();
|
|
50
|
+
|
|
51
|
+
function getAborter() {
|
|
52
|
+
return typeof AbortController === 'undefined' ? new MockAbortController() : new AbortController();
|
|
29
53
|
}
|
|
30
54
|
|
|
31
55
|
function createCurrentUserHook(_ref) {
|
|
@@ -37,13 +61,11 @@ function createCurrentUserHook(_ref) {
|
|
|
37
61
|
function getCurrentUser(projectId, abort) {
|
|
38
62
|
return fetch("https://" + projectId + ".api.sanity.io/v1/users/me", {
|
|
39
63
|
credentials: 'include',
|
|
40
|
-
signal: abort
|
|
64
|
+
signal: abort.signal
|
|
41
65
|
}).then(function (res) {
|
|
42
66
|
return res.json();
|
|
43
67
|
}).then(function (res) {
|
|
44
68
|
return res != null && res.id ? res : null;
|
|
45
|
-
}).catch(function (err) {
|
|
46
|
-
return err.name === 'AbortError' ? null : Promise.reject(err);
|
|
47
69
|
});
|
|
48
70
|
}
|
|
49
71
|
|
|
@@ -58,9 +80,11 @@ function useCurrentUser(projectId) {
|
|
|
58
80
|
|
|
59
81
|
useEffect(function () {
|
|
60
82
|
var aborter = getAborter();
|
|
61
|
-
getCurrentUser(projectId, aborter).then(setUser).catch(
|
|
83
|
+
getCurrentUser(projectId, aborter).then(setUser).catch(function (err) {
|
|
84
|
+
return err.name !== 'AbortError' && setError(err);
|
|
85
|
+
});
|
|
62
86
|
return function () {
|
|
63
|
-
|
|
87
|
+
aborter.abort();
|
|
64
88
|
};
|
|
65
89
|
}, [projectId]);
|
|
66
90
|
return {
|
|
@@ -74,7 +98,6 @@ var EMPTY_PARAMS = {};
|
|
|
74
98
|
function createPreviewSubscriptionHook(_ref) {
|
|
75
99
|
var projectId = _ref.projectId,
|
|
76
100
|
dataset = _ref.dataset,
|
|
77
|
-
useGroqBeta = _ref.useGroqBeta,
|
|
78
101
|
_ref$documentLimit = _ref.documentLimit,
|
|
79
102
|
documentLimit = _ref$documentLimit === void 0 ? 3000 : _ref$documentLimit;
|
|
80
103
|
// Only construct/setup the store when `getStore()` is called
|
|
@@ -99,15 +122,23 @@ function createPreviewSubscriptionHook(_ref) {
|
|
|
99
122
|
});
|
|
100
123
|
};
|
|
101
124
|
|
|
102
|
-
function getStore() {
|
|
125
|
+
function getStore(abort) {
|
|
103
126
|
if (!store) {
|
|
104
127
|
store = import('@sanity/groq-store').then(function (_ref2) {
|
|
105
128
|
var groqStore = _ref2.groqStore;
|
|
129
|
+
|
|
130
|
+
// Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure
|
|
131
|
+
if (abort.signal.aborted) {
|
|
132
|
+
var error = new Error('Cancelling groq store creation'); // This ensures we can skip it in the catch block same way
|
|
133
|
+
|
|
134
|
+
error.name = 'AbortError';
|
|
135
|
+
return Promise.reject(error);
|
|
136
|
+
}
|
|
137
|
+
|
|
106
138
|
return groqStore({
|
|
107
139
|
projectId: projectId,
|
|
108
140
|
dataset: dataset,
|
|
109
141
|
documentLimit: documentLimit,
|
|
110
|
-
useGroqBeta: useGroqBeta,
|
|
111
142
|
listen: true,
|
|
112
143
|
overlayDrafts: true,
|
|
113
144
|
subscriptionThrottleMs: 10
|
|
@@ -123,7 +154,6 @@ function useQuerySubscription(options) {
|
|
|
123
154
|
var getStore = options.getStore,
|
|
124
155
|
projectId = options.projectId,
|
|
125
156
|
query = options.query,
|
|
126
|
-
params = options.params,
|
|
127
157
|
initialData = options.initialData,
|
|
128
158
|
_options$enabled = options.enabled,
|
|
129
159
|
enabled = _options$enabled === void 0 ? false : _options$enabled;
|
|
@@ -138,15 +168,14 @@ function useQuerySubscription(options) {
|
|
|
138
168
|
|
|
139
169
|
var _useState3 = useState(),
|
|
140
170
|
data = _useState3[0],
|
|
141
|
-
setData = _useState3[1];
|
|
142
|
-
// but contains the same shallow properties, eg `{"slug": "some-slug"}`
|
|
171
|
+
setData = _useState3[1];
|
|
143
172
|
|
|
173
|
+
var params = useParams(options.params); // Use "deep" dependency comparison because params are often not _referentially_ equal,
|
|
174
|
+
// but contains the same shallow properties, eg `{"slug": "some-slug"}`
|
|
144
175
|
|
|
145
|
-
|
|
176
|
+
useEffect(function () {
|
|
146
177
|
if (!enabled) {
|
|
147
|
-
return
|
|
148
|
-
/* intentional noop */
|
|
149
|
-
};
|
|
178
|
+
return;
|
|
150
179
|
}
|
|
151
180
|
|
|
152
181
|
setLoading(true);
|
|
@@ -160,7 +189,9 @@ function useQuerySubscription(options) {
|
|
|
160
189
|
|
|
161
190
|
console.warn('Not authenticated - preview not available');
|
|
162
191
|
throw new Error('Not authenticated - preview not available');
|
|
163
|
-
}).then(
|
|
192
|
+
}).then(function () {
|
|
193
|
+
return getStore(aborter);
|
|
194
|
+
}).then(function (store) {
|
|
164
195
|
subscription = store.subscribe(query, params, function (err, result) {
|
|
165
196
|
if (err) {
|
|
166
197
|
setError(err);
|
|
@@ -168,9 +199,12 @@ function useQuerySubscription(options) {
|
|
|
168
199
|
setData(result);
|
|
169
200
|
}
|
|
170
201
|
});
|
|
171
|
-
}).catch(
|
|
202
|
+
}).catch(function (err) {
|
|
203
|
+
return err.name === 'AbortError' ? null : setError(err);
|
|
204
|
+
}).finally(function () {
|
|
172
205
|
return setLoading(false);
|
|
173
|
-
});
|
|
206
|
+
}); // eslint-disable-next-line consistent-return
|
|
207
|
+
|
|
174
208
|
return function () {
|
|
175
209
|
if (subscription) {
|
|
176
210
|
subscription.unsubscribe();
|
|
@@ -184,20 +218,17 @@ function useQuerySubscription(options) {
|
|
|
184
218
|
loading: loading,
|
|
185
219
|
error: error
|
|
186
220
|
};
|
|
187
|
-
}
|
|
221
|
+
} // Return params that are stable with deep equal as long as the key order is the same
|
|
188
222
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
serializers: serializers
|
|
198
|
-
}, props));
|
|
199
|
-
};
|
|
223
|
+
|
|
224
|
+
function useParams(params) {
|
|
225
|
+
var stringifiedParams = useMemo(function () {
|
|
226
|
+
return JSON.stringify(params);
|
|
227
|
+
}, [params]);
|
|
228
|
+
return useMemo(function () {
|
|
229
|
+
return JSON.parse(stringifiedParams);
|
|
230
|
+
}, [stringifiedParams]);
|
|
200
231
|
}
|
|
201
232
|
|
|
202
|
-
export { createClient, createCurrentUserHook,
|
|
233
|
+
export { createClient, createCurrentUserHook, createPreviewSubscriptionHook };
|
|
203
234
|
//# sourceMappingURL=next-sanity.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-sanity.esm.js","sources":["../src/client.ts","../src/imageUrlBuilder.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts","../src/portableText.tsx"],"sourcesContent":["import sanityClient from '@sanity/client'\nimport {ClientConfig} from './types'\n\nexport function createClient(config: ClientConfig) {\n return sanityClient(config)\n}\n","import getImageUrlBuilder from '@sanity/image-url'\nimport {ProjectConfig} from './types'\n\nexport function createImageUrlBuilder({projectId, dataset}: ProjectConfig) {\n return getImageUrlBuilder({projectId, dataset})\n}\n","export interface Aborter {\n abort(): void\n signal?: AbortSignal\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? {signal: undefined, abort: noop}\n : new AbortController()\n}\n\nfunction noop() {\n // intentional noop\n}\n","import {useEffect, useState} from 'react'\nimport {CurrentUser} from './types'\nimport {getAborter, Aborter} from './aborter'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(projectId: string, abort?: Aborter): Promise<CurrentUser | null> {\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort?.signal,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n .catch((err: Error) => (err.name === 'AbortError' ? null : Promise.reject(err)))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter).then(setUser).catch(setError)\n return () => aborter.abort()\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {useState} from 'react'\nimport {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useDeepCompareEffectNoCheck as useDeepCompareEffect} from 'use-deep-compare-effect'\nimport {ProjectConfig} from './types'\nimport {getCurrentUser} from './currentUser'\nimport {getAborter} from './aborter'\n\nconst EMPTY_PARAMS = {}\n\ninterface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Record<string, unknown>\n initialData?: R\n}\n\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n useGroqBeta,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number; useGroqBeta?: boolean}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n })\n }\n\n function getStore() {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) =>\n groqStore({\n projectId,\n dataset,\n documentLimit,\n useGroqBeta,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n )\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: () => Promise<GroqStore>\n projectId: string\n query: string\n params: Record<string, unknown>\n initialData: R\n enabled: boolean\n}) {\n const {getStore, projectId, query, params, initialData, enabled = false} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useDeepCompareEffect(() => {\n if (!enabled) {\n return () => {\n /* intentional noop */\n }\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(getStore)\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch(setError)\n .finally(() => setLoading(false))\n\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n","import React from 'react'\nimport SanityPortableText, {\n PortableTextProps,\n PortableTextSerializers,\n} from '@sanity/block-content-to-react'\nimport {ProjectConfig} from './types'\n\nexport function createPortableTextComponent({\n projectId,\n dataset,\n serializers,\n}: ProjectConfig & {serializers?: PortableTextSerializers}) {\n return function PortableText(props: PortableTextProps) {\n return (\n <SanityPortableText\n projectId={projectId}\n dataset={dataset}\n serializers={serializers}\n {...props}\n />\n )\n }\n}\n"],"names":["createClient","config","sanityClient","createImageUrlBuilder","projectId","dataset","getImageUrlBuilder","getAborter","AbortController","signal","undefined","abort","noop","createCurrentUserHook","useCurrentUser","getCurrentUser","fetch","credentials","then","res","json","id","catch","err","name","Promise","reject","useState","data","setUser","error","setError","useEffect","aborter","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","useGroqBeta","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useDeepCompareEffect","subscription","user","console","warn","Error","subscribe","result","finally","unsubscribe","createPortableTextComponent","serializers","PortableText","props","React","SanityPortableText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"next-sanity.esm.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import sanityClient from '@sanity/client'\nimport {ClientConfig} from './types'\n\nexport function createClient(config: ClientConfig) {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\nimport {CurrentUser} from './types'\nimport {getAborter, Aborter} from './aborter'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(projectId: string, abort: Aborter): Promise<CurrentUser | null> {\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {useState, useEffect, useMemo} from 'react'\nimport {GroqStore, Subscription} from '@sanity/groq-store'\nimport {ProjectConfig} from './types'\nimport {getCurrentUser} from './currentUser'\nimport {getAborter, Aborter} from './aborter'\n\nconst EMPTY_PARAMS = {}\n\ntype Params = Record<string, unknown>\ninterface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n}) {\n const {getStore, projectId, query, initialData, enabled = false} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nfunction useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","aborted","abort","_signal","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","fetch","credentials","signal","then","res","json","id","useState","data","setUser","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","Error","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ProjectConfig } from './types';
|
|
2
|
+
declare type Params = Record<string, unknown>;
|
|
2
3
|
interface SubscriptionOptions<R = any> {
|
|
3
4
|
enabled?: boolean;
|
|
4
|
-
params?:
|
|
5
|
+
params?: Params;
|
|
5
6
|
initialData?: R;
|
|
6
7
|
}
|
|
7
|
-
export declare function createPreviewSubscriptionHook({ projectId, dataset,
|
|
8
|
+
export declare function createPreviewSubscriptionHook({ projectId, dataset, documentLimit, }: ProjectConfig & {
|
|
8
9
|
documentLimit?: number;
|
|
9
|
-
useGroqBeta?: boolean;
|
|
10
10
|
}): <R = any>(query: string, options?: SubscriptionOptions<R>) => {
|
|
11
11
|
data: R;
|
|
12
12
|
loading: boolean;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-sanity",
|
|
3
3
|
"description": "Sanity.io toolkit for Next.js",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.0",
|
|
5
5
|
"author": "Sanity.io <hello@sanity.io>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"sideEffects": false,
|
|
@@ -25,14 +25,13 @@
|
|
|
25
25
|
"coverage": "tsdx test --coverage"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@sanity/
|
|
29
|
-
"@sanity/
|
|
30
|
-
"
|
|
31
|
-
"@sanity/image-url": "^1.0.1",
|
|
32
|
-
"groq": "^2.15.0",
|
|
33
|
-
"use-deep-compare-effect": "^1.6.1"
|
|
28
|
+
"@sanity/client": "^3.0.6",
|
|
29
|
+
"@sanity/groq-store": "^0.3.0",
|
|
30
|
+
"groq": "^2.15.0"
|
|
34
31
|
},
|
|
35
32
|
"devDependencies": {
|
|
33
|
+
"@async-fn/jest": "^1.5.3",
|
|
34
|
+
"@testing-library/react-hooks": "^7.0.2",
|
|
36
35
|
"@types/jest": "^27.0.0",
|
|
37
36
|
"@types/react": "^17.0.17",
|
|
38
37
|
"@types/react-dom": "^17.0.9",
|
package/src/aborter.ts
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
export interface Aborter {
|
|
2
2
|
abort(): void
|
|
3
|
-
signal
|
|
3
|
+
signal: AbortSignal
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
class MockAbortController {
|
|
7
|
+
_signal = {aborted: false}
|
|
8
|
+
get signal() {
|
|
9
|
+
return this._signal as AbortSignal
|
|
10
|
+
}
|
|
11
|
+
abort() {
|
|
12
|
+
this._signal.aborted = true
|
|
13
|
+
}
|
|
4
14
|
}
|
|
5
15
|
|
|
6
16
|
export function getAborter(): Aborter {
|
|
7
17
|
return typeof AbortController === 'undefined'
|
|
8
|
-
?
|
|
18
|
+
? new MockAbortController()
|
|
9
19
|
: new AbortController()
|
|
10
20
|
}
|
|
11
|
-
|
|
12
|
-
function noop() {
|
|
13
|
-
// intentional noop
|
|
14
|
-
}
|
package/src/currentUser.ts
CHANGED
|
@@ -6,14 +6,13 @@ export function createCurrentUserHook({projectId}: {projectId: string; dataset?:
|
|
|
6
6
|
return () => useCurrentUser(projectId)
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export function getCurrentUser(projectId: string, abort
|
|
9
|
+
export function getCurrentUser(projectId: string, abort: Aborter): Promise<CurrentUser | null> {
|
|
10
10
|
return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {
|
|
11
11
|
credentials: 'include',
|
|
12
|
-
signal: abort
|
|
12
|
+
signal: abort.signal,
|
|
13
13
|
})
|
|
14
14
|
.then((res) => res.json())
|
|
15
15
|
.then((res) => (res?.id ? res : null))
|
|
16
|
-
.catch((err: Error) => (err.name === 'AbortError' ? null : Promise.reject(err)))
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
function useCurrentUser(projectId: string) {
|
|
@@ -22,8 +21,13 @@ function useCurrentUser(projectId: string) {
|
|
|
22
21
|
|
|
23
22
|
useEffect(() => {
|
|
24
23
|
const aborter = getAborter()
|
|
25
|
-
getCurrentUser(projectId, aborter)
|
|
26
|
-
|
|
24
|
+
getCurrentUser(projectId, aborter)
|
|
25
|
+
.then(setUser)
|
|
26
|
+
.catch((err: Error) => err.name !== 'AbortError' && setError(err))
|
|
27
|
+
|
|
28
|
+
return () => {
|
|
29
|
+
aborter.abort()
|
|
30
|
+
}
|
|
27
31
|
}, [projectId])
|
|
28
32
|
|
|
29
33
|
return {data, error, loading: data !== null || !error}
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export * from './types'
|
|
2
2
|
export {createClient} from './client'
|
|
3
|
-
export {createImageUrlBuilder} from './imageUrlBuilder'
|
|
4
3
|
export {createCurrentUserHook} from './currentUser'
|
|
5
4
|
export {createPreviewSubscriptionHook} from './useSubscription'
|
|
6
|
-
export {createPortableTextComponent} from './portableText'
|
|
7
5
|
export {default as groq} from 'groq'
|
package/src/useSubscription.ts
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import {useState} from 'react'
|
|
1
|
+
import {useState, useEffect, useMemo} from 'react'
|
|
2
2
|
import {GroqStore, Subscription} from '@sanity/groq-store'
|
|
3
|
-
import {useDeepCompareEffectNoCheck as useDeepCompareEffect} from 'use-deep-compare-effect'
|
|
4
3
|
import {ProjectConfig} from './types'
|
|
5
4
|
import {getCurrentUser} from './currentUser'
|
|
6
|
-
import {getAborter} from './aborter'
|
|
5
|
+
import {getAborter, Aborter} from './aborter'
|
|
7
6
|
|
|
8
7
|
const EMPTY_PARAMS = {}
|
|
9
8
|
|
|
9
|
+
type Params = Record<string, unknown>
|
|
10
10
|
interface SubscriptionOptions<R = any> {
|
|
11
11
|
enabled?: boolean
|
|
12
|
-
params?:
|
|
12
|
+
params?: Params
|
|
13
13
|
initialData?: R
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function createPreviewSubscriptionHook({
|
|
17
17
|
projectId,
|
|
18
18
|
dataset,
|
|
19
|
-
useGroqBeta,
|
|
20
19
|
documentLimit = 3000,
|
|
21
|
-
}: ProjectConfig & {documentLimit?: number
|
|
20
|
+
}: ProjectConfig & {documentLimit?: number}) {
|
|
22
21
|
// Only construct/setup the store when `getStore()` is called
|
|
23
22
|
let store: Promise<GroqStore>
|
|
24
23
|
|
|
@@ -37,44 +36,50 @@ export function createPreviewSubscriptionHook({
|
|
|
37
36
|
})
|
|
38
37
|
}
|
|
39
38
|
|
|
40
|
-
function getStore() {
|
|
39
|
+
function getStore(abort: Aborter) {
|
|
41
40
|
if (!store) {
|
|
42
|
-
store = import('@sanity/groq-store').then(({groqStore}) =>
|
|
43
|
-
|
|
41
|
+
store = import('@sanity/groq-store').then(({groqStore}) => {
|
|
42
|
+
// Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure
|
|
43
|
+
if (abort.signal.aborted) {
|
|
44
|
+
const error = new Error('Cancelling groq store creation')
|
|
45
|
+
// This ensures we can skip it in the catch block same way
|
|
46
|
+
error.name = 'AbortError'
|
|
47
|
+
return Promise.reject(error)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return groqStore({
|
|
44
51
|
projectId,
|
|
45
52
|
dataset,
|
|
46
53
|
documentLimit,
|
|
47
|
-
useGroqBeta,
|
|
48
54
|
listen: true,
|
|
49
55
|
overlayDrafts: true,
|
|
50
56
|
subscriptionThrottleMs: 10,
|
|
51
57
|
})
|
|
52
|
-
)
|
|
58
|
+
})
|
|
53
59
|
}
|
|
54
60
|
return store
|
|
55
61
|
}
|
|
56
62
|
}
|
|
57
63
|
|
|
58
64
|
function useQuerySubscription<R = any>(options: {
|
|
59
|
-
getStore: () => Promise<GroqStore>
|
|
65
|
+
getStore: (abort: Aborter) => Promise<GroqStore>
|
|
60
66
|
projectId: string
|
|
61
67
|
query: string
|
|
62
|
-
params:
|
|
68
|
+
params: Params
|
|
63
69
|
initialData: R
|
|
64
70
|
enabled: boolean
|
|
65
71
|
}) {
|
|
66
|
-
const {getStore, projectId, query,
|
|
72
|
+
const {getStore, projectId, query, initialData, enabled = false} = options
|
|
67
73
|
const [error, setError] = useState<Error>()
|
|
68
74
|
const [loading, setLoading] = useState(false)
|
|
69
75
|
const [data, setData] = useState<R>()
|
|
76
|
+
const params = useParams(options.params)
|
|
70
77
|
|
|
71
78
|
// Use "deep" dependency comparison because params are often not _referentially_ equal,
|
|
72
79
|
// but contains the same shallow properties, eg `{"slug": "some-slug"}`
|
|
73
|
-
|
|
80
|
+
useEffect(() => {
|
|
74
81
|
if (!enabled) {
|
|
75
|
-
return
|
|
76
|
-
/* intentional noop */
|
|
77
|
-
}
|
|
82
|
+
return
|
|
78
83
|
}
|
|
79
84
|
|
|
80
85
|
setLoading(true)
|
|
@@ -91,7 +96,7 @@ function useQuerySubscription<R = any>(options: {
|
|
|
91
96
|
console.warn('Not authenticated - preview not available')
|
|
92
97
|
throw new Error('Not authenticated - preview not available')
|
|
93
98
|
})
|
|
94
|
-
.then(getStore)
|
|
99
|
+
.then(() => getStore(aborter))
|
|
95
100
|
.then((store) => {
|
|
96
101
|
subscription = store.subscribe(query, params, (err, result) => {
|
|
97
102
|
if (err) {
|
|
@@ -101,9 +106,10 @@ function useQuerySubscription<R = any>(options: {
|
|
|
101
106
|
}
|
|
102
107
|
})
|
|
103
108
|
})
|
|
104
|
-
.catch(setError)
|
|
109
|
+
.catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))
|
|
105
110
|
.finally(() => setLoading(false))
|
|
106
111
|
|
|
112
|
+
// eslint-disable-next-line consistent-return
|
|
107
113
|
return () => {
|
|
108
114
|
if (subscription) {
|
|
109
115
|
subscription.unsubscribe()
|
|
@@ -119,3 +125,9 @@ function useQuerySubscription<R = any>(options: {
|
|
|
119
125
|
error,
|
|
120
126
|
}
|
|
121
127
|
}
|
|
128
|
+
|
|
129
|
+
// Return params that are stable with deep equal as long as the key order is the same
|
|
130
|
+
function useParams(params: Params): Params {
|
|
131
|
+
const stringifiedParams = useMemo(() => JSON.stringify(params), [params])
|
|
132
|
+
return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])
|
|
133
|
+
}
|
package/dist/portableText.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import { PortableTextProps, PortableTextSerializers } from '@sanity/block-content-to-react';
|
|
3
|
-
import { ProjectConfig } from './types';
|
|
4
|
-
export declare function createPortableTextComponent({ projectId, dataset, serializers, }: ProjectConfig & {
|
|
5
|
-
serializers?: PortableTextSerializers;
|
|
6
|
-
}): (props: PortableTextProps) => JSX.Element;
|
package/src/imageUrlBuilder.ts
DELETED
package/src/portableText.tsx
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import SanityPortableText, {
|
|
3
|
-
PortableTextProps,
|
|
4
|
-
PortableTextSerializers,
|
|
5
|
-
} from '@sanity/block-content-to-react'
|
|
6
|
-
import {ProjectConfig} from './types'
|
|
7
|
-
|
|
8
|
-
export function createPortableTextComponent({
|
|
9
|
-
projectId,
|
|
10
|
-
dataset,
|
|
11
|
-
serializers,
|
|
12
|
-
}: ProjectConfig & {serializers?: PortableTextSerializers}) {
|
|
13
|
-
return function PortableText(props: PortableTextProps) {
|
|
14
|
-
return (
|
|
15
|
-
<SanityPortableText
|
|
16
|
-
projectId={projectId}
|
|
17
|
-
dataset={dataset}
|
|
18
|
-
serializers={serializers}
|
|
19
|
-
{...props}
|
|
20
|
-
/>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
}
|