haori 0.1.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/LICENSE +21 -0
- package/README.ja.md +157 -0
- package/README.md +158 -0
- package/dist/haori.cjs.js +13 -0
- package/dist/haori.cjs.js.map +1 -0
- package/dist/haori.es.js +2929 -0
- package/dist/haori.es.js.map +1 -0
- package/dist/haori.iife.js +13 -0
- package/dist/haori.iife.js.map +1 -0
- package/dist/index.d.ts +824 -0
- package/dist/src/core.d.ts +144 -0
- package/dist/src/core.d.ts.map +1 -0
- package/dist/src/core.js +605 -0
- package/dist/src/core.js.map +1 -0
- package/dist/src/dev.d.ts +35 -0
- package/dist/src/dev.d.ts.map +1 -0
- package/dist/src/dev.js +44 -0
- package/dist/src/dev.js.map +1 -0
- package/dist/src/env.d.ts +25 -0
- package/dist/src/env.d.ts.map +1 -0
- package/dist/src/env.js +64 -0
- package/dist/src/env.js.map +1 -0
- package/dist/src/event.d.ts +144 -0
- package/dist/src/event.d.ts.map +1 -0
- package/dist/src/event.js +221 -0
- package/dist/src/event.js.map +1 -0
- package/dist/src/event_dispatcher.d.ts +50 -0
- package/dist/src/event_dispatcher.d.ts.map +1 -0
- package/dist/src/event_dispatcher.js +99 -0
- package/dist/src/event_dispatcher.js.map +1 -0
- package/dist/src/expression.d.ts +39 -0
- package/dist/src/expression.d.ts.map +1 -0
- package/dist/src/expression.js +148 -0
- package/dist/src/expression.js.map +1 -0
- package/dist/src/form.d.ts +113 -0
- package/dist/src/form.d.ts.map +1 -0
- package/dist/src/form.js +361 -0
- package/dist/src/form.js.map +1 -0
- package/dist/src/fragment.d.ts +427 -0
- package/dist/src/fragment.d.ts.map +1 -0
- package/dist/src/fragment.js +1168 -0
- package/dist/src/fragment.js.map +1 -0
- package/dist/src/haori.d.ts +54 -0
- package/dist/src/haori.d.ts.map +1 -0
- package/dist/src/haori.js +120 -0
- package/dist/src/haori.js.map +1 -0
- package/dist/src/import.d.ts +19 -0
- package/dist/src/import.d.ts.map +1 -0
- package/dist/src/import.js +64 -0
- package/dist/src/import.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +21 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/log.d.ts +32 -0
- package/dist/src/log.d.ts.map +1 -0
- package/dist/src/log.js +43 -0
- package/dist/src/log.js.map +1 -0
- package/dist/src/observer.d.ts +17 -0
- package/dist/src/observer.d.ts.map +1 -0
- package/dist/src/observer.js +102 -0
- package/dist/src/observer.js.map +1 -0
- package/dist/src/procedure.d.ts +203 -0
- package/dist/src/procedure.d.ts.map +1 -0
- package/dist/src/procedure.js +1040 -0
- package/dist/src/procedure.js.map +1 -0
- package/dist/src/queue.d.ts +28 -0
- package/dist/src/queue.d.ts.map +1 -0
- package/dist/src/queue.js +150 -0
- package/dist/src/queue.js.map +1 -0
- package/dist/src/url.d.ts +14 -0
- package/dist/src/url.d.ts.map +1 -0
- package/dist/src/url.js +22 -0
- package/dist/src/url.js.map +1 -0
- package/dist/tests/click-attributes.test.d.ts +2 -0
- package/dist/tests/click-attributes.test.d.ts.map +1 -0
- package/dist/tests/click-attributes.test.js +95 -0
- package/dist/tests/click-attributes.test.js.map +1 -0
- package/dist/tests/core.test.d.ts +5 -0
- package/dist/tests/core.test.d.ts.map +1 -0
- package/dist/tests/core.test.js +158 -0
- package/dist/tests/core.test.js.map +1 -0
- package/dist/tests/data-each-browserlike.test.d.ts +2 -0
- package/dist/tests/data-each-browserlike.test.d.ts.map +1 -0
- package/dist/tests/data-each-browserlike.test.js +48 -0
- package/dist/tests/data-each-browserlike.test.js.map +1 -0
- package/dist/tests/data-each-fragment-debug.test.d.ts +2 -0
- package/dist/tests/data-each-fragment-debug.test.d.ts.map +1 -0
- package/dist/tests/data-each-fragment-debug.test.js +119 -0
- package/dist/tests/data-each-fragment-debug.test.js.map +1 -0
- package/dist/tests/data-each-table.test.d.ts +2 -0
- package/dist/tests/data-each-table.test.d.ts.map +1 -0
- package/dist/tests/data-each-table.test.js +63 -0
- package/dist/tests/data-each-table.test.js.map +1 -0
- package/dist/tests/dev.test.d.ts +2 -0
- package/dist/tests/dev.test.d.ts.map +1 -0
- package/dist/tests/dev.test.js +51 -0
- package/dist/tests/dev.test.js.map +1 -0
- package/dist/tests/each_arg.test.d.ts +2 -0
- package/dist/tests/each_arg.test.d.ts.map +1 -0
- package/dist/tests/each_arg.test.js +41 -0
- package/dist/tests/each_arg.test.js.map +1 -0
- package/dist/tests/env.test.d.ts +2 -0
- package/dist/tests/env.test.d.ts.map +1 -0
- package/dist/tests/env.test.js +96 -0
- package/dist/tests/env.test.js.map +1 -0
- package/dist/tests/event.test.d.ts +2 -0
- package/dist/tests/event.test.d.ts.map +1 -0
- package/dist/tests/event.test.js +287 -0
- package/dist/tests/event.test.js.map +1 -0
- package/dist/tests/expression.test.d.ts +2 -0
- package/dist/tests/expression.test.d.ts.map +1 -0
- package/dist/tests/expression.test.js +281 -0
- package/dist/tests/expression.test.js.map +1 -0
- package/dist/tests/fetch-and-procedure-scenarios.test.d.ts +2 -0
- package/dist/tests/fetch-and-procedure-scenarios.test.d.ts.map +1 -0
- package/dist/tests/fetch-and-procedure-scenarios.test.js +133 -0
- package/dist/tests/fetch-and-procedure-scenarios.test.js.map +1 -0
- package/dist/tests/form.test.d.ts +2 -0
- package/dist/tests/form.test.d.ts.map +1 -0
- package/dist/tests/form.test.js +607 -0
- package/dist/tests/form.test.js.map +1 -0
- package/dist/tests/fragment.test.d.ts +2 -0
- package/dist/tests/fragment.test.d.ts.map +1 -0
- package/dist/tests/fragment.test.js +164 -0
- package/dist/tests/fragment.test.js.map +1 -0
- package/dist/tests/import.test.d.ts +2 -0
- package/dist/tests/import.test.d.ts.map +1 -0
- package/dist/tests/import.test.js +148 -0
- package/dist/tests/import.test.js.map +1 -0
- package/dist/tests/log.test.d.ts +2 -0
- package/dist/tests/log.test.d.ts.map +1 -0
- package/dist/tests/log.test.js +58 -0
- package/dist/tests/log.test.js.map +1 -0
- package/dist/tests/procedure-action-operations.test.d.ts +2 -0
- package/dist/tests/procedure-action-operations.test.d.ts.map +1 -0
- package/dist/tests/procedure-action-operations.test.js +148 -0
- package/dist/tests/procedure-action-operations.test.js.map +1 -0
- package/dist/tests/procedure-fetch-options.test.d.ts +2 -0
- package/dist/tests/procedure-fetch-options.test.d.ts.map +1 -0
- package/dist/tests/procedure-fetch-options.test.js +131 -0
- package/dist/tests/procedure-fetch-options.test.js.map +1 -0
- package/dist/tests/procedure.test.d.ts +2 -0
- package/dist/tests/procedure.test.d.ts.map +1 -0
- package/dist/tests/procedure.test.js +136 -0
- package/dist/tests/procedure.test.js.map +1 -0
- package/dist/tests/procedure_events.test.d.ts +7 -0
- package/dist/tests/procedure_events.test.d.ts.map +1 -0
- package/dist/tests/procedure_events.test.js +96 -0
- package/dist/tests/procedure_events.test.js.map +1 -0
- package/dist/tests/reset_each.test.d.ts +2 -0
- package/dist/tests/reset_each.test.d.ts.map +1 -0
- package/dist/tests/reset_each.test.js +215 -0
- package/dist/tests/reset_each.test.js.map +1 -0
- package/dist/tests/row-move.test.d.ts +2 -0
- package/dist/tests/row-move.test.d.ts.map +1 -0
- package/dist/tests/row-move.test.js +197 -0
- package/dist/tests/row-move.test.js.map +1 -0
- package/dist/tests/row-operations.test.d.ts +2 -0
- package/dist/tests/row-operations.test.d.ts.map +1 -0
- package/dist/tests/row-operations.test.js +238 -0
- package/dist/tests/row-operations.test.js.map +1 -0
- package/dist/tests/url.test.d.ts +2 -0
- package/dist/tests/url.test.d.ts.map +1 -0
- package/dist/tests/url.test.js +150 -0
- package/dist/tests/url.test.js.map +1 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.config.d.ts.map +1 -0
- package/dist/vite.config.js +28 -0
- package/dist/vite.config.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +19 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event_dispatcher.js","sourceRoot":"","sources":["../../src/event_dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview 式評価エンジン
|
|
3
|
+
*
|
|
4
|
+
* 式評価システムです。
|
|
5
|
+
* XSS攻撃やコードインジェクションを防ぐためのセキュリティ機能と、
|
|
6
|
+
* パフォーマンス向上のためのキャッシュ機能を提供します。
|
|
7
|
+
*/
|
|
8
|
+
export default class Expression {
|
|
9
|
+
/** Haoriで禁止すべき識別子一覧(eval と arguments は strict モードで無効化) */
|
|
10
|
+
private static readonly FORBIDDEN_NAMES;
|
|
11
|
+
/** strict モードで禁止される識別子 */
|
|
12
|
+
private static readonly STRICT_FORBIDDEN_NAMES;
|
|
13
|
+
/** 式 → 評価関数のグローバルキャッシュ */
|
|
14
|
+
private static readonly EXPRESSION_CACHE;
|
|
15
|
+
/** 評価関数の前に実行されるコード */
|
|
16
|
+
private static assignments;
|
|
17
|
+
/**
|
|
18
|
+
* 式を評価します。
|
|
19
|
+
*
|
|
20
|
+
* @param expression 評価する式文字列
|
|
21
|
+
* @param bindedValue バインドされた値のオブジェクト
|
|
22
|
+
*/
|
|
23
|
+
static evaluate(expression: string, bindedValues?: Record<string, unknown>): unknown;
|
|
24
|
+
/**
|
|
25
|
+
* 式にevalや危険な構文が含まれているかチェックします。
|
|
26
|
+
*
|
|
27
|
+
* @param expression チェック対象の式文字列
|
|
28
|
+
* @return 危険なパターンが含まれている場合はtrue
|
|
29
|
+
*/
|
|
30
|
+
protected static containsDangerousPatterns(expression: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* valuesオブジェクトに禁止識別子が含まれていないか再帰的にチェックします。
|
|
33
|
+
*
|
|
34
|
+
* @param obj チェック対象のオブジェクト
|
|
35
|
+
* @return 禁止識別子が含まれていればtrue
|
|
36
|
+
*/
|
|
37
|
+
protected static containsForbiddenKeys(obj: unknown): boolean;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=expression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/expression.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,0DAA0D;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CA+BrC;IAEF,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAEvE,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAGpC;IAEJ,sBAAsB;IACtB,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAWnC;;;;;OAKG;WACW,QAAQ,CACpB,UAAU,EAAE,MAAM,EAClB,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACzC,OAAO;IA0DV;;;;;OAKG;IACH,SAAS,CAAC,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IASvE;;;;;OAKG;IACH,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;CAiB9D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview 式評価エンジン
|
|
3
|
+
*
|
|
4
|
+
* 式評価システムです。
|
|
5
|
+
* XSS攻撃やコードインジェクションを防ぐためのセキュリティ機能と、
|
|
6
|
+
* パフォーマンス向上のためのキャッシュ機能を提供します。
|
|
7
|
+
*/
|
|
8
|
+
var _a;
|
|
9
|
+
import Log from './log';
|
|
10
|
+
class Expression {
|
|
11
|
+
/**
|
|
12
|
+
* 式を評価します。
|
|
13
|
+
*
|
|
14
|
+
* @param expression 評価する式文字列
|
|
15
|
+
* @param bindedValue バインドされた値のオブジェクト
|
|
16
|
+
*/
|
|
17
|
+
static evaluate(expression, bindedValues = {}) {
|
|
18
|
+
if (expression.trim() === '') {
|
|
19
|
+
Log.warn('[Haori]', expression, 'Expression is empty');
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
if (this.containsDangerousPatterns(expression)) {
|
|
23
|
+
Log.warn('[Haori]', expression, 'Expression contains dangerous patterns');
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if (this.containsForbiddenKeys(bindedValues)) {
|
|
27
|
+
Log.warn('[Haori]', bindedValues, 'Binded values contain forbidden keys');
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const bindKeys = Object.keys(bindedValues)
|
|
31
|
+
.filter(key => !this.FORBIDDEN_NAMES.includes(key) &&
|
|
32
|
+
!this.STRICT_FORBIDDEN_NAMES.includes(key))
|
|
33
|
+
.sort();
|
|
34
|
+
const cacheKey = `${expression}:${bindKeys.join(',')}`;
|
|
35
|
+
let evaluator = this.EXPRESSION_CACHE.get(cacheKey);
|
|
36
|
+
if (!evaluator) {
|
|
37
|
+
const body = '"use strict";\n' + `${this.assignments};\nreturn (${expression});`;
|
|
38
|
+
try {
|
|
39
|
+
evaluator = new Function(...bindKeys, body);
|
|
40
|
+
this.EXPRESSION_CACHE.set(cacheKey, evaluator);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
Log.error('[Haori]', 'Failed to compile expression:', expression, error);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const argValues = [];
|
|
49
|
+
bindKeys.forEach((key) => {
|
|
50
|
+
argValues.push(bindedValues[key]);
|
|
51
|
+
});
|
|
52
|
+
return evaluator(...argValues);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
Log.error('[Haori]', 'Expression evaluation error:', expression, error);
|
|
56
|
+
if (error instanceof ReferenceError) {
|
|
57
|
+
// ReferenceError(未定義変数)はundefinedを返す
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 式にevalや危険な構文が含まれているかチェックします。
|
|
65
|
+
*
|
|
66
|
+
* @param expression チェック対象の式文字列
|
|
67
|
+
* @return 危険なパターンが含まれている場合はtrue
|
|
68
|
+
*/
|
|
69
|
+
static containsDangerousPatterns(expression) {
|
|
70
|
+
const dangerousPatterns = [
|
|
71
|
+
/\beval\s*\(/, // eval(...)
|
|
72
|
+
/\barguments\s*\[/, // arguments[...]
|
|
73
|
+
/\barguments\s*\./, // arguments.xxx
|
|
74
|
+
];
|
|
75
|
+
return dangerousPatterns.some(pattern => pattern.test(expression));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* valuesオブジェクトに禁止識別子が含まれていないか再帰的にチェックします。
|
|
79
|
+
*
|
|
80
|
+
* @param obj チェック対象のオブジェクト
|
|
81
|
+
* @return 禁止識別子が含まれていればtrue
|
|
82
|
+
*/
|
|
83
|
+
static containsForbiddenKeys(obj) {
|
|
84
|
+
if (obj && typeof obj === 'object') {
|
|
85
|
+
for (const key of Object.keys(obj)) {
|
|
86
|
+
if (this.FORBIDDEN_NAMES.includes(key)) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
if (this.STRICT_FORBIDDEN_NAMES.includes(key)) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
// 再帰的にネストしたオブジェクトもチェック
|
|
93
|
+
if (this.containsForbiddenKeys(obj[key])) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
_a = Expression;
|
|
102
|
+
/** Haoriで禁止すべき識別子一覧(eval と arguments は strict モードで無効化) */
|
|
103
|
+
Expression.FORBIDDEN_NAMES = [
|
|
104
|
+
// グローバルオブジェクト
|
|
105
|
+
'window',
|
|
106
|
+
'self',
|
|
107
|
+
'globalThis',
|
|
108
|
+
'frames',
|
|
109
|
+
'parent',
|
|
110
|
+
'top',
|
|
111
|
+
// 危険な関数/オブジェクト
|
|
112
|
+
'Function',
|
|
113
|
+
'setTimeout',
|
|
114
|
+
'setInterval',
|
|
115
|
+
'requestAnimationFrame',
|
|
116
|
+
'alert',
|
|
117
|
+
'confirm',
|
|
118
|
+
'prompt',
|
|
119
|
+
'fetch',
|
|
120
|
+
'XMLHttpRequest',
|
|
121
|
+
// 脱出経路・プロトタイプ
|
|
122
|
+
'constructor',
|
|
123
|
+
'__proto__',
|
|
124
|
+
'prototype',
|
|
125
|
+
'Object',
|
|
126
|
+
// その他
|
|
127
|
+
'document',
|
|
128
|
+
'location',
|
|
129
|
+
'navigator',
|
|
130
|
+
'localStorage',
|
|
131
|
+
'sessionStorage',
|
|
132
|
+
'IndexedDB',
|
|
133
|
+
'history',
|
|
134
|
+
];
|
|
135
|
+
/** strict モードで禁止される識別子 */
|
|
136
|
+
Expression.STRICT_FORBIDDEN_NAMES = ['eval', 'arguments'];
|
|
137
|
+
/** 式 → 評価関数のグローバルキャッシュ */
|
|
138
|
+
Expression.EXPRESSION_CACHE = new Map();
|
|
139
|
+
(() => {
|
|
140
|
+
// static初期化ブロック
|
|
141
|
+
const lines = [];
|
|
142
|
+
_a.FORBIDDEN_NAMES.forEach((name) => {
|
|
143
|
+
lines.push(`const ${name} = undefined`);
|
|
144
|
+
});
|
|
145
|
+
_a.assignments = lines.join(';\n');
|
|
146
|
+
})();
|
|
147
|
+
export default Expression;
|
|
148
|
+
//# sourceMappingURL=expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/expression.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview フォーム双方向バインディング
|
|
3
|
+
*
|
|
4
|
+
* フォームと入力要素の双方向バインディングを実現します。
|
|
5
|
+
*/
|
|
6
|
+
import { ElementFragment } from './fragment';
|
|
7
|
+
/**
|
|
8
|
+
* Formクラスは、フォームの双方向バインディングを提供します。
|
|
9
|
+
* 入力要素の値をフォームにバインドし、フォームのバインド値を入力要素に反映します。
|
|
10
|
+
*/
|
|
11
|
+
export default class Form {
|
|
12
|
+
/**
|
|
13
|
+
* フォーム内にある入力エレメントの値をオブジェクトとして取得します。
|
|
14
|
+
* data-form-object属性があると、そのエレメント内の値はオブジェクトとして処理されます。
|
|
15
|
+
* 入力エレメントにdata-form-list属性があると、そのエレメントの値はリストとして処理されます。
|
|
16
|
+
* 入力エレメント以外にdata-form-list属性があると、そのエレメントの値はオブジェクトのリストとして処理されます。
|
|
17
|
+
*
|
|
18
|
+
* @param form フォームのElementFragment
|
|
19
|
+
*/
|
|
20
|
+
static getValues(form: ElementFragment): Record<string, unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* フォーム内の各入力エレメントから値を取得し、オブジェクトとして返します。
|
|
23
|
+
* 入力エレメントのname属性、data-form-object属性、data-form-list属性に基づいて値を整理します。
|
|
24
|
+
*
|
|
25
|
+
* @param fragment 対象のElementFragment
|
|
26
|
+
* @param values オブジェクトに追加する値のオブジェクト
|
|
27
|
+
* @returns values と同じオブジェクト
|
|
28
|
+
*/
|
|
29
|
+
private static getPartValues;
|
|
30
|
+
/**
|
|
31
|
+
* フォーム内にある入力エレメントに値を設定します。
|
|
32
|
+
* フォームのdata-bind属性に値が反映されます。
|
|
33
|
+
*
|
|
34
|
+
* @param form フォームのElementFragment
|
|
35
|
+
* @param values フォームに設定する値のオブジェクト
|
|
36
|
+
* @param force data-form-detach属性があるエレメントにも値を反映するかどうか
|
|
37
|
+
* @returns Promise(DOMの更新が完了したら解決される)
|
|
38
|
+
*/
|
|
39
|
+
static setValues(form: ElementFragment, values: Record<string, unknown>, force?: boolean): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* フラグメント内にある各入力エレメントに値を設定します。
|
|
42
|
+
*
|
|
43
|
+
* @param fragment 対象フラグメント
|
|
44
|
+
* @param values フラグメントに設定する値のオブジェクト
|
|
45
|
+
* @param index 配列の場合のインデックス
|
|
46
|
+
* @param force data-form-detach属性があるエレメントにも値を反映するかどうか
|
|
47
|
+
* @returns Promise(DOMの更新が完了したら解決される)
|
|
48
|
+
*/
|
|
49
|
+
private static setPartValues;
|
|
50
|
+
/**
|
|
51
|
+
* 対象フラグメントとその子孫要素の値を初期化します。
|
|
52
|
+
* 値の初期化とメッセージのクリアを行います。
|
|
53
|
+
*
|
|
54
|
+
* @param fragment 対象フラグメント
|
|
55
|
+
* @returns すべての初期化処理が完了するPromise
|
|
56
|
+
*/
|
|
57
|
+
static reset(fragment: ElementFragment): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* data-each によって生成された複製(テンプレート以外)を削除します。
|
|
60
|
+
* 既存のテンプレートは保持し、その後の再評価で必要に応じて再生成されます。
|
|
61
|
+
* 対象エレメント自体がdata-eachを持つ場合はその子の複製を削除しますが、
|
|
62
|
+
* 対象エレメント自体は削除しません。
|
|
63
|
+
*/
|
|
64
|
+
private static clearEachClones;
|
|
65
|
+
/**
|
|
66
|
+
* 再帰的に値を初期化します。
|
|
67
|
+
*
|
|
68
|
+
* @param fragment 対象フラグメント
|
|
69
|
+
*/
|
|
70
|
+
private static clearValues;
|
|
71
|
+
/**
|
|
72
|
+
* フラグメントとその子要素のメッセージをクリアします。
|
|
73
|
+
*
|
|
74
|
+
* @param fragment 対象フラグメント
|
|
75
|
+
* @returns Promise(メッセージのクリアが完了したら解決される)
|
|
76
|
+
*/
|
|
77
|
+
static clearMessages(fragment: ElementFragment): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* キーに一致するフラグメントにエラーメッセージを追加します。
|
|
80
|
+
* キーに一致するフラグメントが見つからない場合は、指定されたフラグメントにメッセージを追加します。
|
|
81
|
+
*
|
|
82
|
+
* @param fragment 対象フラグメント
|
|
83
|
+
* @param key キー(ドット区切りの文字列)
|
|
84
|
+
* @param message 追加するエラーメッセージ]
|
|
85
|
+
* @return Promise(メッセージの追加が完了したら解決される)
|
|
86
|
+
*/
|
|
87
|
+
static addErrorMessage(fragment: ElementFragment, key: string, message: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* 指定されたキーに一致するフラグメントを検索します。
|
|
90
|
+
*
|
|
91
|
+
* @param fragment 対象フラグメント
|
|
92
|
+
* @param key キー(ドット区切りの文字列)
|
|
93
|
+
* @returns 一致するフラグメントの配列
|
|
94
|
+
*/
|
|
95
|
+
static findFragmentsByKey(fragment: ElementFragment, key: string): ElementFragment[];
|
|
96
|
+
/**
|
|
97
|
+
* 指定されたキーに一致するフラグメントを検索します。
|
|
98
|
+
* data-form-list属性で指定された場合はdata-row属性を持つ子要素の位置と添字が一致するものを対象とします。
|
|
99
|
+
*
|
|
100
|
+
* @param fragment 対象フラグメント
|
|
101
|
+
* @param parts キーのパーツ
|
|
102
|
+
* @returns 一致するフラグメントの配列
|
|
103
|
+
*/
|
|
104
|
+
private static findFragmentByKeyParts;
|
|
105
|
+
/**
|
|
106
|
+
* 対象のフラグメントがフォームフラグメントであればそれを返し、
|
|
107
|
+
* そうでなければ先祖要素をたどってフォームフラグメントを探します。
|
|
108
|
+
*
|
|
109
|
+
* @param fragment
|
|
110
|
+
*/
|
|
111
|
+
static getFormFragment(fragment: ElementFragment): ElementFragment | null;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/form.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAK3C;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,IAAI;IACvB;;;;;;;OAOG;WACW,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAKvE;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IA8D5B;;;;;;;;OAQG;WACW,SAAS,CACrB,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAqE5B;;;;;;OAMG;WACiB,KAAK,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IA+B9B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAO1B;;;;;OAKG;WACW,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;;;;;OAQG;WACW,eAAe,CAC3B,QAAQ,EAAE,eAAe,EACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;;;OAMG;WACW,kBAAkB,CAC9B,QAAQ,EAAE,eAAe,EACzB,GAAG,EAAE,MAAM,GACV,eAAe,EAAE;IAIpB;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAsDrC;;;;;OAKG;WACW,eAAe,CAC3B,QAAQ,EAAE,eAAe,GACxB,eAAe,GAAG,IAAI;CAW1B"}
|