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 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
- createImageUrlBuilder,
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 {usePreviewSubscription, urlFor, PortableText} from '../../lib/sanity'
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 blocks={body} />
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
@@ -1,5 +1,5 @@
1
1
  export interface Aborter {
2
2
  abort(): void;
3
- signal?: AbortSignal;
3
+ signal: AbortSignal;
4
4
  }
5
5
  export declare function getAborter(): Aborter;
@@ -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?: Aborter): Promise<CurrentUser | null>;
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 getImageUrlBuilder = _interopDefault(require('@sanity/image-url'));
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 createImageUrlBuilder(_ref) {
39
- var projectId = _ref.projectId,
40
- dataset = _ref.dataset;
41
- return getImageUrlBuilder({
42
- projectId: projectId,
43
- dataset: dataset
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 getAborter() {
48
- return typeof AbortController === 'undefined' ? {
49
- signal: undefined,
50
- abort: noop
51
- } : new AbortController();
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 noop() {// intentional noop
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 == null ? void 0 : abort.signal
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 = React.useState(),
98
+ var _useState = react.useState(),
78
99
  data = _useState[0],
79
100
  setUser = _useState[1];
80
101
 
81
- var _useState2 = React.useState(),
102
+ var _useState2 = react.useState(),
82
103
  error = _useState2[0],
83
104
  setError = _useState2[1];
84
105
 
85
- React.useEffect(function () {
106
+ react.useEffect(function () {
86
107
  var aborter = getAborter();
87
- getCurrentUser(projectId, aborter).then(setUser).catch(setError);
108
+ getCurrentUser(projectId, aborter).then(setUser).catch(function (err) {
109
+ return err.name !== 'AbortError' && setError(err);
110
+ });
88
111
  return function () {
89
- return aborter.abort();
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 = React.useState(),
186
+ var _useState = react.useState(),
158
187
  error = _useState[0],
159
188
  setError = _useState[1];
160
189
 
161
- var _useState2 = React.useState(false),
190
+ var _useState2 = react.useState(false),
162
191
  loading = _useState2[0],
163
192
  setLoading = _useState2[1];
164
193
 
165
- var _useState3 = React.useState(),
194
+ var _useState3 = react.useState(),
166
195
  data = _useState3[0],
167
- setData = _useState3[1]; // Use "deep" dependency comparison because params are often not _referentially_ equal,
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
- useDeepCompareEffect.useDeepCompareEffectNoCheck(function () {
201
+ react.useEffect(function () {
172
202
  if (!enabled) {
173
- return function () {
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(getStore).then(function (store) {
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(setError).finally(function () {
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
- function createPortableTextComponent(_ref) {
216
- var projectId = _ref.projectId,
217
- dataset = _ref.dataset,
218
- serializers = _ref.serializers;
219
- return function PortableText(props) {
220
- return React__default.createElement(SanityPortableText, Object.assign({
221
- projectId: projectId,
222
- dataset: dataset,
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":"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"}
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=e(require("@sanity/image-url")),n=require("react"),o=e(n),i=require("use-deep-compare-effect"),a=e(require("@sanity/block-content-to-react")),u=e(require("groq"));function c(){return"undefined"==typeof AbortController?{signal:void 0,abort:s}:new AbortController}function s(){}function f(e,t){return fetch("https://"+e+".api.sanity.io/v1/users/me",{credentials:"include",signal:null==t?void 0:t.signal}).then((function(e){return e.json()})).then((function(e){return null!=e&&e.id?e:null})).catch((function(e){return"AbortError"===e.name?null:Promise.reject(e)}))}var l={};exports.groq=u,exports.createClient=function(e){return t(e)},exports.createCurrentUserHook=function(e){var t=e.projectId;return function(){return function(e){var t=n.useState(),r=t[0],o=t[1],i=n.useState(),a=i[0],u=i[1];return n.useEffect((function(){var t=c();return f(e,t).then(o).catch(u),function(){return t.abort()}}),[e]),{data:r,error:a,loading:null!==r||!a}}(t)}},exports.createImageUrlBuilder=function(e){return r({projectId:e.projectId,dataset:e.dataset})},exports.createPortableTextComponent=function(e){var t=e.projectId,r=e.dataset,n=e.serializers;return function(e){return o.createElement(a,Object.assign({projectId:t,dataset:r,serializers:n},e))}},exports.createPreviewSubscriptionHook=function(e){var t,r=e.projectId,o=e.dataset,a=e.useGroqBeta,u=e.documentLimit,s=void 0===u?3e3:u;return function(e,t){void 0===t&&(t={});var o=t.params;return function(e){var t=e.getStore,r=e.projectId,o=e.query,a=e.params,u=e.initialData,s=e.enabled,l=void 0!==s&&s,d=n.useState(),p=d[0],v=d[1],b=n.useState(!1),h=b[0],m=b[1],g=n.useState(),j=g[0],y=g[1];return i.useDeepCompareEffectNoCheck((function(){if(!l)return function(){};m(!0);var e,n=c();return f(r,n).then((function(e){if(!e)throw console.warn("Not authenticated - preview not available"),new Error("Not authenticated - preview not available")})).then(t).then((function(t){e=t.subscribe(o,a,(function(e,t){e?v(e):y(t)}))})).catch(v).finally((function(){return m(!1)})),function(){e&&e.unsubscribe(),n.abort()}}),[t,o,a,l]),{data:void 0===j?u:j,loading:h,error:p}}({getStore:d,projectId:r,query:e,params:void 0===o?l:o,initialData:t.initialData,enabled:!!t.enabled&&"undefined"!=typeof window})};function d(){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(e){return(0,e.groqStore)({projectId:r,dataset:o,documentLimit:s,useGroqBeta:a,listen:!0,overlayDrafts:!0,subscriptionThrottleMs:10})}))),t}};
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","../src/imageUrlBuilder.ts","../src/portableText.tsx"],"sourcesContent":["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 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","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":["getAborter","AbortController","signal","undefined","abort","noop","getCurrentUser","projectId","fetch","credentials","then","res","json","id","catch","err","name","Promise","reject","EMPTY_PARAMS","config","sanityClient","useState","data","setUser","error","setError","useEffect","aborter","loading","useCurrentUser","getImageUrlBuilder","dataset","serializers","props","React","SanityPortableText","store","useGroqBeta","documentLimit","query","options","params","getStore","initialData","enabled","setLoading","setData","useDeepCompareEffect","subscription","user","console","warn","Error","subscribe","result","finally","unsubscribe","useQuerySubscription","window","groqStore","listen","overlayDrafts","subscriptionThrottleMs"],"mappings":"2VAKgBA,UACoB,oBAApBC,gBACV,CAACC,YAAQC,EAAWC,MAAOC,GAC3B,IAAIJ,gBAGV,SAASI,cCHOC,EAAeC,EAAmBH,UACzCI,iBAAiBD,+BAAuC,CAC7DE,YAAa,UACbP,aAAQE,SAAAA,EAAOF,SAEdQ,MAAK,SAACC,UAAQA,EAAIC,UAClBF,MAAK,SAACC,gBAASA,GAAAA,EAAKE,GAAKF,EAAM,QAC/BG,OAAM,SAACC,SAA6B,eAAbA,EAAIC,KAAwB,KAAOC,QAAQC,OAAOH,MCR9E,IAAMI,EAAe,gDCJQC,UACpBC,EAAaD,kDFAiBb,IAAAA,iBAC9B,kBAaT,SAAwBA,SACEe,aAAjBC,OAAMC,SACaF,aAAnBG,OAAOC,cAEdC,aAAU,eACFC,EAAU5B,WAChBM,EAAeC,EAAWqB,GAASlB,KAAKc,GAASV,MAAMY,GAChD,kBAAME,EAAQxB,WACpB,CAACG,IAEG,CAACgB,KAAAA,EAAME,MAAAA,EAAOI,QAAkB,OAATN,IAAkBE,GAvBnCK,CAAevB,sDGDrBwB,EAAmB,CAACxB,YADUA,UACCyB,UADUA,+DCKhDzB,IAAAA,UACAyB,IAAAA,QACAC,IAAAA,mBAEO,SAAsBC,UAEzBC,gBAACC,iBACC7B,UAAWA,EACXyB,QAASA,EACTC,YAAaA,GACTC,4DHING,EANJ9B,IAAAA,UACAyB,IAAAA,QACAM,IAAAA,gBACAC,cAAAA,aAAgB,aAKT,SACLC,EACAC,YAAAA,IAAAA,EAAkC,UAEoBA,EAA/CC,cA6BX,SAAuCD,OAQ9BE,EAAoEF,EAApEE,SAAUpC,EAA0DkC,EAA1DlC,UAAWiC,EAA+CC,EAA/CD,MAAOE,EAAwCD,EAAxCC,OAAQE,EAAgCH,EAAhCG,cAAgCH,EAAnBI,QAAAA,kBAC9BvB,aAAnBG,OAAOC,SACgBJ,YAAS,GAAhCO,OAASiB,SACQxB,aAAjBC,OAAMwB,cAIbC,+BAAqB,eACdH,SACI,aAKTC,GAAW,OAGPG,EADErB,EAAU5B,WAEhBM,EAAeC,EAAWqB,GACvBlB,MAAK,SAACwC,OACDA,QAKJC,QAAQC,KAAK,6CACP,IAAIC,MAAM,gDAEjB3C,KAAKiC,GACLjC,MAAK,SAAC2B,GACLY,EAAeZ,EAAMiB,UAAUd,EAAOE,GAAQ,SAAC3B,EAAKwC,GAC9CxC,EACFW,EAASX,GAETgC,EAAQQ,SAIbzC,MAAMY,GACN8B,SAAQ,kBAAMV,GAAW,MAErB,WACDG,GACFA,EAAaQ,cAGf7B,EAAQxB,WAET,CAACuC,EAAUH,EAAOE,EAAQG,IAEtB,CACLtB,UAAsB,IAATA,EAAuBqB,EAAcrB,EAClDM,QAAAA,EACAJ,MAAAA,GAzFOiC,CAAwB,CAC7Bf,SAAAA,EACApC,UAAAA,EACAiC,MAAAA,EACAE,kBALcvB,IAMdyB,YANoDH,EAAxBG,YAO5BC,UAPoDJ,EAAXI,SAOJ,oBAAXc,mBAIrBhB,WACFN,IACHA,EAAQ,8QAAO,2BAAsB3B,MAAK,mBACxCkD,IAD0CA,WAChC,CACRrD,UAAAA,EACAyB,QAAAA,EACAO,cAAAA,EACAD,YAAAA,EACAuB,QAAQ,EACRC,eAAe,EACfC,uBAAwB,SAIvB1B"}
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"}
@@ -1,31 +1,55 @@
1
1
  import sanityClient from '@sanity/client';
2
- import getImageUrlBuilder from '@sanity/image-url';
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 createImageUrlBuilder(_ref) {
13
- var projectId = _ref.projectId,
14
- dataset = _ref.dataset;
15
- return getImageUrlBuilder({
16
- projectId: projectId,
17
- dataset: dataset
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 getAborter() {
22
- return typeof AbortController === 'undefined' ? {
23
- signal: undefined,
24
- abort: noop
25
- } : new AbortController();
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 noop() {// intentional noop
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 == null ? void 0 : abort.signal
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(setError);
83
+ getCurrentUser(projectId, aborter).then(setUser).catch(function (err) {
84
+ return err.name !== 'AbortError' && setError(err);
85
+ });
62
86
  return function () {
63
- return aborter.abort();
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]; // Use "deep" dependency comparison because params are often not _referentially_ equal,
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
- useDeepCompareEffectNoCheck(function () {
176
+ useEffect(function () {
146
177
  if (!enabled) {
147
- return function () {
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(getStore).then(function (store) {
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(setError).finally(function () {
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
- function createPortableTextComponent(_ref) {
190
- var projectId = _ref.projectId,
191
- dataset = _ref.dataset,
192
- serializers = _ref.serializers;
193
- return function PortableText(props) {
194
- return React.createElement(SanityPortableText, Object.assign({
195
- projectId: projectId,
196
- dataset: dataset,
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, createImageUrlBuilder, createPortableTextComponent, createPreviewSubscriptionHook };
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?: Record<string, unknown>;
5
+ params?: Params;
5
6
  initialData?: R;
6
7
  }
7
- export declare function createPreviewSubscriptionHook({ projectId, dataset, useGroqBeta, documentLimit, }: ProjectConfig & {
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.1-beta.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/block-content-to-react": "^3.0.0",
29
- "@sanity/client": "^2.23.1",
30
- "@sanity/groq-store": "^0.3.0-beta.0",
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?: AbortSignal
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
- ? {signal: undefined, abort: noop}
18
+ ? new MockAbortController()
9
19
  : new AbortController()
10
20
  }
11
-
12
- function noop() {
13
- // intentional noop
14
- }
@@ -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?: Aborter): Promise<CurrentUser | null> {
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?.signal,
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).then(setUser).catch(setError)
26
- return () => aborter.abort()
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'
@@ -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?: Record<string, unknown>
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; useGroqBeta?: boolean}) {
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
- groqStore({
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: Record<string, unknown>
68
+ params: Params
63
69
  initialData: R
64
70
  enabled: boolean
65
71
  }) {
66
- const {getStore, projectId, query, params, initialData, enabled = false} = options
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
- useDeepCompareEffect(() => {
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
+ }
@@ -1,2 +0,0 @@
1
- import { ProjectConfig } from './types';
2
- export declare function createImageUrlBuilder({ projectId, dataset }: ProjectConfig): import("@sanity/image-url/lib/types/builder").ImageUrlBuilder;
@@ -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;
@@ -1,6 +0,0 @@
1
- import getImageUrlBuilder from '@sanity/image-url'
2
- import {ProjectConfig} from './types'
3
-
4
- export function createImageUrlBuilder({projectId, dataset}: ProjectConfig) {
5
- return getImageUrlBuilder({projectId, dataset})
6
- }
@@ -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
- }