├── .eslintrc ├── .github └── CODEOWNERS ├── .gitignore ├── CHANGELOG.md ├── README.md ├── package-lock.json ├── package.json └── src ├── debug.js ├── draftHandlers.js ├── handleListenerEvent.js ├── index.js ├── remoteGraphQLSchema.js └── resolveReferences.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["sanity", "prettier"], 3 | "env": { 4 | "node": true 5 | }, 6 | "parserOptions": { 7 | "ecmaVersion": 2018 8 | }, 9 | "rules": { 10 | "complexity": "off" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @sanity-io/ecosystem 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .DS_Store 3 | node_modules 4 | coverage 5 | dist 6 | yarn.lock 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sanity-io/gridsome-source-sanity/2c500549b23d350a5f29c117e7b2b54546fed2af/CHANGELOG.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gridsome-source-sanity 2 | 3 | [Sanity.io](https://www.sanity.io/) source for Gridsome. Requires Gridsome 0.7.1 or above. 4 | 5 | ## Table of contents 6 | 7 | - [Basic usage](#basic-usage) 8 | - [Options](#options) 9 | - [Preview of unpublished content](#preview-of-unpublished-content) 10 | - ["Raw" fields](#raw-fields) 11 | - [Portable Text / Block Content](#portable-text--block-content) 12 | 13 | ## Basic usage 14 | 15 | ```shell 16 | npm install gridsome-source-sanity 17 | # or 18 | yarn add gridsome-source-sanity 19 | ``` 20 | 21 | ### Deploy GraphQL schema 22 | 23 | This source plugin only works if you publish a [GraphQL API](https://www.sanity.io/docs/data-store/graphql) for your project and dataset. It will use the GraphQL API’s schema definitions to set the proper fields for your schema types. 24 | 25 | ```shell 26 | ~/yourSanityProjectFolder > sanity graphql deploy 27 | ``` 28 | 29 | Remember to redeploy the GraphQL API when you have changed the schema for Sanity. 30 | 31 | ### Plugin configuration 32 | 33 | ```javascript 34 | module.exports = { 35 | plugins: [ 36 | { 37 | use: 'gridsome-source-sanity', 38 | options: { 39 | projectId: '', 40 | dataset: '', 41 | // Token is only required if dataset is private 42 | // or `overlayDrafts` is set to true 43 | token: '', 44 | overlayDrafts: false, 45 | // Only enable real-time changes in development 46 | watchMode: process.env.NODE_ENV === "development", 47 | // API Version has to be set to today's date for the latest features. 48 | // See: https://sanity.io/help/js-client-api-version 49 | apiVersion: '2021-10-14', 50 | 51 | // If the Sanity GraphQL API was deployed using `--tag `, 52 | // use `graphqlTag` to specify the tag name. Defaults to `default`. 53 | graphqlTag: 'default' 54 | } 55 | } 56 | ] 57 | } 58 | ``` 59 | 60 | ## Options 61 | 62 | | Options | Type | Default | Description | 63 | | ------------- | ------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 64 | | projectId | string | | **[required]** Your Sanity project's ID | 65 | | dataset | string | | **[required]** The dataset to fetch from | 66 | | token | string | | Authentication token for fetching data from private datasets, or when using `overlayDrafts` [Learn more](https://www.sanity.io/docs/http-auth) | 67 | | graphqlTag | string | `default` | If the Sanity GraphQL API was deployed using `--tag `, use this to specify the tag name. | 68 | | overlayDrafts | boolean | `false` | Set to `true` in order for drafts to replace their published version. By default, drafts will be skipped. | 69 | | watchMode | boolean | `false` | Set to `true` to keep a listener open and update with the latest changes in realtime. If you enable `overlayDrafts`, changes will be reflected almost down to each keypress. This option shouldn't be enabled during build or else the listener will prevent it from being completed. | 70 | | typeName | string | `Sanity` | Prefix for schema types and queries. | 71 | 72 | ## Preview of unpublished content 73 | 74 | Sometimes you might be working on some new content that is not yet published, which you want to make sure looks alright within your Gridsome site. By setting the `overlayDrafts` setting to `true`, the draft versions will as the option says "overlay" the regular document. In terms of Gridsome nodes, it will _replace_ the published document with the draft. 75 | 76 | Keep in mind that drafts do not have to conform to any validation rules, so your frontend will usually want to double-check all nested properties before attempting to use them. 77 | 78 | ## "Raw" fields 79 | 80 | Certain fields (portable text fields being one of them) will get a "raw JSON" representation in a field called `_raw`. For instance, a field named `body` will be mapped to `_rawBody`. This is a workaround for a known GraphQL introspection shortcoming that will be addressed in a future version of Sanity. 81 | 82 | Quite often, you'll want to replace reference fields (eg `_ref: ''`), with the actual document that is referenced. This is done automatically for regular fields, but within raw fields, you have to explicitly enable this behavior, by using the field-level `resolveReferences` argument: 83 | 84 | ```graphql 85 | { 86 | allSanityProject { 87 | edges { 88 | node { 89 | _rawTasks(resolveReferences: {maxDepth: 5}) 90 | } 91 | } 92 | } 93 | } 94 | ``` 95 | 96 | ## Portable Text / Block Content 97 | 98 | Rich text in Sanity is usually represented as [Portable Text](https://www.portabletext.org/) (previously known as "Block Content"). 99 | 100 | These data structures can be deep and a chore to query (specifying all the possible fields). As [noted above](#raw-fields), there is a "raw" alternative available for these fields which is usually what you'll want to use. 101 | 102 | You can install [sanity-blocks-vue-component](https://github.com/rdunk/sanity-blocks-vue-component) from npm and use it in your Gridsome project to serialize Portable Text. It lets you use your own Vue components to override defaults and render custom content types. [Learn more about Portable Text in our documentation](https://www.sanity.io/docs/content-studio/what-you-need-to-know-about-block-text). 103 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gridsome-source-sanity", 3 | "version": "1.2.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.15.7", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 19 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.14.5", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 25 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.14.5", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | }, 44 | "escape-string-regexp": { 45 | "version": "1.0.5", 46 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 47 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 48 | "dev": true 49 | } 50 | } 51 | }, 52 | "@eslint/eslintrc": { 53 | "version": "0.4.3", 54 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 55 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 56 | "dev": true, 57 | "requires": { 58 | "ajv": "^6.12.4", 59 | "debug": "^4.1.1", 60 | "espree": "^7.3.0", 61 | "globals": "^13.9.0", 62 | "ignore": "^4.0.6", 63 | "import-fresh": "^3.2.1", 64 | "js-yaml": "^3.13.1", 65 | "minimatch": "^3.0.4", 66 | "strip-json-comments": "^3.1.1" 67 | } 68 | }, 69 | "@humanwhocodes/config-array": { 70 | "version": "0.5.0", 71 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 72 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 73 | "dev": true, 74 | "requires": { 75 | "@humanwhocodes/object-schema": "^1.2.0", 76 | "debug": "^4.1.1", 77 | "minimatch": "^3.0.4" 78 | } 79 | }, 80 | "@humanwhocodes/object-schema": { 81 | "version": "1.2.0", 82 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", 83 | "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", 84 | "dev": true 85 | }, 86 | "@rexxars/eventsource-polyfill": { 87 | "version": "1.0.0", 88 | "resolved": "https://registry.npmjs.org/@rexxars/eventsource-polyfill/-/eventsource-polyfill-1.0.0.tgz", 89 | "integrity": "sha512-YnrybIoM9WFqmeK1D8p/gutqjJnmXCVFWAU3ucka9M7Dzpen3f2Dy4KsC6k1wDHrCtHQuUHHwZovh3i5UPDaZw==" 90 | }, 91 | "@sanity/client": { 92 | "version": "2.19.0", 93 | "resolved": "https://registry.npmjs.org/@sanity/client/-/client-2.19.0.tgz", 94 | "integrity": "sha512-y3VCTXx0z9n9tIroJUBT70rfCZuyJCNmRVZcMjRSjaLCK7vFJHvACX61OkbfbFo9t8r098g8jXP2XttBUiglLQ==", 95 | "requires": { 96 | "@sanity/eventsource": "2.14.0", 97 | "@sanity/generate-help-url": "2.18.0", 98 | "@sanity/observable": "2.0.9", 99 | "deep-assign": "^2.0.0", 100 | "get-it": "^5.0.3", 101 | "make-error": "^1.3.0", 102 | "object-assign": "^4.1.1" 103 | } 104 | }, 105 | "@sanity/eventsource": { 106 | "version": "2.14.0", 107 | "resolved": "https://registry.npmjs.org/@sanity/eventsource/-/eventsource-2.14.0.tgz", 108 | "integrity": "sha512-U1FgPUwB9//bGT5OO1VgtamSCM2Z3vpWP3mCgN8vPmEUJ0cofAWO+turDbOILahuicH8u7Xnmd+GSB33p4Mg9A==", 109 | "requires": { 110 | "@rexxars/eventsource-polyfill": "^1.0.0", 111 | "eventsource": "^1.0.6" 112 | } 113 | }, 114 | "@sanity/generate-help-url": { 115 | "version": "2.18.0", 116 | "resolved": "https://registry.npmjs.org/@sanity/generate-help-url/-/generate-help-url-2.18.0.tgz", 117 | "integrity": "sha512-If8Qkw32LWPes16UzqwUsTLgfxF5d4ACdUvCLMl6grJc/5G8LKPAGCQUuA/d1F4W16yCJVV7Zv31HDRDXJSJkg==" 118 | }, 119 | "@sanity/observable": { 120 | "version": "2.0.9", 121 | "resolved": "https://registry.npmjs.org/@sanity/observable/-/observable-2.0.9.tgz", 122 | "integrity": "sha512-IUpzsEbhOhofTBUu2tiQ4Ymbkmhr6oe4UC4Ds1khZ9Td4t4mzzPGmGQIr5SBEDawz0UD7ZgZAb4LeEzV3hUrtA==", 123 | "requires": { 124 | "object-assign": "^4.1.1", 125 | "rxjs": "^6.5.3" 126 | } 127 | }, 128 | "@sanity/timed-out": { 129 | "version": "4.0.2", 130 | "resolved": "https://registry.npmjs.org/@sanity/timed-out/-/timed-out-4.0.2.tgz", 131 | "integrity": "sha512-NBDKGj14g9Z+bopIvZcQKWCzJq5JSrdmzRR1CS+iyA3Gm8SnIWBfZa7I3mTg2X6Nu8LQXG0EPKXdOGozLS4i3w==" 132 | }, 133 | "acorn": { 134 | "version": "7.4.1", 135 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 136 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 137 | "dev": true 138 | }, 139 | "acorn-jsx": { 140 | "version": "5.3.2", 141 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 142 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 143 | "dev": true 144 | }, 145 | "ajv": { 146 | "version": "6.12.6", 147 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 148 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 149 | "dev": true, 150 | "requires": { 151 | "fast-deep-equal": "^3.1.1", 152 | "fast-json-stable-stringify": "^2.0.0", 153 | "json-schema-traverse": "^0.4.1", 154 | "uri-js": "^4.2.2" 155 | } 156 | }, 157 | "ansi-colors": { 158 | "version": "4.1.1", 159 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 160 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 161 | "dev": true 162 | }, 163 | "ansi-regex": { 164 | "version": "5.0.1", 165 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 166 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 167 | "dev": true 168 | }, 169 | "ansi-styles": { 170 | "version": "3.2.1", 171 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 172 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 173 | "dev": true, 174 | "requires": { 175 | "color-convert": "^1.9.0" 176 | } 177 | }, 178 | "argparse": { 179 | "version": "1.0.10", 180 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 181 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 182 | "dev": true, 183 | "requires": { 184 | "sprintf-js": "~1.0.2" 185 | } 186 | }, 187 | "astral-regex": { 188 | "version": "2.0.0", 189 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 190 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 191 | "dev": true 192 | }, 193 | "axios": { 194 | "version": "0.22.0", 195 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", 196 | "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", 197 | "requires": { 198 | "follow-redirects": "^1.14.4" 199 | } 200 | }, 201 | "balanced-match": { 202 | "version": "1.0.2", 203 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 204 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 205 | "dev": true 206 | }, 207 | "brace-expansion": { 208 | "version": "1.1.11", 209 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 210 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 211 | "dev": true, 212 | "requires": { 213 | "balanced-match": "^1.0.0", 214 | "concat-map": "0.0.1" 215 | } 216 | }, 217 | "callsites": { 218 | "version": "3.1.0", 219 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 220 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 221 | "dev": true 222 | }, 223 | "capture-stack-trace": { 224 | "version": "1.0.1", 225 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 226 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" 227 | }, 228 | "chalk": { 229 | "version": "4.1.2", 230 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 231 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 232 | "dev": true, 233 | "requires": { 234 | "ansi-styles": "^4.1.0", 235 | "supports-color": "^7.1.0" 236 | }, 237 | "dependencies": { 238 | "ansi-styles": { 239 | "version": "4.3.0", 240 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 241 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 242 | "dev": true, 243 | "requires": { 244 | "color-convert": "^2.0.1" 245 | } 246 | }, 247 | "color-convert": { 248 | "version": "2.0.1", 249 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 250 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 251 | "dev": true, 252 | "requires": { 253 | "color-name": "~1.1.4" 254 | } 255 | }, 256 | "color-name": { 257 | "version": "1.1.4", 258 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 259 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 260 | "dev": true 261 | }, 262 | "has-flag": { 263 | "version": "4.0.0", 264 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 265 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 266 | "dev": true 267 | }, 268 | "supports-color": { 269 | "version": "7.2.0", 270 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 271 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 272 | "dev": true, 273 | "requires": { 274 | "has-flag": "^4.0.0" 275 | } 276 | } 277 | } 278 | }, 279 | "color-convert": { 280 | "version": "1.9.3", 281 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 282 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 283 | "dev": true, 284 | "requires": { 285 | "color-name": "1.1.3" 286 | } 287 | }, 288 | "color-name": { 289 | "version": "1.1.3", 290 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 291 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 292 | "dev": true 293 | }, 294 | "concat-map": { 295 | "version": "0.0.1", 296 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 297 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 298 | "dev": true 299 | }, 300 | "core-util-is": { 301 | "version": "1.0.3", 302 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 303 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 304 | }, 305 | "create-error-class": { 306 | "version": "3.0.2", 307 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 308 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 309 | "requires": { 310 | "capture-stack-trace": "^1.0.0" 311 | } 312 | }, 313 | "cross-spawn": { 314 | "version": "7.0.3", 315 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 316 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 317 | "dev": true, 318 | "requires": { 319 | "path-key": "^3.1.0", 320 | "shebang-command": "^2.0.0", 321 | "which": "^2.0.1" 322 | } 323 | }, 324 | "debug": { 325 | "version": "4.3.2", 326 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 327 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 328 | "requires": { 329 | "ms": "2.1.2" 330 | }, 331 | "dependencies": { 332 | "ms": { 333 | "version": "2.1.2", 334 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 335 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 336 | } 337 | } 338 | }, 339 | "decompress-response": { 340 | "version": "3.3.0", 341 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 342 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 343 | "requires": { 344 | "mimic-response": "^1.0.0" 345 | } 346 | }, 347 | "deep-assign": { 348 | "version": "2.0.0", 349 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", 350 | "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", 351 | "requires": { 352 | "is-obj": "^1.0.0" 353 | } 354 | }, 355 | "deep-is": { 356 | "version": "0.1.4", 357 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 358 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 359 | "dev": true 360 | }, 361 | "doctrine": { 362 | "version": "3.0.0", 363 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 364 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 365 | "dev": true, 366 | "requires": { 367 | "esutils": "^2.0.2" 368 | } 369 | }, 370 | "emoji-regex": { 371 | "version": "8.0.0", 372 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 373 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 374 | "dev": true 375 | }, 376 | "end-of-stream": { 377 | "version": "1.4.1", 378 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 379 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 380 | "requires": { 381 | "once": "^1.4.0" 382 | } 383 | }, 384 | "enquirer": { 385 | "version": "2.3.6", 386 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 387 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 388 | "dev": true, 389 | "requires": { 390 | "ansi-colors": "^4.1.1" 391 | } 392 | }, 393 | "escape-string-regexp": { 394 | "version": "4.0.0", 395 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 396 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 397 | "dev": true 398 | }, 399 | "eslint": { 400 | "version": "7.32.0", 401 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", 402 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", 403 | "dev": true, 404 | "requires": { 405 | "@babel/code-frame": "7.12.11", 406 | "@eslint/eslintrc": "^0.4.3", 407 | "@humanwhocodes/config-array": "^0.5.0", 408 | "ajv": "^6.10.0", 409 | "chalk": "^4.0.0", 410 | "cross-spawn": "^7.0.2", 411 | "debug": "^4.0.1", 412 | "doctrine": "^3.0.0", 413 | "enquirer": "^2.3.5", 414 | "escape-string-regexp": "^4.0.0", 415 | "eslint-scope": "^5.1.1", 416 | "eslint-utils": "^2.1.0", 417 | "eslint-visitor-keys": "^2.0.0", 418 | "espree": "^7.3.1", 419 | "esquery": "^1.4.0", 420 | "esutils": "^2.0.2", 421 | "fast-deep-equal": "^3.1.3", 422 | "file-entry-cache": "^6.0.1", 423 | "functional-red-black-tree": "^1.0.1", 424 | "glob-parent": "^5.1.2", 425 | "globals": "^13.6.0", 426 | "ignore": "^4.0.6", 427 | "import-fresh": "^3.0.0", 428 | "imurmurhash": "^0.1.4", 429 | "is-glob": "^4.0.0", 430 | "js-yaml": "^3.13.1", 431 | "json-stable-stringify-without-jsonify": "^1.0.1", 432 | "levn": "^0.4.1", 433 | "lodash.merge": "^4.6.2", 434 | "minimatch": "^3.0.4", 435 | "natural-compare": "^1.4.0", 436 | "optionator": "^0.9.1", 437 | "progress": "^2.0.0", 438 | "regexpp": "^3.1.0", 439 | "semver": "^7.2.1", 440 | "strip-ansi": "^6.0.0", 441 | "strip-json-comments": "^3.1.0", 442 | "table": "^6.0.9", 443 | "text-table": "^0.2.0", 444 | "v8-compile-cache": "^2.0.3" 445 | } 446 | }, 447 | "eslint-config-prettier": { 448 | "version": "8.3.0", 449 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", 450 | "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", 451 | "dev": true 452 | }, 453 | "eslint-config-sanity": { 454 | "version": "5.1.0", 455 | "resolved": "https://registry.npmjs.org/eslint-config-sanity/-/eslint-config-sanity-5.1.0.tgz", 456 | "integrity": "sha512-kYd4Euy33hDoFxAgLIGtFGm9TB7YpIY5c+atyCESDRh+WnadxhlYSrrJvAUne84CWPZxybe5f4U+m9K+uc/eeQ==", 457 | "dev": true 458 | }, 459 | "eslint-scope": { 460 | "version": "5.1.1", 461 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 462 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 463 | "dev": true, 464 | "requires": { 465 | "esrecurse": "^4.3.0", 466 | "estraverse": "^4.1.1" 467 | } 468 | }, 469 | "eslint-utils": { 470 | "version": "2.1.0", 471 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 472 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 473 | "dev": true, 474 | "requires": { 475 | "eslint-visitor-keys": "^1.1.0" 476 | }, 477 | "dependencies": { 478 | "eslint-visitor-keys": { 479 | "version": "1.3.0", 480 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 481 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 482 | "dev": true 483 | } 484 | } 485 | }, 486 | "eslint-visitor-keys": { 487 | "version": "2.1.0", 488 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 489 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 490 | "dev": true 491 | }, 492 | "espree": { 493 | "version": "7.3.1", 494 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 495 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 496 | "dev": true, 497 | "requires": { 498 | "acorn": "^7.4.0", 499 | "acorn-jsx": "^5.3.1", 500 | "eslint-visitor-keys": "^1.3.0" 501 | }, 502 | "dependencies": { 503 | "eslint-visitor-keys": { 504 | "version": "1.3.0", 505 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 506 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 507 | "dev": true 508 | } 509 | } 510 | }, 511 | "esprima": { 512 | "version": "4.0.1", 513 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 514 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 515 | "dev": true 516 | }, 517 | "esquery": { 518 | "version": "1.4.0", 519 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 520 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 521 | "dev": true, 522 | "requires": { 523 | "estraverse": "^5.1.0" 524 | }, 525 | "dependencies": { 526 | "estraverse": { 527 | "version": "5.2.0", 528 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 529 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 530 | "dev": true 531 | } 532 | } 533 | }, 534 | "esrecurse": { 535 | "version": "4.3.0", 536 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 537 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 538 | "dev": true, 539 | "requires": { 540 | "estraverse": "^5.2.0" 541 | }, 542 | "dependencies": { 543 | "estraverse": { 544 | "version": "5.2.0", 545 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 546 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 547 | "dev": true 548 | } 549 | } 550 | }, 551 | "estraverse": { 552 | "version": "4.3.0", 553 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 554 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 555 | "dev": true 556 | }, 557 | "esutils": { 558 | "version": "2.0.3", 559 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 560 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 561 | "dev": true 562 | }, 563 | "eventsource": { 564 | "version": "1.1.0", 565 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", 566 | "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", 567 | "requires": { 568 | "original": "^1.0.0" 569 | } 570 | }, 571 | "fast-deep-equal": { 572 | "version": "3.1.3", 573 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 574 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 575 | "dev": true 576 | }, 577 | "fast-json-stable-stringify": { 578 | "version": "2.1.0", 579 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 580 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 581 | "dev": true 582 | }, 583 | "fast-levenshtein": { 584 | "version": "2.0.6", 585 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 586 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 587 | "dev": true 588 | }, 589 | "file-entry-cache": { 590 | "version": "6.0.1", 591 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 592 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 593 | "dev": true, 594 | "requires": { 595 | "flat-cache": "^3.0.4" 596 | } 597 | }, 598 | "flat-cache": { 599 | "version": "3.0.4", 600 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 601 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 602 | "dev": true, 603 | "requires": { 604 | "flatted": "^3.1.0", 605 | "rimraf": "^3.0.2" 606 | } 607 | }, 608 | "flatted": { 609 | "version": "3.2.2", 610 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", 611 | "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", 612 | "dev": true 613 | }, 614 | "follow-redirects": { 615 | "version": "1.14.4", 616 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", 617 | "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" 618 | }, 619 | "form-urlencoded": { 620 | "version": "2.0.9", 621 | "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz", 622 | "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA==" 623 | }, 624 | "from2": { 625 | "version": "2.3.0", 626 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 627 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 628 | "requires": { 629 | "inherits": "^2.0.1", 630 | "readable-stream": "^2.0.0" 631 | } 632 | }, 633 | "fs.realpath": { 634 | "version": "1.0.0", 635 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 636 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 637 | "dev": true 638 | }, 639 | "functional-red-black-tree": { 640 | "version": "1.0.1", 641 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 642 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 643 | "dev": true 644 | }, 645 | "get-it": { 646 | "version": "5.0.5", 647 | "resolved": "https://registry.npmjs.org/get-it/-/get-it-5.0.5.tgz", 648 | "integrity": "sha512-P5McakQI/9611hP0cYqyF0VlhxQj49ok21TvCbNEqBfsVVC/ZnmYPP91bky4N4/Oy1HmXFZ/CMh6CCH8nAgLpQ==", 649 | "requires": { 650 | "@sanity/timed-out": "^4.0.2", 651 | "create-error-class": "^3.0.2", 652 | "debug": "^2.6.8", 653 | "decompress-response": "^3.3.0", 654 | "follow-redirects": "^1.2.4", 655 | "form-urlencoded": "^2.0.7", 656 | "in-publish": "^2.0.0", 657 | "into-stream": "^3.1.0", 658 | "is-plain-object": "^2.0.4", 659 | "is-retry-allowed": "^1.1.0", 660 | "is-stream": "^1.1.0", 661 | "nano-pubsub": "^1.0.2", 662 | "object-assign": "^4.1.1", 663 | "parse-headers": "^2.0.1", 664 | "progress-stream": "^2.0.0", 665 | "same-origin": "^0.1.1", 666 | "simple-concat": "^1.0.0", 667 | "tunnel-agent": "^0.6.0", 668 | "url-parse": "^1.1.9" 669 | }, 670 | "dependencies": { 671 | "debug": { 672 | "version": "2.6.9", 673 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 674 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 675 | "requires": { 676 | "ms": "2.0.0" 677 | } 678 | } 679 | } 680 | }, 681 | "glob": { 682 | "version": "7.2.0", 683 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 684 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 685 | "dev": true, 686 | "requires": { 687 | "fs.realpath": "^1.0.0", 688 | "inflight": "^1.0.4", 689 | "inherits": "2", 690 | "minimatch": "^3.0.4", 691 | "once": "^1.3.0", 692 | "path-is-absolute": "^1.0.0" 693 | } 694 | }, 695 | "glob-parent": { 696 | "version": "5.1.2", 697 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 698 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 699 | "dev": true, 700 | "requires": { 701 | "is-glob": "^4.0.1" 702 | } 703 | }, 704 | "globals": { 705 | "version": "13.11.0", 706 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", 707 | "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", 708 | "dev": true, 709 | "requires": { 710 | "type-fest": "^0.20.2" 711 | } 712 | }, 713 | "graphql": { 714 | "version": "15.6.1", 715 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.6.1.tgz", 716 | "integrity": "sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw==" 717 | }, 718 | "has-flag": { 719 | "version": "3.0.0", 720 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 721 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 722 | "dev": true 723 | }, 724 | "ignore": { 725 | "version": "4.0.6", 726 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 727 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 728 | "dev": true 729 | }, 730 | "import-fresh": { 731 | "version": "3.3.0", 732 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 733 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 734 | "dev": true, 735 | "requires": { 736 | "parent-module": "^1.0.0", 737 | "resolve-from": "^4.0.0" 738 | } 739 | }, 740 | "imurmurhash": { 741 | "version": "0.1.4", 742 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 743 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 744 | "dev": true 745 | }, 746 | "in-publish": { 747 | "version": "2.0.1", 748 | "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", 749 | "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" 750 | }, 751 | "inflight": { 752 | "version": "1.0.6", 753 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 754 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 755 | "dev": true, 756 | "requires": { 757 | "once": "^1.3.0", 758 | "wrappy": "1" 759 | } 760 | }, 761 | "inherits": { 762 | "version": "2.0.3", 763 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 764 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 765 | }, 766 | "into-stream": { 767 | "version": "3.1.0", 768 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 769 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 770 | "requires": { 771 | "from2": "^2.1.1", 772 | "p-is-promise": "^1.1.0" 773 | } 774 | }, 775 | "is-extglob": { 776 | "version": "2.1.1", 777 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 778 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 779 | "dev": true 780 | }, 781 | "is-fullwidth-code-point": { 782 | "version": "3.0.0", 783 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 784 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 785 | "dev": true 786 | }, 787 | "is-glob": { 788 | "version": "4.0.3", 789 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 790 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 791 | "dev": true, 792 | "requires": { 793 | "is-extglob": "^2.1.1" 794 | } 795 | }, 796 | "is-obj": { 797 | "version": "1.0.1", 798 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 799 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 800 | }, 801 | "is-plain-object": { 802 | "version": "2.0.4", 803 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 804 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 805 | "requires": { 806 | "isobject": "^3.0.1" 807 | } 808 | }, 809 | "is-retry-allowed": { 810 | "version": "1.2.0", 811 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 812 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" 813 | }, 814 | "is-stream": { 815 | "version": "1.1.0", 816 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 817 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 818 | }, 819 | "isarray": { 820 | "version": "1.0.0", 821 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 822 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 823 | }, 824 | "isexe": { 825 | "version": "2.0.0", 826 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 827 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 828 | "dev": true 829 | }, 830 | "isobject": { 831 | "version": "3.0.1", 832 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 833 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 834 | }, 835 | "js-tokens": { 836 | "version": "4.0.0", 837 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 838 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 839 | "dev": true 840 | }, 841 | "js-yaml": { 842 | "version": "3.14.1", 843 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 844 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 845 | "dev": true, 846 | "requires": { 847 | "argparse": "^1.0.7", 848 | "esprima": "^4.0.0" 849 | } 850 | }, 851 | "json-schema-traverse": { 852 | "version": "0.4.1", 853 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 854 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 855 | "dev": true 856 | }, 857 | "json-stable-stringify-without-jsonify": { 858 | "version": "1.0.1", 859 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 860 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 861 | "dev": true 862 | }, 863 | "levn": { 864 | "version": "0.4.1", 865 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 866 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 867 | "dev": true, 868 | "requires": { 869 | "prelude-ls": "^1.2.1", 870 | "type-check": "~0.4.0" 871 | } 872 | }, 873 | "lodash": { 874 | "version": "4.17.21", 875 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 876 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 877 | }, 878 | "lodash.clonedeep": { 879 | "version": "4.5.0", 880 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 881 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 882 | "dev": true 883 | }, 884 | "lodash.merge": { 885 | "version": "4.6.2", 886 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 887 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 888 | "dev": true 889 | }, 890 | "lodash.truncate": { 891 | "version": "4.4.2", 892 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 893 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 894 | "dev": true 895 | }, 896 | "lru-cache": { 897 | "version": "6.0.0", 898 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 899 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 900 | "dev": true, 901 | "requires": { 902 | "yallist": "^4.0.0" 903 | } 904 | }, 905 | "make-error": { 906 | "version": "1.3.6", 907 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 908 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" 909 | }, 910 | "mimic-response": { 911 | "version": "1.0.1", 912 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 913 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 914 | }, 915 | "minimatch": { 916 | "version": "3.0.4", 917 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 918 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 919 | "dev": true, 920 | "requires": { 921 | "brace-expansion": "^1.1.7" 922 | } 923 | }, 924 | "ms": { 925 | "version": "2.0.0", 926 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 927 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 928 | }, 929 | "nano-pubsub": { 930 | "version": "1.0.2", 931 | "resolved": "https://registry.npmjs.org/nano-pubsub/-/nano-pubsub-1.0.2.tgz", 932 | "integrity": "sha1-NM53b3r5WZFbj3rP6N1rnGbzvek=" 933 | }, 934 | "natural-compare": { 935 | "version": "1.4.0", 936 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 937 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 938 | "dev": true 939 | }, 940 | "object-assign": { 941 | "version": "4.1.1", 942 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 943 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 944 | }, 945 | "once": { 946 | "version": "1.4.0", 947 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 948 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 949 | "requires": { 950 | "wrappy": "1" 951 | } 952 | }, 953 | "oneline": { 954 | "version": "1.0.3", 955 | "resolved": "https://registry.npmjs.org/oneline/-/oneline-1.0.3.tgz", 956 | "integrity": "sha512-KWLrLloG/ShWvvWuvmOL2jw17++ufGdbkKC2buI2Aa6AaM4AkjCtpeJZg60EK34NQVo2qu1mlPrC2uhvQgCrhQ==" 957 | }, 958 | "optionator": { 959 | "version": "0.9.1", 960 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 961 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 962 | "dev": true, 963 | "requires": { 964 | "deep-is": "^0.1.3", 965 | "fast-levenshtein": "^2.0.6", 966 | "levn": "^0.4.1", 967 | "prelude-ls": "^1.2.1", 968 | "type-check": "^0.4.0", 969 | "word-wrap": "^1.2.3" 970 | } 971 | }, 972 | "original": { 973 | "version": "1.0.2", 974 | "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", 975 | "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", 976 | "requires": { 977 | "url-parse": "^1.4.3" 978 | } 979 | }, 980 | "p-is-promise": { 981 | "version": "1.1.0", 982 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 983 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" 984 | }, 985 | "parent-module": { 986 | "version": "1.0.1", 987 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 988 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 989 | "dev": true, 990 | "requires": { 991 | "callsites": "^3.0.0" 992 | } 993 | }, 994 | "parse-headers": { 995 | "version": "2.0.4", 996 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz", 997 | "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==" 998 | }, 999 | "path-is-absolute": { 1000 | "version": "1.0.1", 1001 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1002 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1003 | "dev": true 1004 | }, 1005 | "path-key": { 1006 | "version": "3.1.1", 1007 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1008 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1009 | "dev": true 1010 | }, 1011 | "prelude-ls": { 1012 | "version": "1.2.1", 1013 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1014 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1015 | "dev": true 1016 | }, 1017 | "prettier": { 1018 | "version": "2.4.1", 1019 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", 1020 | "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", 1021 | "dev": true 1022 | }, 1023 | "process-nextick-args": { 1024 | "version": "2.0.1", 1025 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1026 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1027 | }, 1028 | "progress": { 1029 | "version": "2.0.3", 1030 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1031 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1032 | "dev": true 1033 | }, 1034 | "progress-stream": { 1035 | "version": "2.0.0", 1036 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz", 1037 | "integrity": "sha1-+sY6Cz0R3qy7CWmrzJOyFLzhntU=", 1038 | "requires": { 1039 | "speedometer": "~1.0.0", 1040 | "through2": "~2.0.3" 1041 | }, 1042 | "dependencies": { 1043 | "through2": { 1044 | "version": "2.0.5", 1045 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1046 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1047 | "requires": { 1048 | "readable-stream": "~2.3.6", 1049 | "xtend": "~4.0.1" 1050 | } 1051 | } 1052 | } 1053 | }, 1054 | "pump": { 1055 | "version": "3.0.0", 1056 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1057 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1058 | "requires": { 1059 | "end-of-stream": "^1.1.0", 1060 | "once": "^1.3.1" 1061 | } 1062 | }, 1063 | "punycode": { 1064 | "version": "2.1.1", 1065 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1066 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1067 | "dev": true 1068 | }, 1069 | "querystringify": { 1070 | "version": "2.2.0", 1071 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 1072 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" 1073 | }, 1074 | "readable-stream": { 1075 | "version": "2.3.7", 1076 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1077 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1078 | "requires": { 1079 | "core-util-is": "~1.0.0", 1080 | "inherits": "~2.0.3", 1081 | "isarray": "~1.0.0", 1082 | "process-nextick-args": "~2.0.0", 1083 | "safe-buffer": "~5.1.1", 1084 | "string_decoder": "~1.1.1", 1085 | "util-deprecate": "~1.0.1" 1086 | } 1087 | }, 1088 | "regexpp": { 1089 | "version": "3.2.0", 1090 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1091 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1092 | "dev": true 1093 | }, 1094 | "require-from-string": { 1095 | "version": "2.0.2", 1096 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1097 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1098 | "dev": true 1099 | }, 1100 | "requires-port": { 1101 | "version": "1.0.0", 1102 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1103 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" 1104 | }, 1105 | "resolve-from": { 1106 | "version": "4.0.0", 1107 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1108 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1109 | "dev": true 1110 | }, 1111 | "rimraf": { 1112 | "version": "3.0.2", 1113 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1114 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1115 | "dev": true, 1116 | "requires": { 1117 | "glob": "^7.1.3" 1118 | } 1119 | }, 1120 | "rxjs": { 1121 | "version": "6.6.7", 1122 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1123 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1124 | "requires": { 1125 | "tslib": "^1.9.0" 1126 | } 1127 | }, 1128 | "safe-buffer": { 1129 | "version": "5.1.2", 1130 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1131 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1132 | }, 1133 | "same-origin": { 1134 | "version": "0.1.1", 1135 | "resolved": "https://registry.npmjs.org/same-origin/-/same-origin-0.1.1.tgz", 1136 | "integrity": "sha1-wih9MZJXffUXrLvW0UUanDw5FPU=" 1137 | }, 1138 | "semver": { 1139 | "version": "7.3.5", 1140 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1141 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1142 | "dev": true, 1143 | "requires": { 1144 | "lru-cache": "^6.0.0" 1145 | } 1146 | }, 1147 | "shebang-command": { 1148 | "version": "2.0.0", 1149 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1150 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1151 | "dev": true, 1152 | "requires": { 1153 | "shebang-regex": "^3.0.0" 1154 | } 1155 | }, 1156 | "shebang-regex": { 1157 | "version": "3.0.0", 1158 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1159 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1160 | "dev": true 1161 | }, 1162 | "simple-concat": { 1163 | "version": "1.0.1", 1164 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1165 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 1166 | }, 1167 | "slice-ansi": { 1168 | "version": "4.0.0", 1169 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 1170 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 1171 | "dev": true, 1172 | "requires": { 1173 | "ansi-styles": "^4.0.0", 1174 | "astral-regex": "^2.0.0", 1175 | "is-fullwidth-code-point": "^3.0.0" 1176 | }, 1177 | "dependencies": { 1178 | "ansi-styles": { 1179 | "version": "4.3.0", 1180 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1181 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1182 | "dev": true, 1183 | "requires": { 1184 | "color-convert": "^2.0.1" 1185 | } 1186 | }, 1187 | "color-convert": { 1188 | "version": "2.0.1", 1189 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1190 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1191 | "dev": true, 1192 | "requires": { 1193 | "color-name": "~1.1.4" 1194 | } 1195 | }, 1196 | "color-name": { 1197 | "version": "1.1.4", 1198 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1199 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1200 | "dev": true 1201 | } 1202 | } 1203 | }, 1204 | "speedometer": { 1205 | "version": "1.0.0", 1206 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", 1207 | "integrity": "sha1-zWccsGdSwivKM3Di8zREC+T8YuI=" 1208 | }, 1209 | "split2": { 1210 | "version": "3.2.2", 1211 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 1212 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 1213 | "requires": { 1214 | "readable-stream": "^3.0.0" 1215 | }, 1216 | "dependencies": { 1217 | "readable-stream": { 1218 | "version": "3.6.0", 1219 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1220 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1221 | "requires": { 1222 | "inherits": "^2.0.3", 1223 | "string_decoder": "^1.1.1", 1224 | "util-deprecate": "^1.0.1" 1225 | } 1226 | } 1227 | } 1228 | }, 1229 | "sprintf-js": { 1230 | "version": "1.0.3", 1231 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1232 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1233 | "dev": true 1234 | }, 1235 | "string-width": { 1236 | "version": "4.2.3", 1237 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1238 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1239 | "dev": true, 1240 | "requires": { 1241 | "emoji-regex": "^8.0.0", 1242 | "is-fullwidth-code-point": "^3.0.0", 1243 | "strip-ansi": "^6.0.1" 1244 | } 1245 | }, 1246 | "string_decoder": { 1247 | "version": "1.1.1", 1248 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1249 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1250 | "requires": { 1251 | "safe-buffer": "~5.1.0" 1252 | } 1253 | }, 1254 | "strip-ansi": { 1255 | "version": "6.0.1", 1256 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1257 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1258 | "dev": true, 1259 | "requires": { 1260 | "ansi-regex": "^5.0.1" 1261 | } 1262 | }, 1263 | "strip-json-comments": { 1264 | "version": "3.1.1", 1265 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1266 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1267 | "dev": true 1268 | }, 1269 | "supports-color": { 1270 | "version": "5.5.0", 1271 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1272 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1273 | "dev": true, 1274 | "requires": { 1275 | "has-flag": "^3.0.0" 1276 | } 1277 | }, 1278 | "table": { 1279 | "version": "6.7.2", 1280 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", 1281 | "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", 1282 | "dev": true, 1283 | "requires": { 1284 | "ajv": "^8.0.1", 1285 | "lodash.clonedeep": "^4.5.0", 1286 | "lodash.truncate": "^4.4.2", 1287 | "slice-ansi": "^4.0.0", 1288 | "string-width": "^4.2.3", 1289 | "strip-ansi": "^6.0.1" 1290 | }, 1291 | "dependencies": { 1292 | "ajv": { 1293 | "version": "8.6.3", 1294 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", 1295 | "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", 1296 | "dev": true, 1297 | "requires": { 1298 | "fast-deep-equal": "^3.1.1", 1299 | "json-schema-traverse": "^1.0.0", 1300 | "require-from-string": "^2.0.2", 1301 | "uri-js": "^4.2.2" 1302 | } 1303 | }, 1304 | "json-schema-traverse": { 1305 | "version": "1.0.0", 1306 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1307 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1308 | "dev": true 1309 | } 1310 | } 1311 | }, 1312 | "text-table": { 1313 | "version": "0.2.0", 1314 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1315 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1316 | "dev": true 1317 | }, 1318 | "through2": { 1319 | "version": "3.0.1", 1320 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", 1321 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", 1322 | "requires": { 1323 | "readable-stream": "2 || 3" 1324 | }, 1325 | "dependencies": { 1326 | "readable-stream": { 1327 | "version": "3.4.0", 1328 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 1329 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 1330 | "requires": { 1331 | "inherits": "^2.0.3", 1332 | "string_decoder": "^1.1.1", 1333 | "util-deprecate": "^1.0.1" 1334 | } 1335 | } 1336 | } 1337 | }, 1338 | "tslib": { 1339 | "version": "1.14.1", 1340 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1341 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1342 | }, 1343 | "tunnel-agent": { 1344 | "version": "0.6.0", 1345 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1346 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1347 | "requires": { 1348 | "safe-buffer": "^5.0.1" 1349 | } 1350 | }, 1351 | "type-check": { 1352 | "version": "0.4.0", 1353 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1354 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1355 | "dev": true, 1356 | "requires": { 1357 | "prelude-ls": "^1.2.1" 1358 | } 1359 | }, 1360 | "type-fest": { 1361 | "version": "0.20.2", 1362 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1363 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1364 | "dev": true 1365 | }, 1366 | "uri-js": { 1367 | "version": "4.4.1", 1368 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1369 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1370 | "dev": true, 1371 | "requires": { 1372 | "punycode": "^2.1.0" 1373 | } 1374 | }, 1375 | "url-parse": { 1376 | "version": "1.5.3", 1377 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", 1378 | "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", 1379 | "requires": { 1380 | "querystringify": "^2.1.1", 1381 | "requires-port": "^1.0.0" 1382 | } 1383 | }, 1384 | "util-deprecate": { 1385 | "version": "1.0.2", 1386 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1387 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1388 | }, 1389 | "v8-compile-cache": { 1390 | "version": "2.3.0", 1391 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1392 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1393 | "dev": true 1394 | }, 1395 | "which": { 1396 | "version": "2.0.2", 1397 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1398 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1399 | "dev": true, 1400 | "requires": { 1401 | "isexe": "^2.0.0" 1402 | } 1403 | }, 1404 | "word-wrap": { 1405 | "version": "1.2.3", 1406 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1407 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1408 | "dev": true 1409 | }, 1410 | "wrappy": { 1411 | "version": "1.0.2", 1412 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1413 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1414 | }, 1415 | "xtend": { 1416 | "version": "4.0.2", 1417 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1418 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1419 | }, 1420 | "yallist": { 1421 | "version": "4.0.0", 1422 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1423 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1424 | "dev": true 1425 | } 1426 | } 1427 | } 1428 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gridsome-source-sanity", 3 | "version": "1.2.0", 4 | "description": "Sanity.io source for Gridsome", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "publishConfig": { 10 | "access": "public" 11 | }, 12 | "engines": { 13 | "node": ">=8.0.0" 14 | }, 15 | "keywords": [ 16 | "gridsome", 17 | "gridsome-plugin", 18 | "gridsome-source", 19 | "sanity" 20 | ], 21 | "author": "Sanity.io ", 22 | "license": "MIT", 23 | "dependencies": { 24 | "@sanity/client": "^2.19.0", 25 | "axios": "^0.22.0", 26 | "debug": "^4.3.2", 27 | "graphql": "^15.6.1", 28 | "lodash": "^4.17.21", 29 | "oneline": "^1.0.3", 30 | "pump": "^3.0.0", 31 | "split2": "^3.2.2", 32 | "through2": "^3.0.1" 33 | }, 34 | "devDependencies": { 35 | "eslint": "^7.32.0", 36 | "eslint-config-prettier": "^8.3.0", 37 | "eslint-config-sanity": "^5.1.0", 38 | "prettier": "^2.4.1" 39 | }, 40 | "peerDependencies": { 41 | "gridsome": ">=0.7.1" 42 | }, 43 | "prettier": { 44 | "useTabs": false, 45 | "singleQuote": true, 46 | "trailingComma": "none", 47 | "semi": false, 48 | "printWidth": 100, 49 | "bracketSpacing": false 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/debug.js: -------------------------------------------------------------------------------- 1 | const debug = require('debug') 2 | 3 | module.exports = debug('sanity') 4 | -------------------------------------------------------------------------------- /src/draftHandlers.js: -------------------------------------------------------------------------------- 1 | const through = require('through2') 2 | 3 | function filter(doc, enc, callback) { 4 | return isDraft(doc) ? callback() : callback(null, doc) 5 | } 6 | 7 | function isDraft(doc) { 8 | return doc && doc._id && isDraftId(doc._id) 9 | } 10 | 11 | function isDraftId(id) { 12 | return id.startsWith('drafts.') 13 | } 14 | 15 | function unprefixDraftId(id) { 16 | return id.replace(/^drafts\./, '') 17 | } 18 | 19 | exports.isDraft = isDraft 20 | exports.isDraftId = isDraftId 21 | exports.unprefixDraftId = unprefixDraftId 22 | 23 | exports.prefixId = id => (id.startsWith('drafts.') ? id : `drafts.${id}`) 24 | 25 | exports.unprefixId = id => id.replace(/^drafts\./, '') 26 | 27 | exports.removeDrafts = () => through.obj(filter) 28 | 29 | exports.extractDrafts = (drafts, published) => 30 | through.obj((doc, enc, callback) => { 31 | if (isDraft(doc)) { 32 | drafts.push(doc) 33 | callback() // Don't include in doc stream 34 | return 35 | } 36 | 37 | published.set(doc._id, doc) 38 | callback(null, doc) 39 | }) 40 | -------------------------------------------------------------------------------- /src/handleListenerEvent.js: -------------------------------------------------------------------------------- 1 | const debug = require('./debug') 2 | const {unprefixId, isDraftId} = require('./draftHandlers') 3 | 4 | module.exports = function handleListenerEvent(event, options, docs) { 5 | const {store, getUid, overlayDrafts, addDocumentToCollection, getCollectionForType} = options 6 | 7 | const uid = getUid(unprefixId(event.documentId)) 8 | const current = store.getNodeByUid(uid) 9 | const collection = current && getCollectionForType(current._type, store) 10 | const published = docs.published.get(unprefixId(event.documentId)) 11 | const touchedIsDraft = isDraftId(event.documentId) 12 | const currentIsDraft = current && isDraftId(current._id) 13 | 14 | // In non-overlay mode, things are pretty simple - 15 | // replace the current on create/update, delete the current if it disappears 16 | if (!overlayDrafts) { 17 | if (touchedIsDraft) { 18 | debug('Document is draft, but draft overlay disabled. Skipping.') 19 | return 20 | } 21 | 22 | if (event.transition !== 'disappear') { 23 | // Created/updated, replace current 24 | debug('Published document created or updated, replace/create') 25 | addDocumentToCollection(event.result, store) 26 | } else if (current) { 27 | // Deleted a node that we currently have, delete it 28 | debug('Published document deleted, remove') 29 | collection.removeNode(unprefixId(event.documentId)) 30 | } 31 | 32 | return 33 | } 34 | 35 | // In overlay mode, things are a bit more tricky. 36 | // We need to keep a copy of the published documents around so we can 37 | // put the published version back if a draft is discarded (deleted). 38 | // If a published document is updated but there is still a draft, 39 | // we still want to show the draft. A lot of cases here, unfortunately. 40 | if (event.transition === 'disappear') { 41 | // A document was deleted 42 | if (touchedIsDraft && published) { 43 | debug('Draft deleted, published version exists, restore published version') 44 | addDocumentToCollection(published, store) 45 | } else if (touchedIsDraft && !published && current) { 46 | debug('Draft deleted, no published version exist, delete node') 47 | collection.removeNode(unprefixId(current._id)) 48 | } else if (!touchedIsDraft && currentIsDraft && published) { 49 | debug('Published version deleted, but we have draft, remove published from working set') 50 | docs.published.delete(event.documentId) 51 | } else if (!touchedIsDraft && !currentIsDraft && current) { 52 | debug('Published version deleted, we have no draft, remove node entirely') 53 | collection.removeNode(unprefixId(current._id)) 54 | docs.published.delete(event.documentId) 55 | } 56 | 57 | return 58 | } 59 | 60 | // Overlay mode, and a document was updated / created 61 | if (touchedIsDraft) { 62 | debug(current ? 'Replace the current draft with a new draft' : 'New draft discovered') 63 | addDocumentToCollection(event.result, store) 64 | 65 | // If the currently used node is a published one, make sure we keep a copy 66 | if (current && !currentIsDraft) { 67 | docs.published.set(unprefixId(event.documentId), current) 68 | } 69 | } else if (currentIsDraft) { 70 | // Creating/updating a published document, but we have a draft 71 | // Keep the draft as the current, but update our set of published docs 72 | debug('Created/updating published document, but draft overlays it') 73 | docs.published.set(event.documentId, event.result) 74 | } else { 75 | // Creating/updating a published document, and there is no draft version present 76 | // Replace the current version with the new one 77 | debug('Created/updating published document, no draft present') 78 | addDocumentToCollection(event.result, store) 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const crypto = require('crypto') 3 | const {valueFromASTUntyped} = require('graphql') 4 | const axios = require('axios') 5 | const pumpIt = require('pump') 6 | const split = require('split2') 7 | const through = require('through2') 8 | const oneline = require('oneline') 9 | const {startCase} = require('lodash') 10 | const sanityClient = require('@sanity/client') 11 | const {version} = require('../package.json') 12 | const resolveReferences = require('./resolveReferences') 13 | const handleListenerEvent = require('./handleListenerEvent') 14 | const getRemoteGraphQLSchema = require('./remoteGraphQLSchema') 15 | const {extractDrafts, removeDrafts, unprefixDraftId} = require('./draftHandlers') 16 | 17 | const gqlScalarTypes = ['String', 'Int', 'Float', 'Boolean', 'ID'] 18 | 19 | class SanitySource { 20 | static defaultOptions() { 21 | return { 22 | typeName: 'Sanity', 23 | projectId: '', 24 | dataset: '', 25 | token: '', 26 | graphqlTag: 'default', 27 | overlayDrafts: false, 28 | watchMode: false 29 | } 30 | } 31 | 32 | constructor(api, options) { 33 | this.options = options 34 | 35 | const {projectId, dataset, token, overlayDrafts, graphqlTag, apiVersion = "2021-03-25"} = options 36 | 37 | if (overlayDrafts && !token) { 38 | console.warn('[sanity] `overlayDrafts` set to true, but no `token` specified!') 39 | } 40 | 41 | // We're passing these methods around to helpers, so bind them for correct scoping 42 | this.getUid = this.getUid.bind(this) 43 | this.getCollectionForType = this.getCollectionForType.bind(this) 44 | this.addDocumentToCollection = this.addDocumentToCollection.bind(this) 45 | 46 | this.uidPrefix = sha1([projectId, dataset, token].join('-')) 47 | this.client = sanityClient({ 48 | apiVersion, 49 | useCdn: false, 50 | projectId, 51 | dataset, 52 | token 53 | }) 54 | 55 | api.loadSource(async store => { 56 | const remoteSchema = await getRemoteGraphQLSchema(this.client, graphqlTag) 57 | await this.declareContentTypes(store, remoteSchema) 58 | await this.getDocuments(store) 59 | }) 60 | 61 | api.createSchema(({ addSchemaTypes }) => { 62 | addSchemaTypes(` 63 | type SanityDocument implements Node @infer { 64 | id: ID! 65 | } 66 | `) 67 | }) 68 | } 69 | 70 | makeTypeName(originalName) { 71 | return `${this.options.typeName}${originalName}`.replace(/^SanitySanity/, 'Sanity') 72 | } 73 | 74 | declareContentTypes(store, remoteSchema) { 75 | const {addSchemaTypes} = store 76 | 77 | addSchemaTypes(` 78 | input SanityResolveReferencesConfiguration { 79 | maxDepth: Int! 80 | } 81 | `) 82 | 83 | addSchemaTypes( 84 | remoteSchema.definitions 85 | .filter(def => ['ObjectTypeDefinition', 'UnionTypeDefinition'].includes(def.kind)) 86 | .map(def => 87 | def.kind === 'ObjectTypeDefinition' 88 | ? this.createObjectType(def, store, remoteSchema) 89 | : this.createUnionType(def, store, remoteSchema) 90 | ) 91 | ) 92 | } 93 | 94 | // eslint-disable-next-line class-methods-use-this 95 | createObjectType(graphqlType, store) { 96 | const {overlayDrafts} = this.options 97 | const {addCollection, schema} = store 98 | const {createObjectType} = schema 99 | const graphqlName = graphqlType.name.value 100 | const typeName = this.makeTypeName(graphqlName) 101 | const isDocumentType = graphqlType.interfaces.some(iface => iface.name.value === 'Document') 102 | 103 | const fields = isDocumentType ? {id: {type: 'ID!'}} : {} 104 | 105 | // Regular fields 106 | graphqlType.fields 107 | .filter(field => !getJsonAliasDirective(field)) 108 | .map(field => ({...field, unwrappedType: unwrapType(field.type)})) 109 | .forEach(field => { 110 | const unwrappedName = field.unwrappedType.name.value 111 | const unwrapped = makeNullable(field) 112 | const isList = field.type.kind === 'ListType' || unwrapped.kind === 'ListType' 113 | 114 | // Scalar type? 115 | if (gqlScalarTypes.includes(unwrappedName)) { 116 | fields[field.name.value] = { 117 | // Custom resolver not necessary since it's 1:1 with field name and primitive type 118 | type: isList ? `[${unwrappedName}]` : unwrappedName 119 | } 120 | return 121 | } 122 | 123 | // Remap Date/DateTime to Date 124 | if (unwrappedName === 'DateTime' || unwrappedName === 'Date') { 125 | fields[field.name.value] = { 126 | type: isList ? '[Date]' : 'Date' 127 | } 128 | return 129 | } 130 | 131 | // Maps to one of our own types 132 | const targetName = this.makeTypeName(unwrappedName) 133 | fields[field.name.value] = { 134 | type: isList ? `[${targetName}]` : targetName, 135 | resolve: (source, args, context) => { 136 | if (isList) { 137 | const items = source[field.name.value] || [] 138 | return items && Array.isArray(items) 139 | ? items.map(item => this.maybeResolveReference(item, context.store)) 140 | : [] 141 | } 142 | 143 | return this.maybeResolveReference(source[field.name.value], context.store) 144 | } 145 | } 146 | }) 147 | 148 | // JSON aliases 149 | graphqlType.fields 150 | .map(getJsonAliasDirective) 151 | .filter(Boolean) 152 | .forEach(jsonField => { 153 | fields[`_raw${ucFirst(jsonField.aliasFor)}`] = { 154 | type: 'JSON', 155 | args: { 156 | resolveReferences: { 157 | type: 'SanityResolveReferencesConfiguration' 158 | } 159 | }, 160 | resolve: (source, args, context) => { 161 | const resolveContext = {store: context.store, getUid: this.getUid, overlayDrafts} 162 | const value = source[jsonField.aliasFor] 163 | return args.resolveReferences 164 | ? resolveReferences(value, 0, args.resolveReferences.maxDepth, resolveContext) 165 | : value 166 | } 167 | } 168 | }) 169 | 170 | if (isDocumentType) { 171 | addCollection({ 172 | typeName, 173 | dateField: '_createdAt' 174 | }) 175 | } 176 | 177 | return createObjectType({ 178 | name: typeName, 179 | interfaces: isDocumentType ? ['Node'] : [], 180 | fields 181 | }) 182 | } 183 | 184 | // eslint-disable-next-line class-methods-use-this 185 | createUnionType(graphqlType, store, gqlSchema) { 186 | const {schema} = store 187 | const {createUnionType} = schema 188 | const graphqlName = graphqlType.name.value 189 | const typeName = this.makeTypeName(graphqlName) 190 | const allDocuments = graphqlType.types.every(type => { 191 | const target = gqlSchema.definitions.find( 192 | def => def.name && def.name.value === type.name.value 193 | ) 194 | return target && target.interfaces.some(iface => iface.name.value === 'Document') 195 | }) 196 | 197 | const targetTypeNames = graphqlType.types.map(type => this.makeTypeName(type.name.value)) 198 | 199 | return createUnionType({ 200 | name: typeName, 201 | interfaces: allDocuments ? ['Node'] : [], 202 | types: targetTypeNames, 203 | resolveType: (data, context, info) => { 204 | const gqlTypeName = data._type && getGraphQLTypeName(data._type) 205 | const target = gqlTypeName && this.makeTypeName(gqlTypeName) 206 | const type = target && info.schema.getType(target) 207 | return type || null 208 | } 209 | }) 210 | } 211 | 212 | maybeResolveReference(item, store) { 213 | if (item && typeof item._ref === 'string') { 214 | return store.getNodeByUid(this.getUid(item._ref)) 215 | } 216 | 217 | return item 218 | } 219 | 220 | async getDocuments(store) { 221 | const {getUid, addDocumentToCollection} = this 222 | const {overlayDrafts, watchMode} = this.options 223 | const {dataset, token} = this.client.config() 224 | 225 | const url = this.client.getUrl(`/data/export/${dataset}`) 226 | const inputStream = await getDocumentStream(url, token) 227 | 228 | // Mutated by overlayed drafts handling 229 | const drafts = [] 230 | const published = new Map() 231 | 232 | await pump([ 233 | inputStream, 234 | split(JSON.parse), 235 | rejectOnApiError(), 236 | overlayDrafts ? extractDrafts(drafts, published) : removeDrafts(), 237 | removeSystemDocuments(), 238 | this.addDocumentsToCollection(store) 239 | ]) 240 | 241 | if (drafts.length > 0) { 242 | console.info('[sanity] Overlaying drafts') 243 | drafts.forEach(draft => this.addDocumentToCollection(draft, store)) 244 | } 245 | 246 | if (watchMode) { 247 | console.info('[sanity] Watch mode enabled, starting a listener') 248 | 249 | const filters = ['!(_id in path("_.**"))'] 250 | if (!overlayDrafts) { 251 | filters.push('!(_id in path("drafts.**"))') 252 | } 253 | 254 | const docs = {drafts, published} 255 | const {getCollectionForType} = this 256 | const options = { 257 | store, 258 | overlayDrafts, 259 | getUid, 260 | addDocumentToCollection, 261 | getCollectionForType 262 | } 263 | 264 | this.client.listen(`*[${filters.join(' && ')}]`).subscribe(event => { 265 | handleListenerEvent(event, options, docs) 266 | }) 267 | } 268 | } 269 | 270 | // eslint-disable-next-line class-methods-use-this 271 | getCollectionForType(type, store) { 272 | const {getCollection} = store 273 | const gqlTypeName = getGraphQLTypeName(type) 274 | const typeName = this.makeTypeName(gqlTypeName) 275 | return getCollection(typeName) 276 | } 277 | 278 | addDocumentToCollection(doc, store) { 279 | const {overlayDrafts} = this.options 280 | const {_id, _type} = doc 281 | const id = overlayDrafts ? unprefixDraftId(_id) : _id 282 | const collection = this.getCollectionForType(_type, store) 283 | 284 | if (!collection) { 285 | console.warn( 286 | oneline` 287 | [sanity] Document with ID "%s" has type "%s", which is not declared 288 | as a document type in the GraphQL schema. Have you remembered to 289 | run \`sanity graphql deploy\` lately? Skipping document.`, 290 | _id, 291 | _type 292 | ) 293 | return 294 | } 295 | 296 | // Gridsome overrides `node.id` with `node._id` if present. 297 | // This is scheduled for removal at 1.0, but for now we have to pass the non-draft 298 | // id to make sure we actually update the same node as we were expecting to. 299 | const newNode = {...doc, id, $uid: this.getUid(id), _id: id} 300 | const existingNode = collection.getNodeById(id) 301 | 302 | if (existingNode) { 303 | collection.updateNode(newNode) 304 | } else { 305 | collection.addNode(newNode) 306 | } 307 | } 308 | 309 | // eslint-disable-next-line class-methods-use-this 310 | addDocumentsToCollection(store) { 311 | return through.obj((doc, enc, callback) => { 312 | this.addDocumentToCollection(doc, store) 313 | callback() 314 | }) 315 | } 316 | 317 | getUid(id) { 318 | return `${this.uidPrefix}-${id}` 319 | } 320 | } 321 | 322 | function ucFirst(str) { 323 | return (str[0] || '').toUpperCase() + str.slice(1) 324 | } 325 | 326 | function rejectOnApiError() { 327 | return through.obj(function(sanityDoc, string, callback) { 328 | const doc = sanityDoc 329 | if (doc._id && doc._type) { 330 | callback(null, doc) 331 | return 332 | } 333 | 334 | const error = sanityDoc 335 | if (error.statusCode && error.error) { 336 | callback(new Error(`${error.statusCode}: ${error.error}`)) 337 | return 338 | } 339 | 340 | callback() 341 | }) 342 | } 343 | 344 | function removeSystemDocuments() { 345 | return through.obj(function(doc, string, callback) { 346 | if (doc && doc._id && doc._id.startsWith('_.')) { 347 | return callback() 348 | } 349 | 350 | return callback(null, doc) 351 | }) 352 | } 353 | 354 | async function getDocumentStream(url, token) { 355 | const auth = token ? {Authorization: `Bearer ${token}`} : {} 356 | const userAgent = {'User-Agent': `gridsome-source-sanity@${version}`} 357 | const headers = { 358 | ...userAgent, 359 | ...auth 360 | } 361 | 362 | try { 363 | const response = await axios({ 364 | method: 'get', 365 | responseType: 'stream', 366 | maxRedirects: 0, 367 | url, 368 | headers 369 | }) 370 | 371 | return response.data 372 | } catch (err) { 373 | if (err.response.status === 404) { 374 | err.message = `${err.message} - double-check project ID and dataset configuration` 375 | } 376 | 377 | throw err 378 | } 379 | } 380 | 381 | function getJsonAliasDirective(field) { 382 | const alias = field.directives.find(dir => dir.name.value === 'jsonAlias') 383 | if (!alias) { 384 | return null 385 | } 386 | 387 | return { 388 | aliasFor: valueFromASTUntyped(alias.arguments.find(arg => arg.name.value === 'for').value) 389 | } 390 | } 391 | 392 | function pump(streams) { 393 | return new Promise((resolve, reject) => 394 | pumpIt(streams, err => { 395 | if (err) { 396 | reject(err) 397 | } else { 398 | resolve() 399 | } 400 | }) 401 | ) 402 | } 403 | 404 | function unwrapType(typeNode) { 405 | if (['NonNullType', 'ListType'].includes(typeNode.kind)) { 406 | const wrappedType = typeNode 407 | return unwrapType(wrappedType.type) 408 | } 409 | 410 | return typeNode 411 | } 412 | 413 | function makeNullable(typeNode) { 414 | if (typeNode.kind === 'NonNullType') { 415 | return makeNullable(typeNode.type) 416 | } else if (typeNode.kind === 'ListType') { 417 | return {...typeNode, type: makeNullable(typeNode.type)} 418 | } 419 | 420 | return typeNode 421 | } 422 | 423 | function sha1(value) { 424 | return crypto 425 | .createHash('sha1') 426 | .update(value) 427 | .digest('base64') 428 | .replace(/[^A-Za-z0-9]/g, '') 429 | .slice(0, 10) 430 | } 431 | 432 | function getGraphQLTypeName(str) { 433 | return startCase(str).replace(/\s+/g, '') 434 | } 435 | 436 | module.exports = SanitySource 437 | -------------------------------------------------------------------------------- /src/remoteGraphQLSchema.js: -------------------------------------------------------------------------------- 1 | const {parse} = require('graphql') 2 | 3 | module.exports = async (client, graphqlTag) => { 4 | const config = client.config() 5 | const {dataset} = config 6 | 7 | let api 8 | try { 9 | api = await client.request({ 10 | url: `/apis/graphql/${dataset}/${graphqlTag}`, 11 | headers: { 12 | Accept: 'application/graphql' 13 | } 14 | }) 15 | } catch (err) { 16 | const code = err && err.response && err.response.statusCode 17 | const message = 18 | (err && err.response && err.response.body && err.response.body.message) || 19 | (err.response && err.response.statusMessage) || 20 | err.message 21 | 22 | const is404 = code === 404 || /schema not found/i.test(message) 23 | const hint = is404 ? ` - have you run \`sanity graphql deploy\` yet?` : '' 24 | 25 | throw new Error(`${message}${hint}`, is404) 26 | } 27 | 28 | return parse(api) 29 | } 30 | -------------------------------------------------------------------------------- /src/resolveReferences.js: -------------------------------------------------------------------------------- 1 | const {unprefixDraftId} = require('./draftHandlers') 2 | 3 | module.exports = function resolveReferences(obj, depth, maxDepth, context) { 4 | const {store, getUid, overlayDrafts} = context 5 | const {getNodeByUid} = store 6 | 7 | if (Array.isArray(obj)) { 8 | return depth <= maxDepth 9 | ? obj.map(item => resolveReferences(item, depth + 1, maxDepth, context)) 10 | : obj 11 | } 12 | 13 | if (obj === null || typeof obj !== 'object') { 14 | return obj 15 | } 16 | 17 | if (typeof obj._ref === 'string') { 18 | const id = obj._ref 19 | const node = getNodeByUid(getUid(overlayDrafts ? unprefixDraftId(id) : id)) 20 | return node && depth <= maxDepth 21 | ? resolveReferences(node, depth + 1, maxDepth, context) // Recurse deeper! 22 | : obj 23 | } 24 | 25 | const initial = {} 26 | return Object.keys(obj).reduce((acc, key) => { 27 | acc[key] = resolveReferences(obj[key], depth + 1, maxDepth, context) 28 | return acc 29 | }, initial) 30 | } 31 | --------------------------------------------------------------------------------