haori 0.1.1 → 0.1.2

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.
Files changed (43) hide show
  1. package/README.ja.md +26 -15
  2. package/README.md +26 -15
  3. package/dist/haori.cjs.js +10 -9
  4. package/dist/haori.cjs.js.map +1 -1
  5. package/dist/haori.es.js +1169 -736
  6. package/dist/haori.es.js.map +1 -1
  7. package/dist/haori.iife.js +9 -8
  8. package/dist/haori.iife.js.map +1 -1
  9. package/dist/index.d.ts +10 -2
  10. package/dist/package.json +70 -0
  11. package/dist/src/expression.d.ts +92 -0
  12. package/dist/src/expression.d.ts.map +1 -1
  13. package/dist/src/expression.js +475 -2
  14. package/dist/src/expression.js.map +1 -1
  15. package/dist/src/fragment.d.ts +9 -1
  16. package/dist/src/fragment.d.ts.map +1 -1
  17. package/dist/src/fragment.js +50 -6
  18. package/dist/src/fragment.js.map +1 -1
  19. package/dist/src/index.d.ts +1 -1
  20. package/dist/src/index.js +1 -1
  21. package/dist/tests/data-each-table.test.js +5 -20
  22. package/dist/tests/data-each-table.test.js.map +1 -1
  23. package/dist/tests/data-fetch-tbody-dom.test.js +1 -1
  24. package/dist/tests/data-fetch-tbody-dom.test.js.map +1 -1
  25. package/dist/tests/event.test.js +3 -2
  26. package/dist/tests/event.test.js.map +1 -1
  27. package/dist/tests/expression.test.js +92 -0
  28. package/dist/tests/expression.test.js.map +1 -1
  29. package/dist/tests/form.test.js +35 -34
  30. package/dist/tests/form.test.js.map +1 -1
  31. package/dist/tests/fragment.test.js +51 -1
  32. package/dist/tests/fragment.test.js.map +1 -1
  33. package/dist/tests/helpers/async.d.ts +19 -0
  34. package/dist/tests/helpers/async.d.ts.map +1 -0
  35. package/dist/tests/helpers/async.js +31 -0
  36. package/dist/tests/helpers/async.js.map +1 -0
  37. package/dist/tests/procedure-action-operations.test.js +15 -12
  38. package/dist/tests/procedure-action-operations.test.js.map +1 -1
  39. package/dist/tests/row-move.test.js +36 -13
  40. package/dist/tests/row-move.test.js.map +1 -1
  41. package/dist/tests/row-operations.test.js +21 -20
  42. package/dist/tests/row-operations.test.js.map +1 -1
  43. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -374,6 +374,14 @@ declare class ElementFragment extends Fragment {
374
374
  * @returns 属性の有無
375
375
  */
376
376
  hasAttribute(name: string): boolean;
377
+ /**
378
+ * DOM上の順序から、参照フラグメントに対応する children 配列の挿入位置を推定します。
379
+ *
380
+ * @param referenceChild 参照フラグメント
381
+ * @param insertAfter 参照位置の後ろに挿入するかどうか
382
+ * @returns 挿入位置。解決できない場合はnull
383
+ */
384
+ private resolveInsertionPointFromDom;
377
385
  /**
378
386
  * 子ノードを参照ノードの前に挿入します。
379
387
  * 参照ノードがnullの場合、親の最後に追加されます。
@@ -382,7 +390,7 @@ declare class ElementFragment extends Fragment {
382
390
  * @param referenceChild 参照ノード
383
391
  * @return 挿入のPromise
384
392
  */
385
- insertBefore(newChild: Fragment, referenceChild: Fragment | null): Promise<void>;
393
+ insertBefore(newChild: Fragment, referenceChild: Fragment | null, referenceNodeOverride?: Node | null): Promise<void>;
386
394
  /**
387
395
  * 指定した参照ノードの後に子ノードを挿入します。
388
396
  *
@@ -819,6 +827,6 @@ declare class TextFragment extends Fragment {
819
827
  evaluate(): Promise<void>;
820
828
  }
821
829
 
822
- export declare const version = "0.1.1";
830
+ export declare const version = "0.1.2";
823
831
 
824
832
  export { }
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "haori",
3
+ "version": "0.1.2",
4
+ "description": "A lightweight HTML-first UI engine powered by declarative data bindings and expressions.",
5
+ "scripts": {
6
+ "dev": "vite",
7
+ "build": "vite build",
8
+ "dev:demo": "vite --config demo/vite.config.ts",
9
+ "build:demo": "vite build --config demo/vite.config.ts",
10
+ "preview:demo": "vite preview --config demo/vite.config.ts",
11
+ "test": "vitest run",
12
+ "test:watch": "vitest",
13
+ "lint": "eslint src",
14
+ "lint:fix": "eslint src --fix",
15
+ "format": "prettier --write src/**/*.{ts,js,json}",
16
+ "format:check": "prettier --check src/**/*.{ts,js,json}",
17
+ "type-check": "tsc --noEmit",
18
+ "preview": "vite preview",
19
+ "compile": "tsc",
20
+ "clean": "rm -rf dist",
21
+ "prepare": "npm run compile",
22
+ "pretest": "npm run compile",
23
+ "posttest": "npm run lint"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/meibinlab/haori-js.git"
28
+ },
29
+ "keywords": [
30
+ "html",
31
+ "template",
32
+ "binding",
33
+ "ui-engine",
34
+ "no-javascript",
35
+ "dom",
36
+ "declarative",
37
+ "frontend"
38
+ ],
39
+ "author": "meibinlab",
40
+ "license": "MIT",
41
+ "type": "module",
42
+ "exports": {
43
+ ".": {
44
+ "import": "./dist/haori.js"
45
+ }
46
+ },
47
+ "main": "dist/haori.es.js",
48
+ "types": "./dist/index.d.ts",
49
+ "files": [
50
+ "dist"
51
+ ],
52
+ "bugs": {
53
+ "url": "https://github.com/meibinlab/haori-js/issues"
54
+ },
55
+ "homepage": "https://github.com/meibinlab/haori-js#readme",
56
+ "devDependencies": {
57
+ "@eslint/js": "^9.31.0",
58
+ "@playwright/test": "^1.57.0",
59
+ "@types/node": "^22.7.5",
60
+ "eslint": "^9.31.0",
61
+ "http-server": "^14.1.1",
62
+ "jsdom": "^26.1.0",
63
+ "prettier": "^3.6.2",
64
+ "typescript": "^5.6.3",
65
+ "typescript-eslint": "^8.37.0",
66
+ "vite": "^7.0.4",
67
+ "vite-plugin-dts": "^4.5.4",
68
+ "vitest": "^3.2.4"
69
+ }
70
+ }
@@ -10,6 +10,10 @@ export default class Expression {
10
10
  private static readonly FORBIDDEN_NAMES;
11
11
  /** strict モードで禁止される識別子 */
12
12
  private static readonly STRICT_FORBIDDEN_NAMES;
13
+ /** プロパティアクセスで拒否する名前 */
14
+ private static readonly FORBIDDEN_PROPERTY_NAMES;
15
+ /** 式構文として許可しない予約語 */
16
+ private static readonly DISALLOWED_KEYWORDS;
13
17
  /** 式 → 評価関数のグローバルキャッシュ */
14
18
  private static readonly EXPRESSION_CACHE;
15
19
  /** 評価関数の前に実行されるコード */
@@ -28,6 +32,94 @@ export default class Expression {
28
32
  * @return 危険なパターンが含まれている場合はtrue
29
33
  */
30
34
  protected static containsDangerousPatterns(expression: string): boolean;
35
+ /**
36
+ * 許可する式構文かどうかを検証します。
37
+ *
38
+ * @param expression 検証対象の式
39
+ * @returns 許可する構文であればtrue
40
+ */
41
+ private static hasAllowedSyntax;
42
+ /**
43
+ * 式をトークン列に分解します。
44
+ *
45
+ * @param expression 評価前に検証する式
46
+ * @returns 分解結果。未対応構文を含む場合はnull
47
+ */
48
+ private static tokenizeExpression;
49
+ /**
50
+ * 文字列リテラルを読み取ります。
51
+ *
52
+ * @param expression 式全体
53
+ * @param start 開始位置
54
+ * @returns トークンと次の位置
55
+ */
56
+ private static readStringToken;
57
+ /**
58
+ * 数値リテラルを読み取ります。
59
+ *
60
+ * @param expression 式全体
61
+ * @param start 開始位置
62
+ * @returns トークンと次の位置
63
+ */
64
+ private static readNumberToken;
65
+ /**
66
+ * 識別子を読み取ります。
67
+ *
68
+ * @param expression 式全体
69
+ * @param start 開始位置
70
+ * @returns トークンと次の位置
71
+ */
72
+ private static readIdentifierToken;
73
+ /**
74
+ * 角括弧がメンバーアクセスかどうかを判定します。
75
+ *
76
+ * @param previous 直前のトークン
77
+ * @returns メンバーアクセスであればtrue
78
+ */
79
+ private static startsMemberAccess;
80
+ /**
81
+ * 文字列リテラルをプレーン文字列へ変換します。
82
+ *
83
+ * @param literal 文字列リテラル
84
+ * @returns デコード後の文字列
85
+ */
86
+ private static decodeStringLiteral;
87
+ /**
88
+ * バインド値を安全なProxyでラップします。
89
+ *
90
+ * @param bindedValues バインド値
91
+ * @returns ラップ済みのバインド値
92
+ */
93
+ private static wrapBoundValues;
94
+ /**
95
+ * 危険なプロパティアクセスを防ぐために値を再帰的にラップします。
96
+ *
97
+ * @param value ラップ対象の値
98
+ * @param cache 既存Proxyのキャッシュ
99
+ * @returns ラップ済みの値
100
+ */
101
+ private static wrapBoundValue;
102
+ /**
103
+ * Proxy ラップ対象の値かどうかを判定します。
104
+ *
105
+ * @param value 判定対象
106
+ * @returns ラップ対象であればtrue
107
+ */
108
+ private static shouldWrapValue;
109
+ /**
110
+ * 評価中のみ prototype 系プロパティへの生アクセスを抑止します。
111
+ *
112
+ * @param callback 実行する処理
113
+ * @returns 処理結果
114
+ */
115
+ private static withBlockedPropertyAccess;
116
+ /**
117
+ * イテレータ互換オブジェクトかどうかを判定します。
118
+ *
119
+ * @param value 判定対象
120
+ * @returns イテレータ互換であればtrue
121
+ */
122
+ private static isIteratorLike;
31
123
  /**
32
124
  * valuesオブジェクトに禁止識別子が含まれていないか再帰的にチェックします。
33
125
  *
@@ -1 +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"}
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/expression.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,0DAA0D;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAgCrC;IAEF,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAEvE,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAI7C;IAEH,qBAAqB;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAkCxC;IAEH,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;IA2DV;;;;;OAKG;IACH,SAAS,CAAC,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAYvE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAuF/B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiGjC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IA6B9B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAwB9B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAqBlC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA+BlC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAa9B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA4E7B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAe9B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAiCxC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B;;;;;OAKG;IACH,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;CAiB9D"}