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