@typespec/http-server-js
Version:
TypeSpec HTTP server code generator for JavaScript
256 lines • 9.34 kB
JavaScript
// Copyright (c) Microsoft Corporation
// Licensed under the MIT license.
export let module = undefined;
// prettier-ignore
const lines = [
"// Copyright (c) Microsoft Corporation",
"// Licensed under the MIT license.",
"",
"// #region Duration",
"",
"/**",
" * Regular expression for matching ISO8601 duration strings.",
" *",
" * Yields:",
" * - 0: the full match",
" * - 1: the sign (optional)",
" * - 2: years (optional)",
" * - 3: months (optional)",
" * - 4: weeks (optional)",
" * - 5: days (optional)",
" * - 6: hours (optional)",
" * - 7: minutes (optional)",
" * - 8: seconds (optional)",
" */",
"const ISO8601_DURATION_REGEX =",
" /^(-)?P(?:((?:\\d*[.,])?\\d+)Y)?(?:((?:\\d*[.,])?\\d+)M)?(?:((?:\\d*[.,])?\\d+)W)?(?:((?:\\d*[.,])?\\d+)D)?(?:T(?:((?:\\d*[.,])?\\d+)H)?(?:((?:\\d*[.,])?\\d+)M)?(?:((?:\\d*[.,])?\\d+)S)?)?$/;",
"",
"/**",
" * A duration of time, measured in years, months, weeks, days, hours, minutes, and seconds.",
" *",
" * The values may be fractional and are not normalized (e.g. 36 hours is not the same duration as 1 day and 12 hours",
" * when accounting for Daylight Saving Time changes or leap seconds).",
" *",
" * @see https://en.wikipedia.org/wiki/ISO_8601#Durations",
" */",
"export interface Duration {",
" /**",
" * \"+\" if the duration is positive, \"-\" if the duration is negative.",
" */",
" sign: \"+\" | \"-\";",
" /**",
" * The number of years in the duration.",
" */",
" years: number;",
" /**",
" * The number of months in the duration.",
" */",
" months: number;",
" /**",
" * The number of weeks in the duration.",
" */",
" weeks: number;",
" /**",
" * The number of days in the duration.",
" */",
" days: number;",
" /**",
" * The number of hours in the duration.",
" */",
" hours: number;",
" /**",
" * The number of minutes in the duration.",
" */",
" minutes: number;",
" /**",
" * The number of seconds in the duration.",
" */",
" seconds: number;",
"}",
"",
"export const Duration = Object.freeze({",
" /**",
" * Parses an ISO8601 duration string into an object.",
" *",
" * @see https://en.wikipedia.org/wiki/ISO_8601#Durations",
" *",
" * @param duration - the duration string to parse",
" * @returns an object containing the parsed duration",
" */",
" parseISO8601(duration: string, maxLength: number = 100): Duration {",
" duration = duration.trim();",
" if (duration.length > maxLength)",
" throw new Error(`ISO8601 duration string is too long: ${duration}`);",
"",
" const match = duration.match(ISO8601_DURATION_REGEX);",
"",
" if (!match) throw new Error(`Invalid ISO8601 duration: ${duration}`);",
"",
" return {",
" sign: match[1] === undefined ? \"+\" : (match[1] as Duration[\"sign\"]),",
" years: parseFloatNormal(match[2]),",
" months: parseFloatNormal(match[3]),",
" weeks: parseFloatNormal(match[4]),",
" days: parseFloatNormal(match[5]),",
" hours: parseFloatNormal(match[6]),",
" minutes: parseFloatNormal(match[7]),",
" seconds: parseFloatNormal(match[8]),",
" };",
"",
" function parseFloatNormal(match: string | undefined): number {",
" if (match === undefined) return 0;",
"",
" const normalized = match.replace(\",\", \".\");",
"",
" const parsed = parseFloat(normalized);",
"",
" if (isNaN(parsed))",
" throw new Error(`Unreachable: Invalid number in ISO8601 duration string: ${match}`);",
"",
" return parsed;",
" }",
" },",
" /**",
" * Writes a Duration to an ISO8601 duration string.",
" *",
" * @see https://en.wikipedia.org/wiki/ISO_8601#Durations",
" *",
" * @param duration - the duration to write to a string",
" * @returns a string in ISO8601 duration format",
" */",
" toISO8601(duration: Duration): string {",
" const sign = duration.sign === \"+\" ? \"\" : \"-\";",
"",
" const years =",
" duration.years !== 0 && !isNaN(Number(duration.years)) ? `${duration.years}Y` : \"\";",
" const months =",
" duration.months !== 0 && !isNaN(Number(duration.months)) ? `${duration.months}M` : \"\";",
" const weeks =",
" duration.weeks !== 0 && !isNaN(Number(duration.weeks)) ? `${duration.weeks}W` : \"\";",
" const days = duration.days !== 0 && !isNaN(Number(duration.days)) ? `${duration.days}D` : \"\";",
"",
" let time = \"\";",
"",
" const _hours = duration.hours !== 0 && !isNaN(Number(duration.hours));",
" const _minutes = duration.minutes !== 0 && !isNaN(Number(duration.minutes));",
" const _seconds = duration.seconds !== 0 && !isNaN(Number(duration.seconds));",
"",
" if (_hours || _minutes || _seconds) {",
" const hours = _hours ? `${duration.hours}H` : \"\";",
" const minutes = _minutes ? `${duration.minutes}M` : \"\";",
" const seconds = _seconds ? `${duration.seconds}S` : \"\";",
"",
" time = `T${hours}${minutes}${seconds}`;",
" }",
"",
" return `${sign}P${years}${months}${weeks}${days}${time}`;",
" },",
"",
" /**",
" * Gets the total number of seconds in a duration.",
" *",
" * This method will throw an Error if the duration contains any years, months, weeks, or days, as those require a reference",
" * point to calculate the total number of seconds.",
" *",
" * WARNING: If the total number of seconds is larger than the maximum safe integer in JavaScript, this method will",
" * lose precision. @see Duration.totalSecondsBigInt for a BigInt alternative.",
" *",
" * @param duration - the duration to calculate the total number of seconds for",
" * @returns the total number of seconds in the duration",
" */",
" totalSeconds(duration: Duration): number {",
" if (",
" duration.years !== 0 ||",
" duration.months !== 0 ||",
" duration.weeks !== 0 ||",
" duration.days !== 0",
" ) {",
" throw new Error(",
" \"Cannot calculate total seconds for a duration with years, months, weeks, or days.\",",
" );",
" }",
"",
" return (",
" duration.seconds +",
" duration.minutes * 60 +",
" duration.hours * 60 * 60 +",
" duration.weeks * 7 * 24 * 60 * 60",
" );",
" },",
"",
" /**",
" * Gets the total number of seconds in a duration.",
" *",
" * This method will throw an Error if the duration contains any years, months, weeks, or days, as those require a reference",
" * point to calculate the total number of seconds. It will also throw an error if any of the components are not integers.",
" *",
" * @param duration - the duration to calculate the total number of seconds for",
" * @returns the total number of seconds in the duration",
" */",
" totalSecondsBigInt(duration: Duration): bigint {",
" if (",
" duration.years !== 0 ||",
" duration.months !== 0 ||",
" duration.weeks !== 0 ||",
" duration.days !== 0",
" ) {",
" throw new Error(",
" \"Cannot calculate total seconds for a duration with years, months, weeks, or days.\",",
" );",
" }",
"",
" if (",
" !Number.isInteger(duration.seconds) ||",
" !Number.isInteger(duration.minutes) ||",
" !Number.isInteger(duration.hours) ||",
" !Number.isInteger(duration.weeks)",
" ) {",
" throw new Error(",
" \"Cannot calculate total seconds as a BigInt for a duration with non-integer components.\",",
" );",
" }",
"",
" return (",
" BigInt(duration.seconds) +",
" BigInt(duration.minutes) * 60n +",
" BigInt(duration.hours) * 60n * 60n +",
" BigInt(duration.weeks) * 7n * 24n * 60n * 60n",
" );",
" },",
"",
" /**",
" * Creates a duration from a total number of seconds.",
" *",
" * The result is not normalized, so it will only contain a seconds field.",
" */",
" fromTotalSeconds(seconds: number): Duration {",
" return {",
" sign: seconds < 0 ? \"-\" : \"+\",",
" years: 0,",
" months: 0,",
" weeks: 0,",
" days: 0,",
" hours: 0,",
" minutes: 0,",
" seconds: Math.abs(seconds),",
" };",
" },",
"});",
"",
"// #endregion",
"",
];
export async function createModule(parent) {
if (module)
return module;
module = {
name: "datetime",
cursor: parent.cursor.enter("datetime"),
imports: [],
declarations: [],
};
module.declarations.push(lines);
parent.declarations.push(module);
return module;
}
//# sourceMappingURL=datetime.js.map