xref: /expo/docs/common/utilities.ts (revision fc13df4e)
1import GithubSlugger from 'github-slugger';
2import React from 'react';
3
4function hasChildren(node: React.ReactNode): node is React.ReactElement {
5  return (node as React.ReactElement)?.props?.children !== undefined;
6}
7
8/**
9 * Converts any object to string accepted by _Slugger_.
10 * This is needed, because sometimes we receive pure string node,
11 * but sometimes (e.g. when using styled text), we receive whole object (React.Element)
12 *
13 * @param {React.ReactNode} node React Node object to stringify
14 */
15export const toString = (node: React.ReactNode): string => {
16  if (typeof node === 'string') {
17    return node;
18  } else if (Array.isArray(node)) {
19    return node.map(toString).join('');
20  } else if (hasChildren(node)) {
21    return toString(node.props.children);
22  } else {
23    return '';
24  }
25};
26
27export const generateSlug = (slugger: GithubSlugger, node: React.ReactNode, length = 7): string => {
28  const stringToSlug = toString(node).split(' ').splice(0, length).join('-');
29
30  // NOTE(jim): This will strip out commas from stringToSlug
31  return slugger.slug(stringToSlug);
32};
33
34export const isVersionedUrl = (url: string) => {
35  return /https?:\/\/(.*)(\/versions\/.*)/.test(url);
36};
37
38export const replaceVersionInUrl = (url: string, replaceWith: string) => {
39  const urlArr = url.split('/');
40  urlArr[2] = replaceWith;
41  return urlArr.join('/');
42};
43
44export const getVersionFromUrl = (url: string) => {
45  return url.split('/')[2];
46};
47
48/**
49 * Get the user facing or human-readable version from the SDK version.
50 * If you provide a `latestVersion` or `betaVersion`, matching entries will include the correct label in parentheses.
51 */
52export const getUserFacingVersionString = (
53  version: string,
54  latestVersion?: string,
55  betaVersion?: string
56): string => {
57  const versionString = `SDK${version?.substring(1, 3)}`;
58
59  if (version === 'latest') {
60    return latestVersion ? `${getUserFacingVersionString(latestVersion)} (Latest)` : 'Latest';
61  } else if (version === betaVersion) {
62    return `${versionString} (Beta)`;
63  } else if (version === 'unversioned') {
64    return 'Unversioned';
65  }
66
67  return versionString;
68};
69