├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src └── index.ts ├── svelte-readonly.code-workspace ├── tsconfig.cjs.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | es6/ 3 | cjs/ 4 | coverage/ 5 | /*js 6 | /*.d.ts 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2021 Christopher Pfohl 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Svelte Readonly 2 | 3 | Not all writable stores should be writable outside their module. This enables that. It has no dependencies. It also has no tests, but that's ok. It's not that interesting. 4 | 5 | ## Installation 6 | 7 | Install, as expected, with `npm install svelte-readonly`. 8 | 9 | ## Usage 10 | 11 | ``` 12 | import readonly from 'svelte-readonly'; 13 | // or 14 | import {readonly} from 'svelte-readonly'; 15 | ``` 16 | 17 | Readonly takes a writable store and returns a readable store. That's it. 18 | 19 | ## Example 20 | 21 | This example lets you subscribe to user changes, but doesn't let you set it outside the logIn/logOut functions. This gets more handy the less you want to accidentally set something incorrectly outside a module. (Adding session timeouts, warnings, etc). 22 | 23 | ``` 24 | // session.js 25 | import { writable } from 'svelte/store'; 26 | import readonly from 'svelte-readonly'; 27 | 28 | const writableUser = writable(null); 29 | 30 | export const user = readonly(writableUser); 31 | 32 | export async function logIn(username, password) { 33 | try { 34 | writableUser.set(await api.logIn(username, password)); 35 | } catch (err) { 36 | // handle login error 37 | } 38 | } 39 | 40 | export async function logOut() { 41 | writableUser.set(null); 42 | } 43 | ``` 44 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-readonly", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-styles": { 8 | "version": "3.2.1", 9 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 10 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 11 | "dev": true, 12 | "requires": { 13 | "color-convert": "^1.9.0" 14 | } 15 | }, 16 | "balanced-match": { 17 | "version": "1.0.0", 18 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 19 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 20 | "dev": true 21 | }, 22 | "brace-expansion": { 23 | "version": "1.1.11", 24 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 25 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 26 | "dev": true, 27 | "requires": { 28 | "balanced-match": "^1.0.0", 29 | "concat-map": "0.0.1" 30 | } 31 | }, 32 | "call-bind": { 33 | "version": "1.0.0", 34 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", 35 | "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", 36 | "dev": true, 37 | "requires": { 38 | "function-bind": "^1.1.1", 39 | "get-intrinsic": "^1.0.0" 40 | } 41 | }, 42 | "chalk": { 43 | "version": "2.4.2", 44 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 45 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 46 | "dev": true, 47 | "requires": { 48 | "ansi-styles": "^3.2.1", 49 | "escape-string-regexp": "^1.0.5", 50 | "supports-color": "^5.3.0" 51 | } 52 | }, 53 | "color-convert": { 54 | "version": "1.9.3", 55 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 56 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 57 | "dev": true, 58 | "requires": { 59 | "color-name": "1.1.3" 60 | } 61 | }, 62 | "color-name": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 65 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 66 | "dev": true 67 | }, 68 | "concat-map": { 69 | "version": "0.0.1", 70 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 71 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 72 | "dev": true 73 | }, 74 | "cross-spawn": { 75 | "version": "6.0.5", 76 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 77 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 78 | "dev": true, 79 | "requires": { 80 | "nice-try": "^1.0.4", 81 | "path-key": "^2.0.1", 82 | "semver": "^5.5.0", 83 | "shebang-command": "^1.2.0", 84 | "which": "^1.2.9" 85 | } 86 | }, 87 | "define-properties": { 88 | "version": "1.1.3", 89 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 90 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 91 | "dev": true, 92 | "requires": { 93 | "object-keys": "^1.0.12" 94 | } 95 | }, 96 | "error-ex": { 97 | "version": "1.3.2", 98 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 99 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 100 | "dev": true, 101 | "requires": { 102 | "is-arrayish": "^0.2.1" 103 | } 104 | }, 105 | "es-abstract": { 106 | "version": "1.18.0-next.1", 107 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", 108 | "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", 109 | "dev": true, 110 | "requires": { 111 | "es-to-primitive": "^1.2.1", 112 | "function-bind": "^1.1.1", 113 | "has": "^1.0.3", 114 | "has-symbols": "^1.0.1", 115 | "is-callable": "^1.2.2", 116 | "is-negative-zero": "^2.0.0", 117 | "is-regex": "^1.1.1", 118 | "object-inspect": "^1.8.0", 119 | "object-keys": "^1.1.1", 120 | "object.assign": "^4.1.1", 121 | "string.prototype.trimend": "^1.0.1", 122 | "string.prototype.trimstart": "^1.0.1" 123 | } 124 | }, 125 | "es-to-primitive": { 126 | "version": "1.2.1", 127 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 128 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 129 | "dev": true, 130 | "requires": { 131 | "is-callable": "^1.1.4", 132 | "is-date-object": "^1.0.1", 133 | "is-symbol": "^1.0.2" 134 | } 135 | }, 136 | "escape-string-regexp": { 137 | "version": "1.0.5", 138 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 139 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 140 | "dev": true 141 | }, 142 | "function-bind": { 143 | "version": "1.1.1", 144 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 145 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 146 | "dev": true 147 | }, 148 | "get-intrinsic": { 149 | "version": "1.0.2", 150 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", 151 | "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", 152 | "dev": true, 153 | "requires": { 154 | "function-bind": "^1.1.1", 155 | "has": "^1.0.3", 156 | "has-symbols": "^1.0.1" 157 | } 158 | }, 159 | "graceful-fs": { 160 | "version": "4.2.4", 161 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 162 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 163 | "dev": true 164 | }, 165 | "has": { 166 | "version": "1.0.3", 167 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 168 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 169 | "dev": true, 170 | "requires": { 171 | "function-bind": "^1.1.1" 172 | } 173 | }, 174 | "has-flag": { 175 | "version": "3.0.0", 176 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 177 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 178 | "dev": true 179 | }, 180 | "has-symbols": { 181 | "version": "1.0.1", 182 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 183 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 184 | "dev": true 185 | }, 186 | "hosted-git-info": { 187 | "version": "2.8.8", 188 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 189 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", 190 | "dev": true 191 | }, 192 | "is-arrayish": { 193 | "version": "0.2.1", 194 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 195 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 196 | "dev": true 197 | }, 198 | "is-callable": { 199 | "version": "1.2.2", 200 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", 201 | "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", 202 | "dev": true 203 | }, 204 | "is-core-module": { 205 | "version": "2.2.0", 206 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 207 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 208 | "dev": true, 209 | "requires": { 210 | "has": "^1.0.3" 211 | } 212 | }, 213 | "is-date-object": { 214 | "version": "1.0.2", 215 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 216 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 217 | "dev": true 218 | }, 219 | "is-negative-zero": { 220 | "version": "2.0.1", 221 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 222 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 223 | "dev": true 224 | }, 225 | "is-regex": { 226 | "version": "1.1.1", 227 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 228 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 229 | "dev": true, 230 | "requires": { 231 | "has-symbols": "^1.0.1" 232 | } 233 | }, 234 | "is-symbol": { 235 | "version": "1.0.3", 236 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 237 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 238 | "dev": true, 239 | "requires": { 240 | "has-symbols": "^1.0.1" 241 | } 242 | }, 243 | "isexe": { 244 | "version": "2.0.0", 245 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 246 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 247 | "dev": true 248 | }, 249 | "json-parse-better-errors": { 250 | "version": "1.0.2", 251 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 252 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 253 | "dev": true 254 | }, 255 | "load-json-file": { 256 | "version": "4.0.0", 257 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 258 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 259 | "dev": true, 260 | "requires": { 261 | "graceful-fs": "^4.1.2", 262 | "parse-json": "^4.0.0", 263 | "pify": "^3.0.0", 264 | "strip-bom": "^3.0.0" 265 | } 266 | }, 267 | "memorystream": { 268 | "version": "0.3.1", 269 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 270 | "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", 271 | "dev": true 272 | }, 273 | "minimatch": { 274 | "version": "3.0.4", 275 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 276 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 277 | "dev": true, 278 | "requires": { 279 | "brace-expansion": "^1.1.7" 280 | } 281 | }, 282 | "nice-try": { 283 | "version": "1.0.5", 284 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 285 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 286 | "dev": true 287 | }, 288 | "normalize-package-data": { 289 | "version": "2.5.0", 290 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 291 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 292 | "dev": true, 293 | "requires": { 294 | "hosted-git-info": "^2.1.4", 295 | "resolve": "^1.10.0", 296 | "semver": "2 || 3 || 4 || 5", 297 | "validate-npm-package-license": "^3.0.1" 298 | } 299 | }, 300 | "npm-run-all": { 301 | "version": "4.1.5", 302 | "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", 303 | "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", 304 | "dev": true, 305 | "requires": { 306 | "ansi-styles": "^3.2.1", 307 | "chalk": "^2.4.1", 308 | "cross-spawn": "^6.0.5", 309 | "memorystream": "^0.3.1", 310 | "minimatch": "^3.0.4", 311 | "pidtree": "^0.3.0", 312 | "read-pkg": "^3.0.0", 313 | "shell-quote": "^1.6.1", 314 | "string.prototype.padend": "^3.0.0" 315 | } 316 | }, 317 | "object-inspect": { 318 | "version": "1.9.0", 319 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", 320 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", 321 | "dev": true 322 | }, 323 | "object-keys": { 324 | "version": "1.1.1", 325 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 326 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 327 | "dev": true 328 | }, 329 | "object.assign": { 330 | "version": "4.1.2", 331 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 332 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 333 | "dev": true, 334 | "requires": { 335 | "call-bind": "^1.0.0", 336 | "define-properties": "^1.1.3", 337 | "has-symbols": "^1.0.1", 338 | "object-keys": "^1.1.1" 339 | } 340 | }, 341 | "parse-json": { 342 | "version": "4.0.0", 343 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 344 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 345 | "dev": true, 346 | "requires": { 347 | "error-ex": "^1.3.1", 348 | "json-parse-better-errors": "^1.0.1" 349 | } 350 | }, 351 | "path-key": { 352 | "version": "2.0.1", 353 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 354 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 355 | "dev": true 356 | }, 357 | "path-parse": { 358 | "version": "1.0.6", 359 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 360 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 361 | "dev": true 362 | }, 363 | "path-type": { 364 | "version": "3.0.0", 365 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 366 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 367 | "dev": true, 368 | "requires": { 369 | "pify": "^3.0.0" 370 | } 371 | }, 372 | "pidtree": { 373 | "version": "0.3.1", 374 | "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", 375 | "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", 376 | "dev": true 377 | }, 378 | "pify": { 379 | "version": "3.0.0", 380 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 381 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 382 | "dev": true 383 | }, 384 | "read-pkg": { 385 | "version": "3.0.0", 386 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 387 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 388 | "dev": true, 389 | "requires": { 390 | "load-json-file": "^4.0.0", 391 | "normalize-package-data": "^2.3.2", 392 | "path-type": "^3.0.0" 393 | } 394 | }, 395 | "resolve": { 396 | "version": "1.19.0", 397 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", 398 | "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", 399 | "dev": true, 400 | "requires": { 401 | "is-core-module": "^2.1.0", 402 | "path-parse": "^1.0.6" 403 | } 404 | }, 405 | "semver": { 406 | "version": "5.7.1", 407 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 408 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 409 | "dev": true 410 | }, 411 | "shebang-command": { 412 | "version": "1.2.0", 413 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 414 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 415 | "dev": true, 416 | "requires": { 417 | "shebang-regex": "^1.0.0" 418 | } 419 | }, 420 | "shebang-regex": { 421 | "version": "1.0.0", 422 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 423 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 424 | "dev": true 425 | }, 426 | "shell-quote": { 427 | "version": "1.7.2", 428 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", 429 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", 430 | "dev": true 431 | }, 432 | "spdx-correct": { 433 | "version": "3.1.1", 434 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 435 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 436 | "dev": true, 437 | "requires": { 438 | "spdx-expression-parse": "^3.0.0", 439 | "spdx-license-ids": "^3.0.0" 440 | } 441 | }, 442 | "spdx-exceptions": { 443 | "version": "2.3.0", 444 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 445 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 446 | "dev": true 447 | }, 448 | "spdx-expression-parse": { 449 | "version": "3.0.1", 450 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 451 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 452 | "dev": true, 453 | "requires": { 454 | "spdx-exceptions": "^2.1.0", 455 | "spdx-license-ids": "^3.0.0" 456 | } 457 | }, 458 | "spdx-license-ids": { 459 | "version": "3.0.7", 460 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", 461 | "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", 462 | "dev": true 463 | }, 464 | "string.prototype.padend": { 465 | "version": "3.1.1", 466 | "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz", 467 | "integrity": "sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg==", 468 | "dev": true, 469 | "requires": { 470 | "call-bind": "^1.0.0", 471 | "define-properties": "^1.1.3", 472 | "es-abstract": "^1.18.0-next.1" 473 | } 474 | }, 475 | "string.prototype.trimend": { 476 | "version": "1.0.3", 477 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", 478 | "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", 479 | "dev": true, 480 | "requires": { 481 | "call-bind": "^1.0.0", 482 | "define-properties": "^1.1.3" 483 | } 484 | }, 485 | "string.prototype.trimstart": { 486 | "version": "1.0.3", 487 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", 488 | "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", 489 | "dev": true, 490 | "requires": { 491 | "call-bind": "^1.0.0", 492 | "define-properties": "^1.1.3" 493 | } 494 | }, 495 | "strip-bom": { 496 | "version": "3.0.0", 497 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 498 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 499 | "dev": true 500 | }, 501 | "supports-color": { 502 | "version": "5.5.0", 503 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 504 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 505 | "dev": true, 506 | "requires": { 507 | "has-flag": "^3.0.0" 508 | } 509 | }, 510 | "svelte": { 511 | "version": "3.31.2", 512 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.31.2.tgz", 513 | "integrity": "sha512-TxZGrXzX2ggFH3BIKY5fmbeMdJuZrMIMDYPMX6R9255bueuYIuVaBQSLUeY2oD7W4IdeqRZiAVGCjDw2POKBRA==", 514 | "dev": true 515 | }, 516 | "typescript": { 517 | "version": "3.9.7", 518 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 519 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 520 | "dev": true 521 | }, 522 | "validate-npm-package-license": { 523 | "version": "3.0.4", 524 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 525 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 526 | "dev": true, 527 | "requires": { 528 | "spdx-correct": "^3.0.0", 529 | "spdx-expression-parse": "^3.0.0" 530 | } 531 | }, 532 | "which": { 533 | "version": "1.3.1", 534 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 535 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 536 | "dev": true, 537 | "requires": { 538 | "isexe": "^2.0.0" 539 | } 540 | } 541 | } 542 | } 543 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-readonly", 3 | "version": "1.0.0", 4 | "description": "Function to export only readonly store in svelte", 5 | "main": "cjs/index.js", 6 | "module": "es6/index.js", 7 | "files": [ 8 | "cjs", 9 | "es6", 10 | "src" 11 | ], 12 | "scripts": { 13 | "clean:esm": "rm -rf esm", 14 | "clean:cjs": "rm -rf cjs", 15 | "clean": "run-p clean:*", 16 | "build:esm": "tsc", 17 | "build:cjs": "tsc --project tsconfig.cjs.json", 18 | "build": "run-p build:*", 19 | "dev:esm": "tsc -w", 20 | "dev:cjs": "tsc -w --project tsconfig.cjs.json", 21 | "dev": "run-p dev:*", 22 | "prepare": "run-s clean build", 23 | "preversion": "npm run test", 24 | "postversion": "git push && git push --tags && npm publish --access=public" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git+ssh://git@github.com/crisfole/svelte-readonly.git" 29 | }, 30 | "keywords": [ 31 | "Svelte", 32 | "Stores", 33 | "Readonly" 34 | ], 35 | "author": "Chris Pfohl", 36 | "license": "MIT", 37 | "bugs": { 38 | "url": "https://github.com/crisfole/svelte-readonly/issues" 39 | }, 40 | "homepage": "https://github.com/crisfole/svelte-readonly#readme", 41 | "devDependencies": { 42 | "npm-run-all": "^4", 43 | "svelte": "^3.31.2", 44 | "typescript": "^3" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Writable, Readable } from 'svelte/store'; 2 | 3 | export function readonly(store: Writable): Readable { 4 | return { subscribe: store.subscribe }; 5 | } 6 | 7 | export default readonly; 8 | -------------------------------------------------------------------------------- /svelte-readonly.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": { 8 | "files.exclude": { 9 | "*js": true, 10 | "*.d.ts": true, 11 | "node_modules": true, 12 | "cjs": true, 13 | "es6": true 14 | }, 15 | "editor.tabSize": 2, 16 | "editor.insertSpaces": false, 17 | "files.trimTrailingWhitespace": true, 18 | "files.insertFinalNewline": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tsconfig.cjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "CommonJS", 5 | "esModuleInterop": true, 6 | "outDir": "cjs" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", // Override in tsconfig.cjs.json 5 | "esModuleInterop": false, // Override in tsconfig.cjs.json 6 | "allowJs": true, 7 | "allowSyntheticDefaultImports": true, 8 | "moduleResolution": "node", 9 | "strict": true, 10 | "experimentalDecorators": false, 11 | "emitDecoratorMetadata": false, 12 | "forceConsistentCasingInFileNames": true, 13 | "outDir": "es6", // Override in tsconfig.cjs.json 14 | "declaration": true, 15 | "lib": [ "DOM", "ESNext", "DOM.Iterable" ] 16 | }, 17 | "include": [ 18 | "src/**/*" 19 | ], 20 | "compileOnSave": true 21 | } 22 | --------------------------------------------------------------------------------