├── .gitignore ├── README.md ├── lib └── index.js ├── package-lock.json ├── package.json └── src └── index.coffee /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.swo 3 | node_modules 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # graphql-type-long 2 | Enable 52-bit signed integer types for [GraphQL.js](https://github.com/graphql/graphql-js) 3 | 4 | ## Usage 5 | 6 | ```js 7 | import GraphQLLong from 'graphql-type-long'; 8 | ``` 9 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.10.0 2 | var GraphQLLong, GraphQLScalarType, Kind, MAX_LONG, MIN_LONG, coerceLong, parseLiteral; 3 | 4 | GraphQLScalarType = require('graphql').GraphQLScalarType; 5 | 6 | Kind = require('graphql/language').Kind; 7 | 8 | MAX_LONG = Number.MAX_SAFE_INTEGER; 9 | 10 | MIN_LONG = Number.MIN_SAFE_INTEGER; 11 | 12 | coerceLong = function(value) { 13 | var num; 14 | if (value === '') { 15 | throw new TypeError('Long cannot represent non 52-bit signed integer value: (empty string)'); 16 | } 17 | num = Number(value); 18 | if (num === num && num <= MAX_LONG && num >= MIN_LONG) { 19 | if (num < 0) { 20 | return Math.ceil(num); 21 | } else { 22 | return Math.floor(num); 23 | } 24 | } 25 | throw new TypeError('Long cannot represent non 52-bit signed integer value: ' + String(value)); 26 | }; 27 | 28 | parseLiteral = function(ast) { 29 | var num; 30 | if (ast.kind === Kind.INT) { 31 | num = parseInt(ast.value, 10); 32 | if (num <= MAX_LONG && num >= MIN_LONG) { 33 | return num; 34 | } 35 | return null; 36 | } 37 | }; 38 | 39 | GraphQLLong = new GraphQLScalarType({ 40 | name: 'Long', 41 | description: 'The `Long` scalar type represents 52-bit integers', 42 | serialize: coerceLong, 43 | parseValue: coerceLong, 44 | parseLiteral: parseLiteral 45 | }); 46 | 47 | module.exports = GraphQLLong; 48 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-type-long", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "balanced-match": { 7 | "version": "1.0.0", 8 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 9 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 10 | "dev": true 11 | }, 12 | "brace-expansion": { 13 | "version": "1.1.8", 14 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 15 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 16 | "dev": true 17 | }, 18 | "concat-map": { 19 | "version": "0.0.1", 20 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 21 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 22 | "dev": true 23 | }, 24 | "deep-equal": { 25 | "version": "1.0.1", 26 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 27 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 28 | "dev": true 29 | }, 30 | "define-properties": { 31 | "version": "1.1.2", 32 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 33 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 34 | "dev": true 35 | }, 36 | "defined": { 37 | "version": "1.0.0", 38 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 39 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 40 | "dev": true 41 | }, 42 | "es-abstract": { 43 | "version": "1.7.0", 44 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", 45 | "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", 46 | "dev": true 47 | }, 48 | "es-to-primitive": { 49 | "version": "1.1.1", 50 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 51 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 52 | "dev": true 53 | }, 54 | "for-each": { 55 | "version": "0.3.2", 56 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", 57 | "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", 58 | "dev": true 59 | }, 60 | "foreach": { 61 | "version": "2.0.5", 62 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 63 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 64 | "dev": true 65 | }, 66 | "fs.realpath": { 67 | "version": "1.0.0", 68 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 69 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 70 | "dev": true 71 | }, 72 | "function-bind": { 73 | "version": "1.1.0", 74 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", 75 | "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", 76 | "dev": true 77 | }, 78 | "glob": { 79 | "version": "7.1.2", 80 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 81 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 82 | "dev": true 83 | }, 84 | "graphql": { 85 | "version": "https://registry.npmjs.org/graphql/-/graphql-0.9.2.tgz", 86 | "integrity": "sha1-LLXGNd4T95CnfFh5ZJy0AbFYk4Y=" 87 | }, 88 | "has": { 89 | "version": "1.0.1", 90 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 91 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 92 | "dev": true 93 | }, 94 | "inflight": { 95 | "version": "1.0.6", 96 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 97 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 98 | "dev": true 99 | }, 100 | "inherits": { 101 | "version": "2.0.3", 102 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 103 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 104 | "dev": true 105 | }, 106 | "is-callable": { 107 | "version": "1.1.3", 108 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 109 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 110 | "dev": true 111 | }, 112 | "is-date-object": { 113 | "version": "1.0.1", 114 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 115 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 116 | "dev": true 117 | }, 118 | "is-function": { 119 | "version": "1.0.1", 120 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 121 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", 122 | "dev": true 123 | }, 124 | "is-regex": { 125 | "version": "1.0.4", 126 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 127 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 128 | "dev": true 129 | }, 130 | "is-symbol": { 131 | "version": "1.0.1", 132 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 133 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 134 | "dev": true 135 | }, 136 | "iterall": { 137 | "version": "https://registry.npmjs.org/iterall/-/iterall-1.0.3.tgz", 138 | "integrity": "sha1-4LMZWPg1ATwyP/CxCUOCmsaapLc=" 139 | }, 140 | "minimatch": { 141 | "version": "3.0.4", 142 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 143 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 144 | "dev": true 145 | }, 146 | "minimist": { 147 | "version": "1.2.0", 148 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 149 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 150 | "dev": true 151 | }, 152 | "object-inspect": { 153 | "version": "1.2.2", 154 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.2.tgz", 155 | "integrity": "sha1-yCEV5PzIiK6hTWTCLk8X9qcNXlo=", 156 | "dev": true 157 | }, 158 | "object-keys": { 159 | "version": "1.0.11", 160 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 161 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", 162 | "dev": true 163 | }, 164 | "once": { 165 | "version": "1.4.0", 166 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 167 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 168 | "dev": true 169 | }, 170 | "path-is-absolute": { 171 | "version": "1.0.1", 172 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 173 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 174 | "dev": true 175 | }, 176 | "path-parse": { 177 | "version": "1.0.5", 178 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 179 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 180 | "dev": true 181 | }, 182 | "resolve": { 183 | "version": "1.3.3", 184 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", 185 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", 186 | "dev": true 187 | }, 188 | "resumer": { 189 | "version": "0.0.0", 190 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 191 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 192 | "dev": true 193 | }, 194 | "string.prototype.trim": { 195 | "version": "1.1.2", 196 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 197 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 198 | "dev": true 199 | }, 200 | "tape": { 201 | "version": "4.7.0", 202 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.7.0.tgz", 203 | "integrity": "sha512-ePzu2KfZYVtq0v+KKGxBJ9HJWYZ4MaQWeGabD+KpVdMKRen3NJPf6EiwA5BxfMkhQPGtCwnOFWelcB39bhOUng==", 204 | "dev": true 205 | }, 206 | "through": { 207 | "version": "2.3.8", 208 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 209 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 210 | "dev": true 211 | }, 212 | "wrappy": { 213 | "version": "1.0.2", 214 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 215 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 216 | "dev": true 217 | } 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-type-long", 3 | "version": "0.1.1", 4 | "description": "Enable 52-bit signed integer types for GraphQL", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "build": "coffee --bare -o lib -c src" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/chadlieberman/graphql-type-long.git" 12 | }, 13 | "keywords": [ 14 | "graphql", 15 | "long" 16 | ], 17 | "author": "Chad Lieberman", 18 | "license": "ISC", 19 | "bugs": { 20 | "url": "https://github.com/chadlieberman/graphql-type-long/issues" 21 | }, 22 | "homepage": "https://github.com/chadlieberman/graphql-type-long#readme", 23 | "peerDependencies": { 24 | "graphql": "^0.9.1 || ^0.10.0 || ^0.12.0 || ^0.13.0 || ^0.14.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/index.coffee: -------------------------------------------------------------------------------- 1 | {GraphQLScalarType} = require 'graphql' 2 | {Kind} = require 'graphql/language' 3 | 4 | MAX_LONG = Number.MAX_SAFE_INTEGER 5 | MIN_LONG = Number.MIN_SAFE_INTEGER 6 | 7 | coerceLong = (value) -> 8 | if value == '' 9 | throw new TypeError( 10 | 'Long cannot represent non 52-bit signed integer value: (empty string)' 11 | ) 12 | num = Number value 13 | if num == num && num <= MAX_LONG && num >= MIN_LONG 14 | return if num < 0 then Math.ceil(num) else Math.floor(num) 15 | throw new TypeError( 16 | 'Long cannot represent non 52-bit signed integer value: ' + String(value) 17 | ) 18 | 19 | parseLiteral = (ast) -> 20 | if ast.kind == Kind.INT 21 | num = parseInt ast.value, 10 22 | if num <= MAX_LONG && num >= MIN_LONG 23 | return num 24 | return null 25 | 26 | GraphQLLong = new GraphQLScalarType 27 | name: 'Long' 28 | description: 'The `Long` scalar type represents 52-bit integers' 29 | serialize: coerceLong 30 | parseValue: coerceLong 31 | parseLiteral: parseLiteral 32 | 33 | module.exports = GraphQLLong --------------------------------------------------------------------------------