sanity-plugin-dashboard-widget-netlify 1.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Sanity, Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Sanity Dashboard Widget: Netlify
2
+
3
+ Sanity Studio Dashboard Widget for triggering Netlify builds.
4
+
5
+ ## Installing
6
+
7
+ ### Install the dashboard plugin
8
+ To get dashboard support in Sanity Studio in general:
9
+
10
+ `sanity install @sanity/dashboard`
11
+
12
+ ### Install the Netlify widget plugin
13
+
14
+ `sanity install dashboard-widget-netlify`
15
+
16
+ ## Configuring
17
+
18
+ 1. Implement your own dashboardConfig. In your `sanity.json` file, append the following line to the `parts` array:
19
+
20
+ ```json
21
+ {
22
+ "implements": "part:@sanity/dashboard/config",
23
+ "path": "src/dashboardConfig.js"
24
+ }
25
+ ```
26
+
27
+ 2. Create the file `src/dashboardConfig.js` and inlcude the `netlify` widget config like this:
28
+
29
+ ```js
30
+ export default {
31
+ widgets: [
32
+ {
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
+ ]
51
+ }
52
+ }
53
+ ]
54
+ }
55
+ ```
56
+ ### Widget options
57
+ `title` - Override the widget default title
58
+
59
+ `sites[]` - Your Netlify sites to show deploys for
60
+ - `apiId`- The Netfliy API ID of your site (see *Site Settings > General > Site Details > Site Information -> API ID*).
61
+ - `buildHookId` - The id of a build hook you have created for your site within the Netlify administration panel (see *Site Settings > Build & Deploy > Continuous Deployment -> Build Hooks*).
62
+ - `name` - The Netlify site name
63
+ - `title` - Override the site name with a custom title
64
+ - `url` - Optionally override site deployment url. By default it is inferred to be `https://netlify-site-name-netlify.app`.
65
+
66
+ ## Developing on this module
67
+
68
+ To simulate using your development version as a real module inside a studio, you can do the following:
69
+
70
+ * Run `npm install && npm link` from the root of this repository.
71
+ * Run `npm run watch` to start developing and build the module when changes are made.
72
+
73
+ #### Displaying your development version inside a studio
74
+
75
+ **With the mono-repo's `test-studio`:**
76
+
77
+ * Bootstrap the monorepo: `npm run bootstrap`
78
+ * 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)
79
+ * Run `npm link sanity-plugin-dashboard-widget-netlify` inside the mono-repo's root.
80
+ * Restart the `test-studio`
81
+
82
+ **With a regular Sanity Studio:**
83
+ * Run `npm install`
84
+ * Add `sanity-plugin-dashboard-widget-netlify` with the current version number to `package.json`.
85
+ * Run `npm link sanity-plugin-dashboard-widget-netlify`
86
+ * Start the studio
87
+
88
+ 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.
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=sanity.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"sanity.d.js"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = NetlifyWidget;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _SiteList = _interopRequireDefault(require("./SiteList"));
11
+
12
+ var _dashboard = require("@sanity/dashboard");
13
+
14
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
15
+
16
+ var _ui = require("@sanity/ui");
17
+
18
+ var _templateObject;
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
23
+
24
+ var ContentCard = (0, _styledComponents.default)(_ui.Card)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n min-height: 66px;\n"])));
25
+
26
+ function NetlifyWidget(props) {
27
+ var netlifySitesUrl = 'https://app.netlify.com/account/sites';
28
+ var title = props.title,
29
+ description = props.description,
30
+ isLoading = props.isLoading,
31
+ sites = props.sites,
32
+ onDeploy = props.onDeploy;
33
+
34
+ var footer = /*#__PURE__*/_react.default.createElement(_ui.Flex, {
35
+ direction: "column",
36
+ align: "stretch"
37
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
38
+ as: "a",
39
+ href: isLoading ? undefined : netlifySitesUrl,
40
+ disabled: isLoading,
41
+ paddingX: 2,
42
+ paddingY: 4,
43
+ mode: "bleed",
44
+ tone: "primary",
45
+ text: "Manage sites at Netlify",
46
+ loading: isLoading,
47
+ target: "_blank"
48
+ }));
49
+
50
+ return /*#__PURE__*/_react.default.createElement(_dashboard.DashboardWidget, {
51
+ header: title,
52
+ footer: footer
53
+ }, /*#__PURE__*/_react.default.createElement(ContentCard, {
54
+ paddingY: 1
55
+ }, description && /*#__PURE__*/_react.default.createElement(_ui.Box, {
56
+ paddingY: 2,
57
+ paddingX: 3
58
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
59
+ as: "p",
60
+ dangerouslySetInnerHTML: {
61
+ __html: description
62
+ }
63
+ })), /*#__PURE__*/_react.default.createElement(_SiteList.default, {
64
+ isLoading: isLoading,
65
+ onDeploy: onDeploy,
66
+ sites: sites
67
+ })));
68
+ }
69
+ //# sourceMappingURL=NetlifyWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/NetlifyWidget.tsx"],"names":["ContentCard","Card","NetlifyWidget","props","netlifySitesUrl","title","description","isLoading","sites","onDeploy","footer","undefined","__html"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;;;;;;;AAEA,IAAMA,WAAW,GAAG,+BAAOC,QAAP,CAAH,4FAAjB;;AAIe,SAASC,aAAT,CAAuBC,KAAvB,EAAqC;AAClD,MAAMC,eAAe,GAAG,uCAAxB;AADkD,MAE3CC,KAF2C,GAEOF,KAFP,CAE3CE,KAF2C;AAAA,MAEpCC,WAFoC,GAEOH,KAFP,CAEpCG,WAFoC;AAAA,MAEvBC,SAFuB,GAEOJ,KAFP,CAEvBI,SAFuB;AAAA,MAEZC,KAFY,GAEOL,KAFP,CAEZK,KAFY;AAAA,MAELC,QAFK,GAEON,KAFP,CAELM,QAFK;;AAIlD,MAAMC,MAAM,gBACV,6BAAC,QAAD;AAAM,IAAA,SAAS,EAAC,QAAhB;AAAyB,IAAA,KAAK,EAAC;AAA/B,kBACE,6BAAC,UAAD;AACE,IAAA,EAAE,EAAC,GADL;AAEE,IAAA,IAAI,EAAEH,SAAS,GAAGI,SAAH,GAAeP,eAFhC;AAGE,IAAA,QAAQ,EAAEG,SAHZ;AAIE,IAAA,QAAQ,EAAE,CAJZ;AAKE,IAAA,QAAQ,EAAE,CALZ;AAME,IAAA,IAAI,EAAC,OANP;AAOE,IAAA,IAAI,EAAC,SAPP;AAQE,IAAA,IAAI,EAAC,yBARP;AASE,IAAA,OAAO,EAAEA,SATX;AAUE,IAAA,MAAM,EAAC;AAVT,IADF,CADF;;AAiBA,sBACE,6BAAC,0BAAD;AAAiB,IAAA,MAAM,EAAEF,KAAzB;AAAgC,IAAA,MAAM,EAAEK;AAAxC,kBACE,6BAAC,WAAD;AAAa,IAAA,QAAQ,EAAE;AAAvB,KACGJ,WAAW,iBACV,6BAAC,OAAD;AAAK,IAAA,QAAQ,EAAE,CAAf;AAAkB,IAAA,QAAQ,EAAE;AAA5B,kBAA+B,6BAAC,QAAD;AAAM,IAAA,EAAE,EAAC,GAAT;AAAa,IAAA,uBAAuB,EAAE;AAACM,MAAAA,MAAM,EAAEN;AAAT;AAAtC,IAA/B,CAFJ,eAIE,6BAAC,iBAAD;AAAU,IAAA,SAAS,EAAEC,SAArB;AAAgC,IAAA,QAAQ,EAAEE,QAA1C;AAAoD,IAAA,KAAK,EAAED;AAA3D,IAJF,CADF,CADF;AAUD","sourcesContent":["import React from 'react'\nimport {Props} from '../types'\nimport SiteList from './SiteList'\nimport {DashboardWidget} 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: Props) {\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 <DashboardWidget header={title} footer={footer}>\n <ContentCard paddingY={1}>\n {description && (\n <Box paddingY={2} paddingX={3}><Text as=\"p\" dangerouslySetInnerHTML={{__html: description}} /></Box>\n )}\n <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n </ContentCard>\n </DashboardWidget>\n )\n}\n"],"file":"NetlifyWidget.js"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var Link = props => {
13
+ var url = props.url,
14
+ children = props.children;
15
+ return /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement("a", {
16
+ href: url,
17
+ target: "_blank"
18
+ }, children));
19
+ };
20
+
21
+ var Links = props => {
22
+ var url = props.url,
23
+ adminUrl = props.adminUrl;
24
+
25
+ if (url && adminUrl) {
26
+ return /*#__PURE__*/_react.default.createElement("span", null, "(", /*#__PURE__*/_react.default.createElement(Link, {
27
+ url: url
28
+ }, "view"), ", ", /*#__PURE__*/_react.default.createElement(Link, {
29
+ url: adminUrl
30
+ }, "admin"), ")");
31
+ }
32
+
33
+ if (url) {
34
+ return /*#__PURE__*/_react.default.createElement(Link, {
35
+ url: url
36
+ }, "(view)");
37
+ }
38
+
39
+ if (adminUrl) {
40
+ return /*#__PURE__*/_react.default.createElement(Link, {
41
+ url: adminUrl
42
+ }, "(admin)");
43
+ }
44
+
45
+ return null;
46
+ };
47
+
48
+ var _default = Links;
49
+ exports.default = _default;
50
+ //# sourceMappingURL=Links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/SiteItem/Links.tsx"],"names":["Link","props","url","children","Links","adminUrl"],"mappings":";;;;;;;AAAA;;;;AAEA,IAAMA,IAAsC,GAAIC,KAAD,IAAW;AAAA,MACjDC,GADiD,GAChCD,KADgC,CACjDC,GADiD;AAAA,MAC5CC,QAD4C,GAChCF,KADgC,CAC5CE,QAD4C;AAGxD,sBACE,wDACE;AAAG,IAAA,IAAI,EAAED,GAAT;AAAc,IAAA,MAAM,EAAC;AAArB,KAA+BC,QAA/B,CADF,CADF;AAKD,CARD;;AAeA,IAAMC,KAA+B,GAAIH,KAAD,IAAW;AAAA,MAC1CC,GAD0C,GACzBD,KADyB,CAC1CC,GAD0C;AAAA,MACrCG,QADqC,GACzBJ,KADyB,CACrCI,QADqC;;AAGjD,MAAIH,GAAG,IAAIG,QAAX,EAAqB;AACnB,wBACE,6DACG,6BAAC,IAAD;AAAM,MAAA,GAAG,EAAEH;AAAX,cADH,qBACgC,6BAAC,IAAD;AAAM,MAAA,GAAG,EAAEG;AAAX,eADhC,MADF;AAKD;;AAED,MAAIH,GAAJ,EAAS;AACP,wBAAO,6BAAC,IAAD;AAAM,MAAA,GAAG,EAAEA;AAAX,gBAAP;AACD;;AACD,MAAIG,QAAJ,EAAc;AACZ,wBAAO,6BAAC,IAAD;AAAM,MAAA,GAAG,EAAEA;AAAX,iBAAP;AACD;;AACD,SAAO,IAAP;AACD,CAlBD;;eAoBeD,K","sourcesContent":["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"],"file":"Links.js"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.IMAGE_PULL_INTERVAL = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _ui = require("@sanity/ui");
11
+
12
+ var _Links = _interopRequireDefault(require("./Links"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
17
+
18
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
21
+
22
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+
24
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
+
26
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
27
+
28
+ function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
29
+
30
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
31
+
32
+ var IMAGE_PULL_INTERVAL = 10000;
33
+ exports.IMAGE_PULL_INTERVAL = IMAGE_PULL_INTERVAL;
34
+
35
+ var getImageUrl = siteId => {
36
+ var baseUrl = "https://api.netlify.com/api/v1/badges/".concat(siteId, "/deploy-status");
37
+ var time = new Date().getTime();
38
+ return "".concat(baseUrl, "?").concat(time);
39
+ };
40
+
41
+ var useBadgeImage = siteId => {
42
+ var _useState = (0, _react.useState)(() => getImageUrl(siteId)),
43
+ _useState2 = _slicedToArray(_useState, 2),
44
+ src = _useState2[0],
45
+ setSrc = _useState2[1];
46
+
47
+ var update = (0, _react.useCallback)(() => setSrc(getImageUrl(siteId)), [siteId]);
48
+ (0, _react.useEffect)(() => {
49
+ var interval = window.setInterval(update, IMAGE_PULL_INTERVAL);
50
+ return () => window.clearInterval(interval);
51
+ }, [update]);
52
+ return [src, update];
53
+ };
54
+
55
+ var useDeploy = (site, onDeploy, updateBadge) => {
56
+ var timeoutRef = (0, _react.useRef)(-1);
57
+ (0, _react.useEffect)(() => () => window.clearTimeout(timeoutRef.current), []);
58
+ return (0, _react.useCallback)(() => {
59
+ onDeploy(site);
60
+ timeoutRef.current = window.setTimeout(updateBadge, 1000);
61
+ }, [site, onDeploy, updateBadge]);
62
+ };
63
+
64
+ var SiteItem = props => {
65
+ var _useState3 = (0, _react.useState)(false),
66
+ _useState4 = _slicedToArray(_useState3, 2),
67
+ hasBadgeError = _useState4[0],
68
+ setHasBadgeError = _useState4[1];
69
+
70
+ var site = props.site,
71
+ onDeploy = props.onDeploy;
72
+ var id = site.id,
73
+ name = site.name,
74
+ title = site.title,
75
+ url = site.url,
76
+ adminUrl = site.adminUrl,
77
+ buildHookId = site.buildHookId;
78
+
79
+ var _useBadgeImage = useBadgeImage(id),
80
+ _useBadgeImage2 = _slicedToArray(_useBadgeImage, 2),
81
+ badge = _useBadgeImage2[0],
82
+ updateBadge = _useBadgeImage2[1];
83
+
84
+ var handleDeploy = useDeploy(site, onDeploy, updateBadge);
85
+
86
+ var handleBadgeError = () => {
87
+ setHasBadgeError(true);
88
+ };
89
+
90
+ return /*#__PURE__*/_react.default.createElement(_ui.Flex, {
91
+ as: "li"
92
+ }, /*#__PURE__*/_react.default.createElement(_ui.Box, {
93
+ flex: 1,
94
+ paddingY: 2,
95
+ paddingX: 3
96
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
97
+ space: 2
98
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
99
+ as: "h4"
100
+ }, title || name, /*#__PURE__*/_react.default.createElement(_Links.default, {
101
+ url: url,
102
+ adminUrl: adminUrl
103
+ })), /*#__PURE__*/_react.default.createElement(_ui.Flex, {
104
+ justify: "flex-start"
105
+ }, !hasBadgeError && /*#__PURE__*/_react.default.createElement("img", {
106
+ src: badge,
107
+ onError: handleBadgeError,
108
+ alt: "Badge"
109
+ }), hasBadgeError && /*#__PURE__*/_react.default.createElement(_ui.Card, {
110
+ tone: "critical",
111
+ radius: 2,
112
+ padding: 2
113
+ }, /*#__PURE__*/_react.default.createElement(_ui.Label, {
114
+ size: 0,
115
+ muted: true
116
+ }, "Failed to load badge"))))), buildHookId ? /*#__PURE__*/_react.default.createElement(_ui.Box, {
117
+ paddingY: 2,
118
+ paddingX: 3
119
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
120
+ mode: "ghost",
121
+ onClick: handleDeploy,
122
+ text: "Deploy"
123
+ })) : null);
124
+ };
125
+
126
+ var _default = SiteItem;
127
+ exports.default = _default;
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/SiteItem/index.tsx"],"names":["IMAGE_PULL_INTERVAL","getImageUrl","siteId","baseUrl","time","Date","getTime","useBadgeImage","src","setSrc","update","interval","window","setInterval","clearInterval","useDeploy","site","onDeploy","updateBadge","timeoutRef","clearTimeout","current","setTimeout","SiteItem","props","hasBadgeError","setHasBadgeError","id","name","title","url","adminUrl","buildHookId","badge","handleDeploy","handleBadgeError"],"mappings":"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","sourcesContent":["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) => {\n const baseUrl = `https://api.netlify.com/api/v1/badges/${siteId}/deploy-status`\n const time = new Date().getTime()\n\n return `${baseUrl}?${time}`\n}\n\nconst useBadgeImage = (siteId: string) => {\n const [src, setSrc] = useState(() => getImageUrl(siteId))\n const update = useCallback(() => setSrc(getImageUrl(siteId)), [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} = site\n\n const [badge, updateBadge] = useBadgeImage(id)\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"],"file":"index.js"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = SiteList;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _SiteItem = _interopRequireDefault(require("./SiteItem"));
11
+
12
+ var _ui = require("@sanity/ui");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function SiteList(props) {
17
+ var isLoading = props.isLoading,
18
+ onDeploy = props.onDeploy,
19
+ sites = props.sites;
20
+
21
+ if (isLoading) {
22
+ return /*#__PURE__*/_react.default.createElement(_ui.Card, {
23
+ padding: 4
24
+ }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
25
+ direction: "column",
26
+ justify: "center",
27
+ align: "center"
28
+ }, /*#__PURE__*/_react.default.createElement(_ui.Spinner, {
29
+ muted: true
30
+ }), /*#__PURE__*/_react.default.createElement(_ui.Box, {
31
+ marginTop: 3
32
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
33
+ muted: true
34
+ }, "Loading sites\u2026"))));
35
+ }
36
+
37
+ if (!sites || sites && sites.length === 0) {
38
+ return /*#__PURE__*/_react.default.createElement(_ui.Card, {
39
+ tone: "critical",
40
+ padding: 3
41
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "No sites are defined in the widget options. Please check your config."));
42
+ }
43
+
44
+ return /*#__PURE__*/_react.default.createElement(_ui.Box, {
45
+ paddingY: 2
46
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
47
+ as: "ul",
48
+ space: 2
49
+ }, sites.map((site, index) => {
50
+ return /*#__PURE__*/_react.default.createElement(_SiteItem.default, {
51
+ onDeploy: onDeploy,
52
+ site: site,
53
+ key: "site-".concat(index)
54
+ });
55
+ })));
56
+ }
57
+ //# sourceMappingURL=SiteList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/SiteList.tsx"],"names":["SiteList","props","isLoading","onDeploy","sites","length","map","site","index"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;;;AAQe,SAASA,QAAT,CAAkBC,KAAlB,EAAgC;AAAA,MACtCC,SADsC,GACRD,KADQ,CACtCC,SADsC;AAAA,MAC3BC,QAD2B,GACRF,KADQ,CAC3BE,QAD2B;AAAA,MACjBC,KADiB,GACRH,KADQ,CACjBG,KADiB;;AAE7C,MAAIF,SAAJ,EAAe;AACb,wBACE,6BAAC,QAAD;AAAM,MAAA,OAAO,EAAE;AAAf,oBACE,6BAAC,QAAD;AAAM,MAAA,SAAS,EAAC,QAAhB;AAAyB,MAAA,OAAO,EAAC,QAAjC;AAA0C,MAAA,KAAK,EAAC;AAAhD,oBACE,6BAAC,WAAD;AAAS,MAAA,KAAK;AAAd,MADF,eAEE,6BAAC,OAAD;AAAK,MAAA,SAAS,EAAE;AAAhB,oBACE,6BAAC,QAAD;AAAM,MAAA,KAAK;AAAX,6BADF,CAFF,CADF,CADF;AAUD;;AACD,MAAI,CAACE,KAAD,IAAWA,KAAK,IAAIA,KAAK,CAACC,MAAN,KAAiB,CAAzC,EAA6C;AAC3C,wBACE,6BAAC,QAAD;AAAM,MAAA,IAAI,EAAC,UAAX;AAAsB,MAAA,OAAO,EAAE;AAA/B,oBACE,6BAAC,QAAD,gFADF,CADF;AAKD;;AACD,sBACE,6BAAC,OAAD;AAAK,IAAA,QAAQ,EAAE;AAAf,kBACE,6BAAC,SAAD;AAAO,IAAA,EAAE,EAAC,IAAV;AAAe,IAAA,KAAK,EAAE;AAAtB,KACGD,KAAK,CAACE,GAAN,CAAU,CAACC,IAAD,EAAOC,KAAP,KAAiB;AAC1B,wBAAO,6BAAC,iBAAD;AAAU,MAAA,QAAQ,EAAEL,QAApB;AAA8B,MAAA,IAAI,EAAEI,IAApC;AAA0C,MAAA,GAAG,iBAAUC,KAAV;AAA7C,MAAP;AACD,GAFA,CADH,CADF,CADF;AASD","sourcesContent":["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"],"file":"SiteList.js"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.deploy = deploy;
7
+
8
+ var _rxjs = require("rxjs");
9
+
10
+ var _operators = require("rxjs/operators");
11
+
12
+ var _statusCodeRequest = require("../http/statusCodeRequest");
13
+
14
+ function deploy(site) {
15
+ if (!site.buildHookId) {
16
+ return (0, _rxjs.of)(new Error('Site missing buildHookId'));
17
+ }
18
+
19
+ return (0, _statusCodeRequest.statusCodeRequest)("https://api.netlify.com/build_hooks/".concat(site.buildHookId), {
20
+ method: 'POST'
21
+ }).pipe((0, _operators.map)(result => ({
22
+ result,
23
+ site
24
+ })));
25
+ }
26
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/datastores/deploy.ts"],"names":["deploy","site","buildHookId","Error","method","pipe","result"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAGO,SAASA,MAAT,CAAgBC,IAAhB,EAA8E;AACnF,MAAI,CAACA,IAAI,CAACC,WAAV,EAAuB;AACrB,WAAO,cAAG,IAAIC,KAAJ,CAAU,0BAAV,CAAH,CAAP;AACD;;AAED,SAAO,wFAAyDF,IAAI,CAACC,WAA9D,GAA6E;AAClFE,IAAAA,MAAM,EAAE;AAD0E,GAA7E,EAEJC,IAFI,CAEC,oBAAKC,MAAD,KAAa;AAACA,IAAAA,MAAD;AAASL,IAAAA;AAAT,GAAb,CAAJ,CAFD,CAAP;AAGD","sourcesContent":["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"],"file":"deploy.js"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.jsonRequest = void 0;
7
+
8
+ var _rxjs = require("rxjs");
9
+
10
+ var _createAbortController = require("./utils/createAbortController");
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
15
+
16
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+
18
+ var jsonRequest = (input, init) => {
19
+ return new _rxjs.Observable(subscriber => {
20
+ var controller = (0, _createAbortController.createAbortController)();
21
+
22
+ var onResponse = res => {
23
+ subscriber.next(res);
24
+ subscriber.complete();
25
+ };
26
+
27
+ var onError = err => {
28
+ if (err.name === 'AbortError') {
29
+ subscriber.complete();
30
+ } else {
31
+ subscriber.error(err);
32
+ }
33
+ };
34
+
35
+ fetch(input, _objectSpread(_objectSpread({}, init), {}, {
36
+ signal: controller.signal
37
+ })).then(res => {
38
+ if (res.status < 200 || res.status > 299) {
39
+ throw new Error("HTTP Error ".concat(res.status, ": ").concat(res.statusText));
40
+ }
41
+
42
+ return res.json();
43
+ }).then(onResponse, onError);
44
+ return () => {
45
+ controller.abort();
46
+ };
47
+ });
48
+ };
49
+
50
+ exports.jsonRequest = jsonRequest;
51
+ //# sourceMappingURL=jsonRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http/jsonRequest.ts"],"names":["jsonRequest","input","init","Observable","subscriber","controller","onResponse","res","next","complete","onError","err","name","error","fetch","signal","then","status","Error","statusText","json","abort"],"mappings":";;;;;;;AAAA;;AACA;;;;;;;;AAEO,IAAMA,WAAW,GAAG,CAAIC,KAAJ,EAAwBC,IAAxB,KAA8D;AACvF,SAAO,IAAIC,gBAAJ,CAAgBC,UAAD,IAAgB;AACpC,QAAMC,UAAU,GAAG,mDAAnB;;AACA,QAAMC,UAAU,GAAIC,GAAD,IAAY;AAC7BH,MAAAA,UAAU,CAACI,IAAX,CAAgBD,GAAhB;AACAH,MAAAA,UAAU,CAACK,QAAX;AACD,KAHD;;AAIA,QAAMC,OAAO,GAAIC,GAAD,IAAgB;AAC9B,UAAIA,GAAG,CAACC,IAAJ,KAAa,YAAjB,EAA+B;AAC7BR,QAAAA,UAAU,CAACK,QAAX;AACD,OAFD,MAEO;AACLL,QAAAA,UAAU,CAACS,KAAX,CAAiBF,GAAjB;AACD;AACF,KAND;;AAQAG,IAAAA,KAAK,CAACb,KAAD,kCAAYC,IAAZ;AAAkBa,MAAAA,MAAM,EAAEV,UAAU,CAACU;AAArC,OAAL,CACGC,IADH,CACST,GAAD,IAAmB;AACvB,UAAIA,GAAG,CAACU,MAAJ,GAAa,GAAb,IAAoBV,GAAG,CAACU,MAAJ,GAAa,GAArC,EAA0C;AACxC,cAAM,IAAIC,KAAJ,sBAAwBX,GAAG,CAACU,MAA5B,eAAuCV,GAAG,CAACY,UAA3C,EAAN;AACD;;AACD,aAAOZ,GAAG,CAACa,IAAJ,EAAP;AACD,KANH,EAOGJ,IAPH,CAOQV,UAPR,EAOoBI,OAPpB;AASA,WAAO,MAAM;AACXL,MAAAA,UAAU,CAACgB,KAAX;AACD,KAFD;AAGD,GA1BM,CAAP;AA2BD,CA5BM","sourcesContent":["import {Observable} from 'rxjs'\nimport {createAbortController} from './utils/createAbortController'\n\nexport const jsonRequest = <T>(input: RequestInfo, init?: RequestInit): Observable<T> => {\n return new Observable((subscriber) => {\n const controller = createAbortController()\n const onResponse = (res: T) => {\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.json()\n })\n .then(onResponse, onError)\n\n return () => {\n controller.abort()\n }\n })\n}\n"],"file":"jsonRequest.js"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.statusCodeRequest = void 0;
7
+
8
+ var _rxjs = require("rxjs");
9
+
10
+ var _createAbortController = require("./utils/createAbortController");
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
15
+
16
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+
18
+ var statusCodeRequest = (input, init) => {
19
+ return new _rxjs.Observable(subscriber => {
20
+ var controller = (0, _createAbortController.createAbortController)();
21
+
22
+ var onResponse = res => {
23
+ subscriber.next(res);
24
+ subscriber.complete();
25
+ };
26
+
27
+ var onError = err => {
28
+ if (err.name === 'AbortError') {
29
+ subscriber.complete();
30
+ } else {
31
+ subscriber.error(err);
32
+ }
33
+ };
34
+
35
+ fetch(input, _objectSpread(_objectSpread({}, init), {}, {
36
+ signal: controller.signal
37
+ })).then(res => {
38
+ if (res.status < 200 || res.status > 299) {
39
+ throw new Error("HTTP Error ".concat(res.status, ": ").concat(res.statusText));
40
+ }
41
+
42
+ return res.status;
43
+ }).then(onResponse, onError);
44
+ return () => {
45
+ controller.abort();
46
+ };
47
+ });
48
+ };
49
+
50
+ exports.statusCodeRequest = statusCodeRequest;
51
+ //# sourceMappingURL=statusCodeRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http/statusCodeRequest.ts"],"names":["statusCodeRequest","input","init","Observable","subscriber","controller","onResponse","res","next","complete","onError","err","name","error","fetch","signal","then","status","Error","statusText","abort"],"mappings":";;;;;;;AAAA;;AACA;;;;;;;;AAEO,IAAMA,iBAAiB,GAAG,CAACC,KAAD,EAAqBC,IAArB,KAAgE;AAC/F,SAAO,IAAIC,gBAAJ,CAAgBC,UAAD,IAAgB;AACpC,QAAMC,UAAU,GAAG,mDAAnB;;AACA,QAAMC,UAAU,GAAIC,GAAD,IAAiB;AAClCH,MAAAA,UAAU,CAACI,IAAX,CAAgBD,GAAhB;AACAH,MAAAA,UAAU,CAACK,QAAX;AACD,KAHD;;AAIA,QAAMC,OAAO,GAAIC,GAAD,IAAgB;AAC9B,UAAIA,GAAG,CAACC,IAAJ,KAAa,YAAjB,EAA+B;AAC7BR,QAAAA,UAAU,CAACK,QAAX;AACD,OAFD,MAEO;AACLL,QAAAA,UAAU,CAACS,KAAX,CAAiBF,GAAjB;AACD;AACF,KAND;;AAQAG,IAAAA,KAAK,CAACb,KAAD,kCAAYC,IAAZ;AAAkBa,MAAAA,MAAM,EAAEV,UAAU,CAACU;AAArC,OAAL,CACGC,IADH,CACST,GAAD,IAAmB;AACvB,UAAIA,GAAG,CAACU,MAAJ,GAAa,GAAb,IAAoBV,GAAG,CAACU,MAAJ,GAAa,GAArC,EAA0C;AACxC,cAAM,IAAIC,KAAJ,sBAAwBX,GAAG,CAACU,MAA5B,eAAuCV,GAAG,CAACY,UAA3C,EAAN;AACD;;AACD,aAAOZ,GAAG,CAACU,MAAX;AACD,KANH,EAOGD,IAPH,CAOQV,UAPR,EAOoBI,OAPpB;AASA,WAAO,MAAM;AACXL,MAAAA,UAAU,CAACe,KAAX;AACD,KAFD;AAGD,GA1BM,CAAP;AA2BD,CA5BM","sourcesContent":["import {Observable} from 'rxjs'\nimport {createAbortController} from './utils/createAbortController'\n\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"],"file":"statusCodeRequest.js"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createAbortController = void 0;
7
+
8
+ var _abortController = _interopRequireDefault(require("abort-controller"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var createAbortController = () => {
13
+ if (!('AbortController' in window)) {
14
+ return new _abortController.default();
15
+ }
16
+
17
+ return new AbortController();
18
+ };
19
+
20
+ exports.createAbortController = createAbortController;
21
+ //# sourceMappingURL=createAbortController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http/utils/createAbortController.ts"],"names":["createAbortController","window","AbortControllerPolyfill","AbortController"],"mappings":";;;;;;;AAAA;;;;AAEO,IAAMA,qBAAqB,GAAG,MAAuB;AAC1D,MAAI,EAAE,qBAAqBC,MAAvB,CAAJ,EAAoC;AAClC,WAAO,IAAIC,wBAAJ,EAAP;AACD;;AACD,SAAO,IAAIC,eAAJ,EAAP;AACD,CALM","sourcesContent":["import AbortControllerPolyfill from 'abort-controller'\n\nexport const createAbortController = (): AbortController => {\n if (!('AbortController' in window)) {\n return new AbortControllerPolyfill()\n }\n return new AbortController()\n}\n"],"file":"createAbortController.js"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _widget = _interopRequireDefault(require("./widget"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var _default = {
13
+ name: 'netlify',
14
+ component: _widget.default,
15
+ layout: {
16
+ width: 'medium'
17
+ }
18
+ };
19
+ exports.default = _default;
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["name","component","Widget","layout","width"],"mappings":";;;;;;;AAAA;;;;eAEe;AACbA,EAAAA,IAAI,EAAE,SADO;AAEbC,EAAAA,SAAS,EAAEC,eAFE;AAGbC,EAAAA,MAAM,EAAE;AAACC,IAAAA,KAAK,EAAE;AAAR;AAHK,C","sourcesContent":["import Widget from './widget'\n\nexport default {\n name: 'netlify',\n component: Widget,\n layout: {width: 'medium'},\n}\n"],"file":"index.js"}
package/dist/props.js ADDED
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.props$ = void 0;
7
+
8
+ var _rxjs = require("rxjs");
9
+
10
+ var _reactPropsStream = require("react-props-stream");
11
+
12
+ var _operators = require("rxjs/operators");
13
+
14
+ var _deploy = require("./datastores/deploy");
15
+
16
+ var _reducers = require("./reducers");
17
+
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
19
+
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
21
+
22
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
+
24
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
25
+
26
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
27
+
28
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
29
+
30
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
31
+
32
+ function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
33
+
34
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
35
+
36
+ var noop = () => undefined;
37
+
38
+ var INITIAL_PROPS = {
39
+ title: 'Netlify sites',
40
+ sites: [],
41
+ isLoading: true,
42
+ onDeploy: noop
43
+ }; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
44
+
45
+ var props$ = options => {
46
+ var configuredSites = (options.sites || []).map(site => ({
47
+ id: site.apiId,
48
+ name: site.name,
49
+ title: site.title,
50
+ buildHookId: site.buildHookId,
51
+ url: site.url || site.name && "https://".concat(site.name, ".netlify.app/"),
52
+ adminUrl: site.name && "https://app.netlify.com/sites/".concat(site.name)
53
+ }));
54
+
55
+ var _createEventHandler = (0, _reactPropsStream.createEventHandler)(),
56
+ _createEventHandler2 = _slicedToArray(_createEventHandler, 2),
57
+ onDeploy$ = _createEventHandler2[0],
58
+ onDeploy = _createEventHandler2[1];
59
+
60
+ var setSitesAction$ = (0, _rxjs.of)(configuredSites).pipe((0, _operators.map)(sites => ({
61
+ type: 'setSites',
62
+ sites
63
+ })));
64
+ var deployAction$ = onDeploy$.pipe((0, _operators.map)(site => ({
65
+ type: 'deploy/started',
66
+ site
67
+ })));
68
+ var deployResult$ = onDeploy$.pipe((0, _operators.switchMap)(site => (0, _deploy.deploy)(site)));
69
+ var deployCompletedAction$ = deployResult$.pipe((0, _operators.map)(result => _objectSpread({
70
+ type: 'deploy/completed'
71
+ }, result), (0, _operators.catchError)(error => (0, _rxjs.of)({
72
+ type: 'deploy/failed',
73
+ error
74
+ }))));
75
+ (0, _rxjs.merge)(setSitesAction$, deployAction$, deployCompletedAction$).pipe(_reducers.stateReducer$).subscribe();
76
+ return (0, _rxjs.of)(configuredSites).pipe((0, _operators.map)(sites => ({
77
+ sites,
78
+ title: options.title || INITIAL_PROPS.title,
79
+ description: options.description,
80
+ isLoading: false,
81
+ onDeploy
82
+ })), (0, _operators.startWith)(INITIAL_PROPS));
83
+ };
84
+
85
+ exports.props$ = props$;
86
+ //# sourceMappingURL=props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/props.ts"],"names":["noop","undefined","INITIAL_PROPS","title","sites","isLoading","onDeploy","props$","options","configuredSites","map","site","id","apiId","name","buildHookId","url","adminUrl","onDeploy$","setSitesAction$","pipe","type","deployAction$","deployResult$","deployCompletedAction$","result","error","stateReducer$","subscribe","description"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,IAAI,GAAG,MAAMC,SAAnB;;AAEA,IAAMC,aAAa,GAAG;AACpBC,EAAAA,KAAK,EAAE,eADa;AAEpBC,EAAAA,KAAK,EAAE,EAFa;AAGpBC,EAAAA,SAAS,EAAE,IAHS;AAIpBC,EAAAA,QAAQ,EAAEN;AAJU,CAAtB,C,CAOA;;AACO,IAAMO,MAAM,GAAIC,OAAD,IAA4B;AAChD,MAAMC,eAAe,GAAG,CAACD,OAAO,CAACJ,KAAR,IAAiB,EAAlB,EAAsBM,GAAtB,CAA2BC,IAAD,KAAW;AAC3DC,IAAAA,EAAE,EAAED,IAAI,CAACE,KADkD;AAE3DC,IAAAA,IAAI,EAAEH,IAAI,CAACG,IAFgD;AAG3DX,IAAAA,KAAK,EAAEQ,IAAI,CAACR,KAH+C;AAI3DY,IAAAA,WAAW,EAAEJ,IAAI,CAACI,WAJyC;AAK3DC,IAAAA,GAAG,EAAEL,IAAI,CAACK,GAAL,IAAaL,IAAI,CAACG,IAAL,sBAAwBH,IAAI,CAACG,IAA7B,kBALyC;AAM3DG,IAAAA,QAAQ,EAAEN,IAAI,CAACG,IAAL,4CAA8CH,IAAI,CAACG,IAAnD;AANiD,GAAX,CAA1B,CAAxB;;AADgD,4BAUlB,2CAVkB;AAAA;AAAA,MAUzCI,SAVyC;AAAA,MAU9BZ,QAV8B;;AAWhD,MAAMa,eAAe,GAAG,cAAGV,eAAH,EAAoBW,IAApB,CAAyB,oBAAKhB,KAAD,KAAY;AAACiB,IAAAA,IAAI,EAAE,UAAP;AAAmBjB,IAAAA;AAAnB,GAAZ,CAAJ,CAAzB,CAAxB;AACA,MAAMkB,aAAa,GAAGJ,SAAS,CAACE,IAAV,CAAe,oBAAKT,IAAD,KAAW;AAACU,IAAAA,IAAI,EAAE,gBAAP;AAAyBV,IAAAA;AAAzB,GAAX,CAAJ,CAAf,CAAtB;AACA,MAAMY,aAAa,GAAGL,SAAS,CAACE,IAAV,CAAe,0BAAWT,IAAD,IAAU,oBAAOA,IAAP,CAApB,CAAf,CAAtB;AACA,MAAMa,sBAAsB,GAAGD,aAAa,CAACH,IAAd,CAC7B,oBACGK,MAAD;AAAcJ,IAAAA,IAAI,EAAE;AAApB,KAA2CI,MAA3C,CADF,EAEE,2BAAYC,KAAD,IAAW,cAAG;AAACL,IAAAA,IAAI,EAAE,eAAP;AAAwBK,IAAAA;AAAxB,GAAH,CAAtB,CAFF,CAD6B,CAA/B;AAOA,mBAAMP,eAAN,EAAuBG,aAAvB,EAAsCE,sBAAtC,EAA8DJ,IAA9D,CAAmEO,uBAAnE,EAAkFC,SAAlF;AAEA,SAAO,cAAGnB,eAAH,EAAoBW,IAApB,CACL,oBAAKhB,KAAD,KAAY;AACdA,IAAAA,KADc;AAEdD,IAAAA,KAAK,EAAEK,OAAO,CAACL,KAAR,IAAiBD,aAAa,CAACC,KAFxB;AAGd0B,IAAAA,WAAW,EAAErB,OAAO,CAACqB,WAHP;AAIdxB,IAAAA,SAAS,EAAE,KAJG;AAKdC,IAAAA;AALc,GAAZ,CAAJ,CADK,EAQL,0BAAUJ,aAAV,CARK,CAAP;AAUD,CAjCM","sourcesContent":["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: site.url || (site.name && `https://${site.name}.netlify.app/`),\n adminUrl: site.name && `https://app.netlify.com/sites/${site.name}`,\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"],"file":"props.js"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stateReducer$ = void 0;
7
+
8
+ var _operators = require("rxjs/operators");
9
+
10
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
11
+
12
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
13
+
14
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
+
16
+ var stateReducer$ = (0, _operators.scan)((state, action) => {
17
+ switch (action.type) {
18
+ case 'setSites':
19
+ return _objectSpread(_objectSpread({}, state), {}, {
20
+ sites: action.sites || []
21
+ });
22
+
23
+ case 'deploy/started':
24
+ return _objectSpread(_objectSpread({}, state), {}, {
25
+ sites: state.sites.map(site => {
26
+ if (action.site && site.id === action.site.id) {
27
+ return _objectSpread({}, site);
28
+ }
29
+
30
+ return site;
31
+ })
32
+ });
33
+
34
+ case 'deploy/failed':
35
+ return _objectSpread(_objectSpread({}, state), {}, {
36
+ error: action.error
37
+ });
38
+
39
+ case 'deploy/completed':
40
+ return _objectSpread(_objectSpread({}, state), {}, {
41
+ sites: state.sites.map(site => {
42
+ if (action.site && site.id === action.site.id) {
43
+ return _objectSpread(_objectSpread({}, site), {}, {
44
+ error: action.error
45
+ });
46
+ }
47
+
48
+ return site;
49
+ })
50
+ });
51
+
52
+ default:
53
+ return state;
54
+ }
55
+ });
56
+ exports.stateReducer$ = stateReducer$;
57
+ //# sourceMappingURL=reducers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reducers.ts"],"names":["stateReducer$","state","action","type","sites","map","site","id","error"],"mappings":";;;;;;;AAAA;;;;;;;;AAoBO,IAAMA,aAAa,GAAG,qBAAK,CAACC,KAAD,EAAeC,MAAf,KAAkC;AAClE,UAAQA,MAAM,CAACC,IAAf;AACE,SAAK,UAAL;AACE,6CAAWF,KAAX;AAAkBG,QAAAA,KAAK,EAAEF,MAAM,CAACE,KAAP,IAAgB;AAAzC;;AACF,SAAK,gBAAL;AACE,6CACKH,KADL;AAEEG,QAAAA,KAAK,EAAEH,KAAK,CAACG,KAAN,CAAYC,GAAZ,CAAiBC,IAAD,IAAgB;AACrC,cAAIJ,MAAM,CAACI,IAAP,IAAeA,IAAI,CAACC,EAAL,KAAYL,MAAM,CAACI,IAAP,CAAYC,EAA3C,EAA+C;AAC7C,qCAAWD,IAAX;AACD;;AACD,iBAAOA,IAAP;AACD,SALM;AAFT;;AASF,SAAK,eAAL;AACE,6CACKL,KADL;AAEEO,QAAAA,KAAK,EAAEN,MAAM,CAACM;AAFhB;;AAIF,SAAK,kBAAL;AACE,6CACKP,KADL;AAEEG,QAAAA,KAAK,EAAEH,KAAK,CAACG,KAAN,CAAYC,GAAZ,CAAiBC,IAAD,IAAgB;AACrC,cAAIJ,MAAM,CAACI,IAAP,IAAeA,IAAI,CAACC,EAAL,KAAYL,MAAM,CAACI,IAAP,CAAYC,EAA3C,EAA+C;AAC7C,mDAAWD,IAAX;AAAiBE,cAAAA,KAAK,EAAEN,MAAM,CAACM;AAA/B;AACD;;AACD,iBAAOF,IAAP;AACD,SALM;AAFT;;AASF;AACE,aAAOL,KAAP;AA7BJ;AA+BD,CAhC4B,CAAtB","sourcesContent":["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"],"file":"reducers.js"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"types.js"}
package/dist/widget.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _reactPropsStream = require("react-props-stream");
11
+
12
+ var _operators = require("rxjs/operators");
13
+
14
+ var _props = require("./props");
15
+
16
+ var _NetlifyWidget = _interopRequireDefault(require("./components/NetlifyWidget"));
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ var _default = (0, _reactPropsStream.streamingComponent)(options$ => options$.pipe((0, _operators.switchMap)(options => (0, _props.props$)(options).pipe((0, _operators.map)(props => {
21
+ return /*#__PURE__*/_react.default.createElement(_NetlifyWidget.default, props);
22
+ })))));
23
+
24
+ exports.default = _default;
25
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/widget.tsx"],"names":["options$","pipe","options","props"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;;;eAEe,0CAAmCA,QAAD,IAC/CA,QAAQ,CAACC,IAAT,CACE,0BAAWC,OAAD,IACR,mBAAOA,OAAP,EAAgBD,IAAhB,CACE,oBAAKE,KAAD,IAAW;AACb,sBAAO,6BAAC,sBAAD,EAAmBA,KAAnB,CAAP;AACD,CAFD,CADF,CADF,CADF,CADa,C","sourcesContent":["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"],"file":"widget.js"}
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "sanity-plugin-dashboard-widget-netlify",
3
+ "version": "1.2.0",
4
+ "description": "Sanity Studio Dashboard Widget for triggering Netlify builds",
5
+ "keywords": [
6
+ "sanity",
7
+ "plugin",
8
+ "dashboard",
9
+ "widget",
10
+ "netlify"
11
+ ],
12
+ "main": "dist/index.js",
13
+ "files": [
14
+ "dist",
15
+ "sanity.json"
16
+ ],
17
+ "author": "Sanity.io <hello@sanity.io>",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git@github.com:sanity-io/sanity-plugin-dashboard-widget-netlify.git"
21
+ },
22
+ "license": "MIT",
23
+ "engines": {
24
+ "node": ">=10.0.0"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify/issues"
31
+ },
32
+ "homepage": "https://github.com/sanity-io/sanity-plugin-dashboard-widget-netlify#readme",
33
+ "scripts": {
34
+ "lint": "eslint .",
35
+ "prebuild": "rimraf dist",
36
+ "build": "sanipack build",
37
+ "watch": "sanipack build --watch",
38
+ "test": "jest --coverage",
39
+ "test:watch": "jest --coverage --watch",
40
+ "test:prod": "npm run lint && npm run test -- --no-cache",
41
+ "prepublishOnly": "npm run build"
42
+ },
43
+ "prettier": {
44
+ "semi": false,
45
+ "printWidth": 100,
46
+ "bracketSpacing": false,
47
+ "singleQuote": true
48
+ },
49
+ "dependencies": {
50
+ "abort-controller": "^2.0.3",
51
+ "react-props-stream": "^1.0.0",
52
+ "rxjs": "^6.0.0"
53
+ },
54
+ "peerDependencies": {
55
+ "@sanity/base": ">=2.13.0",
56
+ "@sanity/dashboard": ">=2.13.0",
57
+ "@sanity/ui": "^0.36.12",
58
+ "react": "^16.9 || ^17",
59
+ "styled-components": "^5.2.0"
60
+ },
61
+ "devDependencies": {
62
+ "@sanity/dashboard": ">=2.13.0",
63
+ "@sanity/ui": "^0.36.12",
64
+ "@testing-library/jest-dom": "^5.11.4",
65
+ "@testing-library/react": "^11.0.4",
66
+ "@types/jest": "^26.0.20",
67
+ "@types/node": "^10.11.0",
68
+ "@types/react": "^17.0.0",
69
+ "@types/react-dom": "^17.0.0",
70
+ "@types/styled-components": "^5.1.14",
71
+ "@typescript-eslint/eslint-plugin": "^4.18.0",
72
+ "@typescript-eslint/parser": "^4.18.0",
73
+ "eslint": "^7.22.0",
74
+ "eslint-config-prettier": "^8.1.0",
75
+ "eslint-config-sanity": "^5.1.0",
76
+ "eslint-plugin-prettier": "^3.3.1",
77
+ "jest": "^26.0.0",
78
+ "jest-date-mock": "^1.0.8",
79
+ "prettier": "^2.0.0",
80
+ "react": "^17.0.0",
81
+ "react-dom": "^17.0.0",
82
+ "rimraf": "^2.6.2",
83
+ "sanipack": "^1.0.8",
84
+ "styled-components": "^5.2.0",
85
+ "ts-jest": "^26.0.0",
86
+ "tsconfig-paths-jest": "0.0.1",
87
+ "typescript": "^4.0.3"
88
+ }
89
+ }
package/sanity.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "paths": {
3
+ "source": "./src",
4
+ "compiled": "./dist"
5
+ },
6
+ "parts": [
7
+ {
8
+ "implements": "part:@sanity/dashboard/widget",
9
+ "path": "index"
10
+ }
11
+ ]
12
+ }