11import * as rulesets from "@distilled.cloud/cloudflare/rulesets" ;
2- import * as zones from "@distilled.cloud/cloudflare/zones" ;
32import * as Effect from "effect/Effect" ;
4- import * as Option from "effect/Option" ;
5- import * as Stream from "effect/Stream" ;
63import { deepEqual , isResolved } from "../../Diff.ts" ;
74import { createPhysicalName } from "../../PhysicalName.ts" ;
85import * as Provider from "../../Provider.ts" ;
96import { Resource } from "../../Resource.ts" ;
107import { CloudflareEnvironment } from "../CloudflareEnvironment.ts" ;
118import type { Providers } from "../Providers.ts" ;
9+ import {
10+ isZoneId ,
11+ resolveZoneId as resolveCloudflareZoneId ,
12+ type ZoneReference ,
13+ } from "../Zone.ts" ;
1214import { toRulesetAttributes } from "./attributes.ts" ;
1315
1416export type RulesetPhase = rulesets . CreateRulesetForZoneRequest [ "phase" ] ;
@@ -20,7 +22,7 @@ export type RulesetOutputRule = Omit<
2022 "lastUpdated" | "version"
2123> ;
2224
23- export type RulesetZone = string | { zoneId : string ; name ?: string } ;
25+ export type RulesetZone = ZoneReference ;
2426
2527export type RulesetProps < Phase extends RulesetPhase = RulesetPhase > = {
2628 /**
@@ -97,11 +99,6 @@ const isNotFoundError = (error: unknown): boolean =>
9799const zoneRef = ( zone : RulesetZone ) : string =>
98100 typeof zone === "string" ? zone : zone . zoneId ;
99101
100- const isZoneIdString = ( zone : string ) : boolean => / ^ [ a - f 0 - 9 ] { 32 } $ / i. test ( zone ) ;
101-
102- const matchesHostname = ( zoneName : string , hostname : string ) : boolean =>
103- hostname === zoneName || hostname . endsWith ( `.${ zoneName } ` ) ;
104-
105102export const RulesetProvider = ( ) =>
106103 Provider . effect (
107104 Ruleset ,
@@ -116,27 +113,10 @@ export const RulesetProvider = () =>
116113 } ) ;
117114
118115 const resolveZoneId = ( zone : RulesetZone ) =>
119- Effect . gen ( function * ( ) {
120- if ( typeof zone !== "string" ) return zone . zoneId ;
121- if ( isZoneIdString ( zone ) ) return zone ;
122-
123- const matches = yield * zones . listZones . items ( { } ) . pipe (
124- Stream . filter (
125- ( candidate ) =>
126- candidate . account . id === accountId &&
127- matchesHostname ( candidate . name , zone ) ,
128- ) ,
129- Stream . runCollect ,
130- ) ;
131- const match = [ ...matches ] . sort (
132- ( a , b ) => b . name . length - a . name . length ,
133- ) [ 0 ] ;
134- if ( ! match ) {
135- return yield * Effect . fail (
136- new Error ( `Cloudflare zone not found for ${ zone } ` ) ,
137- ) ;
138- }
139- return match . id ;
116+ resolveCloudflareZoneId ( {
117+ accountId,
118+ zone,
119+ hostname : typeof zone === "string" ? zone : ( zone . name ?? "" ) ,
140120 } ) ;
141121
142122 return {
@@ -145,13 +125,12 @@ export const RulesetProvider = () =>
145125 if ( ! isResolved ( news ) ) return undefined ;
146126 const desiredZone = zoneRef ( news . zone ) ;
147127 const desiredZoneId =
148- typeof news . zone !== "string" || isZoneIdString ( news . zone )
128+ typeof news . zone !== "string" || isZoneId ( news . zone )
149129 ? desiredZone
150130 : undefined ;
151131 const oldZone = olds . zone ? zoneRef ( olds . zone ) : undefined ;
152132 const oldZoneId =
153- olds . zone &&
154- ( typeof olds . zone !== "string" || isZoneIdString ( olds . zone ) )
133+ olds . zone && ( typeof olds . zone !== "string" || isZoneId ( olds . zone ) )
155134 ? oldZone
156135 : undefined ;
157136
0 commit comments