@scalemule/news-publication 0.0.48 → 0.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/{chunk-GB36YM56.js → chunk-2MEYHM7M.js} +11 -1
- package/dist/chunk-4JRWZXAP.js +62 -0
- package/dist/chunk-MBBPEFDA.js +124 -0
- package/dist/chunk-TTLM7YOH.js +444 -0
- package/dist/chunk-ZXH3O537.js +251 -0
- package/dist/community-maps-view.d.cts +3 -3
- package/dist/community-maps-view.d.ts +3 -3
- package/dist/cookie-consent-banner.d.cts +2 -2
- package/dist/cookie-consent-banner.d.ts +2 -2
- package/dist/cookie-settings-view.d.cts +2 -2
- package/dist/cookie-settings-view.d.ts +2 -2
- package/dist/index.cjs +29 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -3
- package/dist/marketplace-forms.d.cts +3 -3
- package/dist/marketplace-forms.d.ts +3 -3
- package/dist/marketplace-view.d.cts +5 -5
- package/dist/marketplace-view.d.ts +5 -5
- package/dist/{meet-RWmfj3I3.d.cts → meet-BWpxY20X.d.ts} +5 -0
- package/dist/{meet-RWmfj3I3.d.ts → meet-CO9Unz5M.d.cts} +5 -0
- package/dist/meet-forms.d.cts +7 -6
- package/dist/meet-forms.d.ts +7 -6
- package/dist/meet-forms.js +2 -1
- package/dist/meet-view.cjs +22 -2
- package/dist/meet-view.d.cts +7 -5
- package/dist/meet-view.d.ts +7 -5
- package/dist/meet-view.js +21 -4
- package/dist/network-bar.d.cts +2 -2
- package/dist/network-bar.d.ts +2 -2
- package/dist/network-copyright.d.cts +2 -2
- package/dist/network-copyright.d.ts +2 -2
- package/dist/pets-auth-server.cjs +212 -0
- package/dist/pets-auth-server.d.cts +17 -0
- package/dist/pets-auth-server.d.ts +17 -0
- package/dist/pets-auth-server.js +155 -0
- package/dist/pets-forms.cjs +762 -0
- package/dist/pets-forms.d.cts +26 -0
- package/dist/pets-forms.d.ts +26 -0
- package/dist/pets-forms.js +712 -0
- package/dist/pets-interactions.cjs +332 -0
- package/dist/pets-interactions.d.cts +20 -0
- package/dist/pets-interactions.d.ts +20 -0
- package/dist/pets-interactions.js +319 -0
- package/dist/pets-publication.cjs +818 -0
- package/dist/pets-publication.d.cts +36 -0
- package/dist/pets-publication.d.ts +36 -0
- package/dist/pets-publication.js +177 -0
- package/dist/pets-server.cjs +289 -0
- package/dist/pets-server.d.cts +42 -0
- package/dist/pets-server.d.ts +42 -0
- package/dist/pets-server.js +2 -0
- package/dist/pets-view.cjs +541 -0
- package/dist/pets-view.d.cts +56 -0
- package/dist/pets-view.d.ts +56 -0
- package/dist/pets-view.js +4 -0
- package/dist/pets.cjs +138 -0
- package/dist/pets.d.cts +127 -0
- package/dist/pets.d.ts +127 -0
- package/dist/pets.js +1 -0
- package/dist/sponsorship-view.d.cts +2 -2
- package/dist/sponsorship-view.d.ts +2 -2
- package/dist/sponsorship-view.js +2 -62
- package/dist/story-review.d.cts +6 -6
- package/dist/story-review.d.ts +6 -6
- package/dist/theme-toggle.d.cts +2 -2
- package/dist/theme-toggle.d.ts +2 -2
- package/dist/verified-card.d.cts +3 -3
- package/dist/verified-card.d.ts +3 -3
- package/package.json +40 -3
- package/pets.css +538 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { PET_UUID, petReferences, PET_SLUG } from './chunk-MBBPEFDA.js';
|
|
2
|
+
import { buildClientContextHeaders } from '@scalemule/sdk';
|
|
3
|
+
|
|
4
|
+
var PetRequestError = class extends Error {
|
|
5
|
+
constructor(status, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.status = status;
|
|
8
|
+
}
|
|
9
|
+
status;
|
|
10
|
+
};
|
|
11
|
+
var petPrivateHeaders = {
|
|
12
|
+
"cache-control": "private, no-store",
|
|
13
|
+
"x-robots-tag": "noindex, nofollow",
|
|
14
|
+
"referrer-policy": "no-referrer",
|
|
15
|
+
"x-content-type-options": "nosniff"
|
|
16
|
+
};
|
|
17
|
+
async function bounded(request, max) {
|
|
18
|
+
if (Number(request.headers.get("content-length")) > max)
|
|
19
|
+
throw new PetRequestError(413, "The submission is too large.");
|
|
20
|
+
const reader = request.body?.getReader();
|
|
21
|
+
if (!reader) return new Uint8Array();
|
|
22
|
+
const parts = [];
|
|
23
|
+
let size = 0;
|
|
24
|
+
try {
|
|
25
|
+
for (; ; ) {
|
|
26
|
+
const { done, value } = await reader.read();
|
|
27
|
+
if (done) break;
|
|
28
|
+
size += value.length;
|
|
29
|
+
if (size > max) {
|
|
30
|
+
await reader.cancel();
|
|
31
|
+
throw new PetRequestError(413, "The submission is too large.");
|
|
32
|
+
}
|
|
33
|
+
parts.push(value);
|
|
34
|
+
}
|
|
35
|
+
} finally {
|
|
36
|
+
reader.releaseLock();
|
|
37
|
+
}
|
|
38
|
+
return Buffer.concat(parts);
|
|
39
|
+
}
|
|
40
|
+
function config(scope) {
|
|
41
|
+
const url = new URL(scope.gatewayUrl);
|
|
42
|
+
if (!scope.apiKey || !PET_SLUG.test(scope.collectionSlug) || url.username || url.password || url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1"].includes(url.hostname)))
|
|
43
|
+
throw new PetRequestError(503, "The pet community is not available yet.");
|
|
44
|
+
return url.origin;
|
|
45
|
+
}
|
|
46
|
+
async function petRequest(scope, path, init = {}, fetcher = fetch) {
|
|
47
|
+
const gateway = config(scope);
|
|
48
|
+
if (!path.startsWith("/v1/") || path.includes("..") || /[\\\r\n]/.test(path))
|
|
49
|
+
throw new Error("Invalid platform path");
|
|
50
|
+
const response = await fetcher(gateway + path, {
|
|
51
|
+
method: init.method || "GET",
|
|
52
|
+
headers: {
|
|
53
|
+
...buildClientContextHeaders(scope.clientContext),
|
|
54
|
+
"x-api-key": scope.apiKey,
|
|
55
|
+
"content-type": "application/json",
|
|
56
|
+
...scope.accessToken ? { authorization: `Bearer ${scope.accessToken}` } : {}
|
|
57
|
+
},
|
|
58
|
+
body: init.body === void 0 ? void 0 : JSON.stringify(init.body),
|
|
59
|
+
cache: "no-store",
|
|
60
|
+
redirect: "error",
|
|
61
|
+
signal: AbortSignal.timeout(15e3)
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok)
|
|
64
|
+
throw new PetRequestError(
|
|
65
|
+
response.status,
|
|
66
|
+
response.status === 401 ? "Please sign in to continue." : response.status === 404 ? "This pet resource is not available." : response.status === 409 ? "This contribution changed. Reload before saving." : response.status === 429 ? "Please wait before trying again." : "We couldn\u2019t complete that request. Please try again."
|
|
67
|
+
);
|
|
68
|
+
const json = await response.json();
|
|
69
|
+
return json?.data ?? json;
|
|
70
|
+
}
|
|
71
|
+
function createPublicationPetsHandler(options) {
|
|
72
|
+
const fetcher = options.fetch || fetch;
|
|
73
|
+
return async function handler(request, path) {
|
|
74
|
+
const json = (data, status = 200) => Response.json(data, { status, headers: petPrivateHeaders });
|
|
75
|
+
try {
|
|
76
|
+
const scope = await options.resolve(request), gateway = config(scope), method = request.method;
|
|
77
|
+
const root = `/v1/knowledge/community-maps/collections/${scope.collectionSlug}`;
|
|
78
|
+
const id = path[0] && PET_UUID.test(path[0]);
|
|
79
|
+
const isMedia = id && path.length === 3 && path[1] === "media" && PET_UUID.test(path[2]);
|
|
80
|
+
const upload = path.length === 3 && path[0] === "submissions" && PET_UUID.test(path[1]) && path[2] === "media";
|
|
81
|
+
const ownMedia = path.length === 4 && path[0] === "submissions" && PET_UUID.test(path[1]) && path[2] === "media" && PET_UUID.test(path[3]);
|
|
82
|
+
const own = path[0] === "mine" && (path.length === 1 || path.length === 2 && PET_UUID.test(path[1]));
|
|
83
|
+
const preferences = path.length === 1 && path[0] === "preferences";
|
|
84
|
+
const reaction = id && path.length === 2 && path[1] === "reaction";
|
|
85
|
+
const report = id && path.length === 2 && path[1] === "reports";
|
|
86
|
+
const publicRead = method === "GET" && (!path.length || id && path.length === 1 || isMedia || path.length === 1 && path[0] === "community");
|
|
87
|
+
const read = publicRead || method === "GET" && (own || ownMedia || preferences || reaction);
|
|
88
|
+
const write = method === "POST" && (!path.length || upload || report || id && path.length === 2 && path[1] === "reunited") || method === "PUT" && (preferences || reaction) || ["PUT", "DELETE"].includes(method) && id && path.length === 1;
|
|
89
|
+
if (!read && !write) return json({ error: "Route not found" }, 404);
|
|
90
|
+
if (write && (!scope.writesEnabled || request.headers.get("origin") !== new URL(scope.origin).origin))
|
|
91
|
+
return json(
|
|
92
|
+
{ error: "Continue from the pet community\u2019s official website." },
|
|
93
|
+
403
|
|
94
|
+
);
|
|
95
|
+
if ((write || own || ownMedia || preferences || reaction) && !scope.accessToken)
|
|
96
|
+
return json({ error: "Sign in to continue." }, 401);
|
|
97
|
+
let endpoint = root + (path[0] === "community" ? "" : upload || ownMedia ? "/" + path.join("/") : "/pets" + (path.length ? "/" + path.join("/") : ""));
|
|
98
|
+
const query = new URLSearchParams();
|
|
99
|
+
if (method === "GET" && !path.length)
|
|
100
|
+
for (const key of [
|
|
101
|
+
"area_id",
|
|
102
|
+
"kind",
|
|
103
|
+
"after",
|
|
104
|
+
"week",
|
|
105
|
+
"limit",
|
|
106
|
+
"category",
|
|
107
|
+
"species",
|
|
108
|
+
"event_type",
|
|
109
|
+
"cost",
|
|
110
|
+
"starts_after",
|
|
111
|
+
"starts_before"
|
|
112
|
+
]) {
|
|
113
|
+
const value = new URL(request.url).searchParams.get(key);
|
|
114
|
+
if (value) query.set(key, value);
|
|
115
|
+
}
|
|
116
|
+
if (own) {
|
|
117
|
+
const after = new URL(request.url).searchParams.get("after");
|
|
118
|
+
if (after && PET_UUID.test(after)) query.set("after", after);
|
|
119
|
+
}
|
|
120
|
+
if (query.size) endpoint += "?" + query;
|
|
121
|
+
if (isMedia) {
|
|
122
|
+
const imageQuery = new URLSearchParams();
|
|
123
|
+
const sourceQuery = new URL(request.url).searchParams;
|
|
124
|
+
if (["640", "1280"].includes(sourceQuery.get("width") || ""))
|
|
125
|
+
imageQuery.set("width", sourceQuery.get("width"));
|
|
126
|
+
if (["jpeg", "webp"].includes(sourceQuery.get("format") || ""))
|
|
127
|
+
imageQuery.set("format", sourceQuery.get("format"));
|
|
128
|
+
if (imageQuery.size) endpoint += "?" + imageQuery;
|
|
129
|
+
}
|
|
130
|
+
if (isMedia || upload || ownMedia) {
|
|
131
|
+
let body2;
|
|
132
|
+
const type = request.headers.get("content-type") || "";
|
|
133
|
+
if (upload) {
|
|
134
|
+
if (!type.startsWith("multipart/form-data;"))
|
|
135
|
+
throw new PetRequestError(415, "Choose a photograph.");
|
|
136
|
+
body2 = await bounded(request, 9 * 1024 * 1024);
|
|
137
|
+
}
|
|
138
|
+
const response = await fetcher(gateway + endpoint, {
|
|
139
|
+
method,
|
|
140
|
+
headers: {
|
|
141
|
+
...buildClientContextHeaders(scope.clientContext),
|
|
142
|
+
"x-api-key": scope.apiKey,
|
|
143
|
+
...scope.accessToken ? { authorization: `Bearer ${scope.accessToken}` } : {},
|
|
144
|
+
...upload ? { "content-type": type } : {}
|
|
145
|
+
},
|
|
146
|
+
body: body2,
|
|
147
|
+
cache: "no-store",
|
|
148
|
+
redirect: "error",
|
|
149
|
+
signal: AbortSignal.timeout(45e3)
|
|
150
|
+
});
|
|
151
|
+
if (!response.ok) {
|
|
152
|
+
await response.body?.cancel();
|
|
153
|
+
return json(
|
|
154
|
+
{
|
|
155
|
+
error: "The photograph is unavailable. Check its size and try again."
|
|
156
|
+
},
|
|
157
|
+
response.status >= 500 ? 503 : response.status
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
if (upload) return json(await response.json());
|
|
161
|
+
const imageType = response.headers.get("content-type")?.split(";")[0] || "";
|
|
162
|
+
if (!["image/png", "image/jpeg", "image/webp"].includes(imageType)) {
|
|
163
|
+
await response.body?.cancel();
|
|
164
|
+
return json({ error: "Photograph unavailable" }, 404);
|
|
165
|
+
}
|
|
166
|
+
return new Response(response.body, {
|
|
167
|
+
headers: { ...petPrivateHeaders, "content-type": imageType }
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
let body;
|
|
171
|
+
if (write) {
|
|
172
|
+
if (!request.headers.get("content-type")?.startsWith("application/json"))
|
|
173
|
+
throw new PetRequestError(415, "Use the pet contribution form.");
|
|
174
|
+
try {
|
|
175
|
+
body = JSON.parse(
|
|
176
|
+
new TextDecoder().decode(await bounded(request, 32768))
|
|
177
|
+
);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
if (error instanceof PetRequestError) throw error;
|
|
180
|
+
throw new PetRequestError(400, "Check the contribution fields.");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return json({
|
|
184
|
+
data: await petRequest(scope, endpoint, { method, body }, fetcher)
|
|
185
|
+
});
|
|
186
|
+
} catch (error) {
|
|
187
|
+
return json(
|
|
188
|
+
{
|
|
189
|
+
error: error instanceof PetRequestError ? error.message : "The pet community is temporarily unavailable."
|
|
190
|
+
},
|
|
191
|
+
error instanceof PetRequestError ? error.status : 503
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
async function resolvePetReferences(scope, metadata, fetcher = fetch) {
|
|
197
|
+
const references = petReferences(metadata).filter(
|
|
198
|
+
(ref) => ref.collection_slug === scope.collectionSlug
|
|
199
|
+
);
|
|
200
|
+
const results = await Promise.all(
|
|
201
|
+
references.map(async (ref) => {
|
|
202
|
+
try {
|
|
203
|
+
const resource = await petRequest(
|
|
204
|
+
{ ...scope, accessToken: void 0 },
|
|
205
|
+
`/v1/knowledge/community-maps/collections/${ref.collection_slug}/pets/${ref.id}`,
|
|
206
|
+
{},
|
|
207
|
+
fetcher
|
|
208
|
+
);
|
|
209
|
+
return resource.kind === ref.kind ? resource : null;
|
|
210
|
+
} catch (error) {
|
|
211
|
+
if (error instanceof PetRequestError && [403, 404].includes(error.status))
|
|
212
|
+
return null;
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
})
|
|
216
|
+
);
|
|
217
|
+
return results.filter(
|
|
218
|
+
(resource) => resource !== null
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
async function petAcknowledgments(scope, community, productPath = "/pets", fetcher = fetch) {
|
|
222
|
+
if (!scope.publicationId || !PET_UUID.test(scope.publicationId)) return [];
|
|
223
|
+
try {
|
|
224
|
+
const groups = await Promise.all(
|
|
225
|
+
["community_partner", "community_guide"].map(
|
|
226
|
+
async (placement) => {
|
|
227
|
+
const query = new URLSearchParams({
|
|
228
|
+
placement_type: placement,
|
|
229
|
+
product_path: productPath
|
|
230
|
+
});
|
|
231
|
+
if (community) query.set("community", community);
|
|
232
|
+
const response = await petRequest(
|
|
233
|
+
{ ...scope, accessToken: void 0 },
|
|
234
|
+
`/v1/blog/publications/${scope.publicationId}/sponsorships/delivery?${query}`,
|
|
235
|
+
{},
|
|
236
|
+
fetcher
|
|
237
|
+
);
|
|
238
|
+
return response.items.filter(
|
|
239
|
+
(item) => item.publication_id === scope.publicationId && item.placement_type === placement
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
);
|
|
244
|
+
return groups.flat().slice(0, 2);
|
|
245
|
+
} catch {
|
|
246
|
+
console.warn("paw.sponsorship_delivery_unavailable");
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export { PetRequestError, createPublicationPetsHandler, petAcknowledgments, petPrivateHeaders, petRequest, resolvePetReferences };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { CommunityMapCollection, CommunityMapFeature, CommunityCityAtlasConfig } from '@scalemule/react/community-maps';
|
|
3
3
|
export { c as communityMapEmbeds } from './community-maps-DKcYhQYN.cjs';
|
|
4
4
|
|
|
@@ -13,11 +13,11 @@ interface PublicationCommunityMapPageProps {
|
|
|
13
13
|
atlas?: CommunityCityAtlasConfig;
|
|
14
14
|
}
|
|
15
15
|
/** The newspaper supplies its chrome and inherited type. The platform owns map behavior. */
|
|
16
|
-
declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps):
|
|
16
|
+
declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps): React.JSX.Element;
|
|
17
17
|
|
|
18
18
|
declare function CommunityMapArticleEmbeds({ metadata, apiPath, }: {
|
|
19
19
|
metadata: unknown;
|
|
20
20
|
apiPath?: string;
|
|
21
|
-
}):
|
|
21
|
+
}): React.JSX.Element;
|
|
22
22
|
|
|
23
23
|
export { CommunityMapArticleEmbeds, PublicationCommunityMapPage, type PublicationCommunityMapPageProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { CommunityMapCollection, CommunityMapFeature, CommunityCityAtlasConfig } from '@scalemule/react/community-maps';
|
|
3
3
|
export { c as communityMapEmbeds } from './community-maps-DKcYhQYN.js';
|
|
4
4
|
|
|
@@ -13,11 +13,11 @@ interface PublicationCommunityMapPageProps {
|
|
|
13
13
|
atlas?: CommunityCityAtlasConfig;
|
|
14
14
|
}
|
|
15
15
|
/** The newspaper supplies its chrome and inherited type. The platform owns map behavior. */
|
|
16
|
-
declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps):
|
|
16
|
+
declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps): React.JSX.Element;
|
|
17
17
|
|
|
18
18
|
declare function CommunityMapArticleEmbeds({ metadata, apiPath, }: {
|
|
19
19
|
metadata: unknown;
|
|
20
20
|
apiPath?: string;
|
|
21
|
-
}):
|
|
21
|
+
}): React.JSX.Element;
|
|
22
22
|
|
|
23
23
|
export { CommunityMapArticleEmbeds, PublicationCommunityMapPage, type PublicationCommunityMapPageProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface CookieConsentBannerProps {
|
|
4
4
|
/** Title displayed in banner. Default: "Help Us Improve Our Website with Cookies" */
|
|
@@ -20,6 +20,6 @@ interface CookieConsentBannerProps {
|
|
|
20
20
|
/** URL of the central network consent iframe bridge. Default: "https://bayareachronicle.com/consent-bridge.html" */
|
|
21
21
|
consentHubUrl?: string;
|
|
22
22
|
}
|
|
23
|
-
declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps):
|
|
23
|
+
declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps): React__default.JSX.Element | null;
|
|
24
24
|
|
|
25
25
|
export { CookieConsentBanner, type CookieConsentBannerProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface CookieConsentBannerProps {
|
|
4
4
|
/** Title displayed in banner. Default: "Help Us Improve Our Website with Cookies" */
|
|
@@ -20,6 +20,6 @@ interface CookieConsentBannerProps {
|
|
|
20
20
|
/** URL of the central network consent iframe bridge. Default: "https://bayareachronicle.com/consent-bridge.html" */
|
|
21
21
|
consentHubUrl?: string;
|
|
22
22
|
}
|
|
23
|
-
declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps):
|
|
23
|
+
declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps): React__default.JSX.Element | null;
|
|
24
24
|
|
|
25
25
|
export { CookieConsentBanner, type CookieConsentBannerProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface CookieSettingsViewProps {
|
|
4
4
|
/** The publication display name (e.g., "San Ramon Times") */
|
|
@@ -10,6 +10,6 @@ interface CookieSettingsViewProps {
|
|
|
10
10
|
/** Optional publication slug for metadata */
|
|
11
11
|
publicationSlug?: string;
|
|
12
12
|
}
|
|
13
|
-
declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps):
|
|
13
|
+
declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps): React__default.JSX.Element;
|
|
14
14
|
|
|
15
15
|
export { CookieSettingsView, type CookieSettingsViewProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface CookieSettingsViewProps {
|
|
4
4
|
/** The publication display name (e.g., "San Ramon Times") */
|
|
@@ -10,6 +10,6 @@ interface CookieSettingsViewProps {
|
|
|
10
10
|
/** Optional publication slug for metadata */
|
|
11
11
|
publicationSlug?: string;
|
|
12
12
|
}
|
|
13
|
-
declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps):
|
|
13
|
+
declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps): React__default.JSX.Element;
|
|
14
14
|
|
|
15
15
|
export { CookieSettingsView, type CookieSettingsViewProps };
|
package/dist/index.cjs
CHANGED
|
@@ -752,6 +752,26 @@ function referralCode(publication, url) {
|
|
|
752
752
|
}
|
|
753
753
|
}
|
|
754
754
|
|
|
755
|
+
// src/pets.ts
|
|
756
|
+
function preparePawWalk(value) {
|
|
757
|
+
if (!Number.isInteger(value.duration_minutes) || value.duration_minutes < 10 || value.duration_minutes > 240)
|
|
758
|
+
throw new Error("Choose a walk duration from 10 to 240 minutes.");
|
|
759
|
+
if (value.distance_km !== void 0 && (!Number.isFinite(value.distance_km) || value.distance_km < 0 || value.distance_km > 30))
|
|
760
|
+
throw new Error("Choose a walking distance from 0 to 30 km.");
|
|
761
|
+
if (value.leash !== "required" && value.leash !== "venue_rules")
|
|
762
|
+
throw new Error("Choose the leash requirements.");
|
|
763
|
+
for (const field of [value.size_guidance, value.accessibility])
|
|
764
|
+
if (typeof field !== "string" || Array.from(field).length > 500)
|
|
765
|
+
throw new Error("Keep walk guidance within 500 characters.");
|
|
766
|
+
return {
|
|
767
|
+
duration_minutes: value.duration_minutes,
|
|
768
|
+
distance_km: value.distance_km,
|
|
769
|
+
leash: value.leash,
|
|
770
|
+
size_guidance: value.size_guidance,
|
|
771
|
+
accessibility: value.accessibility
|
|
772
|
+
};
|
|
773
|
+
}
|
|
774
|
+
|
|
755
775
|
// src/meet.ts
|
|
756
776
|
var MEET_ACTIVITIES = [
|
|
757
777
|
{ value: "coffee", label: "Coffee" },
|
|
@@ -811,6 +831,13 @@ function prepareMeetup(input, places, now = /* @__PURE__ */ new Date()) {
|
|
|
811
831
|
if (!notes.ok) throw new Error(notes.reason);
|
|
812
832
|
const capacity = Number(input.capacity ?? 6);
|
|
813
833
|
if (!Number.isInteger(capacity) || capacity < 2 || capacity > 12) throw new Error("Choose a group size from 2 to 12.");
|
|
834
|
+
const walk = activity === "dogs" && input.walk ? preparePawWalk(input.walk) : void 0;
|
|
835
|
+
if (walk) for (const guidance of [walk.size_guidance, walk.accessibility]) {
|
|
836
|
+
if (guidance.trim()) {
|
|
837
|
+
const screened = screenMessage(guidance);
|
|
838
|
+
if (!screened.ok) throw new Error(screened.reason);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
814
841
|
return {
|
|
815
842
|
activity,
|
|
816
843
|
activityLabel: label,
|
|
@@ -819,7 +846,8 @@ function prepareMeetup(input, places, now = /* @__PURE__ */ new Date()) {
|
|
|
819
846
|
placeDetail: place.detail,
|
|
820
847
|
startsAt: new Date(starts).toISOString(),
|
|
821
848
|
notes: notes.text,
|
|
822
|
-
capacity
|
|
849
|
+
capacity,
|
|
850
|
+
...walk ? { walk } : {}
|
|
823
851
|
};
|
|
824
852
|
}
|
|
825
853
|
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as PublicationTheme, P as PublicationInput, N as NewsPublication, F as FeatureName, b as NewsItem, H as HomepageSelection, c as NearbyUpdate, E as EditorialSection, d as NewsArticle, C as CouponOffer } from './types-BJFCWWi0.cjs';
|
|
2
2
|
export { A as ArticleCitation, e as CardType, f as CategoryRef, g as CouponSettings, h as CoverImageMetadata, i as FEATURE_NAMES, j as FeatureFlags, k as NewsFeed, l as NewsLayoutId, m as PublicationModules, R as ReferralSettings, S as StoryDisplay, T as TagRef, V as VerifiedCard, n as VerifiedCardAction, o as VerifiedCardFact, p as VerifiedCardImage } from './types-BJFCWWi0.cjs';
|
|
3
|
-
export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-
|
|
3
|
+
export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-CO9Unz5M.cjs';
|
|
4
4
|
export { b as CLASSIFIED_CATEGORIES, c as ClassifiedCategory, C as ClassifiedListing, E as EmploymentType, J as JOB_EMPLOYMENT_TYPES, d as PreparedClassified, e as PreparedJob, P as PublicDeal, f as PublicDealOffer, a as PublicJob, g as categoryLabel, h as classifiedPath, i as classifiedSearchPath, j as clipChars, k as dealDollars, l as dealGoPath, m as dealsFeedPath, n as employmentLabel, o as isClassifiedCategory, p as isEmploymentType, q as jobEmployerBody, r as jobOpeningBody, s as jobPostingBody, t as prepareClassified, u as prepareJobPost, v as publicJobPath, w as publicJobsPath } from './marketplace-29i5w4LS.cjs';
|
|
5
5
|
export { b as PublicationRecord, P as PublicationSnapshot, S as SnapshotHooks, c as SyncSource, a as SyncedPublication, d as acceptRemoteRecord, e as acceptSnapshot, p as parseSnapshot, f as publicationFromSnapshot, g as publicationRecord, s as snapshotFromRecord, h as syncPublication } from './snapshot-Dx4Lv-lB.cjs';
|
|
6
6
|
import { CookieCategoryDefinition, CookieConsentRecord } from '@scalemule/compliance';
|
|
@@ -11,12 +11,13 @@ export { ThemeToggle, ThemeToggleProps } from './theme-toggle.cjs';
|
|
|
11
11
|
export { EDITORIAL_PRINCIPLES, EditorialPrinciple, NETWORK_PARENT, NetworkParent, PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.cjs';
|
|
12
12
|
export { LocalNetworkBar, LocalNetworkBarProps } from './network-bar.cjs';
|
|
13
13
|
export { NetworkCopyrightNotice, NetworkCopyrightNoticeProps } from './network-copyright.cjs';
|
|
14
|
-
import * as
|
|
14
|
+
import * as React from 'react';
|
|
15
15
|
export { VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './verified-card.cjs';
|
|
16
16
|
export { C as CommunityMapArticleEmbed, c as communityMapEmbeds } from './community-maps-DKcYhQYN.cjs';
|
|
17
17
|
export { C as ContentBlock, S as StructuredDocument, a as StructuredMedia, f as formatArtworkCaption, p as parseDocumentBlocks, r as renderArticleBlocksToHtml, s as sanitizeInlineMarkdown } from './article-blocks-DsabIDmH.cjs';
|
|
18
18
|
import { M as Measurement } from './sponsorships-CtnBe3S8.cjs';
|
|
19
19
|
export { a as Campaign, b as CampaignStatus, c as CampaignTarget, C as Creative, d as Placement, e as PlacementType, P as PublicAcknowledgment, S as SPONSORSHIP_OFFERINGS, f as SPONSORSHIP_POLICY, g as SponsorParty, p as placementAvailable, s as safeSponsorUrl } from './sponsorships-CtnBe3S8.cjs';
|
|
20
|
+
import './pets.cjs';
|
|
20
21
|
|
|
21
22
|
/** Walnut Creek Times broadsheet colors. A paper overrides only what it changes. */
|
|
22
23
|
declare const BROADSHEET_THEME: PublicationTheme;
|
|
@@ -424,7 +425,7 @@ declare function subscribeTheme(listener: () => void): () => void;
|
|
|
424
425
|
declare function themeInitScript(): string;
|
|
425
426
|
|
|
426
427
|
/** A reader projection, never an internal reporting package. */
|
|
427
|
-
declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>):
|
|
428
|
+
declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>): React.JSX.Element | null;
|
|
428
429
|
declare function readerSources(input: unknown): {
|
|
429
430
|
url: string;
|
|
430
431
|
title?: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as PublicationTheme, P as PublicationInput, N as NewsPublication, F as FeatureName, b as NewsItem, H as HomepageSelection, c as NearbyUpdate, E as EditorialSection, d as NewsArticle, C as CouponOffer } from './types-BJFCWWi0.js';
|
|
2
2
|
export { A as ArticleCitation, e as CardType, f as CategoryRef, g as CouponSettings, h as CoverImageMetadata, i as FEATURE_NAMES, j as FeatureFlags, k as NewsFeed, l as NewsLayoutId, m as PublicationModules, R as ReferralSettings, S as StoryDisplay, T as TagRef, V as VerifiedCard, n as VerifiedCardAction, o as VerifiedCardFact, p as VerifiedCardImage } from './types-BJFCWWi0.js';
|
|
3
|
-
export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-
|
|
3
|
+
export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-BWpxY20X.js';
|
|
4
4
|
export { b as CLASSIFIED_CATEGORIES, c as ClassifiedCategory, C as ClassifiedListing, E as EmploymentType, J as JOB_EMPLOYMENT_TYPES, d as PreparedClassified, e as PreparedJob, P as PublicDeal, f as PublicDealOffer, a as PublicJob, g as categoryLabel, h as classifiedPath, i as classifiedSearchPath, j as clipChars, k as dealDollars, l as dealGoPath, m as dealsFeedPath, n as employmentLabel, o as isClassifiedCategory, p as isEmploymentType, q as jobEmployerBody, r as jobOpeningBody, s as jobPostingBody, t as prepareClassified, u as prepareJobPost, v as publicJobPath, w as publicJobsPath } from './marketplace-29i5w4LS.js';
|
|
5
5
|
export { b as PublicationRecord, P as PublicationSnapshot, S as SnapshotHooks, c as SyncSource, a as SyncedPublication, d as acceptRemoteRecord, e as acceptSnapshot, p as parseSnapshot, f as publicationFromSnapshot, g as publicationRecord, s as snapshotFromRecord, h as syncPublication } from './snapshot-DmRw8G_B.js';
|
|
6
6
|
import { CookieCategoryDefinition, CookieConsentRecord } from '@scalemule/compliance';
|
|
@@ -11,12 +11,13 @@ export { ThemeToggle, ThemeToggleProps } from './theme-toggle.js';
|
|
|
11
11
|
export { EDITORIAL_PRINCIPLES, EditorialPrinciple, NETWORK_PARENT, NetworkParent, PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.js';
|
|
12
12
|
export { LocalNetworkBar, LocalNetworkBarProps } from './network-bar.js';
|
|
13
13
|
export { NetworkCopyrightNotice, NetworkCopyrightNoticeProps } from './network-copyright.js';
|
|
14
|
-
import * as
|
|
14
|
+
import * as React from 'react';
|
|
15
15
|
export { VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './verified-card.js';
|
|
16
16
|
export { C as CommunityMapArticleEmbed, c as communityMapEmbeds } from './community-maps-DKcYhQYN.js';
|
|
17
17
|
export { C as ContentBlock, S as StructuredDocument, a as StructuredMedia, f as formatArtworkCaption, p as parseDocumentBlocks, r as renderArticleBlocksToHtml, s as sanitizeInlineMarkdown } from './article-blocks-DsabIDmH.js';
|
|
18
18
|
import { M as Measurement } from './sponsorships-CtnBe3S8.js';
|
|
19
19
|
export { a as Campaign, b as CampaignStatus, c as CampaignTarget, C as Creative, d as Placement, e as PlacementType, P as PublicAcknowledgment, S as SPONSORSHIP_OFFERINGS, f as SPONSORSHIP_POLICY, g as SponsorParty, p as placementAvailable, s as safeSponsorUrl } from './sponsorships-CtnBe3S8.js';
|
|
20
|
+
import './pets.js';
|
|
20
21
|
|
|
21
22
|
/** Walnut Creek Times broadsheet colors. A paper overrides only what it changes. */
|
|
22
23
|
declare const BROADSHEET_THEME: PublicationTheme;
|
|
@@ -424,7 +425,7 @@ declare function subscribeTheme(listener: () => void): () => void;
|
|
|
424
425
|
declare function themeInitScript(): string;
|
|
425
426
|
|
|
426
427
|
/** A reader projection, never an internal reporting package. */
|
|
427
|
-
declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>):
|
|
428
|
+
declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>): React.JSX.Element | null;
|
|
428
429
|
declare function readerSources(input: unknown): {
|
|
429
430
|
url: string;
|
|
430
431
|
title?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
export { NetworkCopyrightNotice } from './chunk-WAC6ATNP.js';
|
|
2
1
|
export { CURATED_COMMUNITY_CARDS, VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './chunk-FMCHQI7K.js';
|
|
3
|
-
export { MEET_ACTIVITIES, activityLabel, canHostMeetup, isAdult, prepareMeetup, screenMessage } from './chunk-GB36YM56.js';
|
|
4
2
|
export { CookieConsentBanner } from './chunk-GOWOYMSG.js';
|
|
5
3
|
export { CookieSettingsView } from './chunk-UL2Q3N26.js';
|
|
6
4
|
export { THEME_COOKIE, THEME_EVENT, THEME_MAX_AGE_SECONDS, THEME_STORAGE_KEY, ThemeToggle, applyTheme, clearTheme, getStoredTheme, getSystemTheme, resolveEffectiveTheme, setTheme, subscribeTheme, themeInitScript } from './chunk-NQD3M7ZY.js';
|
|
7
5
|
export { LocalNetworkBar } from './chunk-2XSW7JZS.js';
|
|
6
|
+
export { NetworkCopyrightNotice } from './chunk-WAC6ATNP.js';
|
|
8
7
|
import { localPublications } from './chunk-JV76ZEIA.js';
|
|
9
8
|
export { COOKIE_CATEGORIES, COOKIE_CONSENT_BACKUP_KEY, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, COOKIE_CONSENT_MAX_AGE_SECONDS, DEFAULT_CONSENT_HUB_URL, DEFAULT_PREFERENCES_ACCEPTED, DEFAULT_PREFERENCES_REJECTED, EDITORIAL_PRINCIPLES, EU_EEA_UK_COUNTRIES, NETWORK_CONSENT_STORAGE_KEY, NETWORK_PARENT, acceptAllCookies, checkUrlConsentBridge, clearCookieConsent, communityPublications, decorateNetworkUrl, findPublicationByHost, findPublicationBySlug, getCookieConsent, getNetworkPublicationUrl, hasConsented, isCategoryAllowed, isGeoConsentRequired, listedPublications, localPublications, queryNetworkConsentHub, recordConsentToCompliance, rejectOptionalCookies, setCookieConsent, setNetworkConsentHub } from './chunk-JV76ZEIA.js';
|
|
10
|
-
export { SPONSORSHIP_OFFERINGS, SPONSORSHIP_POLICY, placementAvailable, safeSponsorUrl } from './chunk-66GI2IX6.js';
|
|
11
9
|
export { communityMapEmbeds } from './chunk-IMYBSG7J.js';
|
|
12
10
|
export { formatArtworkCaption, parseDocumentBlocks, renderArticleBlocksToHtml, sanitizeInlineMarkdown } from './chunk-OISLCYER.js';
|
|
13
11
|
import { definePublication } from './chunk-57YVL6BD.js';
|
|
14
12
|
export { BROADSHEET_THEME, FEATURE_NAMES, LAYOUT_COOKIE, acceptRemoteRecord, acceptSnapshot, definePublication, featureEnabled, parseSnapshot, publicationFromSnapshot, publicationRecord, resolveLayout, snapshotFromRecord, syncPublication } from './chunk-57YVL6BD.js';
|
|
15
13
|
export { CLASSIFIED_CATEGORIES, JOB_EMPLOYMENT_TYPES, categoryLabel, classifiedPath, classifiedSearchPath, clipChars, dealDollars, dealGoPath, dealsFeedPath, employmentLabel, isClassifiedCategory, isEmploymentType, jobEmployerBody, jobOpeningBody, jobPostingBody, prepareClassified, prepareJobPost, publicJobPath, publicJobsPath } from './chunk-C7ZPLH2K.js';
|
|
14
|
+
export { MEET_ACTIVITIES, activityLabel, canHostMeetup, isAdult, prepareMeetup, screenMessage } from './chunk-2MEYHM7M.js';
|
|
15
|
+
export { SPONSORSHIP_OFFERINGS, SPONSORSHIP_POLICY, placementAvailable, safeSponsorUrl } from './chunk-66GI2IX6.js';
|
|
16
|
+
import './chunk-MBBPEFDA.js';
|
|
16
17
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
17
18
|
|
|
18
19
|
// src/editorial.ts
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
|
|
3
3
|
declare function JobPostForm({ towns }: {
|
|
4
4
|
towns: string[];
|
|
5
|
-
}):
|
|
5
|
+
}): React.JSX.Element;
|
|
6
6
|
declare function ClassifiedPostForm({ towns }: {
|
|
7
7
|
towns: string[];
|
|
8
|
-
}):
|
|
8
|
+
}): React.JSX.Element;
|
|
9
9
|
|
|
10
10
|
export { ClassifiedPostForm, JobPostForm };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
|
|
3
3
|
declare function JobPostForm({ towns }: {
|
|
4
4
|
towns: string[];
|
|
5
|
-
}):
|
|
5
|
+
}): React.JSX.Element;
|
|
6
6
|
declare function ClassifiedPostForm({ towns }: {
|
|
7
7
|
towns: string[];
|
|
8
|
-
}):
|
|
8
|
+
}): React.JSX.Element;
|
|
9
9
|
|
|
10
10
|
export { ClassifiedPostForm, JobPostForm };
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { C as ClassifiedListing, P as PublicDeal, a as PublicJob } from './marketplace-29i5w4LS.cjs';
|
|
3
3
|
|
|
4
4
|
declare function JobsBoard({ region, jobs, query }: {
|
|
5
5
|
region: string;
|
|
6
6
|
jobs: PublicJob[];
|
|
7
7
|
query: string;
|
|
8
|
-
}):
|
|
8
|
+
}): React.JSX.Element;
|
|
9
9
|
declare function JobArticle({ job }: {
|
|
10
10
|
job: PublicJob;
|
|
11
|
-
}):
|
|
11
|
+
}): React.JSX.Element;
|
|
12
12
|
declare function ClassifiedsBoard({ region, listings, category, deals, }: {
|
|
13
13
|
region: string;
|
|
14
14
|
listings: ClassifiedListing[];
|
|
15
15
|
category: string;
|
|
16
16
|
deals?: PublicDeal[];
|
|
17
|
-
}):
|
|
17
|
+
}): React.JSX.Element;
|
|
18
18
|
declare function ClassifiedArticle({ listing }: {
|
|
19
19
|
listing: ClassifiedListing;
|
|
20
|
-
}):
|
|
20
|
+
}): React.JSX.Element;
|
|
21
21
|
|
|
22
22
|
export { ClassifiedArticle, ClassifiedsBoard, JobArticle, JobsBoard };
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { C as ClassifiedListing, P as PublicDeal, a as PublicJob } from './marketplace-29i5w4LS.js';
|
|
3
3
|
|
|
4
4
|
declare function JobsBoard({ region, jobs, query }: {
|
|
5
5
|
region: string;
|
|
6
6
|
jobs: PublicJob[];
|
|
7
7
|
query: string;
|
|
8
|
-
}):
|
|
8
|
+
}): React.JSX.Element;
|
|
9
9
|
declare function JobArticle({ job }: {
|
|
10
10
|
job: PublicJob;
|
|
11
|
-
}):
|
|
11
|
+
}): React.JSX.Element;
|
|
12
12
|
declare function ClassifiedsBoard({ region, listings, category, deals, }: {
|
|
13
13
|
region: string;
|
|
14
14
|
listings: ClassifiedListing[];
|
|
15
15
|
category: string;
|
|
16
16
|
deals?: PublicDeal[];
|
|
17
|
-
}):
|
|
17
|
+
}): React.JSX.Element;
|
|
18
18
|
declare function ClassifiedArticle({ listing }: {
|
|
19
19
|
listing: ClassifiedListing;
|
|
20
|
-
}):
|
|
20
|
+
}): React.JSX.Element;
|
|
21
21
|
|
|
22
22
|
export { ClassifiedArticle, ClassifiedsBoard, JobArticle, JobsBoard };
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { PawWalkDetails } from './pets.js';
|
|
2
|
+
|
|
1
3
|
/** Rules for in-person meetups and the paper's chat. */
|
|
4
|
+
|
|
2
5
|
declare const MEET_ACTIVITIES: readonly [{
|
|
3
6
|
readonly value: "coffee";
|
|
4
7
|
readonly label: "Coffee";
|
|
@@ -52,6 +55,7 @@ type MeetupInput = {
|
|
|
52
55
|
startsAt?: unknown;
|
|
53
56
|
notes?: unknown;
|
|
54
57
|
capacity?: unknown;
|
|
58
|
+
walk?: Partial<PawWalkDetails>;
|
|
55
59
|
};
|
|
56
60
|
type PreparedMeetup = {
|
|
57
61
|
activity: MeetActivity;
|
|
@@ -62,6 +66,7 @@ type PreparedMeetup = {
|
|
|
62
66
|
startsAt: string;
|
|
63
67
|
notes: string;
|
|
64
68
|
capacity: number;
|
|
69
|
+
walk?: PawWalkDetails;
|
|
65
70
|
};
|
|
66
71
|
declare function isAdult(bornOn: string, now?: Date): boolean;
|
|
67
72
|
declare function canHostMeetup(accountCreatedAt: string, now?: Date): boolean;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { PawWalkDetails } from './pets.cjs';
|
|
2
|
+
|
|
1
3
|
/** Rules for in-person meetups and the paper's chat. */
|
|
4
|
+
|
|
2
5
|
declare const MEET_ACTIVITIES: readonly [{
|
|
3
6
|
readonly value: "coffee";
|
|
4
7
|
readonly label: "Coffee";
|
|
@@ -52,6 +55,7 @@ type MeetupInput = {
|
|
|
52
55
|
startsAt?: unknown;
|
|
53
56
|
notes?: unknown;
|
|
54
57
|
capacity?: unknown;
|
|
58
|
+
walk?: Partial<PawWalkDetails>;
|
|
55
59
|
};
|
|
56
60
|
type PreparedMeetup = {
|
|
57
61
|
activity: MeetActivity;
|
|
@@ -62,6 +66,7 @@ type PreparedMeetup = {
|
|
|
62
66
|
startsAt: string;
|
|
63
67
|
notes: string;
|
|
64
68
|
capacity: number;
|
|
69
|
+
walk?: PawWalkDetails;
|
|
65
70
|
};
|
|
66
71
|
declare function isAdult(bornOn: string, now?: Date): boolean;
|
|
67
72
|
declare function canHostMeetup(accountCreatedAt: string, now?: Date): boolean;
|