silentium-components 0.0.7 → 0.0.9
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/CHANGELOG.md +14 -0
- package/dist/silentium-components.cjs +59 -0
- package/dist/silentium-components.cjs.map +1 -1
- package/dist/silentium-components.d.ts +22 -1
- package/dist/silentium-components.js +58 -2
- package/dist/silentium-components.js.map +1 -1
- package/dist/silentium-components.min.js +1 -1
- package/dist/silentium-components.min.mjs +1 -1
- package/dist/silentium-components.min.mjs.map +1 -1
- package/dist/silentium-components.mjs +58 -2
- package/dist/silentium-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -0
- package/src/strings/index.ts +1 -0
- package/src/structures/Record.nested.test.ts +28 -0
- package/src/structures/Record.test.ts +28 -0
- package/src/structures/Record.ts +18 -0
- package/src/structures/index.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.0.9](https://github.com/silentium-lab/silentium-components/compare/v0.0.8...v0.0.9) (2025-05-03)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **main:** fix exports ([073feb2](https://github.com/silentium-lab/silentium-components/commit/073feb24cca3e391ff0990b857d67875415e48a3))
|
|
11
|
+
|
|
12
|
+
### [0.0.8](https://github.com/silentium-lab/silentium-components/compare/v0.0.7...v0.0.8) (2025-05-03)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* **17-issue:** record structure done ([2666794](https://github.com/silentium-lab/silentium-components/commit/2666794a7b408e9542dd404ebd570a245b262c17))
|
|
18
|
+
|
|
5
19
|
### [0.0.7](https://github.com/silentium-lab/silentium-components/compare/v0.0.6...v0.0.7) (2025-05-03)
|
|
6
20
|
|
|
7
21
|
|
|
@@ -140,10 +140,69 @@ const hashTable = (baseSource) => {
|
|
|
140
140
|
return result.value;
|
|
141
141
|
};
|
|
142
142
|
|
|
143
|
+
const record = (recordSrc) => {
|
|
144
|
+
const keys = Object.keys(recordSrc);
|
|
145
|
+
return silentium.sourceCombined(...Object.values(recordSrc))(
|
|
146
|
+
(g, ...entries) => {
|
|
147
|
+
const record2 = {};
|
|
148
|
+
entries.forEach((entry, index) => {
|
|
149
|
+
record2[keys[index]] = entry;
|
|
150
|
+
});
|
|
151
|
+
silentium.give(record2, g);
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const concatenated = (sources, joinPartSrc = "") => {
|
|
157
|
+
const result = silentium.sourceCombined(
|
|
158
|
+
joinPartSrc,
|
|
159
|
+
...sources
|
|
160
|
+
)((g, joinPart, ...strings) => {
|
|
161
|
+
silentium.give(strings.join(joinPart), g);
|
|
162
|
+
});
|
|
163
|
+
return result;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const regexpMatched = (patternSrc, valueSrc, flagsSrc = "") => silentium.sourceCombined(
|
|
167
|
+
patternSrc,
|
|
168
|
+
valueSrc,
|
|
169
|
+
flagsSrc
|
|
170
|
+
)((g, pattern, value, flags) => {
|
|
171
|
+
silentium.give(new RegExp(pattern, flags).test(value), g);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const router = (urlSrc, routesSrc, defaultSrc) => {
|
|
175
|
+
const resultSrc = silentium.sourceOf();
|
|
176
|
+
silentium.value(
|
|
177
|
+
routesSrc,
|
|
178
|
+
silentium.patron((routes) => {
|
|
179
|
+
silentium.value(
|
|
180
|
+
silentium.sourceAny([
|
|
181
|
+
silentium.sourceChain(urlSrc, defaultSrc),
|
|
182
|
+
...routes.map(
|
|
183
|
+
(r) => silentium.sourceChain(
|
|
184
|
+
silentium.sourceFiltered(
|
|
185
|
+
regexpMatched(r.pattern, urlSrc, r.patternFlags),
|
|
186
|
+
Boolean
|
|
187
|
+
),
|
|
188
|
+
r.template
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
]),
|
|
192
|
+
silentium.patron(resultSrc)
|
|
193
|
+
);
|
|
194
|
+
})
|
|
195
|
+
);
|
|
196
|
+
return resultSrc.value;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
exports.concatenated = concatenated;
|
|
143
200
|
exports.deadline = deadline;
|
|
144
201
|
exports.dirty = dirty;
|
|
145
202
|
exports.groupActiveClass = groupActiveClass;
|
|
146
203
|
exports.hashTable = hashTable;
|
|
147
204
|
exports.loading = loading;
|
|
148
205
|
exports.path = path;
|
|
206
|
+
exports.record = record;
|
|
207
|
+
exports.router = router;
|
|
149
208
|
//# sourceMappingURL=silentium-components.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium-components.cjs","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n"],"names":["value","sourceAll","patron","sourceOf","give","guestCast","patronOnce","subSourceMany","sourceFiltered","subSource"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"silentium-components.cjs","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts","../src/structures/Record.ts","../src/strings/Concatenated.ts","../src/system/RegexpMatched.ts","../src/navigation/Router.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Returns record of data from record of sources\n * https://silentium-lab.github.io/silentium-components/#/structures/record\n */\nexport const record = (recordSrc: Record<string, SourceType>) => {\n const keys = Object.keys(recordSrc);\n return sourceCombined(...Object.values(recordSrc))(\n (g: GuestType<Record<string, any>>, ...entries: any[]) => {\n const record: Record<string, any> = {};\n entries.forEach((entry, index) => {\n record[keys[index]] = entry;\n });\n give(record, g);\n },\n );\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Join sources of strings to one source\n */\nexport const concatenated = (\n sources: SourceType<string>[],\n joinPartSrc: SourceType<string> = \"\",\n): SourceType<string> => {\n const result = sourceCombined(\n joinPartSrc,\n ...sources,\n )((g: GuestType<string>, joinPart, ...strings) => {\n give(strings.join(joinPart), g);\n });\n\n return result;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Boolean source what checks what string matches pattern\n */\nexport const regexpMatched = (\n patternSrc: SourceType<string>,\n valueSrc: SourceType<string>,\n flagsSrc: SourceType<string> = \"\",\n): SourceType<boolean> =>\n sourceCombined(\n patternSrc,\n valueSrc,\n flagsSrc,\n )((g: GuestType<boolean>, pattern, value, flags) => {\n give(new RegExp(pattern, flags).test(value), g);\n });\n","import {\n patron,\n sourceAny,\n sourceChain,\n sourceFiltered,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\nimport { regexpMatched } from \"../system/RegexpMatched\";\n\nexport interface Route<T> {\n pattern: string;\n patternFlags?: string;\n template: T | SourceType<T>;\n}\n\n/**\n * Router component what will return template if url matches pattern\n */\nexport const router = <T = \"string\">(\n urlSrc: SourceType<string>,\n routesSrc: SourceType<Route<T>[]>,\n defaultSrc: SourceType<T>,\n) => {\n const resultSrc = sourceOf<T>();\n\n value(\n routesSrc,\n patron((routes) => {\n value(\n sourceAny([\n sourceChain(urlSrc, defaultSrc as T),\n ...routes.map((r) =>\n sourceChain(\n sourceFiltered(\n regexpMatched(r.pattern, urlSrc, r.patternFlags),\n Boolean,\n ),\n r.template,\n ),\n ),\n ]),\n patron(resultSrc),\n );\n }),\n );\n\n return resultSrc.value;\n};\n"],"names":["value","sourceAll","patron","sourceOf","give","guestCast","patronOnce","subSourceMany","sourceFiltered","subSource","sourceCombined","record","sourceAny","sourceChain"],"mappings":"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"}
|
|
@@ -28,4 +28,25 @@ declare const deadline: <T>(error: GuestType<Error>, baseSrc: SourceType<T>, tim
|
|
|
28
28
|
*/
|
|
29
29
|
declare const hashTable: (baseSource: SourceType<[string, unknown]>) => silentium.SourceExecutorType<Record<string, unknown>>;
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Returns record of data from record of sources
|
|
33
|
+
* https://silentium-lab.github.io/silentium-components/#/structures/record
|
|
34
|
+
*/
|
|
35
|
+
declare const record: (recordSrc: Record<string, SourceType>) => SourceType<Record<string, any>>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Join sources of strings to one source
|
|
39
|
+
*/
|
|
40
|
+
declare const concatenated: (sources: SourceType<string>[], joinPartSrc?: SourceType<string>) => SourceType<string>;
|
|
41
|
+
|
|
42
|
+
interface Route<T> {
|
|
43
|
+
pattern: string;
|
|
44
|
+
patternFlags?: string;
|
|
45
|
+
template: T | SourceType<T>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Router component what will return template if url matches pattern
|
|
49
|
+
*/
|
|
50
|
+
declare const router: <T = "string">(urlSrc: SourceType<string>, routesSrc: SourceType<Route<T>[]>, defaultSrc: SourceType<T>) => silentium.SourceExecutorType<T>;
|
|
51
|
+
|
|
52
|
+
export { type Route, concatenated, deadline, dirty, groupActiveClass, hashTable, loading, path, record, router };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { value, sourceAll, patron, sourceOf, patronOnce, guestCast, give, subSourceMany, sourceFiltered, subSource } from 'silentium';
|
|
1
|
+
import { value, sourceAll, patron, sourceOf, patronOnce, guestCast, give, subSourceMany, sourceFiltered, subSource, sourceCombined, sourceAny, sourceChain } from 'silentium';
|
|
2
2
|
|
|
3
3
|
const groupActiveClass = (activeClassSrc, activeElementSrc, groupElementsSrc) => {
|
|
4
4
|
value(
|
|
@@ -138,5 +138,61 @@ const hashTable = (baseSource) => {
|
|
|
138
138
|
return result.value;
|
|
139
139
|
};
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
const record = (recordSrc) => {
|
|
142
|
+
const keys = Object.keys(recordSrc);
|
|
143
|
+
return sourceCombined(...Object.values(recordSrc))(
|
|
144
|
+
(g, ...entries) => {
|
|
145
|
+
const record2 = {};
|
|
146
|
+
entries.forEach((entry, index) => {
|
|
147
|
+
record2[keys[index]] = entry;
|
|
148
|
+
});
|
|
149
|
+
give(record2, g);
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const concatenated = (sources, joinPartSrc = "") => {
|
|
155
|
+
const result = sourceCombined(
|
|
156
|
+
joinPartSrc,
|
|
157
|
+
...sources
|
|
158
|
+
)((g, joinPart, ...strings) => {
|
|
159
|
+
give(strings.join(joinPart), g);
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const regexpMatched = (patternSrc, valueSrc, flagsSrc = "") => sourceCombined(
|
|
165
|
+
patternSrc,
|
|
166
|
+
valueSrc,
|
|
167
|
+
flagsSrc
|
|
168
|
+
)((g, pattern, value, flags) => {
|
|
169
|
+
give(new RegExp(pattern, flags).test(value), g);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const router = (urlSrc, routesSrc, defaultSrc) => {
|
|
173
|
+
const resultSrc = sourceOf();
|
|
174
|
+
value(
|
|
175
|
+
routesSrc,
|
|
176
|
+
patron((routes) => {
|
|
177
|
+
value(
|
|
178
|
+
sourceAny([
|
|
179
|
+
sourceChain(urlSrc, defaultSrc),
|
|
180
|
+
...routes.map(
|
|
181
|
+
(r) => sourceChain(
|
|
182
|
+
sourceFiltered(
|
|
183
|
+
regexpMatched(r.pattern, urlSrc, r.patternFlags),
|
|
184
|
+
Boolean
|
|
185
|
+
),
|
|
186
|
+
r.template
|
|
187
|
+
)
|
|
188
|
+
)
|
|
189
|
+
]),
|
|
190
|
+
patron(resultSrc)
|
|
191
|
+
);
|
|
192
|
+
})
|
|
193
|
+
);
|
|
194
|
+
return resultSrc.value;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
export { concatenated, deadline, dirty, groupActiveClass, hashTable, loading, path, record, router };
|
|
142
198
|
//# sourceMappingURL=silentium-components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium-components.js","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n"],"names":["value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"silentium-components.js","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts","../src/structures/Record.ts","../src/strings/Concatenated.ts","../src/system/RegexpMatched.ts","../src/navigation/Router.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Returns record of data from record of sources\n * https://silentium-lab.github.io/silentium-components/#/structures/record\n */\nexport const record = (recordSrc: Record<string, SourceType>) => {\n const keys = Object.keys(recordSrc);\n return sourceCombined(...Object.values(recordSrc))(\n (g: GuestType<Record<string, any>>, ...entries: any[]) => {\n const record: Record<string, any> = {};\n entries.forEach((entry, index) => {\n record[keys[index]] = entry;\n });\n give(record, g);\n },\n );\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Join sources of strings to one source\n */\nexport const concatenated = (\n sources: SourceType<string>[],\n joinPartSrc: SourceType<string> = \"\",\n): SourceType<string> => {\n const result = sourceCombined(\n joinPartSrc,\n ...sources,\n )((g: GuestType<string>, joinPart, ...strings) => {\n give(strings.join(joinPart), g);\n });\n\n return result;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Boolean source what checks what string matches pattern\n */\nexport const regexpMatched = (\n patternSrc: SourceType<string>,\n valueSrc: SourceType<string>,\n flagsSrc: SourceType<string> = \"\",\n): SourceType<boolean> =>\n sourceCombined(\n patternSrc,\n valueSrc,\n flagsSrc,\n )((g: GuestType<boolean>, pattern, value, flags) => {\n give(new RegExp(pattern, flags).test(value), g);\n });\n","import {\n patron,\n sourceAny,\n sourceChain,\n sourceFiltered,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\nimport { regexpMatched } from \"../system/RegexpMatched\";\n\nexport interface Route<T> {\n pattern: string;\n patternFlags?: string;\n template: T | SourceType<T>;\n}\n\n/**\n * Router component what will return template if url matches pattern\n */\nexport const router = <T = \"string\">(\n urlSrc: SourceType<string>,\n routesSrc: SourceType<Route<T>[]>,\n defaultSrc: SourceType<T>,\n) => {\n const resultSrc = sourceOf<T>();\n\n value(\n routesSrc,\n patron((routes) => {\n value(\n sourceAny([\n sourceChain(urlSrc, defaultSrc as T),\n ...routes.map((r) =>\n sourceChain(\n sourceFiltered(\n regexpMatched(r.pattern, urlSrc, r.patternFlags),\n Boolean,\n ),\n r.template,\n ),\n ),\n ]),\n patron(resultSrc),\n );\n }),\n );\n\n return resultSrc.value;\n};\n"],"names":["value","record"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,r){"use strict";e.deadline=(e,t,u)=>{let
|
|
1
|
+
!function(e,r){"use strict";e.concatenated=(e,t="")=>r.sourceCombined(t,...e)(((e,t,...u)=>{r.give(u.join(t),e)})),e.deadline=(e,t,u)=>{let a=null;return s=>{r.value(u,r.guestCast(s,(u=>{a&&clearTimeout(a);let o=!1;a=setTimeout((()=>{o||(o=!0,r.give(new Error("Timeout reached in Deadline class"),e))}),u),r.value(r.sourceFiltered(t,(()=>!o)),s),r.value(t,r.patronOnce((()=>{o=!0})))})))}},e.dirty=(e,t=!1,u=[],a=[])=>{const s=r.sourceOf(),o=r.sourceAll([s,e]),n={give:e=>(r.give(JSON.parse(JSON.stringify(e)),s),n),value:e=>(r.value(o,r.guestCast(e,(([t,s])=>{t&&r.give(Object.fromEntries(Object.entries(t).filter((([e,r])=>!!u.includes(e)||!a.includes(e)&&r!==s[e]))),e)}))),n)};return t&&r.value(e,r.patronOnce(n)),n},e.groupActiveClass=(e,t,u)=>(r.value(r.sourceAll([e,t,u]),r.patron((([e,r,t])=>{t.forEach((r=>{r.classList&&r.classList.remove(e)})),r.classList.add(e)}))),u),e.hashTable=e=>{const t=r.sourceOf({});return r.subSource(t,e),r.value(e,r.patron((([e,r])=>{t.value((t=>{t[e]=r}))}))),t.value},e.loading=(e,t)=>{const u=r.sourceOf();return r.subSourceMany(u,[e,t]),r.value(e,r.patron((()=>{u.give(!0)}))),r.value(t,r.patron((()=>{u.give(!1)}))),u.value},e.path=(e,t)=>{const u=r.sourceOf();return r.subSourceMany(u,[e,t]),r.value(r.sourceAll([e,t]),r.patron((([e,t])=>{const a=t.split(".");let s=e;a.forEach((e=>{s=s[e]})),void 0!==s&&s!==e&&r.give(s,u)}))),u.value},e.record=e=>{const t=Object.keys(e);return r.sourceCombined(...Object.values(e))(((e,...u)=>{const a={};u.forEach(((e,r)=>{a[t[r]]=e})),r.give(a,e)}))},e.router=(e,t,u)=>{const a=r.sourceOf();return r.value(t,r.patron((t=>{r.value(r.sourceAny([r.sourceChain(e,u),...t.map((t=>r.sourceChain(r.sourceFiltered(((e,t,u="")=>r.sourceCombined(e,t,u)(((e,t,u,a)=>{r.give(new RegExp(t,a).test(u),e)})))(t.pattern,e,t.patternFlags),Boolean),t.template)))]),r.patron(a))}))),a.value}}({},silentium);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{value as e,sourceAll as t,patron as r,sourceOf as s,patronOnce as
|
|
1
|
+
import{value as e,sourceAll as t,patron as r,sourceOf as s,patronOnce as n,guestCast as l,give as a,subSourceMany as o,sourceFiltered as c,subSource as i,sourceCombined as u,sourceAny as v,sourceChain as m}from"silentium";const p=(s,n,l)=>(e(t([s,n,l]),r((([e,t,r])=>{r.forEach((t=>{t.classList&&t.classList.remove(e)})),t.classList.add(e)}))),l),d=(r,o=!1,c=[],i=[])=>{const u=s(),v=t([u,r]),m={give:e=>(a(JSON.parse(JSON.stringify(e)),u),m),value:t=>(e(v,l(t,(([e,r])=>{e&&a(Object.fromEntries(Object.entries(e).filter((([e,t])=>!!c.includes(e)||!i.includes(e)&&t!==r[e]))),t)}))),m)};return o&&e(r,n(m)),m},f=(t,n)=>{const l=s();return o(l,[t,n]),e(t,r((()=>{l.give(!0)}))),e(n,r((()=>{l.give(!1)}))),l.value},g=(n,l)=>{const c=s();return o(c,[n,l]),e(t([n,l]),r((([e,t])=>{const r=t.split(".");let s=e;r.forEach((e=>{s=s[e]})),void 0!==s&&s!==e&&a(s,c)}))),c.value},E=(t,r,s)=>{let o=null;return i=>{e(s,l(i,(s=>{o&&clearTimeout(o);let l=!1;o=setTimeout((()=>{l||(l=!0,a(new Error("Timeout reached in Deadline class"),t))}),s),e(c(r,(()=>!l)),i),e(r,n((()=>{l=!0})))})))}},O=t=>{const n=s({});return i(n,t),e(t,r((([e,t])=>{n.value((r=>{r[e]=t}))}))),n.value},j=e=>{const t=Object.keys(e);return u(...Object.values(e))(((e,...r)=>{const s={};r.forEach(((e,r)=>{s[t[r]]=e})),a(s,e)}))},b=(e,t="")=>u(t,...e)(((e,t,...r)=>{a(r.join(t),e)})),h=(t,n,l)=>{const o=s();return e(n,r((s=>{e(v([m(t,l),...s.map((e=>m(c(((e,t,r="")=>u(e,t,r)(((e,t,r,s)=>{a(new RegExp(t,s).test(r),e)})))(e.pattern,t,e.patternFlags),Boolean),e.template)))]),r(o))}))),o.value};export{b as concatenated,E as deadline,d as dirty,p as groupActiveClass,O as hashTable,f as loading,g as path,j as record,h as router};
|
|
2
2
|
//# sourceMappingURL=silentium-components.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium-components.min.mjs","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n"],"names":["groupActiveClass","activeClassSrc","activeElementSrc","groupElementsSrc","value","sourceAll","patron","activeClass","activeElement","groupElements","forEach","el","classList","remove","add","dirty","baseEntitySource","becomePatronAuto","alwaysKeep","excludeKeys","comparingSrc","sourceOf","all","result","give","JSON","parse","stringify","guest","guestCast","comparing","base","Object","fromEntries","entries","filter","key","includes","patronOnce","loading","loadingStartSource","loadingFinishSource","loadingSrc","subSourceMany","path","baseSrc","keySrc","pathSrc","keyChunks","split","keyChunk","deadline","error","timeoutSrc","timerHead","g","timeout","clearTimeout","timeoutReached","setTimeout","Error","sourceFiltered","hashTable","baseSource","subSource","lastRecord"],"mappings":"0KAOO,MAAMA,EAAmB,CAC9BC,EACAC,EACAC,KAEAC,EACEC,EAAU,CAACJ,EAAgBC,EAAkBC,IAC7CG,GAAO,EAAEC,EAAaC,EAAeC,MACrBA,EAAAC,SAASC,IACjBA,EAAGC,WACFD,EAAAC,UAAUC,OAAON,EAAW,IAGrBC,EAAAI,UAAUE,IAAIP,EAAW,KAIpCJ,GCRIY,EAAQ,CACnBC,EACAC,GAAmB,EACnBC,EAAuB,GACvBC,EAAwB,MAExB,MAAMC,EAAeC,IACfC,EAAMjB,EAAU,CAACe,EAAcJ,IAE/BO,EAAS,CACbC,KAAKpB,IACHoB,EAAKC,KAAKC,MAAMD,KAAKE,UAAUvB,IAASgB,GACjCG,GAETnB,MAAMwB,IACJxB,EACEkB,EACAO,EAAUD,GAAO,EAAEE,EAAWC,MACvBD,GAILN,EACEQ,OAAOC,YACLD,OAAOE,QAAQJ,GAAWK,QAAO,EAAEC,EAAKhC,OAClCc,EAAWmB,SAASD,KAGpBjB,EAAYkB,SAASD,IAGlBhC,IAAW2B,EAAaK,MAGnCR,EACF,KAGGL,IAQJ,OAJHN,GACIb,EAAAY,EAAkBsB,EAAWf,IAG9BA,CAAA,ECzDIgB,EAAU,CACrBC,EACAC,KAEA,MAAMC,EAAarB,IAgBnB,OAfAsB,EAAcD,EAAY,CAACF,EAAoBC,IAE/CrC,EACEoC,EACAlC,GAAO,KACLoC,EAAWlB,MAAK,EAAI,KAGxBpB,EACEqC,EACAnC,GAAO,KACLoC,EAAWlB,MAAK,EAAK,KAIlBkB,EAAWtC,KAAA,ECfPwC,EAAO,CAClBC,EACAC,KAEA,MAAMC,EAAU1B,IAkBhB,OAjBAsB,EAAcI,EAAS,CAACF,EAASC,IAEjC1C,EACEC,EAAU,CAACwC,EAASC,IACpBxC,GAAO,EAAEyB,EAAMK,MACP,MAAAY,EAAYZ,EAAIa,MAAM,KAC5B,IAAI7C,EAAiB2B,EACXiB,EAAAtC,SAASwC,IACjB9C,EAASA,EAAY8C,EAAQ,SAGjB,IAAV9C,GAAuBA,IAAU2B,GACnCP,EAAKpB,EAAe2C,EAAO,KAK1BA,EAAQ3C,KAAA,ECtBJ+C,EAAW,CACtBC,EACAP,EACAQ,KAEA,IAAIC,EAAqB,KACzB,OAAQC,IACNnD,EACEiD,EACAxB,EAAU0B,GAAIC,IACRF,GACFG,aAAaH,GAGf,IAAII,GAAiB,EAErBJ,EAAYK,YAAW,KACjBD,IAGaA,GAAA,EACjBlC,EAAK,IAAIoC,MAAM,qCAAsCR,GAAK,GACzDI,GAEHpD,EACEyD,EAAehB,GAAS,KAAOa,IAC/BH,GAGFnD,EACEyC,EACAP,GAAW,KACQoB,GAAA,CAAA,IAErB,IAEJ,CACF,EC1CWI,EAAaC,IAClB,MAAAxC,EAASF,EAAkC,IAYjD,OAXA2C,EAAUzC,EAAQwC,GAElB3D,EACE2D,EACAzD,GAAO,EAAE8B,EAAKhC,MACLmB,EAAAnB,OAAO6D,IACZA,EAAW7B,GAAOhC,CAAAA,GACnB,KAIEmB,EAAOnB,KAAA"}
|
|
1
|
+
{"version":3,"file":"silentium-components.min.mjs","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts","../src/structures/Record.ts","../src/strings/Concatenated.ts","../src/navigation/Router.ts","../src/system/RegexpMatched.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Returns record of data from record of sources\n * https://silentium-lab.github.io/silentium-components/#/structures/record\n */\nexport const record = (recordSrc: Record<string, SourceType>) => {\n const keys = Object.keys(recordSrc);\n return sourceCombined(...Object.values(recordSrc))(\n (g: GuestType<Record<string, any>>, ...entries: any[]) => {\n const record: Record<string, any> = {};\n entries.forEach((entry, index) => {\n record[keys[index]] = entry;\n });\n give(record, g);\n },\n );\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Join sources of strings to one source\n */\nexport const concatenated = (\n sources: SourceType<string>[],\n joinPartSrc: SourceType<string> = \"\",\n): SourceType<string> => {\n const result = sourceCombined(\n joinPartSrc,\n ...sources,\n )((g: GuestType<string>, joinPart, ...strings) => {\n give(strings.join(joinPart), g);\n });\n\n return result;\n};\n","import {\n patron,\n sourceAny,\n sourceChain,\n sourceFiltered,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\nimport { regexpMatched } from \"../system/RegexpMatched\";\n\nexport interface Route<T> {\n pattern: string;\n patternFlags?: string;\n template: T | SourceType<T>;\n}\n\n/**\n * Router component what will return template if url matches pattern\n */\nexport const router = <T = \"string\">(\n urlSrc: SourceType<string>,\n routesSrc: SourceType<Route<T>[]>,\n defaultSrc: SourceType<T>,\n) => {\n const resultSrc = sourceOf<T>();\n\n value(\n routesSrc,\n patron((routes) => {\n value(\n sourceAny([\n sourceChain(urlSrc, defaultSrc as T),\n ...routes.map((r) =>\n sourceChain(\n sourceFiltered(\n regexpMatched(r.pattern, urlSrc, r.patternFlags),\n Boolean,\n ),\n r.template,\n ),\n ),\n ]),\n patron(resultSrc),\n );\n }),\n );\n\n return resultSrc.value;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Boolean source what checks what string matches pattern\n */\nexport const regexpMatched = (\n patternSrc: SourceType<string>,\n valueSrc: SourceType<string>,\n flagsSrc: SourceType<string> = \"\",\n): SourceType<boolean> =>\n sourceCombined(\n patternSrc,\n valueSrc,\n flagsSrc,\n )((g: GuestType<boolean>, pattern, value, flags) => {\n give(new RegExp(pattern, flags).test(value), g);\n });\n"],"names":["groupActiveClass","activeClassSrc","activeElementSrc","groupElementsSrc","value","sourceAll","patron","activeClass","activeElement","groupElements","forEach","el","classList","remove","add","dirty","baseEntitySource","becomePatronAuto","alwaysKeep","excludeKeys","comparingSrc","sourceOf","all","result","give","JSON","parse","stringify","guest","guestCast","comparing","base","Object","fromEntries","entries","filter","key","includes","patronOnce","loading","loadingStartSource","loadingFinishSource","loadingSrc","subSourceMany","path","baseSrc","keySrc","pathSrc","keyChunks","split","keyChunk","deadline","error","timeoutSrc","timerHead","g","timeout","clearTimeout","timeoutReached","setTimeout","Error","sourceFiltered","hashTable","baseSource","subSource","lastRecord","record","recordSrc","keys","sourceCombined","values","entry","index","concatenated","sources","joinPartSrc","joinPart","strings","join","router","urlSrc","routesSrc","defaultSrc","resultSrc","routes","sourceAny","sourceChain","map","r","patternSrc","valueSrc","flagsSrc","pattern","flags","RegExp","test","regexpMatched","patternFlags","Boolean","template"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { value, sourceAll, patron, sourceOf, patronOnce, guestCast, give, subSourceMany, sourceFiltered, subSource } from 'silentium';
|
|
1
|
+
import { value, sourceAll, patron, sourceOf, patronOnce, guestCast, give, subSourceMany, sourceFiltered, subSource, sourceCombined, sourceAny, sourceChain } from 'silentium';
|
|
2
2
|
|
|
3
3
|
const groupActiveClass = (activeClassSrc, activeElementSrc, groupElementsSrc) => {
|
|
4
4
|
value(
|
|
@@ -138,5 +138,61 @@ const hashTable = (baseSource) => {
|
|
|
138
138
|
return result.value;
|
|
139
139
|
};
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
const record = (recordSrc) => {
|
|
142
|
+
const keys = Object.keys(recordSrc);
|
|
143
|
+
return sourceCombined(...Object.values(recordSrc))(
|
|
144
|
+
(g, ...entries) => {
|
|
145
|
+
const record2 = {};
|
|
146
|
+
entries.forEach((entry, index) => {
|
|
147
|
+
record2[keys[index]] = entry;
|
|
148
|
+
});
|
|
149
|
+
give(record2, g);
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const concatenated = (sources, joinPartSrc = "") => {
|
|
155
|
+
const result = sourceCombined(
|
|
156
|
+
joinPartSrc,
|
|
157
|
+
...sources
|
|
158
|
+
)((g, joinPart, ...strings) => {
|
|
159
|
+
give(strings.join(joinPart), g);
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const regexpMatched = (patternSrc, valueSrc, flagsSrc = "") => sourceCombined(
|
|
165
|
+
patternSrc,
|
|
166
|
+
valueSrc,
|
|
167
|
+
flagsSrc
|
|
168
|
+
)((g, pattern, value, flags) => {
|
|
169
|
+
give(new RegExp(pattern, flags).test(value), g);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const router = (urlSrc, routesSrc, defaultSrc) => {
|
|
173
|
+
const resultSrc = sourceOf();
|
|
174
|
+
value(
|
|
175
|
+
routesSrc,
|
|
176
|
+
patron((routes) => {
|
|
177
|
+
value(
|
|
178
|
+
sourceAny([
|
|
179
|
+
sourceChain(urlSrc, defaultSrc),
|
|
180
|
+
...routes.map(
|
|
181
|
+
(r) => sourceChain(
|
|
182
|
+
sourceFiltered(
|
|
183
|
+
regexpMatched(r.pattern, urlSrc, r.patternFlags),
|
|
184
|
+
Boolean
|
|
185
|
+
),
|
|
186
|
+
r.template
|
|
187
|
+
)
|
|
188
|
+
)
|
|
189
|
+
]),
|
|
190
|
+
patron(resultSrc)
|
|
191
|
+
);
|
|
192
|
+
})
|
|
193
|
+
);
|
|
194
|
+
return resultSrc.value;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
export { concatenated, deadline, dirty, groupActiveClass, hashTable, loading, path, record, router };
|
|
142
198
|
//# sourceMappingURL=silentium-components.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium-components.mjs","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n"],"names":["value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"silentium-components.mjs","sources":["../src/controls/GroupActiveClass.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Path.ts","../src/behaviors/Deadline.ts","../src/structures/HashTable.ts","../src/structures/Record.ts","../src/strings/Concatenated.ts","../src/system/RegexpMatched.ts","../src/navigation/Router.ts"],"sourcesContent":["import { patron, sourceAll, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n */\nexport const groupActiveClass = (\n activeClassSrc: SourceType<string>,\n activeElementSrc: SourceType<HTMLElement>,\n groupElementsSrc: SourceType<HTMLElement[]>,\n) => {\n value(\n sourceAll([activeClassSrc, activeElementSrc, groupElementsSrc]),\n patron(([activeClass, activeElement, groupElements]) => {\n groupElements.forEach((el) => {\n if (el.classList) {\n el.classList.remove(activeClass);\n }\n });\n activeElement.classList.add(activeClass);\n }),\n );\n\n return groupElementsSrc;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceAll,\n SourceChangeableType,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport const dirty = <T extends object>(\n baseEntitySource: SourceType<T>,\n becomePatronAuto = false,\n alwaysKeep: string[] = [],\n excludeKeys: string[] = [],\n): SourceChangeableType<Partial<T>> => {\n const comparingSrc = sourceOf();\n const all = sourceAll([comparingSrc, baseEntitySource]);\n\n const result = {\n give(value: T) {\n give(JSON.parse(JSON.stringify(value)), comparingSrc);\n return result;\n },\n value(guest: GuestType<Partial<T>>) {\n value(\n all,\n guestCast(guest, ([comparing, base]) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (alwaysKeep.includes(key)) {\n return true;\n }\n if (excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n return result;\n },\n };\n\n if (becomePatronAuto) {\n value(baseEntitySource, patronOnce(result));\n }\n\n return result;\n};\n","import { patron, sourceOf, SourceType, subSourceMany, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport const loading = (\n loadingStartSource: SourceType<unknown>,\n loadingFinishSource: SourceType<unknown>,\n) => {\n const loadingSrc = sourceOf<boolean>();\n subSourceMany(loadingSrc, [loadingStartSource, loadingFinishSource]);\n\n value(\n loadingStartSource,\n patron(() => {\n loadingSrc.give(true);\n }),\n );\n value(\n loadingFinishSource,\n patron(() => {\n loadingSrc.give(false);\n }),\n );\n\n return loadingSrc.value;\n};\n","import {\n give,\n patron,\n sourceAll,\n sourceOf,\n SourceType,\n subSourceMany,\n value,\n} from \"silentium\";\n\nexport const path = <T extends Record<string, unknown>, K extends string>(\n baseSrc: SourceType<T>,\n keySrc: SourceType<K>,\n) => {\n const pathSrc = sourceOf<T[K]>();\n subSourceMany(pathSrc, [baseSrc, keySrc]);\n\n value(\n sourceAll([baseSrc, keySrc]),\n patron(([base, key]) => {\n const keyChunks = key.split(\".\");\n let value: unknown = base;\n keyChunks.forEach((keyChunk) => {\n value = (value as T)[keyChunk];\n });\n\n if (value !== undefined && value !== base) {\n give(value as T[K], pathSrc);\n }\n }),\n );\n\n return pathSrc.value;\n};\n","import {\n give,\n guestCast,\n GuestType,\n patronOnce,\n sourceFiltered,\n SourceType,\n value,\n} from \"silentium\";\n\nexport const deadline = <T>(\n error: GuestType<Error>,\n baseSrc: SourceType<T>,\n timeoutSrc: SourceType<number>,\n) => {\n let timerHead: unknown = null;\n return (g: GuestType<T>) => {\n value(\n timeoutSrc,\n guestCast(g, (timeout) => {\n if (timerHead) {\n clearTimeout(timerHead as number);\n }\n\n let timeoutReached = false;\n\n timerHead = setTimeout(() => {\n if (timeoutReached) {\n return;\n }\n timeoutReached = true;\n give(new Error(\"Timeout reached in Deadline class\"), error);\n }, timeout);\n\n value(\n sourceFiltered(baseSrc, () => !timeoutReached),\n g,\n );\n\n value(\n baseSrc,\n patronOnce(() => {\n timeoutReached = true;\n }),\n );\n }),\n );\n };\n};\n","import { patron, sourceOf, SourceType, subSource, value } from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport const hashTable = (baseSource: SourceType<[string, unknown]>) => {\n const result = sourceOf<Record<string, unknown>>({});\n subSource(result, baseSource);\n\n value(\n baseSource,\n patron(([key, value]) => {\n result.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n\n return result.value;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Returns record of data from record of sources\n * https://silentium-lab.github.io/silentium-components/#/structures/record\n */\nexport const record = (recordSrc: Record<string, SourceType>) => {\n const keys = Object.keys(recordSrc);\n return sourceCombined(...Object.values(recordSrc))(\n (g: GuestType<Record<string, any>>, ...entries: any[]) => {\n const record: Record<string, any> = {};\n entries.forEach((entry, index) => {\n record[keys[index]] = entry;\n });\n give(record, g);\n },\n );\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Join sources of strings to one source\n */\nexport const concatenated = (\n sources: SourceType<string>[],\n joinPartSrc: SourceType<string> = \"\",\n): SourceType<string> => {\n const result = sourceCombined(\n joinPartSrc,\n ...sources,\n )((g: GuestType<string>, joinPart, ...strings) => {\n give(strings.join(joinPart), g);\n });\n\n return result;\n};\n","import { give, GuestType, sourceCombined, SourceType } from \"silentium\";\n\n/**\n * Boolean source what checks what string matches pattern\n */\nexport const regexpMatched = (\n patternSrc: SourceType<string>,\n valueSrc: SourceType<string>,\n flagsSrc: SourceType<string> = \"\",\n): SourceType<boolean> =>\n sourceCombined(\n patternSrc,\n valueSrc,\n flagsSrc,\n )((g: GuestType<boolean>, pattern, value, flags) => {\n give(new RegExp(pattern, flags).test(value), g);\n });\n","import {\n patron,\n sourceAny,\n sourceChain,\n sourceFiltered,\n sourceOf,\n SourceType,\n value,\n} from \"silentium\";\nimport { regexpMatched } from \"../system/RegexpMatched\";\n\nexport interface Route<T> {\n pattern: string;\n patternFlags?: string;\n template: T | SourceType<T>;\n}\n\n/**\n * Router component what will return template if url matches pattern\n */\nexport const router = <T = \"string\">(\n urlSrc: SourceType<string>,\n routesSrc: SourceType<Route<T>[]>,\n defaultSrc: SourceType<T>,\n) => {\n const resultSrc = sourceOf<T>();\n\n value(\n routesSrc,\n patron((routes) => {\n value(\n sourceAny([\n sourceChain(urlSrc, defaultSrc as T),\n ...routes.map((r) =>\n sourceChain(\n sourceFiltered(\n regexpMatched(r.pattern, urlSrc, r.patternFlags),\n Boolean,\n ),\n r.template,\n ),\n ),\n ]),\n patron(resultSrc),\n );\n }),\n );\n\n return resultSrc.value;\n};\n"],"names":["value","record"],"mappings":";;AAOO,MAAM,gBAAmB,GAAA,CAC9B,cACA,EAAA,gBAAA,EACA,gBACG,KAAA;AACH,EAAA,KAAA;AAAA,IACE,SAAU,CAAA,CAAC,cAAgB,EAAA,gBAAA,EAAkB,gBAAgB,CAAC,CAAA;AAAA,IAC9D,OAAO,CAAC,CAAC,WAAa,EAAA,aAAA,EAAe,aAAa,CAAM,KAAA;AACtD,MAAc,aAAA,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AAC5B,QAAA,IAAI,GAAG,SAAW,EAAA;AAChB,UAAG,EAAA,CAAA,SAAA,CAAU,OAAO,WAAW,CAAA;AAAA;AACjC,OACD,CAAA;AACD,MAAc,aAAA,CAAA,SAAA,CAAU,IAAI,WAAW,CAAA;AAAA,KACxC;AAAA,GACH;AAEA,EAAO,OAAA,gBAAA;AACT;;ACTa,MAAA,KAAA,GAAQ,CACnB,gBAAA,EACA,gBAAmB,GAAA,KAAA,EACnB,aAAuB,EAAC,EACxB,WAAwB,GAAA,EACa,KAAA;AACrC,EAAA,MAAM,eAAe,QAAS,EAAA;AAC9B,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,CAAC,YAAA,EAAc,gBAAgB,CAAC,CAAA;AAEtD,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,KAAKA,MAAU,EAAA;AACb,MAAA,IAAA,CAAK,KAAK,KAAM,CAAA,IAAA,CAAK,UAAUA,MAAK,CAAC,GAAG,YAAY,CAAA;AACpD,MAAO,OAAA,MAAA;AAAA,KACT;AAAA,IACA,MAAM,KAA8B,EAAA;AAClC,MAAA,KAAA;AAAA,QACE,GAAA;AAAA,QACA,UAAU,KAAO,EAAA,CAAC,CAAC,SAAA,EAAW,IAAI,CAAM,KAAA;AACtC,UAAA,IAAI,CAAC,SAAW,EAAA;AACd,YAAA;AAAA;AAGF,UAAA,IAAA;AAAA,YACE,MAAO,CAAA,WAAA;AAAA,cACL,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,OAAO,CAAC,CAAC,GAAKA,EAAAA,MAAK,CAAM,KAAA;AACjD,gBAAI,IAAA,UAAA,CAAW,QAAS,CAAA,GAAG,CAAG,EAAA;AAC5B,kBAAO,OAAA,IAAA;AAAA;AAET,gBAAI,IAAA,WAAA,CAAY,QAAS,CAAA,GAAG,CAAG,EAAA;AAC7B,kBAAO,OAAA,KAAA;AAAA;AAET,gBAAOA,OAAAA,MAAAA,KAAW,KAAa,GAAG,CAAA;AAAA,eACnC;AAAA,aACH;AAAA,YACA;AAAA,WACF;AAAA,SACD;AAAA,OACH;AACA,MAAO,OAAA,MAAA;AAAA;AACT,GACF;AAEA,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAM,KAAA,CAAA,gBAAA,EAAkB,UAAW,CAAA,MAAM,CAAC,CAAA;AAAA;AAG5C,EAAO,OAAA,MAAA;AACT;;AC1Da,MAAA,OAAA,GAAU,CACrB,kBAAA,EACA,mBACG,KAAA;AACH,EAAA,MAAM,aAAa,QAAkB,EAAA;AACrC,EAAA,aAAA,CAAc,UAAY,EAAA,CAAC,kBAAoB,EAAA,mBAAmB,CAAC,CAAA;AAEnE,EAAA,KAAA;AAAA,IACE,kBAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,KACrB;AAAA,GACH;AACA,EAAA,KAAA;AAAA,IACE,mBAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,KACtB;AAAA,GACH;AAEA,EAAA,OAAO,UAAW,CAAA,KAAA;AACpB;;AChBa,MAAA,IAAA,GAAO,CAClB,OAAA,EACA,MACG,KAAA;AACH,EAAA,MAAM,UAAU,QAAe,EAAA;AAC/B,EAAA,aAAA,CAAc,OAAS,EAAA,CAAC,OAAS,EAAA,MAAM,CAAC,CAAA;AAExC,EAAA,KAAA;AAAA,IACE,SAAU,CAAA,CAAC,OAAS,EAAA,MAAM,CAAC,CAAA;AAAA,IAC3B,MAAO,CAAA,CAAC,CAAC,IAAA,EAAM,GAAG,CAAM,KAAA;AACtB,MAAM,MAAA,SAAA,GAAY,GAAI,CAAA,KAAA,CAAM,GAAG,CAAA;AAC/B,MAAA,IAAIA,MAAiB,GAAA,IAAA;AACrB,MAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,QAAa,KAAA;AAC9B,QAAAA,MAAAA,GAASA,OAAY,QAAQ,CAAA;AAAA,OAC9B,CAAA;AAED,MAAIA,IAAAA,MAAAA,KAAU,MAAaA,IAAAA,MAAAA,KAAU,IAAM,EAAA;AACzC,QAAA,IAAA,CAAKA,QAAe,OAAO,CAAA;AAAA;AAC7B,KACD;AAAA,GACH;AAEA,EAAA,OAAO,OAAQ,CAAA,KAAA;AACjB;;ACvBO,MAAM,QAAW,GAAA,CACtB,KACA,EAAA,OAAA,EACA,UACG,KAAA;AACH,EAAA,IAAI,SAAqB,GAAA,IAAA;AACzB,EAAA,OAAO,CAAC,CAAoB,KAAA;AAC1B,IAAA,KAAA;AAAA,MACE,UAAA;AAAA,MACA,SAAA,CAAU,CAAG,EAAA,CAAC,OAAY,KAAA;AACxB,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,YAAA,CAAa,SAAmB,CAAA;AAAA;AAGlC,QAAA,IAAI,cAAiB,GAAA,KAAA;AAErB,QAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,UAAA,IAAI,cAAgB,EAAA;AAClB,YAAA;AAAA;AAEF,UAAiB,cAAA,GAAA,IAAA;AACjB,UAAA,IAAA,CAAK,IAAI,KAAA,CAAM,mCAAmC,CAAA,EAAG,KAAK,CAAA;AAAA,WACzD,OAAO,CAAA;AAEV,QAAA,KAAA;AAAA,UACE,cAAe,CAAA,OAAA,EAAS,MAAM,CAAC,cAAc,CAAA;AAAA,UAC7C;AAAA,SACF;AAEA,QAAA,KAAA;AAAA,UACE,OAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAiB,cAAA,GAAA,IAAA;AAAA,WAClB;AAAA,SACH;AAAA,OACD;AAAA,KACH;AAAA,GACF;AACF;;AC3Ca,MAAA,SAAA,GAAY,CAAC,UAA8C,KAAA;AACtE,EAAM,MAAA,MAAA,GAAS,QAAkC,CAAA,EAAE,CAAA;AACnD,EAAA,SAAA,CAAU,QAAQ,UAAU,CAAA;AAE5B,EAAA,KAAA;AAAA,IACE,UAAA;AAAA,IACA,MAAO,CAAA,CAAC,CAAC,GAAA,EAAKA,MAAK,CAAM,KAAA;AACvB,MAAO,MAAA,CAAA,KAAA,CAAM,CAAC,UAAe,KAAA;AAC3B,QAAA,UAAA,CAAW,GAAG,CAAIA,GAAAA,MAAAA;AAAA,OACnB,CAAA;AAAA,KACF;AAAA,GACH;AAEA,EAAA,OAAO,MAAO,CAAA,KAAA;AAChB;;ACba,MAAA,MAAA,GAAS,CAAC,SAA0C,KAAA;AAC/D,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,IAAA,CAAK,SAAS,CAAA;AAClC,EAAA,OAAO,cAAe,CAAA,GAAG,MAAO,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IAC/C,CAAC,MAAsC,OAAmB,KAAA;AACxD,MAAA,MAAMC,UAA8B,EAAC;AACrC,MAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAU,KAAA;AAChC,QAAAA,OAAO,CAAA,IAAA,CAAK,KAAK,CAAC,CAAI,GAAA,KAAA;AAAA,OACvB,CAAA;AACD,MAAA,IAAA,CAAKA,SAAQ,CAAC,CAAA;AAAA;AAChB,GACF;AACF;;ACZO,MAAM,YAAe,GAAA,CAC1B,OACA,EAAA,WAAA,GAAkC,EACX,KAAA;AACvB,EAAA,MAAM,MAAS,GAAA,cAAA;AAAA,IACb,WAAA;AAAA,IACA,GAAG;AAAA,GACH,CAAA,CAAC,CAAsB,EAAA,QAAA,EAAA,GAAa,OAAY,KAAA;AAChD,IAAA,IAAA,CAAK,OAAQ,CAAA,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,GAC/B,CAAA;AAED,EAAO,OAAA,MAAA;AACT;;ACZO,MAAM,aAAgB,GAAA,CAC3B,UACA,EAAA,QAAA,EACA,WAA+B,EAE/B,KAAA,cAAA;AAAA,EACE,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,CAAE,CAAC,CAAA,EAAuB,OAAS,EAAA,KAAA,EAAO,KAAU,KAAA;AAClD,EAAK,IAAA,CAAA,IAAI,OAAO,OAAS,EAAA,KAAK,EAAE,IAAK,CAAA,KAAK,GAAG,CAAC,CAAA;AAChD,CAAC,CAAA;;ACII,MAAM,MAAS,GAAA,CACpB,MACA,EAAA,SAAA,EACA,UACG,KAAA;AACH,EAAA,MAAM,YAAY,QAAY,EAAA;AAE9B,EAAA,KAAA;AAAA,IACE,SAAA;AAAA,IACA,MAAA,CAAO,CAAC,MAAW,KAAA;AACjB,MAAA,KAAA;AAAA,QACE,SAAU,CAAA;AAAA,UACR,WAAA,CAAY,QAAQ,UAAe,CAAA;AAAA,UACnC,GAAG,MAAO,CAAA,GAAA;AAAA,YAAI,CAAC,CACb,KAAA,WAAA;AAAA,cACE,cAAA;AAAA,gBACE,aAAc,CAAA,CAAA,CAAE,OAAS,EAAA,MAAA,EAAQ,EAAE,YAAY,CAAA;AAAA,gBAC/C;AAAA,eACF;AAAA,cACA,CAAE,CAAA;AAAA;AACJ;AACF,SACD,CAAA;AAAA,QACD,OAAO,SAAS;AAAA,OAClB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,OAAO,SAAU,CAAA,KAAA;AACnB;;;;"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Concatenated";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { source, sourceOf, sourceSync } from "silentium";
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
import { record } from "./Record";
|
|
4
|
+
|
|
5
|
+
test("Record.nested.test", () => {
|
|
6
|
+
const three = sourceOf<string>("three");
|
|
7
|
+
const recordSrc = sourceSync(
|
|
8
|
+
record({
|
|
9
|
+
one: "one",
|
|
10
|
+
two: source("two"),
|
|
11
|
+
three,
|
|
12
|
+
nested: record({
|
|
13
|
+
four: "four",
|
|
14
|
+
five: source("five"),
|
|
15
|
+
}),
|
|
16
|
+
}),
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
expect(recordSrc.syncValue()).toStrictEqual({
|
|
20
|
+
one: "one",
|
|
21
|
+
two: "two",
|
|
22
|
+
three: "three",
|
|
23
|
+
nested: {
|
|
24
|
+
five: "five",
|
|
25
|
+
four: "four",
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { source, sourceOf, sourceSync } from "silentium";
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
import { record } from "../structures/Record";
|
|
4
|
+
|
|
5
|
+
test("Record.test", () => {
|
|
6
|
+
const three = sourceOf<string>("three");
|
|
7
|
+
const recordSrc = sourceSync(
|
|
8
|
+
record({
|
|
9
|
+
one: "one",
|
|
10
|
+
two: source("two"),
|
|
11
|
+
three,
|
|
12
|
+
}),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
expect(recordSrc.syncValue()).toStrictEqual({
|
|
16
|
+
one: "one",
|
|
17
|
+
two: "two",
|
|
18
|
+
three: "three",
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
three.give("three-changed");
|
|
22
|
+
|
|
23
|
+
expect(recordSrc.syncValue()).toStrictEqual({
|
|
24
|
+
one: "one",
|
|
25
|
+
two: "two",
|
|
26
|
+
three: "three-changed",
|
|
27
|
+
});
|
|
28
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { give, GuestType, sourceCombined, SourceType } from "silentium";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns record of data from record of sources
|
|
5
|
+
* https://silentium-lab.github.io/silentium-components/#/structures/record
|
|
6
|
+
*/
|
|
7
|
+
export const record = (recordSrc: Record<string, SourceType>) => {
|
|
8
|
+
const keys = Object.keys(recordSrc);
|
|
9
|
+
return sourceCombined(...Object.values(recordSrc))(
|
|
10
|
+
(g: GuestType<Record<string, any>>, ...entries: any[]) => {
|
|
11
|
+
const record: Record<string, any> = {};
|
|
12
|
+
entries.forEach((entry, index) => {
|
|
13
|
+
record[keys[index]] = entry;
|
|
14
|
+
});
|
|
15
|
+
give(record, g);
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
};
|
package/src/structures/index.ts
CHANGED