@real1ty-obsidian-plugins/utils 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/async-utils.d.ts +0 -69
- package/dist/async-utils.d.ts.map +0 -1
- package/dist/async-utils.js +0 -108
- package/dist/batch-operations.d.ts +0 -11
- package/dist/batch-operations.d.ts.map +0 -1
- package/dist/batch-operations.js +0 -31
- package/dist/child-reference-utils.d.ts +0 -9
- package/dist/child-reference-utils.d.ts.map +0 -1
- package/dist/child-reference-utils.js +0 -57
- package/dist/date-recurrence-utils.d.ts +0 -30
- package/dist/date-recurrence-utils.d.ts.map +0 -1
- package/dist/date-recurrence-utils.js +0 -159
- package/dist/date-utils.d.ts +0 -21
- package/dist/date-utils.d.ts.map +0 -1
- package/dist/date-utils.js +0 -105
- package/dist/evaluator-base.d.ts +0 -52
- package/dist/evaluator-base.d.ts.map +0 -1
- package/dist/evaluator-base.js +0 -84
- package/dist/file-operations.d.ts +0 -31
- package/dist/file-operations.d.ts.map +0 -1
- package/dist/file-operations.js +0 -160
- package/dist/file-utils.d.ts +0 -6
- package/dist/file-utils.d.ts.map +0 -1
- package/dist/file-utils.js +0 -25
- package/dist/generate.d.ts +0 -7
- package/dist/generate.d.ts.map +0 -1
- package/dist/generate.js +0 -13
- package/dist/index.d.ts +0 -14
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -14
- package/dist/link-parser.d.ts +0 -9
- package/dist/link-parser.d.ts.map +0 -1
- package/dist/link-parser.js +0 -19
- package/dist/settings-store.d.ts +0 -19
- package/dist/settings-store.d.ts.map +0 -1
- package/dist/settings-store.js +0 -79
- package/dist/string-utils.d.ts +0 -5
- package/dist/string-utils.d.ts.map +0 -1
- package/dist/string-utils.js +0 -25
- package/dist/templater-utils.d.ts +0 -4
- package/dist/templater-utils.d.ts.map +0 -1
- package/dist/templater-utils.js +0 -51
- package/dist/testing/index.d.ts +0 -5
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -6
- package/dist/testing/mocks/obsidian.d.ts +0 -149
- package/dist/testing/mocks/obsidian.d.ts.map +0 -1
- package/dist/testing/mocks/obsidian.js +0 -220
- package/dist/testing/mocks/utils.d.ts +0 -14
- package/dist/testing/mocks/utils.d.ts.map +0 -1
- package/dist/testing/mocks/utils.js +0 -85
- package/dist/testing/setup.d.ts +0 -2
- package/dist/testing/setup.d.ts.map +0 -1
- package/dist/testing/setup.js +0 -18
package/package.json
CHANGED
package/dist/async-utils.d.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates a function that ensures an async operation runs only once,
|
|
3
|
-
* returning the same promise for concurrent calls.
|
|
4
|
-
*
|
|
5
|
-
* Useful for initialization patterns where you want to ensure
|
|
6
|
-
* expensive async operations (like indexing, API calls, etc.)
|
|
7
|
-
* only happen once even if called multiple times.
|
|
8
|
-
*
|
|
9
|
-
* @param fn The async function to memoize
|
|
10
|
-
* @returns A function that returns the same promise on subsequent calls
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const initializeOnce = onceAsync(async () => {
|
|
15
|
-
* await heavyInitialization();
|
|
16
|
-
* console.log("Initialized!");
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* // All these calls will share the same promise
|
|
20
|
-
* await initializeOnce();
|
|
21
|
-
* await initializeOnce(); // Won't run again
|
|
22
|
-
* await initializeOnce(); // Won't run again
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export declare function onceAsync<T>(fn: () => Promise<T>): () => Promise<T>;
|
|
26
|
-
/**
|
|
27
|
-
* Creates a function that ensures an async operation runs only once per key,
|
|
28
|
-
* useful for caching expensive operations with different parameters.
|
|
29
|
-
*
|
|
30
|
-
* @param fn The async function to memoize
|
|
31
|
-
* @returns A function that memoizes results by key
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const fetchUserOnce = onceAsyncKeyed(async (userId: string) => {
|
|
36
|
-
* return await api.getUser(userId);
|
|
37
|
-
* });
|
|
38
|
-
*
|
|
39
|
-
* // Each unique userId will only be fetched once
|
|
40
|
-
* await fetchUserOnce("user1");
|
|
41
|
-
* await fetchUserOnce("user1"); // Returns cached promise
|
|
42
|
-
* await fetchUserOnce("user2"); // New fetch for different key
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
export declare function onceAsyncKeyed<TArgs extends readonly unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>): (...args: TArgs) => Promise<TReturn>;
|
|
46
|
-
/**
|
|
47
|
-
* Creates a resettable version of onceAsync that can be cleared and re-run.
|
|
48
|
-
*
|
|
49
|
-
* @param fn The async function to memoize
|
|
50
|
-
* @returns Object with execute and reset methods
|
|
51
|
-
*
|
|
52
|
-
* @example
|
|
53
|
-
* ```typescript
|
|
54
|
-
* const { execute: initialize, reset } = onceAsyncResettable(async () => {
|
|
55
|
-
* await heavyInitialization();
|
|
56
|
-
* });
|
|
57
|
-
*
|
|
58
|
-
* await initialize(); // Runs
|
|
59
|
-
* await initialize(); // Cached
|
|
60
|
-
*
|
|
61
|
-
* reset(); // Clear cache
|
|
62
|
-
* await initialize(); // Runs again
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
export declare function onceAsyncResettable<T>(fn: () => Promise<T>): {
|
|
66
|
-
execute: () => Promise<T>;
|
|
67
|
-
reset: () => void;
|
|
68
|
-
};
|
|
69
|
-
//# sourceMappingURL=async-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"async-utils.d.ts","sourceRoot":"","sources":["../src/async-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAcnE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACvE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GACtC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAYtC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG;IAC7D,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB,CAmBA"}
|
package/dist/async-utils.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates a function that ensures an async operation runs only once,
|
|
3
|
-
* returning the same promise for concurrent calls.
|
|
4
|
-
*
|
|
5
|
-
* Useful for initialization patterns where you want to ensure
|
|
6
|
-
* expensive async operations (like indexing, API calls, etc.)
|
|
7
|
-
* only happen once even if called multiple times.
|
|
8
|
-
*
|
|
9
|
-
* @param fn The async function to memoize
|
|
10
|
-
* @returns A function that returns the same promise on subsequent calls
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const initializeOnce = onceAsync(async () => {
|
|
15
|
-
* await heavyInitialization();
|
|
16
|
-
* console.log("Initialized!");
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* // All these calls will share the same promise
|
|
20
|
-
* await initializeOnce();
|
|
21
|
-
* await initializeOnce(); // Won't run again
|
|
22
|
-
* await initializeOnce(); // Won't run again
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export function onceAsync(fn) {
|
|
26
|
-
let promise = null;
|
|
27
|
-
return () => {
|
|
28
|
-
if (!promise) {
|
|
29
|
-
try {
|
|
30
|
-
promise = fn();
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
// Convert synchronous errors to rejected promises
|
|
34
|
-
promise = Promise.reject(error);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return promise;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Creates a function that ensures an async operation runs only once per key,
|
|
42
|
-
* useful for caching expensive operations with different parameters.
|
|
43
|
-
*
|
|
44
|
-
* @param fn The async function to memoize
|
|
45
|
-
* @returns A function that memoizes results by key
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* const fetchUserOnce = onceAsyncKeyed(async (userId: string) => {
|
|
50
|
-
* return await api.getUser(userId);
|
|
51
|
-
* });
|
|
52
|
-
*
|
|
53
|
-
* // Each unique userId will only be fetched once
|
|
54
|
-
* await fetchUserOnce("user1");
|
|
55
|
-
* await fetchUserOnce("user1"); // Returns cached promise
|
|
56
|
-
* await fetchUserOnce("user2"); // New fetch for different key
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
export function onceAsyncKeyed(fn) {
|
|
60
|
-
const cache = new Map();
|
|
61
|
-
return (...args) => {
|
|
62
|
-
const key = JSON.stringify(args);
|
|
63
|
-
if (!cache.has(key)) {
|
|
64
|
-
cache.set(key, fn(...args));
|
|
65
|
-
}
|
|
66
|
-
return cache.get(key);
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Creates a resettable version of onceAsync that can be cleared and re-run.
|
|
71
|
-
*
|
|
72
|
-
* @param fn The async function to memoize
|
|
73
|
-
* @returns Object with execute and reset methods
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ```typescript
|
|
77
|
-
* const { execute: initialize, reset } = onceAsyncResettable(async () => {
|
|
78
|
-
* await heavyInitialization();
|
|
79
|
-
* });
|
|
80
|
-
*
|
|
81
|
-
* await initialize(); // Runs
|
|
82
|
-
* await initialize(); // Cached
|
|
83
|
-
*
|
|
84
|
-
* reset(); // Clear cache
|
|
85
|
-
* await initialize(); // Runs again
|
|
86
|
-
* ```
|
|
87
|
-
*/
|
|
88
|
-
export function onceAsyncResettable(fn) {
|
|
89
|
-
let promise = null;
|
|
90
|
-
return {
|
|
91
|
-
execute: () => {
|
|
92
|
-
if (!promise) {
|
|
93
|
-
try {
|
|
94
|
-
promise = fn();
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
// Convert synchronous errors to rejected promises
|
|
98
|
-
promise = Promise.reject(error);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return promise;
|
|
102
|
-
},
|
|
103
|
-
reset: () => {
|
|
104
|
-
promise = null;
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXN5bmMtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBSSxFQUFvQjtJQUNoRCxJQUFJLE9BQU8sR0FBc0IsSUFBSSxDQUFDO0lBRXRDLE9BQU8sR0FBRyxFQUFFO1FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDO2dCQUNKLE9BQU8sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNoQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDaEIsa0RBQWtEO2dCQUNsRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0YsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDN0IsRUFBd0M7SUFFeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFFbEQsT0FBTyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUU7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBSSxFQUFvQjtJQUkxRCxJQUFJLE9BQU8sR0FBc0IsSUFBSSxDQUFDO0lBRXRDLE9BQU87UUFDTixPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQztvQkFDSixPQUFPLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDaEIsa0RBQWtEO29CQUNsRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsQ0FBQztZQUNGLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNoQixDQUFDO1FBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNYLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUNELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlbnN1cmVzIGFuIGFzeW5jIG9wZXJhdGlvbiBydW5zIG9ubHkgb25jZSxcbiAqIHJldHVybmluZyB0aGUgc2FtZSBwcm9taXNlIGZvciBjb25jdXJyZW50IGNhbGxzLlxuICpcbiAqIFVzZWZ1bCBmb3IgaW5pdGlhbGl6YXRpb24gcGF0dGVybnMgd2hlcmUgeW91IHdhbnQgdG8gZW5zdXJlXG4gKiBleHBlbnNpdmUgYXN5bmMgb3BlcmF0aW9ucyAobGlrZSBpbmRleGluZywgQVBJIGNhbGxzLCBldGMuKVxuICogb25seSBoYXBwZW4gb25jZSBldmVuIGlmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBAcGFyYW0gZm4gVGhlIGFzeW5jIGZ1bmN0aW9uIHRvIG1lbW9pemVcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzYW1lIHByb21pc2Ugb24gc3Vic2VxdWVudCBjYWxsc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBpbml0aWFsaXplT25jZSA9IG9uY2VBc3luYyhhc3luYyAoKSA9PiB7XG4gKiAgIGF3YWl0IGhlYXZ5SW5pdGlhbGl6YXRpb24oKTtcbiAqICAgY29uc29sZS5sb2coXCJJbml0aWFsaXplZCFcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBBbGwgdGhlc2UgY2FsbHMgd2lsbCBzaGFyZSB0aGUgc2FtZSBwcm9taXNlXG4gKiBhd2FpdCBpbml0aWFsaXplT25jZSgpO1xuICogYXdhaXQgaW5pdGlhbGl6ZU9uY2UoKTsgLy8gV29uJ3QgcnVuIGFnYWluXG4gKiBhd2FpdCBpbml0aWFsaXplT25jZSgpOyAvLyBXb24ndCBydW4gYWdhaW5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb25jZUFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogKCkgPT4gUHJvbWlzZTxUPiB7XG5cdGxldCBwcm9taXNlOiBQcm9taXNlPFQ+IHwgbnVsbCA9IG51bGw7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXByb21pc2UpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHByb21pc2UgPSBmbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gQ29udmVydCBzeW5jaHJvbm91cyBlcnJvcnMgdG8gcmVqZWN0ZWQgcHJvbWlzZXNcblx0XHRcdFx0cHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHByb21pc2U7XG5cdH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZW5zdXJlcyBhbiBhc3luYyBvcGVyYXRpb24gcnVucyBvbmx5IG9uY2UgcGVyIGtleSxcbiAqIHVzZWZ1bCBmb3IgY2FjaGluZyBleHBlbnNpdmUgb3BlcmF0aW9ucyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBmbiBUaGUgYXN5bmMgZnVuY3Rpb24gdG8gbWVtb2l6ZVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHJlc3VsdHMgYnkga2V5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZldGNoVXNlck9uY2UgPSBvbmNlQXN5bmNLZXllZChhc3luYyAodXNlcklkOiBzdHJpbmcpID0+IHtcbiAqICAgcmV0dXJuIGF3YWl0IGFwaS5nZXRVc2VyKHVzZXJJZCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBFYWNoIHVuaXF1ZSB1c2VySWQgd2lsbCBvbmx5IGJlIGZldGNoZWQgb25jZVxuICogYXdhaXQgZmV0Y2hVc2VyT25jZShcInVzZXIxXCIpO1xuICogYXdhaXQgZmV0Y2hVc2VyT25jZShcInVzZXIxXCIpOyAvLyBSZXR1cm5zIGNhY2hlZCBwcm9taXNlXG4gKiBhd2FpdCBmZXRjaFVzZXJPbmNlKFwidXNlcjJcIik7IC8vIE5ldyBmZXRjaCBmb3IgZGlmZmVyZW50IGtleVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmNlQXN5bmNLZXllZDxUQXJncyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSwgVFJldHVybj4oXG5cdGZuOiAoLi4uYXJnczogVEFyZ3MpID0+IFByb21pc2U8VFJldHVybj5cbik6ICguLi5hcmdzOiBUQXJncykgPT4gUHJvbWlzZTxUUmV0dXJuPiB7XG5cdGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8VFJldHVybj4+KCk7XG5cblx0cmV0dXJuICguLi5hcmdzOiBUQXJncykgPT4ge1xuXHRcdGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGFyZ3MpO1xuXG5cdFx0aWYgKCFjYWNoZS5oYXMoa2V5KSkge1xuXHRcdFx0Y2FjaGUuc2V0KGtleSwgZm4oLi4uYXJncykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZS5nZXQoa2V5KSE7XG5cdH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlc2V0dGFibGUgdmVyc2lvbiBvZiBvbmNlQXN5bmMgdGhhdCBjYW4gYmUgY2xlYXJlZCBhbmQgcmUtcnVuLlxuICpcbiAqIEBwYXJhbSBmbiBUaGUgYXN5bmMgZnVuY3Rpb24gdG8gbWVtb2l6ZVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggZXhlY3V0ZSBhbmQgcmVzZXQgbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGV4ZWN1dGU6IGluaXRpYWxpemUsIHJlc2V0IH0gPSBvbmNlQXN5bmNSZXNldHRhYmxlKGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgaGVhdnlJbml0aWFsaXphdGlvbigpO1xuICogfSk7XG4gKlxuICogYXdhaXQgaW5pdGlhbGl6ZSgpOyAvLyBSdW5zXG4gKiBhd2FpdCBpbml0aWFsaXplKCk7IC8vIENhY2hlZFxuICpcbiAqIHJlc2V0KCk7IC8vIENsZWFyIGNhY2hlXG4gKiBhd2FpdCBpbml0aWFsaXplKCk7IC8vIFJ1bnMgYWdhaW5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb25jZUFzeW5jUmVzZXR0YWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IHtcblx0ZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTxUPjtcblx0cmVzZXQ6ICgpID0+IHZvaWQ7XG59IHtcblx0bGV0IHByb21pc2U6IFByb21pc2U8VD4gfCBudWxsID0gbnVsbDtcblxuXHRyZXR1cm4ge1xuXHRcdGV4ZWN1dGU6ICgpID0+IHtcblx0XHRcdGlmICghcHJvbWlzZSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHByb21pc2UgPSBmbigpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdC8vIENvbnZlcnQgc3luY2hyb25vdXMgZXJyb3JzIHRvIHJlamVjdGVkIHByb21pc2VzXG5cdFx0XHRcdFx0cHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHByb21pc2U7XG5cdFx0fSxcblx0XHRyZXNldDogKCkgPT4ge1xuXHRcdFx0cHJvbWlzZSA9IG51bGw7XG5cdFx0fSxcblx0fTtcbn1cbiJdfQ==
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface BatchOperationOptions {
|
|
2
|
-
closeAfter?: boolean;
|
|
3
|
-
callOnComplete?: boolean;
|
|
4
|
-
}
|
|
5
|
-
export interface BatchOperationResult {
|
|
6
|
-
successCount: number;
|
|
7
|
-
errorCount: number;
|
|
8
|
-
}
|
|
9
|
-
export declare function runBatchOperation<T>(items: T[], operationLabel: string, handler: (item: T) => Promise<void>, showResult?: boolean): Promise<BatchOperationResult>;
|
|
10
|
-
export declare function showBatchOperationResult(operation: string, successCount: number, errorCount: number): void;
|
|
11
|
-
//# sourceMappingURL=batch-operations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-operations.d.ts","sourceRoot":"","sources":["../src/batch-operations.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACxC,KAAK,EAAE,CAAC,EAAE,EACV,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACnC,UAAU,GAAE,OAAc,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAChB,IAAI,CAUN"}
|
package/dist/batch-operations.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Notice } from "obsidian";
|
|
3
|
-
export function runBatchOperation(items_1, operationLabel_1, handler_1) {
|
|
4
|
-
return __awaiter(this, arguments, void 0, function* (items, operationLabel, handler, showResult = true) {
|
|
5
|
-
let successCount = 0;
|
|
6
|
-
let errorCount = 0;
|
|
7
|
-
for (const item of items) {
|
|
8
|
-
try {
|
|
9
|
-
yield handler(item);
|
|
10
|
-
successCount++;
|
|
11
|
-
}
|
|
12
|
-
catch (error) {
|
|
13
|
-
console.error(`${operationLabel}: error processing item:`, error);
|
|
14
|
-
errorCount++;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
if (showResult) {
|
|
18
|
-
showBatchOperationResult(operationLabel, successCount, errorCount);
|
|
19
|
-
}
|
|
20
|
-
return { successCount, errorCount };
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
export function showBatchOperationResult(operation, successCount, errorCount) {
|
|
24
|
-
if (errorCount === 0) {
|
|
25
|
-
new Notice(`${operation}: ${successCount} item${successCount === 1 ? "" : "s"} processed successfully`);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
new Notice(`${operation}: ${successCount} succeeded, ${errorCount} failed. Check console for details.`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2gtb3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXRjaC1vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBWWxDLE1BQU0sVUFBZ0IsaUJBQWlCO3lEQUN0QyxLQUFVLEVBQ1YsY0FBc0IsRUFDdEIsT0FBbUMsRUFDbkMsYUFBc0IsSUFBSTtRQUUxQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDO2dCQUNKLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixZQUFZLEVBQUUsQ0FBQztZQUNoQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xFLFVBQVUsRUFBRSxDQUFDO1lBQ2QsQ0FBQztRQUNGLENBQUM7UUFFRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDckMsQ0FBQztDQUFBO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUN2QyxTQUFpQixFQUNqQixZQUFvQixFQUNwQixVQUFrQjtJQUVsQixJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLE1BQU0sQ0FDVCxHQUFHLFNBQVMsS0FBSyxZQUFZLFFBQVEsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLHlCQUF5QixDQUMzRixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDUCxJQUFJLE1BQU0sQ0FDVCxHQUFHLFNBQVMsS0FBSyxZQUFZLGVBQWUsVUFBVSxxQ0FBcUMsQ0FDM0YsQ0FBQztJQUNILENBQUM7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hPcGVyYXRpb25PcHRpb25zIHtcblx0Y2xvc2VBZnRlcj86IGJvb2xlYW47XG5cdGNhbGxPbkNvbXBsZXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaE9wZXJhdGlvblJlc3VsdCB7XG5cdHN1Y2Nlc3NDb3VudDogbnVtYmVyO1xuXHRlcnJvckNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5CYXRjaE9wZXJhdGlvbjxUPihcblx0aXRlbXM6IFRbXSxcblx0b3BlcmF0aW9uTGFiZWw6IHN0cmluZyxcblx0aGFuZGxlcjogKGl0ZW06IFQpID0+IFByb21pc2U8dm9pZD4sXG5cdHNob3dSZXN1bHQ6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcm9taXNlPEJhdGNoT3BlcmF0aW9uUmVzdWx0PiB7XG5cdGxldCBzdWNjZXNzQ291bnQgPSAwO1xuXHRsZXQgZXJyb3JDb3VudCA9IDA7XG5cblx0Zm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IGhhbmRsZXIoaXRlbSk7XG5cdFx0XHRzdWNjZXNzQ291bnQrKztcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgJHtvcGVyYXRpb25MYWJlbH06IGVycm9yIHByb2Nlc3NpbmcgaXRlbTpgLCBlcnJvcik7XG5cdFx0XHRlcnJvckNvdW50Kys7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHNob3dSZXN1bHQpIHtcblx0XHRzaG93QmF0Y2hPcGVyYXRpb25SZXN1bHQob3BlcmF0aW9uTGFiZWwsIHN1Y2Nlc3NDb3VudCwgZXJyb3JDb3VudCk7XG5cdH1cblxuXHRyZXR1cm4geyBzdWNjZXNzQ291bnQsIGVycm9yQ291bnQgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dCYXRjaE9wZXJhdGlvblJlc3VsdChcblx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdHN1Y2Nlc3NDb3VudDogbnVtYmVyLFxuXHRlcnJvckNvdW50OiBudW1iZXJcbik6IHZvaWQge1xuXHRpZiAoZXJyb3JDb3VudCA9PT0gMCkge1xuXHRcdG5ldyBOb3RpY2UoXG5cdFx0XHRgJHtvcGVyYXRpb259OiAke3N1Y2Nlc3NDb3VudH0gaXRlbSR7c3VjY2Vzc0NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifSBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5YFxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0bmV3IE5vdGljZShcblx0XHRcdGAke29wZXJhdGlvbn06ICR7c3VjY2Vzc0NvdW50fSBzdWNjZWVkZWQsICR7ZXJyb3JDb3VudH0gZmFpbGVkLiBDaGVjayBjb25zb2xlIGZvciBkZXRhaWxzLmBcblx0XHQpO1xuXHR9XG59XG4iXX0=
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { TFile } from "obsidian";
|
|
2
|
-
export interface VaultAdapter {
|
|
3
|
-
getAbstractFileByPath(path: string): TFile | null;
|
|
4
|
-
}
|
|
5
|
-
export declare function extractDirectoryPath(filePath: string): string;
|
|
6
|
-
export declare function isRelativeChildReference(childRef: string): boolean;
|
|
7
|
-
export declare function normalizeChildReference(childRef: string, vault: VaultAdapter, currentFileDirectory?: string): string;
|
|
8
|
-
export declare function normalizeChildReferences(childRefs: string[], vault: VaultAdapter, currentFileDirectory?: string): string[];
|
|
9
|
-
//# sourceMappingURL=child-reference-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"child-reference-utils.d.ts","sourceRoot":"","sources":["../src/child-reference-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,MAAM,WAAW,YAAY;IAC5B,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMlE;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,oBAAoB,CAAC,EAAE,MAAM,GAC3B,MAAM,CAqCR;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,oBAAoB,CAAC,EAAE,MAAM,GAC3B,MAAM,EAAE,CAIV"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { TFile } from "obsidian";
|
|
2
|
-
import { createFileLink } from "./file-operations";
|
|
3
|
-
import { extractFilePathFromLink } from "./link-parser";
|
|
4
|
-
export function extractDirectoryPath(filePath) {
|
|
5
|
-
const lastSlashIndex = filePath.lastIndexOf("/");
|
|
6
|
-
if (lastSlashIndex === -1) {
|
|
7
|
-
return "";
|
|
8
|
-
}
|
|
9
|
-
return filePath.substring(0, lastSlashIndex);
|
|
10
|
-
}
|
|
11
|
-
export function isRelativeChildReference(childRef) {
|
|
12
|
-
const filePath = extractFilePathFromLink(childRef);
|
|
13
|
-
if (!filePath) {
|
|
14
|
-
return !childRef.includes("/");
|
|
15
|
-
}
|
|
16
|
-
return !filePath.includes("/");
|
|
17
|
-
}
|
|
18
|
-
export function normalizeChildReference(childRef, vault, currentFileDirectory) {
|
|
19
|
-
const filePath = extractFilePathFromLink(childRef);
|
|
20
|
-
// Handle plain text references (not wrapped in [[]])
|
|
21
|
-
if (!filePath) {
|
|
22
|
-
// If it's not a link format, check if it should be converted to a link
|
|
23
|
-
if (!childRef.includes("/") && currentFileDirectory !== undefined) {
|
|
24
|
-
// This is a plain text reference that might need to be converted to a link
|
|
25
|
-
const potentialPath = currentFileDirectory
|
|
26
|
-
? `${currentFileDirectory}/${childRef.endsWith(".md") ? childRef : `${childRef}.md`}`
|
|
27
|
-
: childRef.endsWith(".md")
|
|
28
|
-
? childRef
|
|
29
|
-
: `${childRef}.md`;
|
|
30
|
-
const file = vault.getAbstractFileByPath(potentialPath);
|
|
31
|
-
if (file instanceof TFile) {
|
|
32
|
-
return createFileLink(file);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return childRef;
|
|
36
|
-
}
|
|
37
|
-
// Handle relative references by making them absolute
|
|
38
|
-
if (isRelativeChildReference(childRef) && currentFileDirectory) {
|
|
39
|
-
const absolutePath = `${currentFileDirectory}/${filePath}`;
|
|
40
|
-
const file = vault.getAbstractFileByPath(absolutePath);
|
|
41
|
-
if (file instanceof TFile) {
|
|
42
|
-
return createFileLink(file);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// For absolute references or when no directory context, try to find the file as-is
|
|
46
|
-
const file = vault.getAbstractFileByPath(filePath);
|
|
47
|
-
if (file instanceof TFile) {
|
|
48
|
-
return createFileLink(file);
|
|
49
|
-
}
|
|
50
|
-
return childRef;
|
|
51
|
-
}
|
|
52
|
-
export function normalizeChildReferences(childRefs, vault, currentFileDirectory) {
|
|
53
|
-
return childRefs.map((childRef) => {
|
|
54
|
-
return normalizeChildReference(childRef, vault, currentFileDirectory);
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbGQtcmVmZXJlbmNlLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoaWxkLXJlZmVyZW5jZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNeEQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdCO0lBQ3BELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsSUFBSSxjQUFjLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQixPQUFPLEVBQUUsQ0FBQztJQUNYLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsUUFBZ0I7SUFDeEQsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ3RDLFFBQWdCLEVBQ2hCLEtBQW1CLEVBQ25CLG9CQUE2QjtJQUU3QixNQUFNLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVuRCxxREFBcUQ7SUFDckQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2YsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25FLDJFQUEyRTtZQUMzRSxNQUFNLGFBQWEsR0FBRyxvQkFBb0I7Z0JBQ3pDLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssRUFBRTtnQkFDckYsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN6QixDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssQ0FBQztZQUNyQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDeEQsSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDRixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDakIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDaEUsTUFBTSxZQUFZLEdBQUcsR0FBRyxvQkFBb0IsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNGLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELElBQUksSUFBSSxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQzNCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUN2QyxTQUFtQixFQUNuQixLQUFtQixFQUNuQixvQkFBNkI7SUFFN0IsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDakMsT0FBTyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVMaW5rIH0gZnJvbSBcIi4vZmlsZS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBleHRyYWN0RmlsZVBhdGhGcm9tTGluayB9IGZyb20gXCIuL2xpbmstcGFyc2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmF1bHRBZGFwdGVyIHtcblx0Z2V0QWJzdHJhY3RGaWxlQnlQYXRoKHBhdGg6IHN0cmluZyk6IFRGaWxlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REaXJlY3RvcnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBsYXN0U2xhc2hJbmRleCA9IGZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0aWYgKGxhc3RTbGFzaEluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdHJldHVybiBmaWxlUGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoSW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGl2ZUNoaWxkUmVmZXJlbmNlKGNoaWxkUmVmOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Y29uc3QgZmlsZVBhdGggPSBleHRyYWN0RmlsZVBhdGhGcm9tTGluayhjaGlsZFJlZik7XG5cdGlmICghZmlsZVBhdGgpIHtcblx0XHRyZXR1cm4gIWNoaWxkUmVmLmluY2x1ZGVzKFwiL1wiKTtcblx0fVxuXHRyZXR1cm4gIWZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNoaWxkUmVmZXJlbmNlKFxuXHRjaGlsZFJlZjogc3RyaW5nLFxuXHR2YXVsdDogVmF1bHRBZGFwdGVyLFxuXHRjdXJyZW50RmlsZURpcmVjdG9yeT86IHN0cmluZ1xuKTogc3RyaW5nIHtcblx0Y29uc3QgZmlsZVBhdGggPSBleHRyYWN0RmlsZVBhdGhGcm9tTGluayhjaGlsZFJlZik7XG5cblx0Ly8gSGFuZGxlIHBsYWluIHRleHQgcmVmZXJlbmNlcyAobm90IHdyYXBwZWQgaW4gW1tdXSlcblx0aWYgKCFmaWxlUGF0aCkge1xuXHRcdC8vIElmIGl0J3Mgbm90IGEgbGluayBmb3JtYXQsIGNoZWNrIGlmIGl0IHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gYSBsaW5rXG5cdFx0aWYgKCFjaGlsZFJlZi5pbmNsdWRlcyhcIi9cIikgJiYgY3VycmVudEZpbGVEaXJlY3RvcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gVGhpcyBpcyBhIHBsYWluIHRleHQgcmVmZXJlbmNlIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8gYSBsaW5rXG5cdFx0XHRjb25zdCBwb3RlbnRpYWxQYXRoID0gY3VycmVudEZpbGVEaXJlY3Rvcnlcblx0XHRcdFx0PyBgJHtjdXJyZW50RmlsZURpcmVjdG9yeX0vJHtjaGlsZFJlZi5lbmRzV2l0aChcIi5tZFwiKSA/IGNoaWxkUmVmIDogYCR7Y2hpbGRSZWZ9Lm1kYH1gXG5cdFx0XHRcdDogY2hpbGRSZWYuZW5kc1dpdGgoXCIubWRcIilcblx0XHRcdFx0XHQ/IGNoaWxkUmVmXG5cdFx0XHRcdFx0OiBgJHtjaGlsZFJlZn0ubWRgO1xuXHRcdFx0Y29uc3QgZmlsZSA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwb3RlbnRpYWxQYXRoKTtcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUZpbGVMaW5rKGZpbGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2hpbGRSZWY7XG5cdH1cblxuXHQvLyBIYW5kbGUgcmVsYXRpdmUgcmVmZXJlbmNlcyBieSBtYWtpbmcgdGhlbSBhYnNvbHV0ZVxuXHRpZiAoaXNSZWxhdGl2ZUNoaWxkUmVmZXJlbmNlKGNoaWxkUmVmKSAmJiBjdXJyZW50RmlsZURpcmVjdG9yeSkge1xuXHRcdGNvbnN0IGFic29sdXRlUGF0aCA9IGAke2N1cnJlbnRGaWxlRGlyZWN0b3J5fS8ke2ZpbGVQYXRofWA7XG5cdFx0Y29uc3QgZmlsZSA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChhYnNvbHV0ZVBhdGgpO1xuXHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcblx0XHRcdHJldHVybiBjcmVhdGVGaWxlTGluayhmaWxlKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGb3IgYWJzb2x1dGUgcmVmZXJlbmNlcyBvciB3aGVuIG5vIGRpcmVjdG9yeSBjb250ZXh0LCB0cnkgdG8gZmluZCB0aGUgZmlsZSBhcy1pc1xuXHRjb25zdCBmaWxlID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoKTtcblx0aWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuXHRcdHJldHVybiBjcmVhdGVGaWxlTGluayhmaWxlKTtcblx0fVxuXG5cdHJldHVybiBjaGlsZFJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNoaWxkUmVmZXJlbmNlcyhcblx0Y2hpbGRSZWZzOiBzdHJpbmdbXSxcblx0dmF1bHQ6IFZhdWx0QWRhcHRlcixcblx0Y3VycmVudEZpbGVEaXJlY3Rvcnk/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0cmV0dXJuIGNoaWxkUmVmcy5tYXAoKGNoaWxkUmVmKSA9PiB7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZUNoaWxkUmVmZXJlbmNlKGNoaWxkUmVmLCB2YXVsdCwgY3VycmVudEZpbGVEaXJlY3RvcnkpO1xuXHR9KTtcbn1cbiJdfQ==
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { DateTime } from "luxon";
|
|
2
|
-
export type RecurrenceType = "daily" | "weekly" | "bi-weekly" | "monthly" | "bi-monthly" | "yearly";
|
|
3
|
-
export type Weekday = "sunday" | "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday";
|
|
4
|
-
export declare const WEEKDAY_TO_NUMBER: Record<Weekday, number>;
|
|
5
|
-
/**
|
|
6
|
-
* Calculates the next occurrence date based on recurrence type and optional weekdays
|
|
7
|
-
*/
|
|
8
|
-
export declare function getNextOccurrence(currentDate: DateTime, recurrenceType: RecurrenceType, weekdays?: Weekday[]): DateTime;
|
|
9
|
-
/**
|
|
10
|
-
* Checks if a given date matches any of the specified weekdays
|
|
11
|
-
*/
|
|
12
|
-
export declare function isDateOnWeekdays(date: DateTime, weekdays: Weekday[]): boolean;
|
|
13
|
-
/**
|
|
14
|
-
* Finds the next occurrence on specified weekdays
|
|
15
|
-
*/
|
|
16
|
-
export declare function getNextWeekdayOccurrence(currentDate: DateTime, weekdays: Weekday[]): DateTime;
|
|
17
|
-
/**
|
|
18
|
-
* Finds the next bi-weekly occurrence on specified weekdays
|
|
19
|
-
*/
|
|
20
|
-
export declare function getNextBiWeeklyOccurrence(currentDate: DateTime, weekdays: Weekday[]): DateTime;
|
|
21
|
-
export declare function iterateOccurrencesInRange(startDate: DateTime, rrules: {
|
|
22
|
-
type: RecurrenceType;
|
|
23
|
-
weekdays?: Weekday[];
|
|
24
|
-
}, rangeStart: DateTime, rangeEnd: DateTime): Generator<DateTime, void, unknown>;
|
|
25
|
-
/**
|
|
26
|
-
* Calculates a DateTime for a specific date with optional time
|
|
27
|
-
*/
|
|
28
|
-
export declare function calculateInstanceDateTime(instanceDate: DateTime, timeString?: string): DateTime;
|
|
29
|
-
export declare function calculateRecurringInstanceDateTime(nextInstanceDateTime: DateTime, nodeRecuringEventDateTime: DateTime, recurrenceType: RecurrenceType, allDay?: boolean): DateTime;
|
|
30
|
-
//# sourceMappingURL=date-recurrence-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-recurrence-utils.d.ts","sourceRoot":"","sources":["../src/date-recurrence-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpG,MAAM,MAAM,OAAO,GAChB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,CAAC;AAEd,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAQrD,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,WAAW,EAAE,QAAQ,EACrB,cAAc,EAAE,cAAc,EAC9B,QAAQ,CAAC,EAAE,OAAO,EAAE,GAClB,QAAQ,CAuBV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAQ7E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,CAgB7F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,CAI9F;AAED,wBAAiB,yBAAyB,CACzC,SAAS,EAAE,QAAQ,EACnB,MAAM,EAAE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,EACtD,UAAU,EAAE,QAAQ,EACpB,QAAQ,EAAE,QAAQ,GAChB,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CA+BpC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAO/F;AAED,wBAAgB,kCAAkC,CACjD,oBAAoB,EAAE,QAAQ,EAC9B,yBAAyB,EAAE,QAAQ,EACnC,cAAc,EAAE,cAAc,EAC9B,MAAM,CAAC,EAAE,OAAO,GACd,QAAQ,CAgDV"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
export const WEEKDAY_TO_NUMBER = {
|
|
2
|
-
sunday: 0,
|
|
3
|
-
monday: 1,
|
|
4
|
-
tuesday: 2,
|
|
5
|
-
wednesday: 3,
|
|
6
|
-
thursday: 4,
|
|
7
|
-
friday: 5,
|
|
8
|
-
saturday: 6,
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Calculates the next occurrence date based on recurrence type and optional weekdays
|
|
12
|
-
*/
|
|
13
|
-
export function getNextOccurrence(currentDate, recurrenceType, weekdays) {
|
|
14
|
-
switch (recurrenceType) {
|
|
15
|
-
case "daily":
|
|
16
|
-
return currentDate.plus({ days: 1 });
|
|
17
|
-
case "weekly":
|
|
18
|
-
if (weekdays && weekdays.length > 0) {
|
|
19
|
-
return getNextWeekdayOccurrence(currentDate, weekdays);
|
|
20
|
-
}
|
|
21
|
-
return currentDate.plus({ weeks: 1 });
|
|
22
|
-
case "bi-weekly":
|
|
23
|
-
if (weekdays && weekdays.length > 0) {
|
|
24
|
-
return getNextBiWeeklyOccurrence(currentDate, weekdays);
|
|
25
|
-
}
|
|
26
|
-
return currentDate.plus({ weeks: 2 });
|
|
27
|
-
case "monthly":
|
|
28
|
-
return currentDate.plus({ months: 1 });
|
|
29
|
-
case "bi-monthly":
|
|
30
|
-
return currentDate.plus({ months: 2 });
|
|
31
|
-
case "yearly":
|
|
32
|
-
return currentDate.plus({ years: 1 });
|
|
33
|
-
default:
|
|
34
|
-
return currentDate.plus({ days: 1 });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Checks if a given date matches any of the specified weekdays
|
|
39
|
-
*/
|
|
40
|
-
export function isDateOnWeekdays(date, weekdays) {
|
|
41
|
-
const dateWeekday = date.weekday;
|
|
42
|
-
const luxonWeekdays = weekdays.map((day) => {
|
|
43
|
-
const dayNumber = WEEKDAY_TO_NUMBER[day];
|
|
44
|
-
return dayNumber === 0 ? 7 : dayNumber; // Convert Sunday from 0 to 7 for Luxon
|
|
45
|
-
});
|
|
46
|
-
return luxonWeekdays.includes(dateWeekday);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Finds the next occurrence on specified weekdays
|
|
50
|
-
*/
|
|
51
|
-
export function getNextWeekdayOccurrence(currentDate, weekdays) {
|
|
52
|
-
const currentWeekday = currentDate.weekday;
|
|
53
|
-
const luxonWeekdays = weekdays.map((day) => {
|
|
54
|
-
const dayNumber = WEEKDAY_TO_NUMBER[day];
|
|
55
|
-
return dayNumber === 0 ? 7 : dayNumber; // Convert Sunday from 0 to 7 for Luxon
|
|
56
|
-
});
|
|
57
|
-
// Find next weekday in the current week (after today)
|
|
58
|
-
const nextWeekday = luxonWeekdays.find((day) => day > currentWeekday);
|
|
59
|
-
if (nextWeekday) {
|
|
60
|
-
return currentDate.set({ weekday: nextWeekday });
|
|
61
|
-
}
|
|
62
|
-
// No more weekdays this week, go to first weekday of next week
|
|
63
|
-
const firstWeekday = Math.min(...luxonWeekdays);
|
|
64
|
-
return currentDate.plus({ weeks: 1 }).set({ weekday: firstWeekday });
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Finds the next bi-weekly occurrence on specified weekdays
|
|
68
|
-
*/
|
|
69
|
-
export function getNextBiWeeklyOccurrence(currentDate, weekdays) {
|
|
70
|
-
const nextWeekly = getNextWeekdayOccurrence(currentDate, weekdays);
|
|
71
|
-
// Add one more week to make it bi-weekly
|
|
72
|
-
return nextWeekly.plus({ weeks: 1 });
|
|
73
|
-
}
|
|
74
|
-
export function* iterateOccurrencesInRange(startDate, rrules, rangeStart, rangeEnd) {
|
|
75
|
-
let currentDate = startDate >= rangeStart ? startDate : rangeStart;
|
|
76
|
-
while (currentDate <= rangeEnd) {
|
|
77
|
-
// Check if current date should have an event
|
|
78
|
-
let shouldAddEvent = false;
|
|
79
|
-
if (rrules.type === "daily") {
|
|
80
|
-
shouldAddEvent = true;
|
|
81
|
-
}
|
|
82
|
-
else if (rrules.type === "weekly" || rrules.type === "bi-weekly") {
|
|
83
|
-
if (rrules.weekdays && rrules.weekdays.length > 0) {
|
|
84
|
-
shouldAddEvent = isDateOnWeekdays(currentDate, rrules.weekdays);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
shouldAddEvent = true;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
shouldAddEvent = true;
|
|
92
|
-
}
|
|
93
|
-
if (shouldAddEvent) {
|
|
94
|
-
yield currentDate;
|
|
95
|
-
}
|
|
96
|
-
const nextDate = getNextOccurrence(currentDate, rrules.type, rrules.weekdays);
|
|
97
|
-
if (nextDate <= rangeEnd) {
|
|
98
|
-
currentDate = nextDate;
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Calculates a DateTime for a specific date with optional time
|
|
107
|
-
*/
|
|
108
|
-
export function calculateInstanceDateTime(instanceDate, timeString) {
|
|
109
|
-
if (!timeString) {
|
|
110
|
-
return instanceDate.startOf("day");
|
|
111
|
-
}
|
|
112
|
-
const [hours, minutes] = timeString.split(":").map(Number);
|
|
113
|
-
return instanceDate.set({ hour: hours, minute: minutes, second: 0, millisecond: 0 });
|
|
114
|
-
}
|
|
115
|
-
export function calculateRecurringInstanceDateTime(nextInstanceDateTime, nodeRecuringEventDateTime, recurrenceType, allDay) {
|
|
116
|
-
switch (recurrenceType) {
|
|
117
|
-
case "daily":
|
|
118
|
-
case "weekly":
|
|
119
|
-
case "bi-weekly": {
|
|
120
|
-
if (allDay) {
|
|
121
|
-
return nextInstanceDateTime.startOf("day");
|
|
122
|
-
}
|
|
123
|
-
return nextInstanceDateTime.set({
|
|
124
|
-
hour: nodeRecuringEventDateTime.hour,
|
|
125
|
-
minute: nodeRecuringEventDateTime.minute,
|
|
126
|
-
second: 0,
|
|
127
|
-
millisecond: 0,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
case "monthly":
|
|
131
|
-
case "bi-monthly": {
|
|
132
|
-
if (allDay) {
|
|
133
|
-
// Inherit day from original, set time to 00:00
|
|
134
|
-
return nextInstanceDateTime.set({ day: nodeRecuringEventDateTime.day }).startOf("day");
|
|
135
|
-
}
|
|
136
|
-
// Inherit day + time from original
|
|
137
|
-
return nodeRecuringEventDateTime.set({
|
|
138
|
-
year: nextInstanceDateTime.year,
|
|
139
|
-
month: nextInstanceDateTime.month,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
case "yearly": {
|
|
143
|
-
if (allDay) {
|
|
144
|
-
return nextInstanceDateTime
|
|
145
|
-
.set({
|
|
146
|
-
month: nodeRecuringEventDateTime.month,
|
|
147
|
-
day: nodeRecuringEventDateTime.day,
|
|
148
|
-
})
|
|
149
|
-
.startOf("day");
|
|
150
|
-
}
|
|
151
|
-
return nodeRecuringEventDateTime.set({
|
|
152
|
-
year: nextInstanceDateTime.year,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
default:
|
|
156
|
-
return nextInstanceDateTime.startOf("day");
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yZWN1cnJlbmNlLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhdGUtcmVjdXJyZW5jZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBNEI7SUFDekQsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLENBQUM7SUFDWixRQUFRLEVBQUUsQ0FBQztJQUNYLE1BQU0sRUFBRSxDQUFDO0lBQ1QsUUFBUSxFQUFFLENBQUM7Q0FDWCxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQ2hDLFdBQXFCLEVBQ3JCLGNBQThCLEVBQzlCLFFBQW9CO0lBRXBCLFFBQVEsY0FBYyxFQUFFLENBQUM7UUFDeEIsS0FBSyxPQUFPO1lBQ1gsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsS0FBSyxRQUFRO1lBQ1osSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUNELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssV0FBVztZQUNmLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8seUJBQXlCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFDRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxLQUFLLFNBQVM7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QyxJQUFJO2dCQUMvQixLQUFLLEVBQUUsb0JBQW9CLENBQUMsS0FBSzthQUNqQyxDQUFDLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLG9CQUFvQjtxQkFDekIsR0FBRyxDQUFDO29CQUNKLEtBQUssRUFBRSx5QkFBeUIsQ0FBQyxLQUFLO29CQUN0QyxHQUFHLEVBQUUseUJBQXlCLENBQUMsR0FBRztpQkFDbEMsQ0FBQztxQkFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsQ0FBQztZQUVELE9BQU8seUJBQXlCLENBQUMsR0FBRyxDQUFDO2dCQUNwQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsSUFBSTthQUMvQixDQUFDLENBQUM7UUFDSixDQUFDO1FBRUQ7WUFDQyxPQUFPLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0FBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGF0ZVRpbWUgfSBmcm9tIFwibHV4b25cIjtcblxuZXhwb3J0IHR5cGUgUmVjdXJyZW5jZVR5cGUgPSBcImRhaWx5XCIgfCBcIndlZWtseVwiIHwgXCJiaS13ZWVrbHlcIiB8IFwibW9udGhseVwiIHwgXCJiaS1tb250aGx5XCIgfCBcInllYXJseVwiO1xuXG5leHBvcnQgdHlwZSBXZWVrZGF5ID1cblx0fCBcInN1bmRheVwiXG5cdHwgXCJtb25kYXlcIlxuXHR8IFwidHVlc2RheVwiXG5cdHwgXCJ3ZWRuZXNkYXlcIlxuXHR8IFwidGh1cnNkYXlcIlxuXHR8IFwiZnJpZGF5XCJcblx0fCBcInNhdHVyZGF5XCI7XG5cbmV4cG9ydCBjb25zdCBXRUVLREFZX1RPX05VTUJFUjogUmVjb3JkPFdlZWtkYXksIG51bWJlcj4gPSB7XG5cdHN1bmRheTogMCxcblx0bW9uZGF5OiAxLFxuXHR0dWVzZGF5OiAyLFxuXHR3ZWRuZXNkYXk6IDMsXG5cdHRodXJzZGF5OiA0LFxuXHRmcmlkYXk6IDUsXG5cdHNhdHVyZGF5OiA2LFxufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBuZXh0IG9jY3VycmVuY2UgZGF0ZSBiYXNlZCBvbiByZWN1cnJlbmNlIHR5cGUgYW5kIG9wdGlvbmFsIHdlZWtkYXlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0T2NjdXJyZW5jZShcblx0Y3VycmVudERhdGU6IERhdGVUaW1lLFxuXHRyZWN1cnJlbmNlVHlwZTogUmVjdXJyZW5jZVR5cGUsXG5cdHdlZWtkYXlzPzogV2Vla2RheVtdXG4pOiBEYXRlVGltZSB7XG5cdHN3aXRjaCAocmVjdXJyZW5jZVR5cGUpIHtcblx0XHRjYXNlIFwiZGFpbHlcIjpcblx0XHRcdHJldHVybiBjdXJyZW50RGF0ZS5wbHVzKHsgZGF5czogMSB9KTtcblx0XHRjYXNlIFwid2Vla2x5XCI6XG5cdFx0XHRpZiAod2Vla2RheXMgJiYgd2Vla2RheXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gZ2V0TmV4dFdlZWtkYXlPY2N1cnJlbmNlKGN1cnJlbnREYXRlLCB3ZWVrZGF5cyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IHdlZWtzOiAxIH0pO1xuXHRcdGNhc2UgXCJiaS13ZWVrbHlcIjpcblx0XHRcdGlmICh3ZWVrZGF5cyAmJiB3ZWVrZGF5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBnZXROZXh0QmlXZWVrbHlPY2N1cnJlbmNlKGN1cnJlbnREYXRlLCB3ZWVrZGF5cyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IHdlZWtzOiAyIH0pO1xuXHRcdGNhc2UgXCJtb250aGx5XCI6XG5cdFx0XHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IG1vbnRoczogMSB9KTtcblx0XHRjYXNlIFwiYmktbW9udGhseVwiOlxuXHRcdFx0cmV0dXJuIGN1cnJlbnREYXRlLnBsdXMoeyBtb250aHM6IDIgfSk7XG5cdFx0Y2FzZSBcInllYXJseVwiOlxuXHRcdFx0cmV0dXJuIGN1cnJlbnREYXRlLnBsdXMoeyB5ZWFyczogMSB9KTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGN1cnJlbnREYXRlLnBsdXMoeyBkYXlzOiAxIH0pO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gZGF0ZSBtYXRjaGVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIHdlZWtkYXlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVPbldlZWtkYXlzKGRhdGU6IERhdGVUaW1lLCB3ZWVrZGF5czogV2Vla2RheVtdKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGVXZWVrZGF5ID0gZGF0ZS53ZWVrZGF5O1xuXHRjb25zdCBsdXhvbldlZWtkYXlzID0gd2Vla2RheXMubWFwKChkYXkpID0+IHtcblx0XHRjb25zdCBkYXlOdW1iZXIgPSBXRUVLREFZX1RPX05VTUJFUltkYXldO1xuXHRcdHJldHVybiBkYXlOdW1iZXIgPT09IDAgPyA3IDogZGF5TnVtYmVyOyAvLyBDb252ZXJ0IFN1bmRheSBmcm9tIDAgdG8gNyBmb3IgTHV4b25cblx0fSk7XG5cblx0cmV0dXJuIGx1eG9uV2Vla2RheXMuaW5jbHVkZXMoZGF0ZVdlZWtkYXkpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXh0IG9jY3VycmVuY2Ugb24gc3BlY2lmaWVkIHdlZWtkYXlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0V2Vla2RheU9jY3VycmVuY2UoY3VycmVudERhdGU6IERhdGVUaW1lLCB3ZWVrZGF5czogV2Vla2RheVtdKTogRGF0ZVRpbWUge1xuXHRjb25zdCBjdXJyZW50V2Vla2RheSA9IGN1cnJlbnREYXRlLndlZWtkYXk7XG5cdGNvbnN0IGx1eG9uV2Vla2RheXMgPSB3ZWVrZGF5cy5tYXAoKGRheSkgPT4ge1xuXHRcdGNvbnN0IGRheU51bWJlciA9IFdFRUtEQVlfVE9fTlVNQkVSW2RheV07XG5cdFx0cmV0dXJuIGRheU51bWJlciA9PT0gMCA/IDcgOiBkYXlOdW1iZXI7IC8vIENvbnZlcnQgU3VuZGF5IGZyb20gMCB0byA3IGZvciBMdXhvblxuXHR9KTtcblxuXHQvLyBGaW5kIG5leHQgd2Vla2RheSBpbiB0aGUgY3VycmVudCB3ZWVrIChhZnRlciB0b2RheSlcblx0Y29uc3QgbmV4dFdlZWtkYXkgPSBsdXhvbldlZWtkYXlzLmZpbmQoKGRheSkgPT4gZGF5ID4gY3VycmVudFdlZWtkYXkpO1xuXHRpZiAobmV4dFdlZWtkYXkpIHtcblx0XHRyZXR1cm4gY3VycmVudERhdGUuc2V0KHsgd2Vla2RheTogbmV4dFdlZWtkYXkgYXMgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB9KTtcblx0fVxuXG5cdC8vIE5vIG1vcmUgd2Vla2RheXMgdGhpcyB3ZWVrLCBnbyB0byBmaXJzdCB3ZWVrZGF5IG9mIG5leHQgd2Vla1xuXHRjb25zdCBmaXJzdFdlZWtkYXkgPSBNYXRoLm1pbiguLi5sdXhvbldlZWtkYXlzKTtcblx0cmV0dXJuIGN1cnJlbnREYXRlLnBsdXMoeyB3ZWVrczogMSB9KS5zZXQoeyB3ZWVrZGF5OiBmaXJzdFdlZWtkYXkgYXMgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB9KTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgbmV4dCBiaS13ZWVrbHkgb2NjdXJyZW5jZSBvbiBzcGVjaWZpZWQgd2Vla2RheXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRCaVdlZWtseU9jY3VycmVuY2UoY3VycmVudERhdGU6IERhdGVUaW1lLCB3ZWVrZGF5czogV2Vla2RheVtdKTogRGF0ZVRpbWUge1xuXHRjb25zdCBuZXh0V2Vla2x5ID0gZ2V0TmV4dFdlZWtkYXlPY2N1cnJlbmNlKGN1cnJlbnREYXRlLCB3ZWVrZGF5cyk7XG5cdC8vIEFkZCBvbmUgbW9yZSB3ZWVrIHRvIG1ha2UgaXQgYmktd2Vla2x5XG5cdHJldHVybiBuZXh0V2Vla2x5LnBsdXMoeyB3ZWVrczogMSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyYXRlT2NjdXJyZW5jZXNJblJhbmdlKFxuXHRzdGFydERhdGU6IERhdGVUaW1lLFxuXHRycnVsZXM6IHsgdHlwZTogUmVjdXJyZW5jZVR5cGU7IHdlZWtkYXlzPzogV2Vla2RheVtdIH0sXG5cdHJhbmdlU3RhcnQ6IERhdGVUaW1lLFxuXHRyYW5nZUVuZDogRGF0ZVRpbWVcbik6IEdlbmVyYXRvcjxEYXRlVGltZSwgdm9pZCwgdW5rbm93bj4ge1xuXHRsZXQgY3VycmVudERhdGUgPSBzdGFydERhdGUgPj0gcmFuZ2VTdGFydCA/IHN0YXJ0RGF0ZSA6IHJhbmdlU3RhcnQ7XG5cblx0d2hpbGUgKGN1cnJlbnREYXRlIDw9IHJhbmdlRW5kKSB7XG5cdFx0Ly8gQ2hlY2sgaWYgY3VycmVudCBkYXRlIHNob3VsZCBoYXZlIGFuIGV2ZW50XG5cdFx0bGV0IHNob3VsZEFkZEV2ZW50ID0gZmFsc2U7XG5cblx0XHRpZiAocnJ1bGVzLnR5cGUgPT09IFwiZGFpbHlcIikge1xuXHRcdFx0c2hvdWxkQWRkRXZlbnQgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAocnJ1bGVzLnR5cGUgPT09IFwid2Vla2x5XCIgfHwgcnJ1bGVzLnR5cGUgPT09IFwiYmktd2Vla2x5XCIpIHtcblx0XHRcdGlmIChycnVsZXMud2Vla2RheXMgJiYgcnJ1bGVzLndlZWtkYXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0c2hvdWxkQWRkRXZlbnQgPSBpc0RhdGVPbldlZWtkYXlzKGN1cnJlbnREYXRlLCBycnVsZXMud2Vla2RheXMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2hvdWxkQWRkRXZlbnQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzaG91bGRBZGRFdmVudCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHNob3VsZEFkZEV2ZW50KSB7XG5cdFx0XHR5aWVsZCBjdXJyZW50RGF0ZTtcblx0XHR9XG5cblx0XHRjb25zdCBuZXh0RGF0ZSA9IGdldE5leHRPY2N1cnJlbmNlKGN1cnJlbnREYXRlLCBycnVsZXMudHlwZSwgcnJ1bGVzLndlZWtkYXlzKTtcblxuXHRcdGlmIChuZXh0RGF0ZSA8PSByYW5nZUVuZCkge1xuXHRcdFx0Y3VycmVudERhdGUgPSBuZXh0RGF0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIERhdGVUaW1lIGZvciBhIHNwZWNpZmljIGRhdGUgd2l0aCBvcHRpb25hbCB0aW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVJbnN0YW5jZURhdGVUaW1lKGluc3RhbmNlRGF0ZTogRGF0ZVRpbWUsIHRpbWVTdHJpbmc/OiBzdHJpbmcpOiBEYXRlVGltZSB7XG5cdGlmICghdGltZVN0cmluZykge1xuXHRcdHJldHVybiBpbnN0YW5jZURhdGUuc3RhcnRPZihcImRheVwiKTtcblx0fVxuXG5cdGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aW1lU3RyaW5nLnNwbGl0KFwiOlwiKS5tYXAoTnVtYmVyKTtcblx0cmV0dXJuIGluc3RhbmNlRGF0ZS5zZXQoeyBob3VyOiBob3VycywgbWludXRlOiBtaW51dGVzLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUmVjdXJyaW5nSW5zdGFuY2VEYXRlVGltZShcblx0bmV4dEluc3RhbmNlRGF0ZVRpbWU6IERhdGVUaW1lLFxuXHRub2RlUmVjdXJpbmdFdmVudERhdGVUaW1lOiBEYXRlVGltZSxcblx0cmVjdXJyZW5jZVR5cGU6IFJlY3VycmVuY2VUeXBlLFxuXHRhbGxEYXk/OiBib29sZWFuXG4pOiBEYXRlVGltZSB7XG5cdHN3aXRjaCAocmVjdXJyZW5jZVR5cGUpIHtcblx0XHRjYXNlIFwiZGFpbHlcIjpcblx0XHRjYXNlIFwid2Vla2x5XCI6XG5cdFx0Y2FzZSBcImJpLXdlZWtseVwiOiB7XG5cdFx0XHRpZiAoYWxsRGF5KSB7XG5cdFx0XHRcdHJldHVybiBuZXh0SW5zdGFuY2VEYXRlVGltZS5zdGFydE9mKFwiZGF5XCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5leHRJbnN0YW5jZURhdGVUaW1lLnNldCh7XG5cdFx0XHRcdGhvdXI6IG5vZGVSZWN1cmluZ0V2ZW50RGF0ZVRpbWUuaG91cixcblx0XHRcdFx0bWludXRlOiBub2RlUmVjdXJpbmdFdmVudERhdGVUaW1lLm1pbnV0ZSxcblx0XHRcdFx0c2Vjb25kOiAwLFxuXHRcdFx0XHRtaWxsaXNlY29uZDogMCxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNhc2UgXCJtb250aGx5XCI6XG5cdFx0Y2FzZSBcImJpLW1vbnRobHlcIjoge1xuXHRcdFx0aWYgKGFsbERheSkge1xuXHRcdFx0XHQvLyBJbmhlcml0IGRheSBmcm9tIG9yaWdpbmFsLCBzZXQgdGltZSB0byAwMDowMFxuXHRcdFx0XHRyZXR1cm4gbmV4dEluc3RhbmNlRGF0ZVRpbWUuc2V0KHsgZGF5OiBub2RlUmVjdXJpbmdFdmVudERhdGVUaW1lLmRheSB9KS5zdGFydE9mKFwiZGF5XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbmhlcml0IGRheSArIHRpbWUgZnJvbSBvcmlnaW5hbFxuXHRcdFx0cmV0dXJuIG5vZGVSZWN1cmluZ0V2ZW50RGF0ZVRpbWUuc2V0KHtcblx0XHRcdFx0eWVhcjogbmV4dEluc3RhbmNlRGF0ZVRpbWUueWVhcixcblx0XHRcdFx0bW9udGg6IG5leHRJbnN0YW5jZURhdGVUaW1lLm1vbnRoLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y2FzZSBcInllYXJseVwiOiB7XG5cdFx0XHRpZiAoYWxsRGF5KSB7XG5cdFx0XHRcdHJldHVybiBuZXh0SW5zdGFuY2VEYXRlVGltZVxuXHRcdFx0XHRcdC5zZXQoe1xuXHRcdFx0XHRcdFx0bW9udGg6IG5vZGVSZWN1cmluZ0V2ZW50RGF0ZVRpbWUubW9udGgsXG5cdFx0XHRcdFx0XHRkYXk6IG5vZGVSZWN1cmluZ0V2ZW50RGF0ZVRpbWUuZGF5LFxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnN0YXJ0T2YoXCJkYXlcIik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBub2RlUmVjdXJpbmdFdmVudERhdGVUaW1lLnNldCh7XG5cdFx0XHRcdHllYXI6IG5leHRJbnN0YW5jZURhdGVUaW1lLnllYXIsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG5leHRJbnN0YW5jZURhdGVUaW1lLnN0YXJ0T2YoXCJkYXlcIik7XG5cdH1cbn1cbiJdfQ==
|
package/dist/date-utils.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { DateTime } from "luxon";
|
|
2
|
-
export declare const formatDateTimeForInput: (dateString: string) => string;
|
|
3
|
-
export declare const formatDateForInput: (dateString: string) => string;
|
|
4
|
-
/**
|
|
5
|
-
* Converts input value to ISO string, handling edge cases where
|
|
6
|
-
* browser datetime-local inputs behave differently across platforms.
|
|
7
|
-
* Returns null for invalid dates to prevent silent failures.
|
|
8
|
-
*/
|
|
9
|
-
export declare const inputValueToISOString: (inputValue: string) => string | null;
|
|
10
|
-
export declare const formatDuration: (minutes: number) => string;
|
|
11
|
-
/**
|
|
12
|
-
* Parse time string from datetime value - returns DateTime object
|
|
13
|
-
* Rejects plain HH:mm format, requires full datetime
|
|
14
|
-
*/
|
|
15
|
-
export declare const parseTimeString: (value: string | null) => DateTime | undefined;
|
|
16
|
-
/**
|
|
17
|
-
* Parse and validate datetime strings for event parsing
|
|
18
|
-
* Supports multiple formats including date-only and datetime formats
|
|
19
|
-
*/
|
|
20
|
-
export declare const parseDateTimeString: (value: string | null) => DateTime | undefined;
|
|
21
|
-
//# sourceMappingURL=date-utils.d.ts.map
|
package/dist/date-utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../src/date-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,eAAO,MAAM,sBAAsB,GAAI,YAAY,MAAM,KAAG,MAgB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,KAAG,MAavD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,MAAM,GAAG,IAMnE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAIhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,GAAG,IAAI,KAAG,QAAQ,GAAG,SAgBjE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,GAAG,IAAI,KAAG,QAAQ,GAAG,SA8BrE,CAAC"}
|