language transfer
This commit is contained in:
1 parent
db434dc560
commit
3c4a5eba9a
14 files changed
+272
-388
No files matched your search
@@ -22,3 +22,7 @@ dist-ssr
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
|
||||
# lda
|
||||
ass/
|
||||
-110
@@ -1,110 +0,0 @@
|
||||
import { Calendar } from "@fullcalendar/core";
|
||||
import iCalendarPlugin from "@fullcalendar/icalendar";
|
||||
import rrulePlugin from "@fullcalendar/rrule";
|
||||
import listPlugin from "@fullcalendar/list";
|
||||
import dayGridPlugin from "@fullcalendar/daygrid";
|
||||
import timeGridPlugin from "@fullcalendar/timegrid";
|
||||
import bootstrap5Plugin from "@fullcalendar/bootstrap5";
|
||||
|
||||
import { getNextColor } from "./color_generator";
|
||||
// import { formatTooltip } from "./tooltip_parser";
|
||||
|
||||
import { glued } from "./main";
|
||||
|
||||
// /**
|
||||
// * @typedef {import("@fullcalendar/core").Calendar} Calendar
|
||||
// * @typedef {import("@fullcalendar/core").EventSourceInput} EventSourceInput
|
||||
// */
|
||||
|
||||
let /** @type {Calendar | null} */ calendar = null;
|
||||
|
||||
/**
|
||||
* Initializes and renders the FullCalendar instance.
|
||||
*
|
||||
* @param {HTMLElement} element - The DOM element to render the calendar into.
|
||||
* @param {string | URL} url - The URL for the initial event source.
|
||||
* @param {Function} onEventMouseEnter - Callback for mouse enter on events.
|
||||
* @param {Function} onEventMouseLeave - Callback for mouse leave on events.
|
||||
*/
|
||||
|
||||
export function initializeCalendar(
|
||||
element,
|
||||
url,
|
||||
onEventMouseEnter,
|
||||
onEventMouseLeave
|
||||
) {
|
||||
if (calendar) {
|
||||
calendar.destroy();
|
||||
}
|
||||
|
||||
calendar = new Calendar(element, {
|
||||
plugins: [
|
||||
iCalendarPlugin,
|
||||
rrulePlugin,
|
||||
bootstrap5Plugin,
|
||||
listPlugin,
|
||||
timeGridPlugin,
|
||||
dayGridPlugin,
|
||||
],
|
||||
themeSystem: "bootstrap5",
|
||||
initialView: "listWeek", // trololo
|
||||
navLinks: true,
|
||||
dayMaxEvents: true,
|
||||
nowIndicator: true,
|
||||
weekNumbers: true,
|
||||
headerToolbar: {
|
||||
left: "prev,next",
|
||||
center: "title",
|
||||
right: "today dayGridMonth,timeGridWeek,timeGridDay,listMonth",
|
||||
},
|
||||
views: {
|
||||
dayGridMonth: { buttonText: "Month" },
|
||||
timeGridWeek: { buttonText: "Week" },
|
||||
timeGridDay: { buttonText: "Day" },
|
||||
listMonth: { buttonText: "List" },
|
||||
},
|
||||
events: init_ics_source(url.toString()), // Convert URL to string
|
||||
eventMouseEnter:
|
||||
/** @type {(arg: import("@fullcalendar/core").EventHoveringArg) => void} */ (
|
||||
onEventMouseEnter
|
||||
),
|
||||
eventMouseLeave:
|
||||
/** @type {(arg: import("@fullcalendar/core").EventHoveringArg) => void} */ (
|
||||
onEventMouseLeave
|
||||
),
|
||||
loading: glued,
|
||||
});
|
||||
// console.log(calendar);
|
||||
calendar.render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new event source to the calendar.
|
||||
* @param {string} url - The URL for the event source.
|
||||
*/
|
||||
export const addEventSource = (url) => {
|
||||
if (calendar) {
|
||||
calendar.addEventSource(init_ics_source(url));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the current calendar instance.
|
||||
* @returns {Calendar | null} The FullCalendar instance.
|
||||
*/
|
||||
export const getCalendarInstance = () => {
|
||||
return calendar;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes an event source object.
|
||||
* @param {string} url - The URL for the event source.
|
||||
* @returns {import("@fullcalendar/core").EventSourceInput} The event source object.
|
||||
*/
|
||||
const init_ics_source = (url) => {
|
||||
return {
|
||||
url: url,
|
||||
format: "ics",
|
||||
color: getNextColor(),
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,76 @@
|
||||
import { Calendar, EventApi, EventHoveringArg } from "@fullcalendar/core";
|
||||
import iCalendarPlugin from "@fullcalendar/icalendar";
|
||||
import rrulePlugin from "@fullcalendar/rrule";
|
||||
import listPlugin from "@fullcalendar/list";
|
||||
import dayGridPlugin from "@fullcalendar/daygrid";
|
||||
import timeGridPlugin from "@fullcalendar/timegrid";
|
||||
import bootstrap5Plugin from "@fullcalendar/bootstrap5";
|
||||
|
||||
import { getNextColor } from "./color_generator";
|
||||
import { glued } from "./main";
|
||||
|
||||
let calendar: Calendar | null = null;
|
||||
|
||||
export function initializeCalendar(
|
||||
element: HTMLElement,
|
||||
url: string | URL,
|
||||
onEventMouseEnter: (arg: EventHoveringArg) => void,
|
||||
onEventMouseLeave: (arg: EventHoveringArg) => void
|
||||
): void {
|
||||
if (calendar) {
|
||||
calendar.destroy();
|
||||
}
|
||||
|
||||
calendar = new Calendar(element, {
|
||||
plugins: [
|
||||
iCalendarPlugin,
|
||||
rrulePlugin,
|
||||
bootstrap5Plugin,
|
||||
listPlugin,
|
||||
timeGridPlugin,
|
||||
dayGridPlugin,
|
||||
],
|
||||
themeSystem: "bootstrap5",
|
||||
initialView: "listWeek",
|
||||
navLinks: true,
|
||||
dayMaxEvents: true,
|
||||
nowIndicator: true,
|
||||
weekNumbers: true,
|
||||
headerToolbar: {
|
||||
left: "prev,next",
|
||||
center: "title",
|
||||
right: "today dayGridMonth,timeGridWeek,timeGridDay,listMonth",
|
||||
},
|
||||
views: {
|
||||
dayGridMonth: { buttonText: "Month" },
|
||||
timeGridWeek: { buttonText: "Week" },
|
||||
timeGridDay: { buttonText: "Day" },
|
||||
listMonth: { buttonText: "List" },
|
||||
},
|
||||
events: init_ics_source(url.toString()),
|
||||
eventMouseEnter: onEventMouseEnter,
|
||||
eventMouseLeave: onEventMouseLeave,
|
||||
loading: glued,
|
||||
});
|
||||
calendar.render();
|
||||
}
|
||||
|
||||
export const addEventSource = (url: string): void => {
|
||||
if (calendar) {
|
||||
calendar.addEventSource(init_ics_source(url));
|
||||
}
|
||||
};
|
||||
|
||||
export const getCalendarInstance = (): Calendar | null => {
|
||||
return calendar;
|
||||
};
|
||||
|
||||
const init_ics_source = (
|
||||
url: string
|
||||
): { url: string; format: string; color: string } => {
|
||||
return {
|
||||
url: url,
|
||||
format: "ics",
|
||||
color: getNextColor(),
|
||||
};
|
||||
};
|
||||
File renamed without changes.
@@ -1,14 +1,10 @@
|
||||
/**
|
||||
* Updates the event source list in the DOM.
|
||||
* @param {HTMLElement | null} eventSourceList - The DOM element to display the event sources.
|
||||
* @returns {Function} A function that updates the event source list for a given calendar.
|
||||
* @returns {(calendar: import("@fullcalendar/core").Calendar) => void} A function that updates the event source list for a given calendar.
|
||||
*/
|
||||
export const updateEventSourceList2 = (eventSourceList) =>
|
||||
/**
|
||||
* Updates the event source list.
|
||||
* @param {import("@fullcalendar/core").Calendar} calendar - The FullCalendar instance.
|
||||
*/
|
||||
function updateEventSourceList(calendar) {
|
||||
export const updateEventSourceList2 = (eventSourceList: HTMLElement | null) =>
|
||||
function updateEventSourceList(calendar: import("@fullcalendar/core").Calendar): void {
|
||||
if (!calendar) return;
|
||||
if (!eventSourceList) return;
|
||||
|
||||
@@ -19,7 +15,7 @@ export const updateEventSourceList2 = (eventSourceList) =>
|
||||
calendar.getEventSources().forEach((source) => {
|
||||
const card = document.createElement("div");
|
||||
card.className = "event-source-card";
|
||||
|
||||
|
||||
const info = document.createElement("div");
|
||||
info.className = "info"; // Add class for styling
|
||||
const url = source.url || "(No URL)";
|
||||
-75
@@ -1,75 +0,0 @@
|
||||
import {
|
||||
initializeCalendar,
|
||||
addEventSource,
|
||||
getCalendarInstance,
|
||||
} from "./calendar";
|
||||
import { newTippy, tippyDie } from "./tooltip";
|
||||
import { updateEventSourceList2 } from "./eventSourceManager";
|
||||
import { create_url } from "./utils";
|
||||
|
||||
import "bootstrap/dist/css/bootstrap.css";
|
||||
import "bootstrap-icons/font/bootstrap-icons.css";
|
||||
import "tippy.js/dist/tippy.css";
|
||||
|
||||
// Fix type for text_field
|
||||
/** @type {HTMLInputElement} */
|
||||
// @ts-ignore
|
||||
const text_field = document.getElementById("ics_file");
|
||||
|
||||
/** @type {HTMLButtonElement} */
|
||||
// @ts-ignore
|
||||
const confirm_button = document.getElementById("ics_run");
|
||||
|
||||
/** @type {HTMLButtonElement} */
|
||||
// @ts-ignore
|
||||
const add_button = document.getElementById("ics_add");
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
const cal_ele = document.getElementById("calendar");
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
const placeholder_message = document.getElementById("placeholder-message");
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
const eventSourceList = document.getElementById("event-source-list");
|
||||
const updateEventSourceList = updateEventSourceList2(eventSourceList);
|
||||
|
||||
|
||||
function showPlaceholder() {
|
||||
placeholder_message.style.display = "block";
|
||||
cal_ele.style.display = "none";
|
||||
}
|
||||
|
||||
function hidePlaceholder() {
|
||||
placeholder_message.style.display = "none";
|
||||
cal_ele.style.display = "block";
|
||||
}
|
||||
|
||||
export const glued = (_e) => {
|
||||
// console.log("loading:", e); // half of it will be true false and half of it will be events
|
||||
|
||||
setTimeout(() => updateEventSourceList(getCalendarInstance()));
|
||||
};
|
||||
|
||||
confirm_button.addEventListener("click", () => {
|
||||
const url = create_url(text_field.value);
|
||||
if (!url && text_field.value) return alert("Please input valid url.");
|
||||
|
||||
if (!text_field.value) {
|
||||
showPlaceholder();
|
||||
return;
|
||||
}
|
||||
|
||||
hidePlaceholder();
|
||||
initializeCalendar(cal_ele, url, newTippy, tippyDie);
|
||||
});
|
||||
|
||||
add_button.addEventListener("click", () => {
|
||||
const url = create_url(text_field.value);
|
||||
if (!url) {
|
||||
if (text_field.value) alert("Please input valid url.");
|
||||
return;
|
||||
}
|
||||
addEventSource(url);
|
||||
updateEventSourceList(getCalendarInstance());
|
||||
});
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
import {
|
||||
initializeCalendar,
|
||||
addEventSource,
|
||||
getCalendarInstance,
|
||||
} from "./calendar";
|
||||
import { newTippy, tippyDie } from "./tooltip";
|
||||
import { updateEventSourceList2 } from "./eventSourceManager";
|
||||
import { create_url } from "./utils";
|
||||
|
||||
import "bootstrap/dist/css/bootstrap.css";
|
||||
import "bootstrap-icons/font/bootstrap-icons.css";
|
||||
import "tippy.js/dist/tippy.css";
|
||||
|
||||
// Fix type for text_field
|
||||
const text_field = document.getElementById("ics_file") as HTMLInputElement;
|
||||
|
||||
const confirm_button = document.getElementById("ics_run") as HTMLButtonElement;
|
||||
|
||||
const add_button = document.getElementById("ics_add") as HTMLButtonElement;
|
||||
|
||||
const cal_ele = document.getElementById("calendar") as HTMLElement;
|
||||
|
||||
const placeholder_message = document.getElementById(
|
||||
"placeholder-message"
|
||||
) as HTMLElement;
|
||||
|
||||
const eventSourceList = document.getElementById(
|
||||
"event-source-list"
|
||||
) as HTMLElement;
|
||||
const updateEventSourceList = updateEventSourceList2(eventSourceList);
|
||||
|
||||
function showPlaceholder(): void {
|
||||
placeholder_message.style.display = "block";
|
||||
cal_ele.style.display = "none";
|
||||
}
|
||||
|
||||
function hidePlaceholder(): void {
|
||||
placeholder_message.style.display = "none";
|
||||
cal_ele.style.display = "block";
|
||||
}
|
||||
|
||||
export const glued = (_e: unknown): void => {
|
||||
const calendar = getCalendarInstance();
|
||||
if (calendar) {
|
||||
setTimeout(() => updateEventSourceList(calendar));
|
||||
}
|
||||
};
|
||||
|
||||
confirm_button.addEventListener("click", () => {
|
||||
const url = create_url(text_field.value);
|
||||
if (!url)
|
||||
return text_field.value
|
||||
? alert("Please input valid url.")
|
||||
: showPlaceholder();
|
||||
|
||||
hidePlaceholder();
|
||||
initializeCalendar(cal_ele, url, newTippy, tippyDie);
|
||||
});
|
||||
|
||||
add_button.addEventListener("click", () => {
|
||||
const url = create_url(text_field.value);
|
||||
if (!url) {
|
||||
if (text_field.value) alert("Please input valid url.");
|
||||
return;
|
||||
}
|
||||
const calendar = getCalendarInstance();
|
||||
if (calendar) {
|
||||
addEventSource(url);
|
||||
updateEventSourceList(calendar);
|
||||
}
|
||||
});
|
||||
@@ -1,33 +0,0 @@
|
||||
import tippy from "tippy.js";
|
||||
import "tippy.js/dist/tippy.css";
|
||||
import { formatTooltip } from "./tooltip_parser";
|
||||
|
||||
let currentTippy = null;
|
||||
|
||||
export function newTippy(info) {
|
||||
if (info.el._tippy === currentTippy) {
|
||||
currentTippy.show();
|
||||
} else {
|
||||
if (currentTippy) {
|
||||
currentTippy.destroy();
|
||||
currentTippy = null;
|
||||
}
|
||||
currentTippy = tippy(info.el, {
|
||||
content: formatTooltip(
|
||||
info.event.title,
|
||||
info.event.extendedProps.description
|
||||
),
|
||||
allowHTML: true,
|
||||
theme: "light",
|
||||
interactive: true,
|
||||
interactiveBorder: 20,
|
||||
delay: [0, 300],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function tippyDie(info) {
|
||||
if (currentTippy) {
|
||||
currentTippy.hideWithInteractivity(info.jsEvent);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import tippy, { Instance, Props } from "tippy.js";
|
||||
import "tippy.js/dist/tippy.css";
|
||||
import { formatTooltip } from "./tooltip_parser";
|
||||
import { EventHoveringArg } from "@fullcalendar/core";
|
||||
|
||||
let currentTippy: Instance<Props> | null = null;
|
||||
|
||||
// Extend HTMLElement to include '_tippy' property
|
||||
interface TippyElement extends HTMLElement {
|
||||
_tippy?: Instance<Props>;
|
||||
}
|
||||
interface thisguy extends EventHoveringArg {
|
||||
el: TippyElement;
|
||||
}
|
||||
/**
|
||||
* Creates a new Tippy instance for an event.
|
||||
* @param info - The event information.
|
||||
*/
|
||||
export function newTippy(info: thisguy): void {
|
||||
if (info.el._tippy && info.el._tippy === currentTippy) {
|
||||
currentTippy?.show(); // Add optional chaining to handle null
|
||||
} else {
|
||||
if (currentTippy) {
|
||||
currentTippy.destroy();
|
||||
currentTippy = null;
|
||||
}
|
||||
currentTippy = tippy(info.el, {
|
||||
content: formatTooltip(
|
||||
info.event.title,
|
||||
info.event.extendedProps.description
|
||||
),
|
||||
allowHTML: true,
|
||||
theme: "light",
|
||||
interactive: true,
|
||||
interactiveBorder: 20,
|
||||
delay: [0, 300],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides the current Tippy instance.
|
||||
* @param info - The event information.
|
||||
*/
|
||||
export function tippyDie(info: EventHoveringArg): void {
|
||||
if (currentTippy) {
|
||||
currentTippy.hideWithInteractivity(info.jsEvent);
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
/**
|
||||
* Escapes HTML special characters to prevent XSS.
|
||||
* @param {string} text - The input text to escape.
|
||||
* @returns {string} The escaped HTML string.
|
||||
*/
|
||||
export function escapeHtml(text) {
|
||||
const div = document.createElement("div");
|
||||
div.innerText = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts URLs in text to clickable links, after escaping.
|
||||
* @param {string} text - The input text containing URLs.
|
||||
* @returns {string} The linkified HTML string.
|
||||
*/
|
||||
export function linkify(text) {
|
||||
let safe = escapeHtml(text);
|
||||
return safe.replace(
|
||||
/(https?:\/\/[^\s<]+)/g,
|
||||
(url) =>
|
||||
`<a href="${url}" target="_blank" rel="noopener noreferrer">${url}</a>`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats tooltip content: escapes, linkifies, and replaces newlines with <br>.
|
||||
* @param {string} title - The title of the tooltip.
|
||||
* @param {string} [description] - The optional description of the tooltip.
|
||||
* @returns {string} The formatted tooltip content.
|
||||
*/
|
||||
export function formatTooltip(title, description) {
|
||||
const safeTitle = escapeHtml(title);
|
||||
const safeDesc = description
|
||||
? `<br><br>${linkify(description).replace(/\n/g, "<br>")}`
|
||||
: "";
|
||||
return `<strong>${safeTitle}</strong>${safeDesc}`;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Escapes HTML special characters to prevent XSS.
|
||||
* @param text - The input text to escape.
|
||||
* @returns The escaped HTML string.
|
||||
*/
|
||||
export function escapeHtml(text: string): string {
|
||||
return text.replace(/[&<>'"]/g, (char) => {
|
||||
const escapeMap: { [key: string]: string } = {
|
||||
"&": "&",
|
||||
"<": "<",
|
||||
">": ">",
|
||||
"'": "'",
|
||||
'"': """,
|
||||
};
|
||||
return escapeMap[char] || char;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts URLs in text to clickable links, after escaping.
|
||||
* @param text - The input text containing URLs.
|
||||
* @returns The linkified HTML string.
|
||||
*/
|
||||
export function linkify(text: string): string {
|
||||
const escapedText = escapeHtml(text);
|
||||
return escapedText.replace(/(https?:\/\/\S+)/g, '<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>');
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats tooltip content: escapes, linkifies, and replaces newlines with <br>.
|
||||
* @param title - The title of the tooltip.
|
||||
* @param description - The optional description of the tooltip.
|
||||
* @returns The formatted tooltip content.
|
||||
*/
|
||||
export function formatTooltip(title: string, description?: string): string {
|
||||
const escapedTitle = escapeHtml(title);
|
||||
const escapedDescription = description ? escapeHtml(description) : "";
|
||||
const linkifiedDescription = linkify(escapedDescription);
|
||||
return `${escapedTitle}<br>${linkifiedDescription}`;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
/**
|
||||
* Creates a valid URL from the given input.
|
||||
* @param {string} input - The input string to convert into a URL.
|
||||
* @returns {string | null} - The valid URL or null if invalid.
|
||||
*/
|
||||
export function create_url(input) {
|
||||
try {
|
||||
const url = new URL(input);
|
||||
return url.href;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Creates a valid URL from the given input.
|
||||
* @param input - The input string to convert into a URL.
|
||||
* @returns The valid URL or null if invalid.
|
||||
*/
|
||||
export function create_url(input: string): string | null {
|
||||
try {
|
||||
const url = new URL(input);
|
||||
return url.href;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+15
-111
@@ -1,113 +1,17 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||
|
||||
/* Projects */
|
||||
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||
|
||||
/* Language and Environment */
|
||||
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||
// "libReplacement": true, /* Enable lib replacement. */
|
||||
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||
|
||||
/* Modules */
|
||||
"module": "commonjs", /* Specify what module code is generated. */
|
||||
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
||||
// "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
|
||||
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||
// "noUncheckedSideEffectImports": true, /* Check side effect imports. */
|
||||
// "resolveJsonModule": true, /* Enable importing .json files. */
|
||||
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
||||
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||
|
||||
/* JavaScript Support */
|
||||
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||
|
||||
/* Emit */
|
||||
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||
// "removeComments": true, /* Disable emitting comments. */
|
||||
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||
|
||||
/* Interop Constraints */
|
||||
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
|
||||
// "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
|
||||
// "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||
|
||||
/* Type Checking */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||
// "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
|
||||
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||
|
||||
/* Completeness */
|
||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
}
|
||||
}
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"noEmit": true,
|
||||
"moduleResolution": "Node",
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"baseUrl": "./",
|
||||
"paths": {
|
||||
"@fullcalendar/*": ["node_modules/@fullcalendar/*"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
||||
Reference in new issue
Block a user