xref: /expo/docs/common/utilities.ts (revision ab22f034)
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).split(' ').splice(0, length).join('-');
28
29  // NOTE(jim): This will strip out commas from stringToSlug
30  const slug = slugger.slug(stringToSlug);
31
32  return slug;
33};
34
35export const isVersionedUrl = (url: string) => {
36  return /https?:\/\/(.*)(\/versions\/.*)/.test(url);
37};
38
39export const replaceVersionInUrl = (url: string, replaceWith: string) => {
40  const urlArr = url.split('/');
41  urlArr[2] = replaceWith;
42  return urlArr.join('/');
43};
44
45export const getVersionFromUrl = (url: string) => {
46  return url.split('/')[2];
47};
48
49/**
50 * Get the user facing or human-readable version from the SDK verion.
51 * If you provide a `latestVersion`, `latest` will include the sdk version in parentheses.
52 */
53export const getUserFacingVersionString = (
54  version: string,
55  latestVersion?: string,
56  betaVersion?: string
57): string => {
58  if (version === 'latest') {
59    return latestVersion ? `Latest (${getUserFacingVersionString(latestVersion)})` : 'Latest';
60  } else if (version === 'unversioned') {
61    return 'Unversioned';
62  }
63
64  const versionString = `SDK${version?.substring(1, 3)}`;
65
66  if (version === betaVersion) {
67    return `Beta (${versionString})`;
68  }
69
70  return versionString;
71};
72