+ return info.age_limit && info.age_limit >= 16
+}
+
+function removeEndSlashes (url: string) {
+ return url.replace(/\/+$/, '')
+}
+
+async function promptPassword () {
+ return new Promise<string>((res, rej) => {
+ prompt.start()
+ const schema = {
+ properties: {
+ password: {
+ hidden: true,
+ required: true
+ }
+ }
+ }
+ prompt.get(schema, function (err, result) {
+ if (err) {
+ return rej(err)
+ }
+ return res(result.password)
+ })
+ })
+}
+
+async function getAccessTokenOrDie (url: string, user: UserInfo) {
+ const resClient = await getClient(url)
+ const client = {
+ id: resClient.body.client_id,
+ secret: resClient.body.client_secret
+ }
+
+ try {
+ const res = await login(url, client, user)
+ return res.body.access_token
+ } catch (err) {
+ exitError('Cannot authenticate. Please check your username/password.')
+ }
+}
+
+function parseDate (dateAsStr: string): Date {
+ if (!/\d{4}-\d{2}-\d{2}/.test(dateAsStr)) {
+ exitError(`Invalid date passed: ${dateAsStr}. Expected format: YYYY-MM-DD. See help for usage.`);
+ }
+ const date = new Date(dateAsStr);
+ date.setHours(0, 0, 0);
+ if (isNaN(date.getTime())) {
+ exitError(`Invalid date passed: ${dateAsStr}. See help for usage.`);
+ }
+ return date;
+}
+
+function formatDate (date: Date): string {
+ return date.toISOString().split('T')[0];
+}