sanity-plugin-dashboard-widget-netlify 1.3.1 → 2.0.0-v3-studio.1

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +53 -65
  3. package/lib/esm/index.js +432 -0
  4. package/lib/esm/index.js.map +1 -0
  5. package/lib/index.js +456 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/types/index.d.ts +37 -0
  8. package/lib/types/index.d.ts.map +1 -0
  9. package/package.json +75 -45
  10. package/sanity.json +2 -6
  11. package/dist/3rdparty-typings/sanity.d.js +0 -2
  12. package/dist/3rdparty-typings/sanity.d.js.map +0 -1
  13. package/dist/components/NetlifyWidget.js +0 -72
  14. package/dist/components/NetlifyWidget.js.map +0 -1
  15. package/dist/components/SiteItem/Links.js +0 -50
  16. package/dist/components/SiteItem/Links.js.map +0 -1
  17. package/dist/components/SiteItem/index.js +0 -130
  18. package/dist/components/SiteItem/index.js.map +0 -1
  19. package/dist/components/SiteList.js +0 -57
  20. package/dist/components/SiteList.js.map +0 -1
  21. package/dist/datastores/deploy.js +0 -26
  22. package/dist/datastores/deploy.js.map +0 -1
  23. package/dist/http/jsonRequest.js +0 -51
  24. package/dist/http/jsonRequest.js.map +0 -1
  25. package/dist/http/statusCodeRequest.js +0 -51
  26. package/dist/http/statusCodeRequest.js.map +0 -1
  27. package/dist/http/utils/createAbortController.js +0 -21
  28. package/dist/http/utils/createAbortController.js.map +0 -1
  29. package/dist/index.js +0 -20
  30. package/dist/index.js.map +0 -1
  31. package/dist/props.js +0 -87
  32. package/dist/props.js.map +0 -1
  33. package/dist/reducers.js +0 -57
  34. package/dist/reducers.js.map +0 -1
  35. package/dist/types.js +0 -2
  36. package/dist/types.js.map +0 -1
  37. package/dist/widget.js +0 -25
  38. package/dist/widget.js.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ <!-- markdownlint-disable --><!-- textlint-disable -->
2
+
3
+ # 📓 Changelog
4
+
5
+ All notable changes to this project will be documented in this file. See
6
+ [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
7
+
8
+ ## [2.0.0-v3-studio.1](https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify/compare/v1.3.0...v2.0.0-v3-studio.1) (2022-09-02)
9
+
10
+ ### ⚠ BREAKING CHANGES
11
+
12
+ - initial V3 version
13
+
14
+ ### Features
15
+
16
+ - initial V3 version ([9b6dd57](https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify/commit/9b6dd57bafecc4e0fae2cfeb6ec2f042b21226d8))
17
+
18
+ ### Bug Fixes
19
+
20
+ - **ci:** semver automation ([a474e7f](https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify/commit/a474e7f9ba0e7ea005fa53dd8b2c8e674dc03a39))
21
+ - compile errors ([32b4546](https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify/commit/32b45460d1f71c74dc4a40ed6af1d8a839b5423f))
package/README.md CHANGED
@@ -1,58 +1,65 @@
1
- # Sanity Dashboard Widget: Netlify
1
+ > **NOTE**
2
+ >
3
+ > This is the **Sanity Studio v3 version** of sanity-plugin-dashboard-widget-netlify.
4
+ >
5
+ > For the v2 version, please refer to the [v2 version](https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify/tree/main).
2
6
 
3
- Sanity Studio Dashboard Widget for triggering Netlify builds.
4
7
 
5
- ## Installing
8
+ # Sanity Dashboard Widget: Netlify
6
9
 
7
- ### Install the dashboard plugin
8
- To get dashboard support in Sanity Studio in general:
10
+ Sanity Studio Dashboard Widget for triggering Netlify builds.
9
11
 
10
- `sanity install @sanity/dashboard`
12
+ ## Install
11
13
 
12
- ### Install the Netlify widget plugin
14
+ ```
15
+ npm install --save sanity-plugin-dashboard-widget-netlify@studio-v3
16
+ ```
13
17
 
14
- `sanity install dashboard-widget-netlify`
18
+ or
15
19
 
16
- ## Configuring
20
+ ```
21
+ yarn add sanity-plugin-dashboard-widget-netlify@studio-v3
22
+ ```
17
23
 
18
- 1. Implement your own dashboardConfig. In your `sanity.json` file, append the following line to the `parts` array:
24
+ Ensure that you have followed install and usage instructions for [@sanity/dashboard](https://github.com/sanity-io/dashboard).
19
25
 
20
- ```json
21
- {
22
- "implements": "part:@sanity/dashboard/config",
23
- "path": "src/dashboardConfig.js"
24
- }
25
- ```
26
+ ## Usage
26
27
 
27
- 2. Create the file `src/dashboardConfig.js` and inlcude the `netlify` widget config like this:
28
+ Add it as a widget to @sanity/dashboard plugin in sanity.config.ts (or .js):
28
29
 
29
- ```js
30
- export default {
31
- widgets: [
30
+ ```js
31
+ export default createConfig({
32
+ // ...
33
+ plugins: [
34
+ dashboardTool({
35
+ widgets: [
32
36
  {
33
- name: 'netlify',
34
- options: {
35
- title: 'My Netlify deploys',
36
- sites: [
37
- {
38
- title: 'Sanity Studio',
39
- apiId: 'xxxxx-yyyy-zzzz-xxxx-yyyyyyyy',
40
- buildHookId: 'xxxyyyxxxyyyyxxxyyy',
41
- name: 'sanity-gatsby-blog-20-studio',
42
- },
43
- {
44
- title: 'Website',
45
- apiId: 'yyyyy-xxxxx-zzzz-xxxx-yyyyyyyy',
46
- buildHookId: 'yyyyxxxxxyyyxxdxxx',
47
- name: 'sanity-gatsby-blog-20-web',
48
- url: 'https://my-sanity-deployment.com',
49
- }
50
- ]
37
+ name: 'netlify',
38
+ options: {
39
+ title: 'My Netlify deploys',
40
+ sites: [
41
+ {
42
+ title: 'Sanity Studio',
43
+ apiId: 'xxxxx-yyyy-zzzz-xxxx-yyyyyyyy',
44
+ buildHookId: 'xxxyyyxxxyyyyxxxyyy',
45
+ name: 'sanity-gatsby-blog-20-studio',
46
+ },
47
+ {
48
+ title: 'Website',
49
+ apiId: 'yyyyy-xxxxx-zzzz-xxxx-yyyyyyyy',
50
+ buildHookId: 'yyyyxxxxxyyyxxdxxx',
51
+ name: 'sanity-gatsby-blog-20-web',
52
+ url: 'https://my-sanity-deployment.com',
53
+ }
54
+ ]
55
+ }
51
56
  }
52
- }
53
- ]
54
- }
55
- ```
57
+ ]
58
+ })
59
+ ]
60
+ })
61
+ ```
62
+
56
63
  ### Widget options
57
64
  `title` - Override the widget default title
58
65
 
@@ -64,31 +71,12 @@ To get dashboard support in Sanity Studio in general:
64
71
  - `url` - Optionally override site deployment url. By default it is inferred to be `https://netlify-site-name.netlify.app`.
65
72
  - `branch` - Optionally pass the name of a branch to deploy
66
73
 
67
- ## Developing on this module
68
-
69
- To simulate using your development version as a real module inside a studio, you can do the following:
70
-
71
- * Run `npm install && npm link` from the root of this repository.
72
- * Run `npm run watch` to start developing and build the module when changes are made.
73
-
74
- #### Displaying your development version inside a studio
75
-
76
- **With the mono-repo's `test-studio`:**
77
-
78
- * Bootstrap the monorepo: `npm run bootstrap`
79
- * Add `sanity-plugin-dashboard-widget-netlify` with the current version number to `package.json` in the `test-studio` root folder (but don't run `npm install` afterwards)
80
- * Run `npm link sanity-plugin-dashboard-widget-netlify` inside the mono-repo's root.
81
- * Restart the `test-studio`
82
-
83
- **With a regular Sanity Studio:**
84
- * Run `npm install`
85
- * Add `sanity-plugin-dashboard-widget-netlify` with the current version number to `package.json`.
86
- * Run `npm link sanity-plugin-dashboard-widget-netlify`
87
- * Start the studio
74
+ ## Developing plugin kit
88
75
 
89
- When you are done and have published your new version, you can run `npm unlink` inside this repo, and `npm unlink sanity-plugin-dashboard-widget-netlify` inside the mono-repo or studio to get back to the normal state. Then run `npm run bootstrap` for the mono-repo or `npm install` inside the regular studio to use the published version.
76
+ ### Test
90
77
 
91
- ## Developing plugin kit
78
+ This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
79
+ with default configuration for build & watch scripts.
92
80
 
93
81
  ### Release new version
94
82
 
@@ -0,0 +1,432 @@
1
+ import {jsx as $gGrEF$jsx, jsxs as $gGrEF$jsxs} from "react/jsx-runtime";
2
+ import {useState as $gGrEF$useState, useCallback as $gGrEF$useCallback, useEffect as $gGrEF$useEffect, useRef as $gGrEF$useRef} from "react";
3
+ import {streamingComponent as $gGrEF$streamingComponent, createEventHandler as $gGrEF$createEventHandler} from "react-props-stream";
4
+ import {switchMap as $gGrEF$switchMap, map as $gGrEF$map, catchError as $gGrEF$catchError, startWith as $gGrEF$startWith, scan as $gGrEF$scan} from "rxjs/operators";
5
+ import {of as $gGrEF$of, merge as $gGrEF$merge, Observable as $gGrEF$Observable} from "rxjs";
6
+ import $gGrEF$abortcontroller from "abort-controller";
7
+ import {DashboardWidgetContainer as $gGrEF$DashboardWidgetContainer} from "@sanity/dashboard";
8
+ import $gGrEF$styledcomponents from "styled-components";
9
+ import {Card as $gGrEF$Card, Flex as $gGrEF$Flex, Button as $gGrEF$Button, Box as $gGrEF$Box, Text as $gGrEF$Text, Spinner as $gGrEF$Spinner, Stack as $gGrEF$Stack, Label as $gGrEF$Label} from "@sanity/ui";
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+ const $6a52b9b8daafcc0d$export$e7284b1f9bc95d1c = ()=>{
25
+ if (!("AbortController" in window)) return new (0, $gGrEF$abortcontroller)();
26
+ return new AbortController();
27
+ };
28
+
29
+
30
+ const $66fba9dd0b7eddcc$export$fbb260ef4c4aaffa = (input, init)=>{
31
+ return new (0, $gGrEF$Observable)((subscriber)=>{
32
+ const controller = (0, $6a52b9b8daafcc0d$export$e7284b1f9bc95d1c)();
33
+ const onResponse = (res)=>{
34
+ subscriber.next(res);
35
+ subscriber.complete();
36
+ };
37
+ const onError = (err)=>{
38
+ if (err.name === "AbortError") subscriber.complete();
39
+ else subscriber.error(err);
40
+ };
41
+ fetch(input, {
42
+ ...init,
43
+ signal: controller.signal
44
+ }).then((res)=>{
45
+ if (res.status < 200 || res.status > 299) throw new Error(`HTTP Error ${res.status}: ${res.statusText}`);
46
+ return res.status;
47
+ }).then(onResponse, onError);
48
+ return ()=>{
49
+ controller.abort();
50
+ };
51
+ });
52
+ };
53
+
54
+
55
+ function $70568a64fed8d622$export$5800f480eca98093(site) {
56
+ if (!site.buildHookId) return (0, $gGrEF$of)(new Error("Site missing buildHookId"));
57
+ return (0, $66fba9dd0b7eddcc$export$fbb260ef4c4aaffa)(`https://api.netlify.com/build_hooks/${site.buildHookId}`, {
58
+ method: "POST"
59
+ }).pipe((0, $gGrEF$map)((result)=>({
60
+ result: result,
61
+ site: site
62
+ })));
63
+ }
64
+
65
+
66
+
67
+ const $711f33e30b92e542$export$7092726c6c65f203 = (0, $gGrEF$scan)((state, action)=>{
68
+ switch(action.type){
69
+ case "setSites":
70
+ return {
71
+ ...state,
72
+ sites: action.sites || []
73
+ };
74
+ case "deploy/started":
75
+ return {
76
+ ...state,
77
+ sites: state.sites.map((site)=>{
78
+ if (action.site && site.id === action.site.id) return {
79
+ ...site
80
+ };
81
+ return site;
82
+ })
83
+ };
84
+ case "deploy/failed":
85
+ return {
86
+ ...state,
87
+ error: action.error
88
+ };
89
+ case "deploy/completed":
90
+ return {
91
+ ...state,
92
+ sites: state.sites.map((site)=>{
93
+ if (action.site && site.id === action.site.id) return {
94
+ ...site,
95
+ error: action.error
96
+ };
97
+ return site;
98
+ })
99
+ };
100
+ default:
101
+ return state;
102
+ }
103
+ });
104
+
105
+
106
+ const $6c90131b55f2a092$var$noop = ()=>undefined;
107
+ const $6c90131b55f2a092$var$INITIAL_PROPS = {
108
+ title: "Netlify sites",
109
+ sites: [],
110
+ isLoading: true,
111
+ onDeploy: $6c90131b55f2a092$var$noop
112
+ };
113
+ const $6c90131b55f2a092$export$508da169a81283d7 = (options)=>{
114
+ const configuredSites = (options.sites || []).map((site)=>({
115
+ id: site.apiId,
116
+ name: site.name,
117
+ title: site.title,
118
+ buildHookId: site.buildHookId,
119
+ url: site.url || site.branch && `https://${site.branch}--${site.name}.netlify.app/` || site.name && `https://${site.name}.netlify.app/`,
120
+ adminUrl: site.name && `https://app.netlify.com/sites/${site.name}`,
121
+ branch: site.branch
122
+ }));
123
+ const [onDeploy$, onDeploy] = (0, $gGrEF$createEventHandler)();
124
+ const setSitesAction$ = (0, $gGrEF$of)(configuredSites).pipe((0, $gGrEF$map)((sites)=>({
125
+ type: "setSites",
126
+ sites: sites
127
+ })));
128
+ const deployAction$ = onDeploy$.pipe((0, $gGrEF$map)((site)=>({
129
+ type: "deploy/started",
130
+ site: site
131
+ })));
132
+ const deployResult$ = onDeploy$.pipe((0, $gGrEF$switchMap)((site)=>(0, $70568a64fed8d622$export$5800f480eca98093)(site)));
133
+ const deployCompletedAction$ = deployResult$.pipe((0, $gGrEF$map)((result)=>({
134
+ type: "deploy/completed",
135
+ ...result
136
+ }), (0, $gGrEF$catchError)((error)=>(0, $gGrEF$of)({
137
+ type: "deploy/failed",
138
+ error: error
139
+ }))));
140
+ (0, $gGrEF$merge)(setSitesAction$, deployAction$, deployCompletedAction$).pipe((0, $711f33e30b92e542$export$7092726c6c65f203)).subscribe();
141
+ return (0, $gGrEF$of)(configuredSites).pipe((0, $gGrEF$map)((sites)=>({
142
+ sites: sites,
143
+ title: options.title || $6c90131b55f2a092$var$INITIAL_PROPS.title,
144
+ description: options.description,
145
+ isLoading: false,
146
+ onDeploy: onDeploy
147
+ })), (0, $gGrEF$startWith)($6c90131b55f2a092$var$INITIAL_PROPS));
148
+ };
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+ const $1ab91c7747387932$var$Link = (props)=>{
161
+ const { url: url , children: children } = props;
162
+ return /*#__PURE__*/ (0, $gGrEF$jsx)("span", {
163
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)("a", {
164
+ href: url,
165
+ target: "_blank",
166
+ children: children
167
+ })
168
+ });
169
+ };
170
+ const $1ab91c7747387932$var$Links = (props)=>{
171
+ const { url: url , adminUrl: adminUrl } = props;
172
+ if (url && adminUrl) return /*#__PURE__*/ (0, $gGrEF$jsxs)("span", {
173
+ children: [
174
+ "(",
175
+ /*#__PURE__*/ (0, $gGrEF$jsx)($1ab91c7747387932$var$Link, {
176
+ url: url,
177
+ children: "view"
178
+ }),
179
+ ", ",
180
+ /*#__PURE__*/ (0, $gGrEF$jsx)($1ab91c7747387932$var$Link, {
181
+ url: adminUrl,
182
+ children: "admin"
183
+ }),
184
+ ")"
185
+ ]
186
+ });
187
+ if (url) return /*#__PURE__*/ (0, $gGrEF$jsx)($1ab91c7747387932$var$Link, {
188
+ url: url,
189
+ children: "(view)"
190
+ });
191
+ if (adminUrl) return /*#__PURE__*/ (0, $gGrEF$jsx)($1ab91c7747387932$var$Link, {
192
+ url: adminUrl,
193
+ children: "(admin)"
194
+ });
195
+ return null;
196
+ };
197
+ var $1ab91c7747387932$export$2e2bcd8739ae039 = $1ab91c7747387932$var$Links;
198
+
199
+
200
+ const $5f385ff862088843$export$367d0f7a898ff105 = 10000;
201
+ const $5f385ff862088843$var$getImageUrl = (siteId, branchName)=>{
202
+ const baseUrl = `https://api.netlify.com/api/v1/badges/${siteId}/deploy-status`;
203
+ const time = new Date().getTime();
204
+ const branch = `branch=${branchName}`;
205
+ return branchName ? `${baseUrl}?${time}&${branch}` : `${baseUrl}?${time}`;
206
+ };
207
+ const $5f385ff862088843$var$useBadgeImage = (siteId, branchName)=>{
208
+ const [src, setSrc] = (0, $gGrEF$useState)(()=>$5f385ff862088843$var$getImageUrl(siteId, branchName));
209
+ const update = (0, $gGrEF$useCallback)(()=>setSrc($5f385ff862088843$var$getImageUrl(siteId, branchName)), [
210
+ siteId
211
+ ]);
212
+ (0, $gGrEF$useEffect)(()=>{
213
+ const interval = window.setInterval(update, $5f385ff862088843$export$367d0f7a898ff105);
214
+ return ()=>window.clearInterval(interval);
215
+ }, [
216
+ update
217
+ ]);
218
+ return [
219
+ src,
220
+ update
221
+ ];
222
+ };
223
+ const $5f385ff862088843$var$useDeploy = (site, onDeploy, updateBadge)=>{
224
+ const timeoutRef = (0, $gGrEF$useRef)(-1);
225
+ (0, $gGrEF$useEffect)(()=>()=>window.clearTimeout(timeoutRef.current), []);
226
+ return (0, $gGrEF$useCallback)(()=>{
227
+ onDeploy(site);
228
+ timeoutRef.current = window.setTimeout(updateBadge, 1000);
229
+ }, [
230
+ site,
231
+ onDeploy,
232
+ updateBadge
233
+ ]);
234
+ };
235
+ const $5f385ff862088843$var$SiteItem = (props)=>{
236
+ const [hasBadgeError, setHasBadgeError] = (0, $gGrEF$useState)(false);
237
+ const { site: site , onDeploy: onDeploy } = props;
238
+ const { id: id , name: name , title: title , url: url , adminUrl: adminUrl , buildHookId: buildHookId , branch: branch } = site;
239
+ const [badge, updateBadge] = $5f385ff862088843$var$useBadgeImage(id, branch);
240
+ const handleDeploy = $5f385ff862088843$var$useDeploy(site, onDeploy, updateBadge);
241
+ const handleBadgeError = ()=>{
242
+ setHasBadgeError(true);
243
+ };
244
+ return /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
245
+ as: "li",
246
+ children: [
247
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
248
+ flex: 1,
249
+ paddingY: 2,
250
+ paddingX: 3,
251
+ children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
252
+ space: 2,
253
+ children: [
254
+ /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Text), {
255
+ as: "h4",
256
+ children: [
257
+ title || name,
258
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $1ab91c7747387932$export$2e2bcd8739ae039), {
259
+ url: url,
260
+ adminUrl: adminUrl
261
+ })
262
+ ]
263
+ }),
264
+ /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
265
+ justify: "flex-start",
266
+ children: [
267
+ !hasBadgeError && /*#__PURE__*/ (0, $gGrEF$jsx)("img", {
268
+ src: badge,
269
+ onError: handleBadgeError,
270
+ alt: "Badge"
271
+ }),
272
+ hasBadgeError && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
273
+ tone: "critical",
274
+ radius: 2,
275
+ padding: 2,
276
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Label), {
277
+ size: 0,
278
+ muted: true,
279
+ children: "Failed to load badge"
280
+ })
281
+ })
282
+ ]
283
+ })
284
+ ]
285
+ })
286
+ }),
287
+ buildHookId ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
288
+ paddingY: 2,
289
+ paddingX: 3,
290
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
291
+ mode: "ghost",
292
+ onClick: handleDeploy,
293
+ text: "Deploy"
294
+ })
295
+ }) : null
296
+ ]
297
+ });
298
+ };
299
+ var $5f385ff862088843$export$2e2bcd8739ae039 = $5f385ff862088843$var$SiteItem;
300
+
301
+
302
+
303
+ function $c51ad6f84c643d08$export$2e2bcd8739ae039(props) {
304
+ const { isLoading: isLoading , onDeploy: onDeploy , sites: sites } = props;
305
+ if (isLoading) return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
306
+ padding: 4,
307
+ children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
308
+ direction: "column",
309
+ justify: "center",
310
+ align: "center",
311
+ children: [
312
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Spinner), {
313
+ muted: true
314
+ }),
315
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
316
+ marginTop: 3,
317
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
318
+ muted: true,
319
+ children: "Loading sites…"
320
+ })
321
+ })
322
+ ]
323
+ })
324
+ });
325
+ if (!sites || sites && sites.length === 0) return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
326
+ tone: "critical",
327
+ padding: 3,
328
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
329
+ children: "No sites are defined in the widget options. Please check your config."
330
+ })
331
+ });
332
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
333
+ paddingY: 2,
334
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Stack), {
335
+ as: "ul",
336
+ space: 2,
337
+ children: sites.map((site, index)=>{
338
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $5f385ff862088843$export$2e2bcd8739ae039), {
339
+ onDeploy: onDeploy,
340
+ site: site
341
+ }, `site-${index}`);
342
+ })
343
+ })
344
+ });
345
+ }
346
+
347
+
348
+
349
+
350
+
351
+ const $b73b92d6ab5ad468$var$ContentCard = (0, $gGrEF$styledcomponents)((0, $gGrEF$Card))`
352
+ min-height: 66px;
353
+ `;
354
+ function $b73b92d6ab5ad468$export$2e2bcd8739ae039(props) {
355
+ const netlifySitesUrl = "https://app.netlify.com/account/sites";
356
+ const { title: title , description: description , isLoading: isLoading , sites: sites , onDeploy: onDeploy } = props;
357
+ const footer = /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Flex), {
358
+ direction: "column",
359
+ align: "stretch",
360
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
361
+ as: "a",
362
+ href: isLoading ? undefined : netlifySitesUrl,
363
+ disabled: isLoading,
364
+ paddingX: 2,
365
+ paddingY: 4,
366
+ mode: "bleed",
367
+ tone: "primary",
368
+ text: "Manage sites at Netlify",
369
+ loading: isLoading,
370
+ target: "_blank"
371
+ })
372
+ });
373
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$DashboardWidgetContainer), {
374
+ header: title,
375
+ footer: footer,
376
+ children: /*#__PURE__*/ (0, $gGrEF$jsxs)($b73b92d6ab5ad468$var$ContentCard, {
377
+ paddingY: 1,
378
+ children: [
379
+ description && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
380
+ paddingY: 3,
381
+ paddingX: 3,
382
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
383
+ as: "p",
384
+ size: 1,
385
+ muted: true,
386
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)("span", {
387
+ dangerouslySetInnerHTML: {
388
+ __html: description
389
+ }
390
+ })
391
+ })
392
+ }),
393
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $c51ad6f84c643d08$export$2e2bcd8739ae039), {
394
+ isLoading: isLoading,
395
+ onDeploy: onDeploy,
396
+ sites: sites
397
+ })
398
+ ]
399
+ })
400
+ });
401
+ }
402
+
403
+
404
+ var $70ad053647681448$export$2e2bcd8739ae039 = (0, $gGrEF$streamingComponent)((options$)=>options$.pipe((0, $gGrEF$switchMap)((options)=>(0, $6c90131b55f2a092$export$508da169a81283d7)(options).pipe((0, $gGrEF$map)((props)=>{
405
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $b73b92d6ab5ad468$export$2e2bcd8739ae039), {
406
+ ...props
407
+ });
408
+ })))));
409
+
410
+
411
+ function $91a08798d183e77b$export$1bbd75f1b90d7c3c(config) {
412
+ return {
413
+ name: "netlify-widget",
414
+ component: ()=>{
415
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $70ad053647681448$export$2e2bcd8739ae039), {
416
+ ...config
417
+ });
418
+ },
419
+ layout: config.layout ?? {
420
+ width: "medium"
421
+ }
422
+ };
423
+ }
424
+
425
+
426
+ var $f17097ca2e05ac05$exports = {};
427
+
428
+
429
+
430
+
431
+ export {$91a08798d183e77b$export$1bbd75f1b90d7c3c as netlifyWidget};
432
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/widget.tsx","src/props.ts","src/datastores/deploy.ts","src/http/statusCodeRequest.ts","src/http/utils/createAbortController.ts","src/reducers.ts","src/components/NetlifyWidget.tsx","src/components/SiteList.tsx","src/components/SiteItem/index.tsx","src/components/SiteItem/Links.tsx","src/types.ts"],"sourcesContent":["/**\n * Plugin widget for @sanity/dashboard\n */\nexport {netlifyWidget} from './plugin'\nexport type {NetlifyWidgetConfig} from './plugin'\n\nexport * from './types'\n","import React from 'react'\nimport Widget from './widget'\nimport {WidgetOptions} from './types'\nimport {DashboardWidget, LayoutConfig} from '@sanity/dashboard'\n\nexport type NetlifyWidgetConfig = WidgetOptions & {layout?: LayoutConfig}\n\nexport function netlifyWidget(config: NetlifyWidgetConfig): DashboardWidget {\n return {\n name: 'netlify-widget',\n component: () => {\n return <Widget {...config} />\n },\n layout: config.layout ?? {width: 'medium'},\n }\n}\n","import React from 'react'\nimport {streamingComponent} from 'react-props-stream'\nimport {map, switchMap} from 'rxjs/operators'\nimport {WidgetOptions} from './types'\nimport {props$} from './props'\nimport NetlifyWidget from './components/NetlifyWidget'\n\nexport default streamingComponent<WidgetOptions>((options$) =>\n options$.pipe(\n switchMap((options) =>\n props$(options).pipe(\n map((props) => {\n return <NetlifyWidget {...props} />\n })\n )\n )\n )\n)\n","import {merge, of} from 'rxjs'\nimport {createEventHandler} from 'react-props-stream'\nimport {catchError, map, startWith, switchMap} from 'rxjs/operators'\nimport {deploy} from './datastores/deploy'\nimport {Site, WidgetOptions} from './types'\nimport {stateReducer$} from './reducers'\n\nconst noop = () => undefined\n\nconst INITIAL_PROPS = {\n title: 'Netlify sites',\n sites: [],\n isLoading: true,\n onDeploy: noop,\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport const props$ = (options: WidgetOptions) => {\n const configuredSites = (options.sites || []).map((site) => ({\n id: site.apiId,\n name: site.name,\n title: site.title,\n buildHookId: site.buildHookId,\n url:\n site.url ||\n (site.branch && `https://${site.branch}--${site.name}.netlify.app/`) ||\n (site.name && `https://${site.name}.netlify.app/`),\n adminUrl: site.name && `https://app.netlify.com/sites/${site.name}`,\n branch: site.branch,\n }))\n\n const [onDeploy$, onDeploy] = createEventHandler<Site>()\n const setSitesAction$ = of(configuredSites).pipe(map((sites) => ({type: 'setSites', sites})))\n const deployAction$ = onDeploy$.pipe(map((site) => ({type: 'deploy/started', site})))\n const deployResult$ = onDeploy$.pipe(switchMap((site) => deploy(site)))\n const deployCompletedAction$ = deployResult$.pipe(\n map(\n (result) => ({type: 'deploy/completed', ...result}),\n catchError((error) => of({type: 'deploy/failed', error}))\n )\n )\n\n merge(setSitesAction$, deployAction$, deployCompletedAction$).pipe(stateReducer$).subscribe()\n\n return of(configuredSites).pipe(\n map((sites) => ({\n sites,\n title: options.title || INITIAL_PROPS.title,\n description: options.description,\n isLoading: false,\n onDeploy,\n })),\n startWith(INITIAL_PROPS)\n )\n}\n","import {Observable, of} from 'rxjs'\nimport {map} from 'rxjs/operators'\nimport {statusCodeRequest} from '../http/statusCodeRequest'\nimport {Site} from '../types'\n\nexport function deploy(site: Site): Observable<{result: number; site: Site} | Error> {\n if (!site.buildHookId) {\n return of(new Error('Site missing buildHookId'))\n }\n\n return statusCodeRequest(`https://api.netlify.com/build_hooks/${site.buildHookId}`, {\n method: 'POST',\n }).pipe(map((result) => ({result, site})))\n}\n","import {Observable} from 'rxjs'\nimport {createAbortController} from './utils/createAbortController'\n\n// eslint-disable-next-line no-undef\nexport const statusCodeRequest = (input: RequestInfo, init?: RequestInit): Observable<number> => {\n return new Observable((subscriber) => {\n const controller = createAbortController()\n const onResponse = (res: number) => {\n subscriber.next(res)\n subscriber.complete()\n }\n const onError = (err: Error) => {\n if (err.name === 'AbortError') {\n subscriber.complete()\n } else {\n subscriber.error(err)\n }\n }\n\n fetch(input, {...init, signal: controller.signal})\n .then((res: Response) => {\n if (res.status < 200 || res.status > 299) {\n throw new Error(`HTTP Error ${res.status}: ${res.statusText}`)\n }\n return res.status\n })\n .then(onResponse, onError)\n\n return () => {\n controller.abort()\n }\n })\n}\n","import AbortControllerPolyfill from 'abort-controller'\n\nexport const createAbortController = (): AbortController => {\n if (!('AbortController' in window)) {\n return new AbortControllerPolyfill() as AbortController\n }\n return new AbortController()\n}\n","import {scan} from 'rxjs/operators'\nimport {Site} from './types'\n\ninterface Deployment {\n id: string\n}\n\ninterface Action {\n type: string\n sites?: Site[]\n site?: Site\n error?: Error\n deployments?: Deployment[]\n}\n\ninterface State {\n sites: Site[]\n action: Action\n}\n\nexport const stateReducer$ = scan((state: State, action: Action) => {\n switch (action.type) {\n case 'setSites':\n return {...state, sites: action.sites || []}\n case 'deploy/started':\n return {\n ...state,\n sites: state.sites.map((site: Site) => {\n if (action.site && site.id === action.site.id) {\n return {...site}\n }\n return site\n }),\n }\n case 'deploy/failed':\n return {\n ...state,\n error: action.error,\n }\n case 'deploy/completed':\n return {\n ...state,\n sites: state.sites.map((site: Site) => {\n if (action.site && site.id === action.site.id) {\n return {...site, error: action.error}\n }\n return site\n }),\n }\n default:\n return state\n }\n})\n","import React from 'react'\nimport {NetlifyWidgetProps} from '../types'\nimport SiteList from './SiteList'\nimport {DashboardWidgetContainer} from '@sanity/dashboard'\nimport styled from 'styled-components'\nimport {Button, Flex, Card, Text, Box} from '@sanity/ui'\n\nconst ContentCard = styled(Card)`\n min-height: 66px;\n`\n\nexport default function NetlifyWidget(props: NetlifyWidgetProps) {\n const netlifySitesUrl = 'https://app.netlify.com/account/sites'\n const {title, description, isLoading, sites, onDeploy} = props\n\n const footer = (\n <Flex direction=\"column\" align=\"stretch\">\n <Button\n as=\"a\"\n href={isLoading ? undefined : netlifySitesUrl}\n disabled={isLoading}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage sites at Netlify\"\n loading={isLoading}\n target=\"_blank\"\n />\n </Flex>\n )\n\n return (\n <DashboardWidgetContainer header={title} footer={footer}>\n <ContentCard paddingY={1}>\n {description && (\n <Box paddingY={3} paddingX={3}>\n <Text as=\"p\" size={1} muted>\n <span dangerouslySetInnerHTML={{__html: description}} />\n </Text>\n </Box>\n )}\n <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n </ContentCard>\n </DashboardWidgetContainer>\n )\n}\n","import React from 'react'\nimport {DeployAction, Site} from '../types'\nimport SiteItem from './SiteItem'\nimport {Flex, Box, Card, Text, Spinner, Stack} from '@sanity/ui'\n\ninterface Props {\n isLoading: boolean\n sites?: Site[]\n onDeploy: DeployAction\n}\n\nexport default function SiteList(props: Props) {\n const {isLoading, onDeploy, sites} = props\n if (isLoading) {\n return (\n <Card padding={4}>\n <Flex direction=\"column\" justify=\"center\" align=\"center\">\n <Spinner muted />\n <Box marginTop={3}>\n <Text muted>Loading sites…</Text>\n </Box>\n </Flex>\n </Card>\n )\n }\n if (!sites || (sites && sites.length === 0)) {\n return (\n <Card tone=\"critical\" padding={3}>\n <Text>No sites are defined in the widget options. Please check your config.</Text>\n </Card>\n )\n }\n return (\n <Box paddingY={2}>\n <Stack as=\"ul\" space={2}>\n {sites.map((site, index) => {\n return <SiteItem onDeploy={onDeploy} site={site} key={`site-${index}`} />\n })}\n </Stack>\n </Box>\n )\n}\n","import React, {FunctionComponent, useCallback, useEffect, useRef, useState} from 'react'\nimport {Button, Flex, Box, Card, Text, Stack, Label} from '@sanity/ui'\nimport {DeployAction, Site} from '../../types'\nimport Links from './Links'\n\ninterface Props {\n site: Site\n onDeploy: DeployAction\n}\n\nexport const IMAGE_PULL_INTERVAL = 10000\n\nconst getImageUrl = (siteId: string, branchName?: string) => {\n const baseUrl = `https://api.netlify.com/api/v1/badges/${siteId}/deploy-status`\n const time = new Date().getTime()\n const branch = `branch=${branchName}`\n\n return branchName ? `${baseUrl}?${time}&${branch}` : `${baseUrl}?${time}`\n}\n\nconst useBadgeImage = (siteId: string, branchName?: string ) => {\n const [src, setSrc] = useState(() => getImageUrl(siteId, branchName))\n const update = useCallback(() => setSrc(getImageUrl(siteId, branchName)), [siteId])\n\n useEffect(() => {\n const interval = window.setInterval(update, IMAGE_PULL_INTERVAL)\n return () => window.clearInterval(interval)\n }, [update])\n\n return [src, update] as const\n}\n\nconst useDeploy = (site: Site, onDeploy: DeployAction, updateBadge: () => void) => {\n const timeoutRef = useRef(-1)\n useEffect(() => () => window.clearTimeout(timeoutRef.current), [])\n\n return useCallback(() => {\n onDeploy(site)\n timeoutRef.current = window.setTimeout(updateBadge, 1000)\n }, [site, onDeploy, updateBadge])\n}\n\nconst SiteItem: FunctionComponent<Props> = (props) => {\n const [hasBadgeError, setHasBadgeError] = useState(false)\n const {site, onDeploy} = props\n const {id, name, title, url, adminUrl, buildHookId, branch} = site\n\n const [badge, updateBadge] = useBadgeImage(id, branch)\n const handleDeploy = useDeploy(site, onDeploy, updateBadge)\n const handleBadgeError = () => {\n setHasBadgeError(true)\n }\n\n return (\n <Flex as=\"li\">\n <Box flex={1} paddingY={2} paddingX={3}>\n <Stack space={2}>\n <Text as=\"h4\">\n {title || name}\n <Links url={url} adminUrl={adminUrl} />\n </Text>\n\n <Flex justify=\"flex-start\">\n {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n {hasBadgeError && <Card tone=\"critical\" radius={2} padding={2}><Label size={0} muted>Failed to load badge</Label></Card>}\n </Flex>\n </Stack>\n </Box>\n\n {buildHookId ? (\n <Box paddingY={2} paddingX={3}>\n <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n </Box>\n ) : null}\n </Flex>\n )\n}\n\nexport default SiteItem\n","import React, {FunctionComponent} from 'react'\n\nconst Link: FunctionComponent<{url: string}> = (props) => {\n const {url, children} = props\n\n return (\n <span>\n <a href={url} target=\"_blank\">{children}</a>\n </span>\n )\n}\n\ntype Props = {\n url?: string\n adminUrl?: string\n}\n\nconst Links: FunctionComponent<Props> = (props) => {\n const {url, adminUrl} = props\n\n if (url && adminUrl) {\n return (\n <span>\n (<Link url={url}>view</Link>, <Link url={adminUrl}>admin</Link>)\n </span>\n )\n }\n\n if (url) {\n return <Link url={url}>(view)</Link>\n }\n if (adminUrl) {\n return <Link url={adminUrl}>(admin)</Link>\n }\n return null\n}\n\nexport default Links\n","export interface SiteWidgetOption {\n apiId: string\n name?: string\n title: string\n buildHookId: string\n url?: string\n branch?: string\n}\nexport interface WidgetOptions {\n title?: string\n description?: string\n sites: SiteWidgetOption[]\n}\n\nexport interface Site {\n title: string\n name?: string\n id: string\n url?: string\n adminUrl?: string\n buildHookId: string\n branch?: string\n}\n\nexport type DeployAction = (site: Site) => void\n\nexport interface NetlifyWidgetProps {\n title?: string\n description?: string\n sites?: Site[]\n isLoading: boolean\n onDeploy: DeployAction\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}