You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					63 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					63 lines
				
				1.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								import { urlAlphabet } from './url-alphabet/index.js'
							 | 
						||
| 
								 | 
							
								if (true) {
							 | 
						||
| 
								 | 
							
								  if (
							 | 
						||
| 
								 | 
							
								    typeof navigator !== 'undefined' &&
							 | 
						||
| 
								 | 
							
								    navigator.product === 'ReactNative' &&
							 | 
						||
| 
								 | 
							
								    typeof crypto === 'undefined'
							 | 
						||
| 
								 | 
							
								  ) {
							 | 
						||
| 
								 | 
							
								    throw new Error(
							 | 
						||
| 
								 | 
							
								      'React Native does not have a built-in secure random generator. ' +
							 | 
						||
| 
								 | 
							
								        'If you don’t need unpredictable IDs use `nanoid/non-secure`. ' +
							 | 
						||
| 
								 | 
							
								        'For secure IDs, import `react-native-get-random-values` ' +
							 | 
						||
| 
								 | 
							
								        'before Nano ID.'
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (typeof msCrypto !== 'undefined' && typeof crypto === 'undefined') {
							 | 
						||
| 
								 | 
							
								    throw new Error(
							 | 
						||
| 
								 | 
							
								      'Import file with `if (!window.crypto) window.crypto = window.msCrypto`' +
							 | 
						||
| 
								 | 
							
								        ' before importing Nano ID to fix IE 11 support'
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (typeof crypto === 'undefined') {
							 | 
						||
| 
								 | 
							
								    throw new Error(
							 | 
						||
| 
								 | 
							
								      'Your browser does not have secure random generator. ' +
							 | 
						||
| 
								 | 
							
								        'If you don’t need unpredictable IDs, you can use nanoid/non-secure.'
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))
							 | 
						||
| 
								 | 
							
								let customRandom = (alphabet, size, getRandom) => {
							 | 
						||
| 
								 | 
							
								  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
							 | 
						||
| 
								 | 
							
								  let step = -~((1.6 * mask * size) / alphabet.length)
							 | 
						||
| 
								 | 
							
								  return () => {
							 | 
						||
| 
								 | 
							
								    let id = ''
							 | 
						||
| 
								 | 
							
								    while (true) {
							 | 
						||
| 
								 | 
							
								      let bytes = getRandom(step)
							 | 
						||
| 
								 | 
							
								      let j = step
							 | 
						||
| 
								 | 
							
								      while (j--) {
							 | 
						||
| 
								 | 
							
								        id += alphabet[bytes[j] & mask] || ''
							 | 
						||
| 
								 | 
							
								        if (id.length === size) return id
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random)
							 | 
						||
| 
								 | 
							
								let nanoid = (size = 21) => {
							 | 
						||
| 
								 | 
							
								  let id = ''
							 | 
						||
| 
								 | 
							
								  let bytes = crypto.getRandomValues(new Uint8Array(size))
							 | 
						||
| 
								 | 
							
								  while (size--) {
							 | 
						||
| 
								 | 
							
								    let byte = bytes[size] & 63
							 | 
						||
| 
								 | 
							
								    if (byte < 36) {
							 | 
						||
| 
								 | 
							
								      id += byte.toString(36)
							 | 
						||
| 
								 | 
							
								    } else if (byte < 62) {
							 | 
						||
| 
								 | 
							
								      id += (byte - 26).toString(36).toUpperCase()
							 | 
						||
| 
								 | 
							
								    } else if (byte < 63) {
							 | 
						||
| 
								 | 
							
								      id += '_'
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      id += '-'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return id
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								export { nanoid, customAlphabet, customRandom, urlAlphabet, random }
							 |