@mathrunet/masamune_cloudflare 3.1.6 → 3.1.7

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 (35) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/adapters/rules_middleware.d.ts +45 -0
  6. package/dist/lib/adapters/rules_middleware.js +42 -0
  7. package/dist/lib/adapters/rules_middleware.js.map +1 -0
  8. package/dist/lib/middlewares/index.d.ts +3 -2
  9. package/dist/lib/middlewares/index.js +7 -2
  10. package/dist/lib/middlewares/index.js.map +1 -1
  11. package/dist/lib/middlewares/rules_middleware.d.ts +29 -0
  12. package/dist/lib/middlewares/rules_middleware.js +36 -0
  13. package/dist/lib/middlewares/rules_middleware.js.map +1 -0
  14. package/dist/lib/src/rules/path_matcher.d.ts +31 -0
  15. package/dist/lib/src/rules/path_matcher.js +105 -0
  16. package/dist/lib/src/rules/path_matcher.js.map +1 -0
  17. package/dist/lib/src/rules/rules_engine.d.ts +72 -0
  18. package/dist/lib/src/rules/rules_engine.js +174 -0
  19. package/dist/lib/src/rules/rules_engine.js.map +1 -0
  20. package/dist/lib/src/rules/rules_loader.d.ts +73 -0
  21. package/dist/lib/src/rules/rules_loader.js +93 -0
  22. package/dist/lib/src/rules/rules_loader.js.map +1 -0
  23. package/dist/lib/src/worker_adapter_base.d.ts +14 -0
  24. package/dist/lib/src/worker_adapter_base.js +12 -0
  25. package/dist/lib/src/worker_adapter_base.js.map +1 -0
  26. package/dist/lib/src/workers_auth_adapter_base.d.ts +3 -8
  27. package/dist/lib/src/workers_auth_adapter_base.js +2 -1
  28. package/dist/lib/src/workers_auth_adapter_base.js.map +1 -1
  29. package/dist/lib/src/workers_base.d.ts +13 -0
  30. package/dist/lib/src/workers_base.js +21 -3
  31. package/dist/lib/src/workers_base.js.map +1 -1
  32. package/dist/lib/src/workers_rule_adapter_base.d.ts +27 -0
  33. package/dist/lib/src/workers_rule_adapter_base.js +28 -0
  34. package/dist/lib/src/workers_rule_adapter_base.js.map +1 -0
  35. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ## 3.1.6 (2026-06-30)
1
+ ## 3.1.7 (2026-07-01)
2
2
 
3
3
 
4
4
  ### chore
package/dist/index.d.ts CHANGED
@@ -14,10 +14,16 @@ export * from "@mathrunet/masamune";
14
14
  export * from "./lib/api";
15
15
  export * from "./lib/src/workers_base";
16
16
  export * from "./lib/src/workers_auth_adapter_base";
17
+ export * from "./lib/src/workers_rule_adapter_base";
17
18
  export * from "./lib/src/workers_data";
18
19
  export * from "./lib/src/request_process_workders_base";
20
+ export * from "./lib/src/rules/rules_loader";
21
+ export * from "./lib/src/rules/path_matcher";
22
+ export * from "./lib/src/rules/rules_engine";
19
23
  export * from "./lib/adapters/firebase_auth_adapter";
20
24
  export * from "./lib/adapters/none_auth_adapter";
25
+ export * from "./lib/adapters/rules_middleware";
26
+ export * from "./lib/middlewares";
21
27
  /**
22
28
  * Methods for deploying to Cloudflare Workers.
23
29
  *
package/dist/index.js CHANGED
@@ -52,10 +52,16 @@ __exportStar(require("@mathrunet/masamune"), exports);
52
52
  __exportStar(require("./lib/api"), exports);
53
53
  __exportStar(require("./lib/src/workers_base"), exports);
54
54
  __exportStar(require("./lib/src/workers_auth_adapter_base"), exports);
55
+ __exportStar(require("./lib/src/workers_rule_adapter_base"), exports);
55
56
  __exportStar(require("./lib/src/workers_data"), exports);
56
57
  __exportStar(require("./lib/src/request_process_workders_base"), exports);
58
+ __exportStar(require("./lib/src/rules/rules_loader"), exports);
59
+ __exportStar(require("./lib/src/rules/path_matcher"), exports);
60
+ __exportStar(require("./lib/src/rules/rules_engine"), exports);
57
61
  __exportStar(require("./lib/adapters/firebase_auth_adapter"), exports);
58
62
  __exportStar(require("./lib/adapters/none_auth_adapter"), exports);
63
+ __exportStar(require("./lib/adapters/rules_middleware"), exports);
64
+ __exportStar(require("./lib/middlewares"), exports);
59
65
  /**
60
66
  * Methods for deploying to Cloudflare Workers.
61
67
  *
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,wBAMC;AA3CD;;;;;;;;;GASG;AACH,2CAA6B;AAG7B,sDAAoC;AACpC,4CAA0B;AAC1B,yDAAuC;AACvC,sEAAoD;AACpD,yDAAuC;AACvC,0EAAwD;AACxD,uEAAqD;AACrD,mEAAiD;AAEjD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,MAAM,CAAC,cAA6B,EAAE,UAA0B,EAAE;IAC9E,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,wBAMC;AAjDD;;;;;;;;;GASG;AACH,2CAA6B;AAG7B,sDAAoC;AACpC,4CAA0B;AAC1B,yDAAuC;AACvC,sEAAoD;AACpD,sEAAoD;AACpD,yDAAuC;AACvC,0EAAwD;AACxD,+DAA6C;AAC7C,+DAA6C;AAC7C,+DAA6C;AAC7C,uEAAqD;AACrD,mEAAiD;AACjD,kEAAgD;AAChD,oDAAkC;AAElC;;;;;;;;;;;;;;GAcG;AACH,SAAgB,MAAM,CAAC,cAA6B,EAAE,UAA0B,EAAE;IAC9E,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { Context, MiddlewareHandler } from "hono";
2
+ import { RulesEngine, RulesEvaluationInput, RulesEvaluationResult } from "../src/rules/rules_engine";
3
+ import { WorkersRuleAdapterBase } from "../src/workers_rule_adapter_base";
4
+ /**
5
+ * Input builder for rules adapter.
6
+ *
7
+ * rulesアダプター用の入力生成関数。
8
+ */
9
+ export type RulesEvaluationInputBuilder = (context: Context) => RulesEvaluationInput | Promise<RulesEvaluationInput>;
10
+ /**
11
+ * Options for RulesEngineRuleAdapter.
12
+ *
13
+ * RulesEngineRuleAdapterのオプション。
14
+ */
15
+ export interface RulesEngineRuleOptions {
16
+ /**
17
+ * Rules engine to evaluate access rules.
18
+ *
19
+ * アクセスルールを評価するrulesエンジン。
20
+ */
21
+ engine: RulesEngine;
22
+ /**
23
+ * Builder that produces rules evaluation input from the request context.
24
+ *
25
+ * リクエストコンテキストからrules評価入力を生成するビルダー。
26
+ */
27
+ getEvaluationInput: RulesEvaluationInputBuilder;
28
+ /**
29
+ * Response returned when access is denied.
30
+ *
31
+ * アクセスが拒否された場合に返すレスポンス。
32
+ */
33
+ deniedResponse?: (context: Context, result: RulesEvaluationResult) => Response | Promise<Response>;
34
+ }
35
+ /**
36
+ * Middleware adapter that evaluates rules using a RulesEngine.
37
+ *
38
+ * RulesEngineを用いてrulesを評価するミドルウェアアダプター。
39
+ */
40
+ export declare class RulesEngineRuleAdapter extends WorkersRuleAdapterBase {
41
+ constructor(options: RulesEngineRuleOptions);
42
+ private readonly options;
43
+ build(): MiddlewareHandler;
44
+ private denied;
45
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RulesEngineRuleAdapter = void 0;
4
+ const workers_rule_adapter_base_1 = require("../src/workers_rule_adapter_base");
5
+ /**
6
+ * Middleware adapter that evaluates rules using a RulesEngine.
7
+ *
8
+ * RulesEngineを用いてrulesを評価するミドルウェアアダプター。
9
+ */
10
+ class RulesEngineRuleAdapter extends workers_rule_adapter_base_1.WorkersRuleAdapterBase {
11
+ constructor(options) {
12
+ super();
13
+ this.options = options;
14
+ }
15
+ options;
16
+ build() {
17
+ return async (context, next) => {
18
+ const authentication = context.get("authentication");
19
+ const input = await this.options.getEvaluationInput(context);
20
+ const result = await this.options.engine.evaluate({
21
+ ...input,
22
+ authentication: input.authentication ?? authentication,
23
+ });
24
+ if (!result.allowed) {
25
+ return await this.denied(context, result);
26
+ }
27
+ this.setRulesContext(context, result);
28
+ await next();
29
+ };
30
+ }
31
+ async denied(context, result) {
32
+ if (this.options.deniedResponse) {
33
+ return await this.options.deniedResponse(context, result);
34
+ }
35
+ return context.json({
36
+ error: "denied",
37
+ rule: result.rulePath,
38
+ }, 403);
39
+ }
40
+ }
41
+ exports.RulesEngineRuleAdapter = RulesEngineRuleAdapter;
42
+ //# sourceMappingURL=rules_middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules_middleware.js","sourceRoot":"","sources":["../../../src/lib/adapters/rules_middleware.ts"],"names":[],"mappings":";;;AAOA,gFAA0E;AA0C1E;;;;GAIG;AACH,MAAa,sBAAuB,SAAQ,kDAAsB;IAC9D,YAAY,OAA+B;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEgB,OAAO,CAAyB;IAEjD,KAAK;QACD,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAmC,CAAC;YACvF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC9C,GAAG,KAAK;gBACR,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,cAAc;aACzD,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,IAAI,EAAE,CAAC;QACjB,CAAC,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,MAAM,CAChB,OAAgB,EAChB,MAA6B;QAE7B,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC9B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC;YAChB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,MAAM,CAAC,QAAQ;SACxB,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC;CACJ;AApCD,wDAoCC"}
@@ -1,2 +1,3 @@
1
- export * from "./firebase_authentication_middleware";
2
- export * from "./no_authentication_middleware";
1
+ export * from "../adapters/rules_middleware";
2
+ export { FirebaseAuthAdapter as FirebaseAuthenticationMiddleware, FirebaseAuthOptions as FirebaseAuthenticationMiddlewareOptions, FirebaseCacheApiKeyStorer, } from "../adapters/firebase_auth_adapter";
3
+ export { NoneAuthAdapter as NoAuthenticationMiddleware, } from "../adapters/none_auth_adapter";
@@ -14,6 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./firebase_authentication_middleware"), exports);
18
- __exportStar(require("./no_authentication_middleware"), exports);
17
+ exports.NoAuthenticationMiddleware = exports.FirebaseCacheApiKeyStorer = exports.FirebaseAuthenticationMiddleware = void 0;
18
+ __exportStar(require("../adapters/rules_middleware"), exports);
19
+ var firebase_auth_adapter_1 = require("../adapters/firebase_auth_adapter");
20
+ Object.defineProperty(exports, "FirebaseAuthenticationMiddleware", { enumerable: true, get: function () { return firebase_auth_adapter_1.FirebaseAuthAdapter; } });
21
+ Object.defineProperty(exports, "FirebaseCacheApiKeyStorer", { enumerable: true, get: function () { return firebase_auth_adapter_1.FirebaseCacheApiKeyStorer; } });
22
+ var none_auth_adapter_1 = require("../adapters/none_auth_adapter");
23
+ Object.defineProperty(exports, "NoAuthenticationMiddleware", { enumerable: true, get: function () { return none_auth_adapter_1.NoneAuthAdapter; } });
19
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/middlewares/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uEAAqD;AACrD,iEAA+C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/middlewares/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,2EAI2C;AAHvC,yIAAA,mBAAmB,OAAoC;AAEvD,kIAAA,yBAAyB,OAAA;AAE7B,mEAEuC;AADnC,+HAAA,eAAe,OAA8B"}
@@ -0,0 +1,29 @@
1
+ import { Context, MiddlewareHandler } from "hono";
2
+ import { RulesEngine, RulesEvaluationInput, RulesEvaluationResult } from "../src/rules/rules_engine";
3
+ /**
4
+ * Input builder for rules middleware.
5
+ *
6
+ * rulesミドルウェア用の入力生成関数。
7
+ */
8
+ export type RulesMiddlewareInputBuilder = (context: Context) => RulesEvaluationInput | Promise<RulesEvaluationInput>;
9
+ /**
10
+ * Options for rules middleware.
11
+ *
12
+ * rulesミドルウェアのオプション。
13
+ */
14
+ export interface RulesMiddlewareOptions {
15
+ engine: RulesEngine;
16
+ getEvaluationInput: RulesMiddlewareInputBuilder;
17
+ }
18
+ /**
19
+ * Create rules middleware.
20
+ *
21
+ * rulesミドルウェアを作成します。
22
+ */
23
+ export declare function rulesMiddleware(options: RulesMiddlewareOptions): MiddlewareHandler;
24
+ /**
25
+ * Get rules evaluation result from Hono context.
26
+ *
27
+ * Hono contextからrules評価結果を取得します。
28
+ */
29
+ export declare function getRulesEvaluationResult(context: Context): RulesEvaluationResult | undefined;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rulesMiddleware = rulesMiddleware;
4
+ exports.getRulesEvaluationResult = getRulesEvaluationResult;
5
+ /**
6
+ * Create rules middleware.
7
+ *
8
+ * rulesミドルウェアを作成します。
9
+ */
10
+ function rulesMiddleware(options) {
11
+ return async (context, next) => {
12
+ const authentication = context.get("authentication");
13
+ const input = await options.getEvaluationInput(context);
14
+ const result = await options.engine.evaluate({
15
+ ...input,
16
+ authentication: input.authentication ?? authentication,
17
+ });
18
+ if (!result.allowed) {
19
+ return context.json({
20
+ error: "denied",
21
+ rule: result.rulePath,
22
+ }, 403);
23
+ }
24
+ context.set("rules", result);
25
+ await next();
26
+ };
27
+ }
28
+ /**
29
+ * Get rules evaluation result from Hono context.
30
+ *
31
+ * Hono contextからrules評価結果を取得します。
32
+ */
33
+ function getRulesEvaluationResult(context) {
34
+ return context.get("rules");
35
+ }
36
+ //# sourceMappingURL=rules_middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules_middleware.js","sourceRoot":"","sources":["../../../src/lib/middlewares/rules_middleware.ts"],"names":[],"mappings":";;AAgCA,0CAiBC;AAOD,4DAEC;AA/BD;;;;GAIG;AACH,SAAgB,eAAe,CAAC,OAA+B;IAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAmC,CAAC;QACvF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YACzC,GAAG,KAAK;YACR,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,cAAc;SACzD,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,IAAI,CAAC;gBAChB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,MAAM,CAAC,QAAQ;aACxB,EAAE,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,OAAgB;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAsC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Result of matching a rule path against a request path.
3
+ *
4
+ * ルールパスとリクエストパスのマッチ結果。
5
+ */
6
+ export interface RulePathMatch {
7
+ matched: boolean;
8
+ rulePath: string;
9
+ literalSegments: number;
10
+ wildcardSegments: number;
11
+ deepWildcardSegments: number;
12
+ matchedSegments: number;
13
+ }
14
+ /**
15
+ * Match rule path to request path.
16
+ *
17
+ * ルールパスをリクエストパスに照合します。
18
+ */
19
+ export declare function matchRulePath(rulePath: string, requestPath: string): RulePathMatch;
20
+ /**
21
+ * Compare matches by specificity.
22
+ *
23
+ * マッチ結果を具体度で比較します。
24
+ */
25
+ export declare function compareRulePathMatch(a: RulePathMatch, b: RulePathMatch): number;
26
+ /**
27
+ * Sort matches from the most specific to the least specific.
28
+ *
29
+ * マッチ結果を具体度の高い順に並べます。
30
+ */
31
+ export declare function sortRulePathMatches(matches: RulePathMatch[]): RulePathMatch[];
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchRulePath = matchRulePath;
4
+ exports.compareRulePathMatch = compareRulePathMatch;
5
+ exports.sortRulePathMatches = sortRulePathMatches;
6
+ const rules_loader_1 = require("./rules_loader");
7
+ /**
8
+ * Match rule path to request path.
9
+ *
10
+ * ルールパスをリクエストパスに照合します。
11
+ */
12
+ function matchRulePath(rulePath, requestPath) {
13
+ (0, rules_loader_1.validateRulePath)(rulePath);
14
+ const ruleSegments = splitPath(rulePath);
15
+ const requestSegments = splitPath(requestPath);
16
+ let literalSegments = 0;
17
+ let wildcardSegments = 0;
18
+ let deepWildcardSegments = 0;
19
+ for (let i = 0; i < ruleSegments.length; i++) {
20
+ const ruleSegment = ruleSegments[i];
21
+ if (ruleSegment === "**") {
22
+ deepWildcardSegments = 1;
23
+ return {
24
+ matched: true,
25
+ rulePath,
26
+ literalSegments,
27
+ wildcardSegments,
28
+ deepWildcardSegments,
29
+ matchedSegments: requestSegments.length,
30
+ };
31
+ }
32
+ const requestSegment = requestSegments[i];
33
+ if (requestSegment === undefined) {
34
+ return createUnmatched(rulePath);
35
+ }
36
+ if (ruleSegment === "*") {
37
+ wildcardSegments++;
38
+ continue;
39
+ }
40
+ if (ruleSegment !== requestSegment) {
41
+ return createUnmatched(rulePath);
42
+ }
43
+ literalSegments++;
44
+ }
45
+ if (ruleSegments.length !== requestSegments.length) {
46
+ return createUnmatched(rulePath);
47
+ }
48
+ return {
49
+ matched: true,
50
+ rulePath,
51
+ literalSegments,
52
+ wildcardSegments,
53
+ deepWildcardSegments,
54
+ matchedSegments: requestSegments.length,
55
+ };
56
+ }
57
+ /**
58
+ * Compare matches by specificity.
59
+ *
60
+ * マッチ結果を具体度で比較します。
61
+ */
62
+ function compareRulePathMatch(a, b) {
63
+ if (a.literalSegments !== b.literalSegments) {
64
+ return b.literalSegments - a.literalSegments;
65
+ }
66
+ if (a.deepWildcardSegments !== b.deepWildcardSegments) {
67
+ return a.deepWildcardSegments - b.deepWildcardSegments;
68
+ }
69
+ if (a.wildcardSegments !== b.wildcardSegments) {
70
+ return a.wildcardSegments - b.wildcardSegments;
71
+ }
72
+ if (a.matchedSegments !== b.matchedSegments) {
73
+ return b.matchedSegments - a.matchedSegments;
74
+ }
75
+ return a.rulePath.localeCompare(b.rulePath);
76
+ }
77
+ /**
78
+ * Sort matches from the most specific to the least specific.
79
+ *
80
+ * マッチ結果を具体度の高い順に並べます。
81
+ */
82
+ function sortRulePathMatches(matches) {
83
+ return [...matches].sort(compareRulePathMatch);
84
+ }
85
+ function splitPath(path) {
86
+ if (path.length === 0 || path.startsWith("/") || path.endsWith("/")) {
87
+ return [];
88
+ }
89
+ const segments = path.split("/");
90
+ if (segments.some((segment) => segment.length === 0)) {
91
+ return [];
92
+ }
93
+ return segments;
94
+ }
95
+ function createUnmatched(rulePath) {
96
+ return {
97
+ matched: false,
98
+ rulePath,
99
+ literalSegments: 0,
100
+ wildcardSegments: 0,
101
+ deepWildcardSegments: 0,
102
+ matchedSegments: 0,
103
+ };
104
+ }
105
+ //# sourceMappingURL=path_matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path_matcher.js","sourceRoot":"","sources":["../../../../src/lib/src/rules/path_matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { WorkersAuthContext } from "../workers_auth_adapter_base";
2
+ import { RulesAccessRule, RulesConfig, RulesOperation, RulesOperationKey } from "./rules_loader";
3
+ /**
4
+ * Input for evaluating rules.
5
+ *
6
+ * rules評価入力。
7
+ */
8
+ export interface RulesEvaluationInput {
9
+ path: string;
10
+ operation: RulesOperation | RulesOperationKey;
11
+ authentication?: WorkersAuthContext | undefined;
12
+ fetchDocument?: (() => Promise<Record<string, unknown> | null | undefined>) | undefined;
13
+ }
14
+ /**
15
+ * Result of evaluating rules.
16
+ *
17
+ * rules評価結果。
18
+ */
19
+ export interface RulesEvaluationResult {
20
+ allowed: boolean;
21
+ rulePath?: string | undefined;
22
+ access?: RulesAccessRule | undefined;
23
+ }
24
+ /**
25
+ * Arguments for building a rules path.
26
+ *
27
+ * rulesパス生成引数。
28
+ */
29
+ export interface RulesPathArguments {
30
+ database: string;
31
+ table: string;
32
+ indexKey: string;
33
+ }
34
+ /**
35
+ * Rules engine.
36
+ *
37
+ * rules評価エンジン。
38
+ */
39
+ export declare class RulesEngine {
40
+ constructor(config: RulesConfig | unknown);
41
+ private readonly config;
42
+ /**
43
+ * Evaluate rules for the given path and operation.
44
+ *
45
+ * 指定したパスと操作に対してrulesを評価します。
46
+ */
47
+ evaluate(input: RulesEvaluationInput): Promise<RulesEvaluationResult>;
48
+ }
49
+ /**
50
+ * Build a normalized rules path.
51
+ *
52
+ * 正規化されたrulesパスを生成します。
53
+ */
54
+ export declare function buildRulesPath({ database, table, indexKey }: RulesPathArguments): string;
55
+ /**
56
+ * Normalize HTTP method to rules operation.
57
+ *
58
+ * HTTPメソッドをrules操作に正規化します。
59
+ */
60
+ export declare function normalizeHttpMethodToRulesOperation(method: string): RulesOperation;
61
+ /**
62
+ * Normalize rules operation aliases.
63
+ *
64
+ * rules操作エイリアスを正規化します。
65
+ */
66
+ export declare function normalizeRulesOperation(operation: RulesOperation | RulesOperationKey): RulesOperation;
67
+ /**
68
+ * Resolve operation lookup order.
69
+ *
70
+ * 操作の解決順を取得します。
71
+ */
72
+ export declare function resolveRulesOperation(operation: RulesOperation | RulesOperationKey): RulesOperationKey[];
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RulesEngine = void 0;
4
+ exports.buildRulesPath = buildRulesPath;
5
+ exports.normalizeHttpMethodToRulesOperation = normalizeHttpMethodToRulesOperation;
6
+ exports.normalizeRulesOperation = normalizeRulesOperation;
7
+ exports.resolveRulesOperation = resolveRulesOperation;
8
+ const rules_loader_1 = require("./rules_loader");
9
+ const path_matcher_1 = require("./path_matcher");
10
+ /**
11
+ * Rules engine.
12
+ *
13
+ * rules評価エンジン。
14
+ */
15
+ class RulesEngine {
16
+ constructor(config) {
17
+ this.config = (0, rules_loader_1.loadRulesConfig)(config);
18
+ }
19
+ config;
20
+ /**
21
+ * Evaluate rules for the given path and operation.
22
+ *
23
+ * 指定したパスと操作に対してrulesを評価します。
24
+ */
25
+ async evaluate(input) {
26
+ const operation = normalizeRulesOperation(input.operation);
27
+ const matches = Object.keys(this.config.rules)
28
+ .map((rulePath) => (0, path_matcher_1.matchRulePath)(rulePath, input.path))
29
+ .filter((match) => match.matched);
30
+ if (matches.length === 0) {
31
+ return { allowed: false };
32
+ }
33
+ const sortedMatches = (0, path_matcher_1.sortRulePathMatches)(matches);
34
+ const resolved = resolveInheritedRule(sortedMatches.map((match) => {
35
+ return {
36
+ rulePath: match.rulePath,
37
+ entry: this.config.rules[match.rulePath],
38
+ };
39
+ }));
40
+ const access = resolveAccessRule(resolved.entry, operation);
41
+ if (!access) {
42
+ return {
43
+ allowed: false,
44
+ rulePath: resolved.rulePath,
45
+ };
46
+ }
47
+ return {
48
+ allowed: await evaluateAccessRule(access, input.authentication, input.fetchDocument),
49
+ rulePath: resolved.rulePath,
50
+ access,
51
+ };
52
+ }
53
+ }
54
+ exports.RulesEngine = RulesEngine;
55
+ /**
56
+ * Build a normalized rules path.
57
+ *
58
+ * 正規化されたrulesパスを生成します。
59
+ */
60
+ function buildRulesPath({ database, table, indexKey }) {
61
+ return [
62
+ "database",
63
+ encodeRulesPathSegment(database),
64
+ "table",
65
+ encodeRulesPathSegment(table),
66
+ encodeRulesPathSegment(indexKey),
67
+ ].join("/");
68
+ }
69
+ /**
70
+ * Normalize HTTP method to rules operation.
71
+ *
72
+ * HTTPメソッドをrules操作に正規化します。
73
+ */
74
+ function normalizeHttpMethodToRulesOperation(method) {
75
+ switch (method.toUpperCase()) {
76
+ case "GET":
77
+ return "get";
78
+ case "POST":
79
+ return "create";
80
+ case "PUT":
81
+ return "update";
82
+ case "DELETE":
83
+ return "delete";
84
+ default:
85
+ throw new Error(`Unsupported HTTP method for rules: ${method}`);
86
+ }
87
+ }
88
+ /**
89
+ * Normalize rules operation aliases.
90
+ *
91
+ * rules操作エイリアスを正規化します。
92
+ */
93
+ function normalizeRulesOperation(operation) {
94
+ switch (operation) {
95
+ case "read":
96
+ return "get";
97
+ case "write":
98
+ return "create";
99
+ case "get":
100
+ case "create":
101
+ case "update":
102
+ case "delete":
103
+ return operation;
104
+ }
105
+ }
106
+ /**
107
+ * Resolve operation lookup order.
108
+ *
109
+ * 操作の解決順を取得します。
110
+ */
111
+ function resolveRulesOperation(operation) {
112
+ const normalized = normalizeRulesOperation(operation);
113
+ switch (normalized) {
114
+ case "get":
115
+ return ["get", "read"];
116
+ case "create":
117
+ return ["create", "write"];
118
+ case "update":
119
+ return ["update", "write"];
120
+ case "delete":
121
+ return ["delete", "write"];
122
+ }
123
+ }
124
+ function resolveInheritedRule(matches) {
125
+ const inherited = {};
126
+ let rulePath = matches[0]?.rulePath ?? "";
127
+ for (const match of [...matches].reverse()) {
128
+ if (!match.entry) {
129
+ continue;
130
+ }
131
+ rulePath = match.rulePath;
132
+ for (const [operation, access] of Object.entries(match.entry)) {
133
+ inherited[operation] = access;
134
+ }
135
+ }
136
+ return {
137
+ rulePath,
138
+ entry: inherited,
139
+ };
140
+ }
141
+ function resolveAccessRule(entry, operation) {
142
+ for (const operationKey of resolveRulesOperation(operation)) {
143
+ const access = entry[operationKey];
144
+ if (access) {
145
+ return access;
146
+ }
147
+ }
148
+ return undefined;
149
+ }
150
+ async function evaluateAccessRule(access, authentication, fetchDocument) {
151
+ switch (access) {
152
+ case "deny":
153
+ return false;
154
+ case "allow":
155
+ return true;
156
+ case "authenticated":
157
+ return !!authentication?.uid;
158
+ default: {
159
+ const uid = authentication?.uid;
160
+ if (!uid || !fetchDocument) {
161
+ return false;
162
+ }
163
+ const document = await fetchDocument();
164
+ return document?.[access.field] === uid;
165
+ }
166
+ }
167
+ }
168
+ function encodeRulesPathSegment(segment) {
169
+ if (segment.length === 0 || segment.includes("/")) {
170
+ throw new Error(`Invalid rules path segment: ${segment}`);
171
+ }
172
+ return segment;
173
+ }
174
+ //# sourceMappingURL=rules_engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules_engine.js","sourceRoot":"","sources":["../../../../src/lib/src/rules/rules_engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Operation names supported by rules.json.
3
+ *
4
+ * rules.jsonでサポートする操作名。
5
+ */
6
+ export type RulesOperation = "get" | "create" | "update" | "delete";
7
+ /**
8
+ * Operation aliases supported by rules.json.
9
+ *
10
+ * rules.jsonでサポートする操作エイリアス。
11
+ */
12
+ export type RulesOperationAlias = "read" | "write";
13
+ /**
14
+ * Operation keys accepted in a rule entry.
15
+ *
16
+ * ルール内で指定可能な操作キー。
17
+ */
18
+ export type RulesOperationKey = RulesOperation | RulesOperationAlias;
19
+ /**
20
+ * Access rule for an operation.
21
+ *
22
+ * 操作に対するアクセスルール。
23
+ */
24
+ export type RulesAccessRule = "deny" | "allow" | "authenticated" | RulesFieldMatchAccessRule;
25
+ /**
26
+ * Field match access rule.
27
+ *
28
+ * フィールド一致アクセスルール。
29
+ */
30
+ export interface RulesFieldMatchAccessRule {
31
+ type: "fieldMatch";
32
+ field: string;
33
+ }
34
+ /**
35
+ * Rule entry for a matched path.
36
+ *
37
+ * パスに対応するルール定義。
38
+ */
39
+ export type RulesEntry = Partial<Record<RulesOperationKey, RulesAccessRule>>;
40
+ /**
41
+ * Rule map keyed by path pattern.
42
+ *
43
+ * パスパターンをキーにしたルールマップ。
44
+ */
45
+ export type RulesMap = Record<string, RulesEntry>;
46
+ /**
47
+ * rules.json configuration.
48
+ *
49
+ * rules.json設定。
50
+ */
51
+ export interface RulesConfig {
52
+ version: string;
53
+ rules: RulesMap;
54
+ }
55
+ /**
56
+ * Result of loading and validating rules.
57
+ *
58
+ * rulesの読み込み・検証結果。
59
+ */
60
+ export interface LoadedRulesConfig extends RulesConfig {
61
+ }
62
+ /**
63
+ * Load and validate rules configuration.
64
+ *
65
+ * rules設定を読み込み、検証します。
66
+ */
67
+ export declare function loadRulesConfig(input: unknown): LoadedRulesConfig;
68
+ /**
69
+ * Validate a rule path.
70
+ *
71
+ * ルールパスを検証します。
72
+ */
73
+ export declare function validateRulePath(path: string): void;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadRulesConfig = loadRulesConfig;
4
+ exports.validateRulePath = validateRulePath;
5
+ const allowedAccessValues = new Set(["deny", "allow", "authenticated"]);
6
+ const allowedOperationKeys = new Set([
7
+ "get",
8
+ "create",
9
+ "update",
10
+ "delete",
11
+ "read",
12
+ "write",
13
+ ]);
14
+ /**
15
+ * Load and validate rules configuration.
16
+ *
17
+ * rules設定を読み込み、検証します。
18
+ */
19
+ function loadRulesConfig(input) {
20
+ if (!isRecord(input)) {
21
+ throw new Error("Rules config must be an object.");
22
+ }
23
+ if (typeof input.version !== "string" || input.version.length === 0) {
24
+ throw new Error("Rules config version must be a non-empty string.");
25
+ }
26
+ if (!isRecord(input.rules) || Array.isArray(input.rules)) {
27
+ throw new Error("Rules config rules must be an object map.");
28
+ }
29
+ const rules = {};
30
+ for (const [path, entry] of Object.entries(input.rules)) {
31
+ validateRulePath(path);
32
+ rules[path] = validateRulesEntry(path, entry);
33
+ }
34
+ return {
35
+ version: input.version,
36
+ rules,
37
+ };
38
+ }
39
+ /**
40
+ * Validate a rule path.
41
+ *
42
+ * ルールパスを検証します。
43
+ */
44
+ function validateRulePath(path) {
45
+ if (path.length === 0) {
46
+ throw new Error("Rule path must be a non-empty string.");
47
+ }
48
+ if (path.startsWith("/") || path.endsWith("/")) {
49
+ throw new Error(`Rule path must not start or end with '/': ${path}`);
50
+ }
51
+ const segments = path.split("/");
52
+ if (segments.some((segment) => segment.length === 0)) {
53
+ throw new Error(`Rule path must not contain empty segments: ${path}`);
54
+ }
55
+ const deepWildcardIndex = segments.indexOf("**");
56
+ if (deepWildcardIndex >= 0 && deepWildcardIndex !== segments.length - 1) {
57
+ throw new Error(`'**' must be the last segment in rule path: ${path}`);
58
+ }
59
+ }
60
+ function validateRulesEntry(path, entry) {
61
+ if (!isRecord(entry) || Array.isArray(entry)) {
62
+ throw new Error(`Rule entry must be an object: ${path}`);
63
+ }
64
+ const result = {};
65
+ for (const [operation, access] of Object.entries(entry)) {
66
+ if (!allowedOperationKeys.has(operation)) {
67
+ throw new Error(`Unsupported rule operation '${operation}' in ${path}.`);
68
+ }
69
+ result[operation] = validateAccessRule(path, operation, access);
70
+ }
71
+ return result;
72
+ }
73
+ function validateAccessRule(path, operation, access) {
74
+ if (typeof access === "string") {
75
+ if (allowedAccessValues.has(access)) {
76
+ return access;
77
+ }
78
+ throw new Error(`Unsupported access rule '${access}' for ${operation} in ${path}.`);
79
+ }
80
+ if (isRecord(access)) {
81
+ if (access.type === "fieldMatch" && typeof access.field === "string" && access.field.length > 0) {
82
+ return {
83
+ type: "fieldMatch",
84
+ field: access.field,
85
+ };
86
+ }
87
+ }
88
+ throw new Error(`Invalid access rule for ${operation} in ${path}.`);
89
+ }
90
+ function isRecord(value) {
91
+ return typeof value === "object" && value !== null;
92
+ }
93
+ //# sourceMappingURL=rules_loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules_loader.js","sourceRoot":"","sources":["../../../../src/lib/src/rules/rules_loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { MiddlewareHandler } from "hono";
2
+ /**
3
+ * Base class for worker adapter for Cloudflare Workers.
4
+ *
5
+ * Cloudflare Workers用のワーカーアダプターのベースクラス。
6
+ */
7
+ export declare abstract class WorkerAdapterBase {
8
+ /**
9
+ * Create Hono middleware.
10
+ *
11
+ * Honoミドルウェアを作成します。
12
+ */
13
+ abstract build(): MiddlewareHandler;
14
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerAdapterBase = void 0;
4
+ /**
5
+ * Base class for worker adapter for Cloudflare Workers.
6
+ *
7
+ * Cloudflare Workers用のワーカーアダプターのベースクラス。
8
+ */
9
+ class WorkerAdapterBase {
10
+ }
11
+ exports.WorkerAdapterBase = WorkerAdapterBase;
12
+ //# sourceMappingURL=worker_adapter_base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker_adapter_base.js","sourceRoot":"","sources":["../../../src/lib/src/worker_adapter_base.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAsB,iBAAiB;CAOtC;AAPD,8CAOC"}
@@ -1,4 +1,5 @@
1
- import { Context, MiddlewareHandler } from "hono";
1
+ import { Context } from "hono";
2
+ import { WorkerAdapterBase } from "./worker_adapter_base";
2
3
  /**
3
4
  * Authentication context for Cloudflare Workers.
4
5
  *
@@ -25,13 +26,7 @@ export interface WorkersAuthContext {
25
26
  *
26
27
  * Cloudflare Workers用の認証アダプターのベースクラス。
27
28
  */
28
- export declare abstract class WorkersAuthAdapterBase {
29
- /**
30
- * Create Hono middleware.
31
- *
32
- * Honoミドルウェアを作成します。
33
- */
34
- abstract build(): MiddlewareHandler;
29
+ export declare abstract class WorkersAuthAdapterBase extends WorkerAdapterBase {
35
30
  /**
36
31
  * Set authentication context.
37
32
  *
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WorkersAuthAdapterBase = void 0;
4
+ const worker_adapter_base_1 = require("./worker_adapter_base");
4
5
  /**
5
6
  * Base class for authentication adapter for Cloudflare Workers.
6
7
  *
7
8
  * Cloudflare Workers用の認証アダプターのベースクラス。
8
9
  */
9
- class WorkersAuthAdapterBase {
10
+ class WorkersAuthAdapterBase extends worker_adapter_base_1.WorkerAdapterBase {
10
11
  /**
11
12
  * Set authentication context.
12
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"workers_auth_adapter_base.js","sourceRoot":"","sources":["../../../src/lib/src/workers_auth_adapter_base.ts"],"names":[],"mappings":";;;AAuBA;;;;GAIG;AACH,MAAsB,sBAAsB;IAQxC;;;;OAIG;IACO,cAAc,CACpB,OAAgB,EAChB,cAAkC;QAElC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;CACJ;AAnBD,wDAmBC"}
1
+ {"version":3,"file":"workers_auth_adapter_base.js","sourceRoot":"","sources":["../../../src/lib/src/workers_auth_adapter_base.ts"],"names":[],"mappings":";;;AACA,+DAA0D;AAuB1D;;;;GAIG;AACH,MAAsB,sBAAuB,SAAQ,uCAAiB;IAClE;;;;OAIG;IACO,cAAc,CACpB,OAAgB,EAChB,cAAkC;QAElC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;CACJ;AAZD,wDAYC"}
@@ -1,5 +1,6 @@
1
1
  import { Hono } from "hono";
2
2
  import { WorkersAuthAdapterBase } from "./workers_auth_adapter_base";
3
+ import { WorkersRuleAdapterBase } from "./workers_rule_adapter_base";
3
4
  /**
4
5
  * Define Function data for Cloudflare Workers.
5
6
  *
@@ -77,6 +78,12 @@ export declare abstract class WorkersBase {
77
78
  * 認証ミドルウェアを適用します。
78
79
  */
79
80
  protected applyAuthentication(hono: Hono, options: WorkersOptions): Hono;
81
+ /**
82
+ * Apply rules middleware.
83
+ *
84
+ * rulesミドルウェアを適用します。
85
+ */
86
+ protected applyRules(hono: Hono, options: WorkersOptions): Hono;
80
87
  }
81
88
  /**
82
89
  * Specifies the options for the process.
@@ -90,6 +97,12 @@ export interface WorkersOptions {
90
97
  * 認証アダプター。
91
98
  */
92
99
  auth?: WorkersAuthAdapterBase | null | undefined;
100
+ /**
101
+ * Rules adapter.
102
+ *
103
+ * rulesアダプター。
104
+ */
105
+ rules?: WorkersRuleAdapterBase | null | undefined;
93
106
  }
94
107
  /**
95
108
  * Merge Workers options.
@@ -72,6 +72,17 @@ class WorkersBase {
72
72
  }
73
73
  return hono;
74
74
  }
75
+ /**
76
+ * Apply rules middleware.
77
+ *
78
+ * rulesミドルウェアを適用します。
79
+ */
80
+ applyRules(hono, options) {
81
+ if (options.rules) {
82
+ hono.use("*", options.rules.build());
83
+ }
84
+ return hono;
85
+ }
75
86
  }
76
87
  exports.WorkersBase = WorkersBase;
77
88
  /**
@@ -80,12 +91,19 @@ exports.WorkersBase = WorkersBase;
80
91
  * Workersのオプションをマージします。
81
92
  */
82
93
  function resolveWorkersOptions(defaultOptions = {}, options = {}) {
94
+ const defaultAuth = defaultOptions.auth;
95
+ const auth = options.auth;
96
+ const defaultRules = defaultOptions.rules;
97
+ const rules = options.rules;
83
98
  return {
84
99
  ...defaultOptions,
85
100
  ...options,
86
- auth: options.auth === undefined
87
- ? defaultOptions.auth
88
- : options.auth,
101
+ auth: auth === undefined
102
+ ? defaultAuth
103
+ : auth,
104
+ rules: rules === undefined
105
+ ? defaultRules
106
+ : rules,
89
107
  };
90
108
  }
91
109
  //# sourceMappingURL=workers_base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workers_base.js","sourceRoot":"","sources":["../../../src/lib/src/workers_base.ts"],"names":[],"mappings":";;;AA6HA,sDAWC;AArID;;;;;;;;GAQG;AACH,MAAsB,WAAW;IAC7B;;;;;;;;OAQG;IACH,YAAY,EACR,IAAI,EACJ,IAAI,EACJ,IAAI,GAAG,EAAE,EACT,OAAO,GAUV;QACG,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACM,IAAI,CAAS;IAEtB;;;;;OAKG;IACM,IAAI,CAIiB;IAE9B;;;;OAIG;IACM,IAAI,CAAyB;IAEtC;;;;OAIG;IACM,OAAO,CAAiB;IASjC;;;;OAIG;IACO,cAAc,CAAC,iBAAiC,EAAE;QACxD,OAAO,qBAAqB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACO,mBAAmB,CAAC,IAAU,EAAE,OAAuB;QAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA5FD,kCA4FC;AAgBD;;;;GAIG;AACH,SAAgB,qBAAqB,CACjC,iBAAiC,EAAE,EACnC,UAA0B,EAAE;IAE5B,OAAO;QACH,GAAG,cAAc;QACjB,GAAG,OAAO;QACV,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS;YAC5B,CAAC,CAAC,cAAc,CAAC,IAAI;YACrB,CAAC,CAAC,OAAO,CAAC,IAAI;KACrB,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"workers_base.js","sourceRoot":"","sources":["../../../src/lib/src/workers_base.ts"],"names":[],"mappings":";;;AAiJA,sDAkBC;AA/JD;;;;;;;;GAQG;AACH,MAAsB,WAAW;IAC7B;;;;;;;;OAQG;IACH,YAAY,EACR,IAAI,EACJ,IAAI,EACJ,IAAI,GAAG,EAAE,EACT,OAAO,GAUV;QACG,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACM,IAAI,CAAS;IAEtB;;;;;OAKG;IACM,IAAI,CAIiB;IAE9B;;;;OAIG;IACM,IAAI,CAAyB;IAEtC;;;;OAIG;IACM,OAAO,CAAiB;IASjC;;;;OAIG;IACO,cAAc,CAAC,iBAAiC,EAAE;QACxD,OAAO,qBAAqB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACO,mBAAmB,CAAC,IAAU,EAAE,OAAuB;QAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACO,UAAU,CAAC,IAAU,EAAE,OAAuB;QACpD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAxGD,kCAwGC;AAuBD;;;;GAIG;AACH,SAAgB,qBAAqB,CACjC,iBAAiC,EAAE,EACnC,UAA0B,EAAE;IAE5B,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,OAAO;QACH,GAAG,cAAc;QACjB,GAAG,OAAO;QACV,IAAI,EAAE,IAAI,KAAK,SAAS;YACpB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI;QACV,KAAK,EAAE,KAAK,KAAK,SAAS;YACtB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,KAAK;KACd,CAAC;AACN,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Context, MiddlewareHandler } from "hono";
2
+ import { RulesEvaluationResult } from "./rules/rules_engine";
3
+ /**
4
+ * Base class for rules adapter for Cloudflare Workers.
5
+ *
6
+ * Cloudflare Workers用のrulesアダプターのベースクラス。
7
+ */
8
+ export declare abstract class WorkersRuleAdapterBase {
9
+ /**
10
+ * Create Hono middleware.
11
+ *
12
+ * Honoミドルウェアを作成します。
13
+ */
14
+ abstract build(): MiddlewareHandler;
15
+ /**
16
+ * Set rules evaluation result to context.
17
+ *
18
+ * rules評価結果をコンテキストに設定します。
19
+ */
20
+ protected setRulesContext(context: Context, result: RulesEvaluationResult): void;
21
+ /**
22
+ * Get rules evaluation result from context.
23
+ *
24
+ * コンテキストからrules評価結果を取得します。
25
+ */
26
+ protected getRulesContext(context: Context): RulesEvaluationResult | undefined;
27
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkersRuleAdapterBase = void 0;
4
+ /**
5
+ * Base class for rules adapter for Cloudflare Workers.
6
+ *
7
+ * Cloudflare Workers用のrulesアダプターのベースクラス。
8
+ */
9
+ class WorkersRuleAdapterBase {
10
+ /**
11
+ * Set rules evaluation result to context.
12
+ *
13
+ * rules評価結果をコンテキストに設定します。
14
+ */
15
+ setRulesContext(context, result) {
16
+ context.set("rules", result);
17
+ }
18
+ /**
19
+ * Get rules evaluation result from context.
20
+ *
21
+ * コンテキストからrules評価結果を取得します。
22
+ */
23
+ getRulesContext(context) {
24
+ return context.get("rules");
25
+ }
26
+ }
27
+ exports.WorkersRuleAdapterBase = WorkersRuleAdapterBase;
28
+ //# sourceMappingURL=workers_rule_adapter_base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers_rule_adapter_base.js","sourceRoot":"","sources":["../../../src/lib/src/workers_rule_adapter_base.ts"],"names":[],"mappings":";;;AAGA;;;;GAIG;AACH,MAAsB,sBAAsB;IAQxC;;;;OAIG;IACO,eAAe,CACrB,OAAgB,EAChB,MAA6B;QAE7B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACO,eAAe,CAAC,OAAgB;QACtC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAsC,CAAC;IACrE,CAAC;CACJ;AA5BD,wDA4BC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mathrunet/masamune_cloudflare",
3
- "version": "3.1.6",
3
+ "version": "3.1.7",
4
4
  "description": "Manages packages on Cloudflare Workers for the server portion of the Masamune framework.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",