@homeflare/alchemy 0.56.0 → 0.58.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.
Files changed (49) hide show
  1. package/dist/unifi/acl-rule-ordering.d.ts +1 -1
  2. package/dist/unifi/acl-rule.d.ts +1 -1
  3. package/dist/unifi/dns-policy.d.ts +1 -1
  4. package/dist/unifi/firewall-policy-create.d.ts +55 -0
  5. package/dist/unifi/firewall-policy-create.d.ts.map +1 -0
  6. package/dist/unifi/firewall-policy-drift.d.ts +3 -3
  7. package/dist/unifi/firewall-policy-drift.d.ts.map +1 -1
  8. package/dist/unifi/firewall-policy-form.d.ts +27 -17
  9. package/dist/unifi/firewall-policy-form.d.ts.map +1 -1
  10. package/dist/unifi/firewall-policy-ordering.d.ts +1 -1
  11. package/dist/unifi/firewall-policy.d.ts +45 -12
  12. package/dist/unifi/firewall-policy.d.ts.map +1 -1
  13. package/dist/unifi/firewall-zone.d.ts +1 -1
  14. package/dist/unifi/index.d.ts +1 -1
  15. package/dist/unifi/index.d.ts.map +1 -1
  16. package/dist/unifi/index.js +175 -28
  17. package/dist/unifi/index.js.map +11 -10
  18. package/dist/unifi/network-update.fixtures.d.ts +53 -0
  19. package/dist/unifi/network-update.fixtures.d.ts.map +1 -0
  20. package/dist/unifi/network.d.ts +1 -1
  21. package/dist/unifi/policy.d.ts +22 -0
  22. package/dist/unifi/policy.d.ts.map +1 -1
  23. package/dist/unifi/resource.d.ts +26 -7
  24. package/dist/unifi/resource.d.ts.map +1 -1
  25. package/dist/unifi/traffic-matching-list.d.ts +1 -1
  26. package/dist/unifi/update-reconcile.d.ts +36 -2
  27. package/dist/unifi/update-reconcile.d.ts.map +1 -1
  28. package/dist/unifi/wifi-broadcast.d.ts +1 -1
  29. package/dist/unifi/wire-guard.d.ts +1 -1
  30. package/dist/unifi/wire-guard.d.ts.map +1 -1
  31. package/docs/distilled-interim.md +4 -2
  32. package/package.json +1 -1
  33. package/src/unifi/firewall-policy-create.ts +94 -0
  34. package/src/unifi/firewall-policy-drift.test.ts +64 -0
  35. package/src/unifi/firewall-policy-drift.ts +24 -7
  36. package/src/unifi/firewall-policy-form.ts +70 -17
  37. package/src/unifi/firewall-policy.test.ts +188 -1
  38. package/src/unifi/firewall-policy.ts +108 -12
  39. package/src/unifi/index.ts +1 -0
  40. package/src/unifi/network-update-accept.test.ts +59 -0
  41. package/src/unifi/network-update.fixtures.ts +74 -0
  42. package/src/unifi/network-update.test.ts +11 -69
  43. package/src/unifi/policy.ts +45 -12
  44. package/src/unifi/resource.test.ts +103 -0
  45. package/src/unifi/resource.ts +73 -21
  46. package/src/unifi/update-reconcile.ts +109 -5
  47. package/src/unifi/wire-guard.test.ts +86 -1
  48. package/src/unifi/wire-guard.ts +8 -1
  49. package/src/unifi/write-op-reference.test.ts +21 -7
@@ -50,7 +50,7 @@ export declare const handlers: {
50
50
  session: {
51
51
  note: (message: string) => Effect.Effect<void, never, never>;
52
52
  };
53
- }) => Effect.Effect<AclRuleOrderingAttributes, import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | aclRules.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
53
+ }) => Effect.Effect<AclRuleOrderingAttributes, import("./policy.ts").UnifiCreateDidNotConverge | import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | aclRules.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
54
54
  delete: (args: {
55
55
  olds: AclRuleOrderingProps;
56
56
  }) => Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
@@ -45,7 +45,7 @@ export declare const handlers: {
45
45
  session: {
46
46
  note: (message: string) => Effect.Effect<void, never, never>;
47
47
  };
48
- }) => Effect.Effect<AclRuleAttributes, import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | aclRules.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
48
+ }) => Effect.Effect<AclRuleAttributes, import("./policy.ts").UnifiCreateDidNotConverge | import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | aclRules.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
49
49
  delete: (args: {
50
50
  olds: AclRuleProps;
51
51
  }) => Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
@@ -51,7 +51,7 @@ export declare const handlers: {
51
51
  session: {
52
52
  note: (message: string) => Effect.Effect<void, never, never>;
53
53
  };
54
- }) => Effect.Effect<DnsPolicyAttributes, import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | dnsPolicies.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
54
+ }) => Effect.Effect<DnsPolicyAttributes, import("./policy.ts").UnifiCreateDidNotConverge | import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | dnsPolicies.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
55
55
  delete: (args: {
56
56
  olds: DnsPolicyProps;
57
57
  }) => Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `Unifi.FirewallPolicy`'s CREATE — the one write this family may make, and only for a row whose
3
+ * declared `name` passes `policy.ts`'s `isHfPolicyName` (Tim 2026-10-19 ~16:20Z, "Allow kit to
4
+ * create hf: rules"). THE ONLY FILE UNDER `src/unifi` ALLOWED TO NAME `createFirewallPolicy`
5
+ * (`write-op-reference.test.ts`'s `WRITE_OP_ALLOWLIST` pins that, alongside `network-update.ts`'s
6
+ * own `updateNetwork` entry).
7
+ *
8
+ * ⛔ A CREATE SENDS ONLY THE FIELDS THE DECLARATION OWNS — NEVER A SPREAD OF ANYTHING ELSE. Unlike
9
+ * `network-update.ts`'s whole-object PUT (which must carry the untouched live object forward so
10
+ * an omitted optional block is not read by the controller as "turn it off"), there IS no live
11
+ * object yet: `createBody` builds `CreateFirewallPolicyRequest` field by field from `props`,
12
+ * omitting every optional key `props` itself leaves `undefined` rather than sending it as
13
+ * `null`/`undefined` (UniFi's "missing = off" rule cuts both ways — a key that is actually absent
14
+ * from the JSON body is what "this policy does not restrict on this axis" means here, same as a
15
+ * declaration that never sets `connectionStateFilter` means "match every connection state").
16
+ * ⛔ `checkScope` RUNS BEFORE THE REQUEST, TYPED, NEVER A STRING COMPARISON INLINE AT THE CALL
17
+ * SITE — one function (`policy.ts`'s `isHfPolicyName`) decides "hf:" everywhere this boundary is
18
+ * checked, so a future second caller cannot drift from this one with a slightly different regex.
19
+ *
20
+ * 🔴 `checkScope` ALSO REFUSES A `firewallPolicyId` THAT IS ALREADY SET (Opus red team,
21
+ * 2026-10-19, PRIMARY FINDING). `resource.ts`'s `create` branch runs for EVERY
22
+ * `Unifi.FirewallPolicy` declaration with no prior Alchemy state, not only ones meant to
23
+ * create — including every `firewallPolicy()` import `.pipe(adopt(true))`, and Tim's own live
24
+ * console ALREADY names hand-made rules `hf: <desc>` (this file's sibling `policy.ts` cites
25
+ * `hf: Vpn to MGMT (Magic WAN site-to-site)` as the existing convention). Before this check, an
26
+ * hf:-named IMPORTED row whose `firewallPolicyId` stopped resolving (state lost, the rule
27
+ * hand-deleted and recreated with a new id, a wrong id in a generated declaration) would GET
28
+ * 404, fall into `createReconcile`, pass the name check, and POST A DUPLICATE — silently, with
29
+ * a green plan, where every other family still refuses "declared row absent" outright
30
+ * (`update-reconcile.ts`'s original behavior, unchanged for every family but this one). A
31
+ * declaration carrying a vendor id is BY DEFINITION an existing row, adopted or updated, never
32
+ * a fresh create; `firewallPolicyId !== undefined` is refused here before `isHfPolicyName` is
33
+ * even checked, so this holds regardless of what the name says.
34
+ */
35
+ import * as firewall from '@distilled.cloud/unifi-network/firewall';
36
+ import * as Effect from 'effect/Effect';
37
+ import type { FirewallPolicyProps } from './firewall-policy-form.ts';
38
+ import type { AllowedWrite } from './wire-guard.ts';
39
+ /** The site's fixed firewall-policies COLLECTION route — never a per-row path, since there is no
40
+ * row id before this POST creates one. Takes `props` (not just a bare `siteId`) to match
41
+ * `UnifiUpdate.allowedWrite`'s own shape, so `resource.ts`'s wiring treats both the same way. */
42
+ export declare const firewallPolicyCreateAllowedWrite: (props: FirewallPolicyProps) => AllowedWrite;
43
+ /** Refuses, typed, before any request: the one gate `createReconcile` calls before `write`.
44
+ * Order matters for the message only (both refuse the same way) — the identity check runs
45
+ * first because it is the one that must hold regardless of what the name says (see header). */
46
+ export declare const checkHfCreateScope: (props: FirewallPolicyProps) => Effect.Effect<void, never, never> | Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, never>;
47
+ /** Every field `CreateFirewallPolicyRequest` accepts, straight from the declaration, with an
48
+ * absent optional field left OUT of the body entirely (never sent as `undefined`/`null`) —
49
+ * `JSON.stringify` already drops an `undefined` value, but building the object field-by-field
50
+ * rather than spreading `props` keeps this list the single place that enumerates exactly what a
51
+ * create may send, so a future prop added to `FirewallPolicyProps` for some OTHER purpose cannot
52
+ * silently become a wire field here without this file changing too. */
53
+ export declare const firewallPolicyCreateBody: (props: FirewallPolicyProps) => firewall.CreateFirewallPolicyRequest;
54
+ export declare const writeFirewallPolicyCreate: (props: FirewallPolicyProps) => Effect.Effect<firewall.FirewallPolicy, firewall.UnifiNetworkOpError, firewall.UnifiNetworkOpContext>;
55
+ //# sourceMappingURL=firewall-policy-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firewall-policy-create.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy-create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;kGAEkG;AAClG,eAAO,MAAM,gCAAgC,UAAW,mBAAmB,KAAG,YAG5E,CAAC;AAKH;;gGAEgG;AAChG,eAAO,MAAM,kBAAkB,UAAW,mBAAmB,6GAW5D,CAAC;AAEF;;;;;wEAKwE;AACxE,eAAO,MAAM,wBAAwB,UAC5B,mBAAmB,KACzB,QAAQ,CAAC,2BAeV,CAAC;AAEH,eAAO,MAAM,yBAAyB,UAAW,mBAAmB,yGACJ,CAAC"}
@@ -10,9 +10,9 @@
10
10
  * before comparing — never applied to only `live` or only `declared` (the specific gap MEDIUM-4's
11
11
  * own mutant found in `network-drift.ts`; see its header, and `acl-rule-drift.ts`'s own repeat of
12
12
  * this same rule for `protocolFilter`/`enforcingDeviceFilter`).
13
- * ★ `action`/`destination`/`ipProtocolScope`/`schedule`/`source` compare with the plain default
14
- * `equal` (whole-value `deepEqual`) — see `firewall-policy-form.ts`'s header for the accepted
15
- * known gap this leaves in their own nested set-like arrays.
13
+ * ★ `destination`/`ipProtocolScope`/`schedule`/`source` run through `normalizeSetArrays` on BOTH
14
+ * sides (set-like nested arrays compare as sets; `firewall-policy-form.ts`'s header), then the
15
+ * default `deepEqual`. `action` compares wholesale.
16
16
  */
17
17
  import type * as firewall from '@distilled.cloud/unifi-network/firewall';
18
18
  import { type FirewallPolicyAttributes, type FirewallPolicyProps } from './firewall-policy-form.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"firewall-policy-drift.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAGzB,MAAM,2BAA2B,CAAC;AAoBnC,eAAO,MAAM,OAAO,eACN,wBAAwB,SAC7B,mBAAmB,KACzB,OAAqD,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,OAAO,SAAU,QAAQ,CAAC,cAAc,SAAS,mBAAmB,sCACnC,CAAC"}
1
+ {"version":3,"file":"firewall-policy-drift.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAIzB,MAAM,2BAA2B,CAAC;AAoCnC,eAAO,MAAM,OAAO,eACN,wBAAwB,SAC7B,mBAAmB,KACzB,OAAqD,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,OAAO,SAAU,QAAQ,CAAC,cAAc,SAAS,mBAAmB,sCACnC,CAAC"}
@@ -15,17 +15,18 @@
15
15
  * `deepEqual` (`stripNullish`) as ONE value, same proportion `acl-rule-form.ts`'s
16
16
  * `enforcingDeviceFilter` gets (one level of structure, not exploded into scalars).
17
17
  *
18
- * ⚠️ KNOWN GAP (T15, same shape as `acl-rule-form.ts`'s own — accepted, not fixed, here either):
19
- * several of the vendor's filter variants nested inside `source`/`destination`/`ipProtocolScope`
20
- * are themselves SET-LIKE arrays with no documented order —
21
- * `FirewallPolicyMACAddressFilter.macAddresses`, `FirewallPolicyNetworkFilter.networkIds`,
22
- * `FirewallPolicyApplicationFilter.applicationIds`, `FirewallPolicyIPAddressFilter.items`,
23
- * `FirewallPolicyRegionFilter.regions`, `FirewallPolicyVPNServerFilter.vpnServerIds`,
24
- * `FirewallSchedule.repeatOnDays` — `deepEqual` compares every one of them order-sensitively, so a
25
- * console-side reorder with no membership change would report a spurious drift this read-only
26
- * family's `reconcile` then refuses forever. Not fixed here for the same reason ACL's own gap
27
- * isn't: normalizing 12 filter variants' own nested arrays is a bigger, separate change, not a
28
- * proportional extension of typing per-discriminator (A3) into set-aware comparison too.
18
+ * ★ SET-LIKE NESTED ARRAYS COMPARE AS SETS (closed 2026-10-19; was T15's accepted gap). The
19
+ * vendor's filter variants inside `source`/`destination`/`ipProtocolScope`/`schedule` carry
20
+ * arrays with no documented order: `FirewallPolicyIPAddressFilter.items`, the port filter's
21
+ * `items`, `FirewallPolicyMACAddressFilter.macAddresses`, `FirewallPolicyNetworkFilter.networkIds`,
22
+ * `FirewallPolicyApplicationFilter.applicationIds`, `FirewallPolicyRegionFilter.regions`,
23
+ * `FirewallPolicyVPNServerFilter.vpnServerIds`, `FirewallPolicyDomainFilter.domains`,
24
+ * `applicationCategoryIds` and `FirewallSchedule.repeatOnDays`. Measured:
25
+ * the controller (Network 11.0.83) stored a declared port list [443, 9100] as [9100, 443], so a
26
+ * correct create failed its read-back (`UnifiCreateDidNotConverge`, homeflare-network PR 79).
27
+ * `normalizeSetArrays` sorts every array under one of those keys (by canonical JSON) on BOTH
28
+ * sides before `deepEqual`. Membership still has to match exactly, and duplicates are kept, so a
29
+ * real change is never hidden.
29
30
  *
30
31
  * ⛔ `connectionStateFilter` IS THE ONE TOP-LEVEL PROPS ARRAY, AND IS A SET — "Match on firewall
31
32
  * connection state. If null, matches all connection states" describes membership, not a sequence
@@ -48,26 +49,35 @@ import type * as firewall from '@distilled.cloud/unifi-network/firewall';
48
49
  * see `acl-rule-form.ts`'s own header for why a normalizer applied to only one side is a bug
49
50
  * class (MEDIUM-4). */
50
51
  export declare const normalizeConnectionStateFilter: (value: readonly string[] | undefined) => string[] | undefined;
52
+ /** A deep copy with every SET_ARRAY_KEYS array sorted by canonical JSON (duplicates kept). */
53
+ export declare const normalizeSetArrays: <T>(value: T) => T;
51
54
  /** ⚠️ EVERY OPTIONAL FIELD SPELLS OUT `| undefined` — `exactOptionalPropertyTypes`; see
52
- * `network-form.ts`'s own header. */
55
+ * `network-form.ts`'s own header.
56
+ *
57
+ * ⛔ `firewallPolicyId` IS OPTIONAL SINCE THE 2026-10-19 hf: CREATE LIFT. An adopt-only
58
+ * declaration (`declareFirewallPolicy`, every imported row) always carries the vendor id it was
59
+ * read from. A fresh `hf:` creatable declaration (`declareHfFirewallPolicy` below) does not have
60
+ * one yet — the vendor assigns it on `createFirewallPolicy`'s response — so `spec.fetchLive`
61
+ * (`firewall-policy.ts`) locates by `name` instead of `id` whenever this is absent (netbox's
62
+ * `locateOne` is the precedent for identity-by-natural-key over identity-by-vendor-id). */
53
63
  export interface FirewallPolicyProps {
54
64
  siteId: string;
55
- firewallPolicyId: string;
65
+ firewallPolicyId?: string | undefined;
56
66
  action: firewall.FirewallPolicyAction;
57
67
  /** Connection states this policy matches — compared as a SET, see the header. */
58
68
  connectionStateFilter?: string[] | undefined;
59
69
  description?: string | undefined;
60
- /** Traffic destination — compound, compared wholesale; see the header's known gap. */
70
+ /** Traffic destination — compound, compared wholesale with set-like arrays normalized; see the header. */
61
71
  destination: firewall.FirewallPolicyDestination;
62
72
  enabled: boolean;
63
- /** IP version + protocol scope — compound, compared wholesale; see the header's known gap. */
73
+ /** IP version + protocol scope — compound, compared wholesale with set-like arrays normalized; see the header. */
64
74
  ipProtocolScope: firewall.FirewallPolicyIPProtocolScope;
65
75
  ipsecFilter?: string | undefined;
66
76
  loggingEnabled: boolean;
67
77
  name: string;
68
- /** Schedule this policy is active on — compound, compared wholesale; see the header's known gap. */
78
+ /** Schedule this policy is active on — compound, compared wholesale with set-like arrays normalized; see the header. */
69
79
  schedule?: firewall.FirewallSchedule | undefined;
70
- /** Traffic source — compound, compared wholesale; see the header's known gap. */
80
+ /** Traffic source — compound, compared wholesale with set-like arrays normalized; see the header. */
71
81
  source: firewall.FirewallPolicySource;
72
82
  }
73
83
  export interface FirewallPolicyAttributes {
@@ -1 +1 @@
1
- {"version":3,"file":"firewall-policy-form.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,KAAK,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AAIzE;;wBAEwB;AACxB,eAAO,MAAM,8BAA8B,UAClC,SAAS,MAAM,EAAE,GAAG,SAAS,KACnC,MAAM,EAAE,GAAG,SAA2D,CAAC;AAE1E;sCACsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;IACtC,iFAAiF;IACjF,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sFAAsF;IACtF,WAAW,EAAE,QAAQ,CAAC,yBAAyB,CAAC;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,8FAA8F;IAC9F,eAAe,EAAE,QAAQ,CAAC,6BAA6B,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,QAAQ,CAAC,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACjD,iFAAiF;IACjF,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;IACtC,qBAAqB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,QAAQ,CAAC,yBAAyB,CAAC;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,oGAAoG;IACpG,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,QAAQ,CAAC,6BAA6B,CAAC;IACxD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;IACtC,6FAA6F;IAC7F,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,YAAY,SACjB,QAAQ,CAAC,cAAc,SACtB,mBAAmB,KACzB,wBAgBD,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,SAC1B,QAAQ,CAAC,cAAc,UACrB,MAAM,KACb,mBAcD,CAAC"}
1
+ {"version":3,"file":"firewall-policy-form.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,KAAK,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AAIzE;;wBAEwB;AACxB,eAAO,MAAM,8BAA8B,UAClC,SAAS,MAAM,EAAE,GAAG,SAAS,KACnC,MAAM,EAAE,GAAG,SAA2D,CAAC;AA6B1E,8FAA8F;AAC9F,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,CAAC,KAAG,CAehD,CAAC;AAEF;;;;;;;;6FAQ6F;AAC7F,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;IACtC,iFAAiF;IACjF,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,0GAA0G;IAC1G,WAAW,EAAE,QAAQ,CAAC,yBAAyB,CAAC;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,kHAAkH;IAClH,eAAe,EAAE,QAAQ,CAAC,6BAA6B,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wHAAwH;IACxH,QAAQ,CAAC,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACjD,qGAAqG;IACrG,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;IACtC,qBAAqB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,QAAQ,CAAC,yBAAyB,CAAC;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,oGAAoG;IACpG,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,QAAQ,CAAC,6BAA6B,CAAC;IACxD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC;IACtC,6FAA6F;IAC7F,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,YAAY,SACjB,QAAQ,CAAC,cAAc,SACtB,mBAAmB,KACzB,wBAgBD,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,SAC1B,QAAQ,CAAC,cAAc,UACrB,MAAM,KACb,mBAcD,CAAC"}
@@ -53,7 +53,7 @@ export declare const handlers: {
53
53
  session: {
54
54
  note: (message: string) => Effect.Effect<void, never, never>;
55
55
  };
56
- }) => Effect.Effect<FirewallPolicyOrderingAttributes, import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
56
+ }) => Effect.Effect<FirewallPolicyOrderingAttributes, import("./policy.ts").UnifiCreateDidNotConverge | import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
57
57
  delete: (args: {
58
58
  olds: FirewallPolicyOrderingProps;
59
59
  }) => Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
@@ -1,9 +1,13 @@
1
1
  /**
2
- * `Unifi.FirewallPolicy` — one firewall policy on a UniFi Network site, READ-ONLY (`policy.ts`).
3
- * `Unifi.FirewallPolicyOrdering` (`firewall-policy-ordering.ts`) is the sibling resource for policy
4
- * ORDER within a zone pair (T5) — one per `(sourceFirewallZoneId, destinationFirewallZoneId)`, never
5
- * this file's concern. `docs/unifi.md`'s own header names this pair as "a bigger, separate PR";
6
- * this is that PR — see `docs/unifi-firewall-policy.md` for the full breakdown.
2
+ * `Unifi.FirewallPolicy` — one firewall policy on a UniFi Network site. READ/ADOPT-ONLY for every
3
+ * row (`policy.ts`), EXCEPT create for a row whose declared `name` starts `hf: `
4
+ * (`isHfPolicyName`, Tim 2026-10-19 ~16:20Z) — `update` and `delete` stay refused even for an
5
+ * `hf:` row. `Unifi.FirewallPolicyOrdering` (`firewall-policy-ordering.ts`) is the sibling
6
+ * resource for policy ORDER within a zone pair (T5) — one per `(sourceFirewallZoneId,
7
+ * destinationFirewallZoneId)`, still read-only; this lift does not touch it, so a created `hf:`
8
+ * row lands wherever the controller places a new policy, and placing it ahead of its zone pair's
9
+ * "Block All Traffic" (if the controller does not already do that) would need an ordering WRITE —
10
+ * a second, separate lift this PR does not make (see `docs/unifi-firewall-policy.md`).
7
11
  *
8
12
  * ★ T11 GATE, CHECKED 2026-09-26: the `Firewall` tag's 13 operations (5 already covered for
9
13
  * `Unifi.FirewallZone` in `docs/unifi.md`, 8 new here for `FirewallPolicy` — `getFirewallPolicies`,
@@ -14,30 +18,59 @@
14
18
  * that DID change elsewhere in the document. Corroborated independently by the A3 changeset's own
15
19
  * broader 25-operation/139-schema re-check (`.changeset/unifi-network-a3-typed-discriminator-filters.md`).
16
20
  * Full breakdown: `docs/unifi-firewall-policy.md`.
21
+ *
22
+ * ⛔ `fetchLive` LOCATES BY `name` WHEN `firewallPolicyId` IS ABSENT (an `hf:` creatable
23
+ * declaration never has the vendor id before its first successful create). A real site's policy
24
+ * count is in the hundreds (T9, 424 live policies), so this walks every page with `pageAll`
25
+ * rather than trusting any one page to hold the match — same reasoning netbox's `locateOne`
26
+ * gives for a server-side filter that cannot be trusted alone, except here there IS no
27
+ * server-side name filter at all, so every row is paged. More than one row sharing a name is a
28
+ * defect, not a reason to take the first: `policy.ts`'s naming convention is exactly `hf: <desc>`
29
+ * because a free-text description makes a collision astronomically unlikely, but if the console
30
+ * ever has one, this engine refuses to guess which row is "the" declared one.
17
31
  */
18
32
  import { Resource } from 'alchemy';
19
33
  import * as Provider from 'alchemy/Provider';
20
34
  import * as firewall from '@distilled.cloud/unifi-network/firewall';
21
35
  import * as Effect from 'effect/Effect';
22
36
  import { type FirewallPolicyAttributes, type FirewallPolicyProps } from './firewall-policy-form.ts';
37
+ import { type UnifiPaginationInconsistent } from './paginate.ts';
23
38
  import type { UnifiRequirements, UnifiSpec } from './resource.ts';
39
+ import type { UnifiWriteRefused } from './policy.ts';
24
40
  export type { FirewallPolicyAttributes, FirewallPolicyProps } from './firewall-policy-form.ts';
25
41
  export { declareFirewallPolicy } from './firewall-policy-form.ts';
26
42
  export { driftOf } from './firewall-policy-drift.ts';
43
+ /** `checkHfCreateScope`'s typed refusal, union'd with the real create call's own error, same
44
+ * shape `network.ts`'s own `UpdateError` gives its write half. */
45
+ type CreateError = UnifiWriteRefused | firewall.CreateFirewallPolicyError;
27
46
  export interface UnifiFirewallPolicy extends Resource<'Unifi.FirewallPolicy', FirewallPolicyProps, FirewallPolicyAttributes, never, UnifiRequirements> {
28
47
  }
29
48
  export declare const UnifiFirewallPolicy: import("alchemy").ResourceClass<UnifiFirewallPolicy>;
30
- /** `firewallPolicy('block-iot-wan', props)` — `adopt(true)` piped on by default (H5); see
31
- * `network.ts`. */
49
+ /** `firewallPolicy('block-iot-wan', props)` — for an IMPORTED, adopt-only row (always carries the
50
+ * vendor's `firewallPolicyId`). `adopt(true)` piped on by default (H5); see `network.ts`. */
32
51
  export declare const firewallPolicy: (id: string, props: FirewallPolicyProps) => Effect.Effect<UnifiFirewallPolicy, never, import("effect/http/HttpClient").HttpClient>;
52
+ /**
53
+ * `hfFirewallPolicy('ct100-to-nas-https', props)` — for a NEW, kit-creatable row: `props` has no
54
+ * `firewallPolicyId` (the vendor assigns one), and `name` MUST start `hf: ` or this throws
55
+ * immediately, at declaration time, rather than waiting for `createReconcile`'s own typed refusal
56
+ * at deploy time. That typed refusal (`checkHfCreateScope`) is still the authoritative gate — this
57
+ * is a second, earlier check for the common case of a typo, not a replacement for it; a caller
58
+ * that builds `FirewallPolicyProps` by hand and calls `UnifiFirewallPolicy` directly still goes
59
+ * through `checkHfCreateScope` and is still refused the same way.
60
+ *
61
+ * ⛔ NO `adopt(true)` HERE. This is a create path, not an adoption: a cold read finding an
62
+ * existing row of this exact name is `Unowned`, same as any other family, and a plan that adopts
63
+ * one silently is not what "create" means for this lift.
64
+ */
65
+ export declare const hfFirewallPolicy: (id: string, props: Omit<FirewallPolicyProps, 'firewallPolicyId'>) => Effect.Effect<UnifiFirewallPolicy, never, import("effect/http/HttpClient").HttpClient>;
33
66
  /** ★ EXPORTED for direct testing against a fake `Credentials` layer — see `network.ts`'s own. */
34
- export declare const spec: UnifiSpec<FirewallPolicyProps, firewall.FirewallPolicy, FirewallPolicyAttributes, firewall.GetFirewallPolicyError>;
67
+ export declare const spec: UnifiSpec<FirewallPolicyProps, firewall.FirewallPolicy, FirewallPolicyAttributes, firewall.GetFirewallPolicyError | firewall.GetFirewallPoliciesError | UnifiPaginationInconsistent, never, CreateError>;
35
68
  export declare const handlers: {
36
69
  list: () => Effect.Effect<never[], never, never>;
37
70
  read: (args: {
38
71
  olds: FirewallPolicyProps;
39
72
  output: FirewallPolicyAttributes | undefined;
40
- }) => Effect.Effect<FirewallPolicyAttributes | undefined, firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
73
+ }) => Effect.Effect<FirewallPolicyAttributes | undefined, UnifiPaginationInconsistent | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
41
74
  diff: (args: {
42
75
  news: import("alchemy").Input<FirewallPolicyProps>;
43
76
  output: FirewallPolicyAttributes | undefined;
@@ -45,7 +78,7 @@ export declare const handlers: {
45
78
  readonly action: 'update';
46
79
  } | {
47
80
  readonly action: 'noop';
48
- } | undefined, firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
81
+ } | undefined, UnifiPaginationInconsistent | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
49
82
  reconcile: (args: {
50
83
  news: FirewallPolicyProps;
51
84
  olds: FirewallPolicyProps | undefined;
@@ -53,10 +86,10 @@ export declare const handlers: {
53
86
  session: {
54
87
  note: (message: string) => Effect.Effect<void, never, never>;
55
88
  };
56
- }) => Effect.Effect<FirewallPolicyAttributes, import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
89
+ }) => Effect.Effect<FirewallPolicyAttributes, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/caddy").Conflict | import("@distilled.cloud/caddy").Forbidden | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/caddy").NotFound | import("@distilled.cloud/caddy").ServiceUnavailable | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("./policy.ts").UnifiCreateDidNotConverge | import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("@distilled.cloud/unifi-network/Errors").UnifiNetworkParseError | UnifiPaginationInconsistent | import("./policy.ts").UnifiUpdateDidNotConverge | UnifiWriteRefused | import("@distilled.cloud/unifi-network/Errors").UnknownUnifiNetworkError | import("@distilled.cloud/caddy").UnprocessableEntity, import("effect/http/HttpClient").HttpClient>;
57
90
  delete: (args: {
58
91
  olds: FirewallPolicyProps;
59
- }) => Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
92
+ }) => Effect.Effect<never, UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
60
93
  };
61
94
  export declare const UnifiFirewallPolicyProvider: () => import("effect/Layer").Layer<Provider.Provider<UnifiFirewallPolicy>, never, import("effect/http/HttpClient").HttpClient>;
62
95
  //# sourceMappingURL=firewall-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"firewall-policy.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAEzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGlE,YAAY,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CACnD,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,EACL,iBAAiB,CAClB;CAAG;AAEJ,eAAO,MAAM,mBAAmB,sDAE9B,CAAC;AAEH;oBACoB;AACpB,eAAO,MAAM,cAAc,OAAQ,MAAM,SAAS,mBAAmB,2FACnB,CAAC;AAEnD,iGAAiG;AACjG,eAAO,MAAM,IAAI,EAAE,SAAS,CAC1B,mBAAmB,EACnB,QAAQ,CAAC,cAAc,EACvB,wBAAwB,EACxB,QAAQ,CAAC,sBAAsB,CAUhC,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;CAAsB,CAAC;AAE5C,eAAO,MAAM,2BAA2B,gIACyD,CAAC"}
1
+ {"version":3,"file":"firewall-policy.d.ts","sourceRoot":"","sources":["../../src/unifi/firewall-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAOxC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAEzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,2BAA2B,EAAW,MAAM,eAAe,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,YAAY,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD;mEACmE;AACnE,KAAK,WAAW,GAAG,iBAAiB,GAAG,QAAQ,CAAC,yBAAyB,CAAC;AAE1E,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CACnD,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,EACL,iBAAiB,CAClB;CAAG;AAEJ,eAAO,MAAM,mBAAmB,sDAE9B,CAAC;AAEH;8FAC8F;AAC9F,eAAO,MAAM,cAAc,OAAQ,MAAM,SAAS,mBAAmB,2FACnB,CAAC;AAEnD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,OACvB,MAAM,SACH,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,2FAuBrD,CAAC;AAkBF,iGAAiG;AACjG,eAAO,MAAM,IAAI,EAAE,SAAS,CAC1B,mBAAmB,EACnB,QAAQ,CAAC,cAAc,EACvB,wBAAwB,EACxB,QAAQ,CAAC,sBAAsB,GAAG,QAAQ,CAAC,wBAAwB,GAAG,2BAA2B,EACjG,KAAK,EACL,WAAW,CAsBZ,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;CAAsB,CAAC;AAE5C,eAAO,MAAM,2BAA2B,gIACyD,CAAC"}
@@ -46,7 +46,7 @@ export declare const handlers: {
46
46
  session: {
47
47
  note: (message: string) => Effect.Effect<void, never, never>;
48
48
  };
49
- }) => Effect.Effect<FirewallZoneAttributes, import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
49
+ }) => Effect.Effect<FirewallZoneAttributes, import("./policy.ts").UnifiCreateDidNotConverge | import("./policy.ts").UnifiIdentityChanged | import("./policy.ts").UnifiLiveDriftedSinceDeploy | import("./policy.ts").UnifiUpdateDidNotConverge | import("./policy.ts").UnifiWriteRefused | firewall.UnifiNetworkOpError, import("effect/http/HttpClient").HttpClient>;
50
50
  delete: (args: {
51
51
  olds: FirewallZoneProps;
52
52
  }) => Effect.Effect<never, import("./policy.ts").UnifiWriteRefused, import("effect/http/HttpClient").HttpClient>;
@@ -16,7 +16,7 @@ export { UnifiDnsPolicy, UnifiDnsPolicyProvider, declareDnsPolicy, dnsPolicy, ty
16
16
  export { UnifiAclRule, UnifiAclRuleProvider, aclRule, declareAclRule, type AclRuleAttributes, type AclRuleProps, driftOf as aclRuleDriftOf, } from './acl-rule.ts';
17
17
  export { UnifiAclRuleOrdering, UnifiAclRuleOrderingProvider, aclRuleOrdering, declareAclRuleOrdering, type AclRuleOrderingAttributes, type AclRuleOrderingProps, driftOf as aclRuleOrderingDriftOf, } from './acl-rule-ordering.ts';
18
18
  export { UnifiWifiBroadcast, UnifiWifiBroadcastProvider, declareWifiBroadcast, wifiBroadcast, type WifiBroadcastAttributes, type WifiBroadcastProps, driftOf as wifiBroadcastDriftOf, } from './wifi-broadcast.ts';
19
- export { UnifiFirewallPolicy, UnifiFirewallPolicyProvider, declareFirewallPolicy, firewallPolicy, type FirewallPolicyAttributes, type FirewallPolicyProps, driftOf as firewallPolicyDriftOf, } from './firewall-policy.ts';
19
+ export { UnifiFirewallPolicy, UnifiFirewallPolicyProvider, declareFirewallPolicy, firewallPolicy, hfFirewallPolicy, type FirewallPolicyAttributes, type FirewallPolicyProps, driftOf as firewallPolicyDriftOf, } from './firewall-policy.ts';
20
20
  export { UnifiFirewallPolicyOrdering, UnifiFirewallPolicyOrderingProvider, declareFirewallPolicyOrdering, firewallPolicyOrdering, type FirewallPolicyOrderingAttributes, type FirewallPolicyOrderingProps, driftOf as firewallPolicyOrderingDriftOf, } from './firewall-policy-ordering.ts';
21
21
  export { UnifiTrafficMatchingList, UnifiTrafficMatchingListProvider, declareTrafficMatchingList, trafficMatchingList, type TrafficMatchingListAttributes, type TrafficMatchingListProps, driftOf as trafficMatchingListDriftOf, } from './traffic-matching-list.ts';
22
22
  export { providers } from './providers.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unifi/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,YAAY,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,OAAO,EACP,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAIjB,OAAO,IAAI,cAAc,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,OAAO,IAAI,mBAAmB,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,OAAO,IAAI,gBAAgB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,OAAO,IAAI,cAAc,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,eAAe,EACf,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,OAAO,IAAI,sBAAsB,GAClC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,aAAa,EACb,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,OAAO,IAAI,oBAAoB,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,OAAO,IAAI,qBAAqB,GACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,EACnC,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,OAAO,IAAI,6BAA6B,GACzC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,OAAO,IAAI,0BAA0B,GACtC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unifi/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,YAAY,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,OAAO,EACP,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAIjB,OAAO,IAAI,cAAc,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,OAAO,IAAI,mBAAmB,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,OAAO,IAAI,gBAAgB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,OAAO,IAAI,cAAc,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,eAAe,EACf,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,OAAO,IAAI,sBAAsB,GAClC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,aAAa,EACb,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,OAAO,IAAI,oBAAoB,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,OAAO,IAAI,qBAAqB,GACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,EACnC,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,OAAO,IAAI,6BAA6B,GACzC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,OAAO,IAAI,0BAA0B,GACtC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}