Fix the code specification issue.
This commit is contained in:
maigamo 2025-06-03 12:38:07 +08:00
parent bc60c1f5f9
commit 9d5b445ff1
15 changed files with 70 additions and 1895 deletions

4
.gitignore vendored
View file

@ -4,7 +4,11 @@ node_modules/
# build artifacts
main.js
main.js.map
dist/
data.json
# 忽略所有由TypeScript编译生成的JS文件
src/**/*.js
src/**/*.js.map
# editor settings
.vscode/

View file

@ -2,7 +2,7 @@
"id": "daily-task-auto-generator",
"name": "Daily Task Auto Generator",
"version": "1.0.1",
"minAppVersion": "0.15.0",
"minAppVersion": "1.8.0",
"description": "Automatically generate daily tasks with custom templates, statistics and multi-language support",
"author": "maigamo",
"authorUrl": "https://github.com/maigamo",

File diff suppressed because one or more lines are too long

View file

@ -36,6 +36,9 @@ export type TranslationKey =
| 'settings.preview'
| 'template.dateWithIcon'
// 命令
| 'commands.addDailyTask'
// 通知
| 'notification.taskAdded'
| 'notification.taskExists'
@ -164,6 +167,9 @@ const translationsZH: Record<TranslationKey, string> = {
'settings.basicSettings': '基本设置',
'settings.templateSettings': '模板设置',
// 命令
'commands.addDailyTask': '手动添加今日任务',
// 通知
'notification.taskAdded': '今日任务已添加',
'notification.taskExists': '今日任务已存在',
@ -205,37 +211,40 @@ const translationsZH: Record<TranslationKey, string> = {
// 英文翻译
const translationsEN: Record<TranslationKey, string> = {
// 设置页面
'settings.title': 'Daily Task Auto Generator Settings',
'settings.rootDir': '📁 Task Directory',
'settings.title': 'Daily Task Auto Generator',
'settings.rootDir': '📁 Task directory',
'settings.rootDir.desc': 'Specify the root directory for storing task files, tasks will be stored in "Year/Month.md" format',
'settings.rootDir.saved': '✓ Directory saved',
'settings.save': '💾 Save',
'settings.autoGenerate': '🔄 Auto Generate Mode',
'settings.autoGenerate': '🔄 Auto generate mode',
'settings.autoGenerate.desc': 'Choose when to automatically generate daily tasks',
'settings.mode.none': '❌ Off',
'settings.mode.daily': '📆 Daily',
'settings.mode.workday': '💼 Workdays Only',
'settings.language': '🔤 Interface Language',
'settings.mode.workday': '💼 Workdays only',
'settings.language': '🔤 Interface language',
'settings.language.desc': 'Select the language for the plugin interface',
'settings.language.auto': '🔍 Auto Detect',
'settings.language.auto': '🔍 Auto detect',
'settings.language.zh': '🇨🇳 Chinese',
'settings.language.en': '🇬🇧 English',
'settings.animations': '✨ Animation Effects',
'settings.animations': '✨ Animation effects',
'settings.animations.desc': 'Enable interface animation effects',
'settings.template': '📝 Task Template',
'settings.template.zh': '🇨🇳 Chinese Template',
'settings.template.en': '🇬🇧 English Template',
'settings.template.preview': '👁️ Show Preview',
'settings.template.hide': '👁️‍🗨️ Hide Preview',
'settings.resetToDefault': '🔄 Reset to Default',
'settings.addTaskButton': ' Add Today\'s Task Manually',
'settings.notificationDuration': '⏱️ Notification Duration',
'settings.template': '📝 Template',
'settings.template.zh': '🇨🇳 Chinese template',
'settings.template.en': '🇬🇧 English template',
'settings.template.preview': '👁️ Show preview',
'settings.template.hide': '👁️‍🗨️ Hide preview',
'settings.resetToDefault': '🔄 Reset to default',
'settings.addTaskButton': ' Add today\'s task manually',
'settings.notificationDuration': '⏱️ Notification duration',
'settings.notificationDuration.desc': 'Duration to show success/failure notifications (milliseconds)',
'settings.preview': 'Preview Template',
'settings.resetDefault': 'Reset to Default',
'settings.preview': 'Preview template',
'settings.resetDefault': 'Reset to default',
'template.dateWithIcon': 'Current date with icon',
'settings.basicSettings': 'Basic Settings',
'settings.templateSettings': 'Template Settings',
'settings.basicSettings': 'Basic',
'settings.templateSettings': 'Templates',
// 命令
'commands.addDailyTask': 'Add today\'s task manually',
// 通知
'notification.taskAdded': 'Today\'s task has been added',

View file

@ -1,7 +1,7 @@
import { Plugin, addIcon } from 'obsidian';
import { AutoGenerateMode } from './models/settings';
import { DailyTaskSettingTab, SettingsManager } from './settings/settings';
import { setCurrentLanguage } from './i18n/i18n';
import { getTranslation, setCurrentLanguage } from './i18n/i18n';
import { isWorkday } from './utils/dateUtils';
import { TaskGenerator } from './taskGenerator';
import { DAILY_TASK_ICON } from './ui/icons';
@ -39,7 +39,7 @@ export default class DailyTaskPlugin extends Plugin {
// 添加手动生成任务命令
this.addCommand({
id: 'add-daily-task',
name: '手动添加今日任务',
name: getTranslation('commands.addDailyTask'),
callback: async () => {
await this.taskGenerator.addTaskManually();
}

View file

@ -1,69 +0,0 @@
/**
* 自动生成模式枚举
*/
export var AutoGenerateMode;
(function (AutoGenerateMode) {
AutoGenerateMode["NONE"] = "none";
AutoGenerateMode["DAILY"] = "daily";
AutoGenerateMode["WORKDAY"] = "workday"; // 仅工作日自动生成
})(AutoGenerateMode || (AutoGenerateMode = {}));
/**
* 设置界面语言
*/
export var Language;
(function (Language) {
Language["AUTO"] = "auto";
Language["ZH"] = "zh";
Language["EN"] = "en";
})(Language || (Language = {}));
/**
* 默认中文模板
*/
export const DEFAULT_TEMPLATE_ZH = `## {{dateWithIcon}}{{weekday}}
### 🧘 今日计划
---
- [ ] 冥想 10 分钟
- [ ] 复盘前一日计划
- [ ] 阅读 20 页书
### 📝 工作任务
---
- [ ] 整理今日工作计划
- [ ] 完成重要项目进度
`;
/**
* 默认英文模板
*/
export const DEFAULT_TEMPLATE_EN = `## {{dateWithIcon}} ({{weekday}})
### 🧘 Today's Plan
---
- [ ] Meditate for 10 minutes
- [ ] Review yesterday's plan
- [ ] Read 20 pages
### 📝 Work Tasks
---
- [ ] Organize today's work schedule
- [ ] Progress on important projects
`;
/**
* 默认设置
*/
export const DEFAULT_SETTINGS = {
rootDir: 'DailyTasks',
autoGenerateMode: AutoGenerateMode.WORKDAY,
language: Language.AUTO,
templateZh: DEFAULT_TEMPLATE_ZH,
templateEn: DEFAULT_TEMPLATE_EN,
customTemplate: '',
hasCustomTemplate: false,
taskStatistics: false,
successNotificationDuration: 3000
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGdCQUlYO0FBSkQsV0FBWSxnQkFBZ0I7SUFDeEIsaUNBQWEsQ0FBQTtJQUNiLG1DQUFlLENBQUE7SUFDZix1Q0FBbUIsQ0FBQSxDQUFDLFdBQVc7QUFDbkMsQ0FBQyxFQUpXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFJM0I7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFFBSVg7QUFKRCxXQUFZLFFBQVE7SUFDaEIseUJBQWEsQ0FBQTtJQUNiLHFCQUFTLENBQUE7SUFDVCxxQkFBUyxDQUFBO0FBQ2IsQ0FBQyxFQUpXLFFBQVEsS0FBUixRQUFRLFFBSW5CO0FBNEJEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7Ozs7Ozs7Ozs7Ozs7O0NBY2xDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHOzs7Ozs7Ozs7Ozs7OztDQWNsQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBc0I7SUFDL0MsT0FBTyxFQUFFLFlBQVk7SUFDckIsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsT0FBTztJQUMxQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7SUFDdkIsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixVQUFVLEVBQUUsbUJBQW1CO0lBQy9CLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLGlCQUFpQixFQUFFLEtBQUs7SUFDeEIsY0FBYyxFQUFFLEtBQUs7SUFDckIsMkJBQTJCLEVBQUUsSUFBSTtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDoh6rliqjnlJ/miJDmqKHlvI/mnprkuL5cbiAqL1xuZXhwb3J0IGVudW0gQXV0b0dlbmVyYXRlTW9kZSB7XG4gICAgTk9ORSA9ICdub25lJywgICAgIC8vIOWFs+mXreiHquWKqOeUn+aIkFxuICAgIERBSUxZID0gJ2RhaWx5JywgICAvLyDmr4/ml6Xoh6rliqjnlJ/miJBcbiAgICBXT1JLREFZID0gJ3dvcmtkYXknIC8vIOS7heW3peS9nOaXpeiHquWKqOeUn+aIkFxufVxuXG4vKipcbiAqIOiuvue9rueVjOmdouivreiogFxuICovXG5leHBvcnQgZW51bSBMYW5ndWFnZSB7XG4gICAgQVVUTyA9ICdhdXRvJyxcbiAgICBaSCA9ICd6aCcsXG4gICAgRU4gPSAnZW4nXG59XG5cbi8qKlxuICog5o+S5Lu26K6+572u5o6l5Y+jXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFpbHlUYXNrU2V0dGluZ3Mge1xuICAgIC8vIOWfuuehgOmFjee9rlxuICAgIHJvb3REaXI6IHN0cmluZzsgICAgICAgICAgICAgICAvLyDku7vliqHmlofku7blrZjmlL7nmoTmoLnnm67lvZVcbiAgICBhdXRvR2VuZXJhdGVNb2RlOiBBdXRvR2VuZXJhdGVNb2RlOyAvLyDoh6rliqjnlJ/miJDmqKHlvI9cbiAgICBsYW5ndWFnZTogc3RyaW5nOyAgICAgICAgICAgIC8vIOeVjOmdouivreiogFxuXG4gICAgLy8g5qih5p2/6YWN572uXG4gICAgdGVtcGxhdGVaaDogc3RyaW5nOyAgICAgICAgICAgIC8vIOS4reaWh+S7u+WKoeaooeadv1xuICAgIHRlbXBsYXRlRW46IHN0cmluZzsgICAgICAgICAgICAvLyDoi7Hmlofku7vliqHmqKHmnb9cblxuICAgIC8vIOaWsOWinu+8mueUqOaIt+iHquWumuS5ieaooeadv1xuICAgIGN1c3RvbVRlbXBsYXRlOiBzdHJpbmc7XG5cbiAgICAvLyDmlrDlop7vvJrmoIforrDmmK/lkKbkvb/nlKjoh6rlrprkuYnmqKHmnb9cbiAgICBoYXNDdXN0b21UZW1wbGF0ZTogYm9vbGVhbjtcblxuICAgIC8vIOaWsOWinu+8muaYr+WQpuW8gOWQr+S7u+WKoee7n+iuoeWKn+iDvVxuICAgIHRhc2tTdGF0aXN0aWNzOiBib29sZWFuO1xuXG4gICAgLy8gVUnphY3nva5cbiAgICBzdWNjZXNzTm90aWZpY2F0aW9uRHVyYXRpb246IG51bWJlcjsgLy8g5oiQ5Yqf6YCa55+l5pi+56S65pe26Ze0KOavq+enkilcbn1cblxuLyoqXG4gKiDpu5jorqTkuK3mlofmqKHmnb9cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEVNUExBVEVfWkggPSBgIyMge3tkYXRlV2l0aEljb259fe+8iHt7d2Vla2RheX1977yJXG5cbiMjIyDwn6eYIOS7iuaXpeiuoeWIklxuLS0tXG5cbi0gWyBdIOWGpeaDsyAxMCDliIbpkp8gIFxuLSBbIF0g5aSN55uY5YmN5LiA5pel6K6h5YiSICBcbi0gWyBdIOmYheivuyAyMCDpobXkuaZcblxuIyMjIPCfk50g5bel5L2c5Lu75YqhXG4tLS1cblxuLSBbIF0g5pW055CG5LuK5pel5bel5L2c6K6h5YiSXG4tIFsgXSDlrozmiJDph43opoHpobnnm67ov5vluqZcbmA7XG5cbi8qKlxuICog6buY6K6k6Iux5paH5qih5p2/XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RFTVBMQVRFX0VOID0gYCMjIHt7ZGF0ZVdpdGhJY29ufX0gKHt7d2Vla2RheX19KVxuXG4jIyMg8J+nmCBUb2RheSdzIFBsYW5cbi0tLVxuXG4tIFsgXSBNZWRpdGF0ZSBmb3IgMTAgbWludXRlcyAgXG4tIFsgXSBSZXZpZXcgeWVzdGVyZGF5J3MgcGxhbiAgXG4tIFsgXSBSZWFkIDIwIHBhZ2VzXG5cbiMjIyDwn5OdIFdvcmsgVGFza3Ncbi0tLVxuXG4tIFsgXSBPcmdhbml6ZSB0b2RheSdzIHdvcmsgc2NoZWR1bGVcbi0gWyBdIFByb2dyZXNzIG9uIGltcG9ydGFudCBwcm9qZWN0c1xuYDtcblxuLyoqXG4gKiDpu5jorqTorr7nva5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IERhaWx5VGFza1NldHRpbmdzID0ge1xuICAgIHJvb3REaXI6ICdEYWlseVRhc2tzJyxcbiAgICBhdXRvR2VuZXJhdGVNb2RlOiBBdXRvR2VuZXJhdGVNb2RlLldPUktEQVksXG4gICAgbGFuZ3VhZ2U6IExhbmd1YWdlLkFVVE8sXG4gICAgdGVtcGxhdGVaaDogREVGQVVMVF9URU1QTEFURV9aSCxcbiAgICB0ZW1wbGF0ZUVuOiBERUZBVUxUX1RFTVBMQVRFX0VOLFxuICAgIGN1c3RvbVRlbXBsYXRlOiAnJywgLy8g6buY6K6k5Li656m677yM6KGo56S65L2/55So6K+t6KiA55u45YWz55qE6buY6K6k5qih5p2/XG4gICAgaGFzQ3VzdG9tVGVtcGxhdGU6IGZhbHNlLCAvLyDpu5jorqTkuI3kvb/nlKjoh6rlrprkuYnmqKHmnb9cbiAgICB0YXNrU3RhdGlzdGljczogZmFsc2UsIC8vIOm7mOiupOWFs+mXreS7u+WKoee7n+iuoeWKn+iDvVxuICAgIHN1Y2Nlc3NOb3RpZmljYXRpb25EdXJhdGlvbjogMzAwMFxufTsgIl19

File diff suppressed because one or more lines are too long

View file

@ -113,17 +113,17 @@ export class DailyTaskSettingTab extends PluginSettingTab {
saveIndicator.appendChild(saveSuccessIcon);
// 记录自动保存定时器
let autoSaveTimer: NodeJS.Timeout | null = null;
let autoSaveTimer: number | null = null;
// 自动保存方法
this.autoSaveRootDir = async (value: string) => {
// 清除之前的定时器
if (autoSaveTimer !== null) {
clearTimeout(autoSaveTimer);
window.clearTimeout(autoSaveTimer);
}
// 设置新的定时器延迟800ms保存在用户停止输入后
autoSaveTimer = setTimeout(async () => {
autoSaveTimer = window.setTimeout(async () => {
let pathToSave = value.trim();
if (pathToSave === '') {
pathToSave = 'DailyTasks'; // 默认存放目录
@ -136,7 +136,7 @@ export class DailyTaskSettingTab extends PluginSettingTab {
// 显示保存成功的视觉反馈
saveIndicator.classList.add('save-indicator-visible');
saveIndicator.classList.remove('save-indicator-hidden');
setTimeout(() => {
window.setTimeout(() => {
saveIndicator.classList.remove('save-indicator-visible');
saveIndicator.classList.add('save-indicator-hidden');
}, 1500);
@ -211,6 +211,9 @@ export class DailyTaskSettingTab extends PluginSettingTab {
});
// 语言设置
// TODO: 应该使用Obsidian API的app.i18n.locale获取系统语言设置
// 需要在manifest.json中设置minAppVersion: "1.8.0"或更高
// 可以移除此设置并修改SettingsManager.getCurrentLanguage()方法
new Setting(containerEl)
.setName(getTranslation('settings.language'))
.setDesc(getTranslation('settings.language.desc'))
@ -277,10 +280,10 @@ export class DailyTaskSettingTab extends PluginSettingTab {
return toggleEl;
});
// 模板设置
const templateHeader = document.createElement('h3');
templateHeader.textContent = getTranslation('settings.template');
containerEl.appendChild(templateHeader);
// 模板设置 - 使用常规方式创建标题
// TODO: 如果Obsidian API支持应该使用Setting.setHeading()方法创建标题
// 例如: new Setting(containerEl).setName(getTranslation('settings.template')).setHeading();
containerEl.createEl('h3', { text: getTranslation('settings.template') });
// 添加模板使用逻辑说明
const templateDescription = document.createElement('p');
@ -417,7 +420,7 @@ export class DailyTaskSettingTab extends PluginSettingTab {
// 显示成功提示动画
resetBtn.buttonEl.classList.add('success-button');
setTimeout(() => {
window.setTimeout(() => {
resetBtn.buttonEl.classList.remove('success-button');
}, 1000);
});
@ -488,7 +491,7 @@ export class DailyTaskSettingTab extends PluginSettingTab {
new Notice(`添加任务失败: ${e.message || e}`);
} finally {
// 移除loading状态
setTimeout(() => {
window.setTimeout(() => {
if (this.addTaskButton && this.addTaskButton.buttonEl) {
this.addTaskButton.buttonEl.classList.remove('loading');
}
@ -664,6 +667,8 @@ export class SettingsManager {
*
*/
getCurrentLanguage(): string {
// TODO: 应该使用Obsidian API的app.i18n.locale获取系统语言设置
// 例如return this.plugin.app.i18n.locale.startsWith('zh') ? 'zh' : 'en';
if (this.settings.language === Language.AUTO) {
// 自动检测系统语言
const systemLanguage = window.navigator.language.toLowerCase();

File diff suppressed because one or more lines are too long

View file

@ -31,13 +31,14 @@ export class TaskGenerator {
const settings = this.settingsManager.getSettings();
const rootDir = settings.rootDir.trim() || 'DailyTasks'; // 使用默认目录
// 获取任务文件路径
// 获取任务文件路径 (格式rootDir/year/month.md)
const filePath = getTaskFilePath(rootDir);
// 解析年份和月份
// 解析年份和月份 - 适应新的路径格式
const pathParts = filePath.split('/');
// 现在pathParts数组格式为 [rootDir, year, month.md]
const year = pathParts.length > 1 ? pathParts[1] : '';
const monthName = pathParts.length > 2 ? pathParts[2].replace('.md', '') : '';
const monthFile = pathParts.length > 2 ? pathParts[2] : '';
const yearFolder = `${rootDir}/${year}`;
// 确保根目录存在

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -140,16 +140,17 @@ export async function fileContains(vault: Vault, path: string, content: string):
/**
*
* @param rootDir
* @returns
* @returns rootDir/year/month.md
*/
export function getTaskFilePath(rootDir: string): string {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth() + 1;
const day = now.getDate();
const formattedDate = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
return normalizePath(`${rootDir}/${formattedDate}.md`);
const yearDir = year.toString();
const monthFile = month.toString().padStart(2, '0') + '.md';
return normalizePath(`${rootDir}/${yearDir}/${monthFile}`);
}
/**
@ -185,8 +186,16 @@ export function getYesterdayDate(): string {
* @returns
*/
export function getYesterdayTaskFilePath(rootDir: string): string {
const yesterdayDate = getYesterdayDate();
return normalizePath(`${rootDir}/${yesterdayDate}.md`);
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const year = yesterday.getFullYear();
const month = yesterday.getMonth() + 1;
const yearDir = year.toString();
const monthFile = month.toString().padStart(2, '0') + '.md';
return normalizePath(`${rootDir}/${yearDir}/${monthFile}`);
}
/**

View file

@ -1,51 +0,0 @@
import { getCurrentDate, getCurrentWeekdayName, getYearProgress, getMonthProgress, getCurrentDateWithIcon } from "./dateUtils";
/**
* 模板变量渲染引擎
*/
/**
* 获取当前时间
* @returns 当前时间如10:30
*/
function getCurrentTime() {
const now = new Date();
const hours = now.getHours().toString().padStart(2, '0');
const minutes = now.getMinutes().toString().padStart(2, '0');
return `${hours}:${minutes}`;
}
/**
* 渲染模板内容替换其中的变量
* @param template 模板内容
* @returns 渲染后的内容
*/
export function renderTemplate(template) {
// 定义变量映射
const variableMap = {
'date': getCurrentDate(),
'dateWithIcon': getCurrentDateWithIcon(),
'weekday': getCurrentWeekdayName(),
'yearProgress': getYearProgress(),
'monthProgress': getMonthProgress(),
'time': getCurrentTime()
};
// 替换模板中的变量
let renderedContent = template;
for (const [variable, value] of Object.entries(variableMap)) {
renderedContent = renderedContent.replace(new RegExp(`{{${variable}}}`, 'g'), value.toString());
}
return renderedContent;
}
/**
* 获取变量说明
* @returns 变量说明包括中英文
*/
export function getTemplateVariables() {
return {
'date': '当前日期 / Current date (YYYY-MM-DD)',
'dateWithIcon': '带图标的当前日期 / Current date with daily icon',
'weekday': '当前星期 / Current weekday',
'yearProgress': '年度进度百分比 / Year progress percentage',
'monthProgress': '月度进度百分比 / Month progress percentage',
'time': '当前时间 / Current time (HH:MM)'
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVFbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZW1wbGF0ZUVuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN6QixNQUFNLGFBQWEsQ0FBQztBQUVyQjs7R0FFRztBQUVIOzs7R0FHRztBQUNILFNBQVMsY0FBYztJQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdELE9BQU8sR0FBRyxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzNDLFNBQVM7SUFDVCxNQUFNLFdBQVcsR0FBb0M7UUFDakQsTUFBTSxFQUFFLGNBQWMsRUFBRTtRQUN4QixjQUFjLEVBQUUsc0JBQXNCLEVBQUU7UUFDeEMsU0FBUyxFQUFFLHFCQUFxQixFQUFFO1FBQ2xDLGNBQWMsRUFBRSxlQUFlLEVBQUU7UUFDakMsZUFBZSxFQUFFLGdCQUFnQixFQUFFO1FBQ25DLE1BQU0sRUFBRSxjQUFjLEVBQUU7S0FDM0IsQ0FBQztJQUVGLFdBQVc7SUFDWCxJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDL0IsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDekQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQ3JDLElBQUksTUFBTSxDQUFDLEtBQUssUUFBUSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQ2xDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FDbkIsQ0FBQztLQUNMO0lBRUQsT0FBTyxlQUFlLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFDaEMsT0FBTztRQUNILE1BQU0sRUFBRSxrQ0FBa0M7UUFDMUMsY0FBYyxFQUFFLHlDQUF5QztRQUN6RCxTQUFTLEVBQUUsd0JBQXdCO1FBQ25DLGNBQWMsRUFBRSxvQ0FBb0M7UUFDcEQsZUFBZSxFQUFFLHFDQUFxQztRQUN0RCxNQUFNLEVBQUUsNkJBQTZCO0tBQ3hDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgICBnZXRDdXJyZW50RGF0ZSwgXHJcbiAgICBnZXRDdXJyZW50V2Vla2RheU5hbWUsIFxyXG4gICAgZ2V0WWVhclByb2dyZXNzLCBcclxuICAgIGdldE1vbnRoUHJvZ3Jlc3MsIFxyXG4gICAgZ2V0Q3VycmVudERhdGVXaXRoSWNvbiBcclxufSBmcm9tIFwiLi9kYXRlVXRpbHNcIjtcclxuXHJcbi8qKlxyXG4gKiDmqKHmnb/lj5jph4/muLLmn5PlvJXmk45cclxuICovXHJcblxyXG4vKipcclxuICog6I635Y+W5b2T5YmN5pe26Ze0XHJcbiAqIEByZXR1cm5zIOW9k+WJjeaXtumXtO+8jOWmgjEwOjMwXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IGhvdXJzID0gbm93LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgbWludXRlcyA9IG5vdy5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgcmV0dXJuIGAke2hvdXJzfToke21pbnV0ZXN9YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIOa4suafk+aooeadv+WGheWuue+8jOabv+aNouWFtuS4reeahOWPmOmHj1xyXG4gKiBAcGFyYW0gdGVtcGxhdGUg5qih5p2/5YaF5a65XHJcbiAqIEByZXR1cm5zIOa4suafk+WQjueahOWGheWuuVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8g5a6a5LmJ5Y+Y6YeP5pig5bCEXHJcbiAgICBjb25zdCB2YXJpYWJsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHtcclxuICAgICAgICAnZGF0ZSc6IGdldEN1cnJlbnREYXRlKCksXHJcbiAgICAgICAgJ2RhdGVXaXRoSWNvbic6IGdldEN1cnJlbnREYXRlV2l0aEljb24oKSxcclxuICAgICAgICAnd2Vla2RheSc6IGdldEN1cnJlbnRXZWVrZGF5TmFtZSgpLFxyXG4gICAgICAgICd5ZWFyUHJvZ3Jlc3MnOiBnZXRZZWFyUHJvZ3Jlc3MoKSxcclxuICAgICAgICAnbW9udGhQcm9ncmVzcyc6IGdldE1vbnRoUHJvZ3Jlc3MoKSxcclxuICAgICAgICAndGltZSc6IGdldEN1cnJlbnRUaW1lKClcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vIOabv+aNouaooeadv+S4reeahOWPmOmHj1xyXG4gICAgbGV0IHJlbmRlcmVkQ29udGVudCA9IHRlbXBsYXRlO1xyXG4gICAgZm9yIChjb25zdCBbdmFyaWFibGUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZU1hcCkpIHtcclxuICAgICAgICByZW5kZXJlZENvbnRlbnQgPSByZW5kZXJlZENvbnRlbnQucmVwbGFjZShcclxuICAgICAgICAgICAgbmV3IFJlZ0V4cChge3ske3ZhcmlhYmxlfX19YCwgJ2cnKSwgXHJcbiAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcmVuZGVyZWRDb250ZW50O1xyXG59XHJcblxyXG4vKipcclxuICog6I635Y+W5Y+Y6YeP6K+05piOXHJcbiAqIEByZXR1cm5zIOWPmOmHj+ivtOaYju+8jOWMheaLrOS4reiLseaWh1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBsYXRlVmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICAnZGF0ZSc6ICflvZPliY3ml6XmnJ8gLyBDdXJyZW50IGRhdGUgKFlZWVktTU0tREQpJyxcclxuICAgICAgICAnZGF0ZVdpdGhJY29uJzogJ+W4puWbvuagh+eahOW9k+WJjeaXpeacnyAvIEN1cnJlbnQgZGF0ZSB3aXRoIGRhaWx5IGljb24nLFxyXG4gICAgICAgICd3ZWVrZGF5JzogJ+W9k+WJjeaYn+acnyAvIEN1cnJlbnQgd2Vla2RheScsXHJcbiAgICAgICAgJ3llYXJQcm9ncmVzcyc6ICflubTluqbov5vluqbnmb7liIbmr5QgLyBZZWFyIHByb2dyZXNzIHBlcmNlbnRhZ2UnLFxyXG4gICAgICAgICdtb250aFByb2dyZXNzJzogJ+aciOW6pui/m+W6pueZvuWIhuavlCAvIE1vbnRoIHByb2dyZXNzIHBlcmNlbnRhZ2UnLFxyXG4gICAgICAgICd0aW1lJzogJ+W9k+WJjeaXtumXtCAvIEN1cnJlbnQgdGltZSAoSEg6TU0pJ1xyXG4gICAgfTtcclxufSAiXX0=

View file

@ -12,6 +12,7 @@
"isolatedModules": true,
"strictNullChecks": true,
"skipLibCheck": true,
"outDir": "dist",
"lib": [
"DOM",
"ES5",