@growth-labs/cms 0.5.27 → 0.5.30
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 +20 -0
- package/dist/engine/index.d.ts +5 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +5 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/publication-continuity.d.ts +77 -0
- package/dist/engine/publication-continuity.d.ts.map +1 -0
- package/dist/engine/publication-continuity.js +94 -0
- package/dist/engine/publication-continuity.js.map +1 -0
- package/dist/engine/publication-receipt/canonical-json.d.ts +34 -0
- package/dist/engine/publication-receipt/canonical-json.d.ts.map +1 -0
- package/dist/engine/publication-receipt/canonical-json.js +100 -0
- package/dist/engine/publication-receipt/canonical-json.js.map +1 -0
- package/dist/engine/publication-receipt/receipt.d.ts +316 -0
- package/dist/engine/publication-receipt/receipt.d.ts.map +1 -0
- package/dist/engine/publication-receipt/receipt.js +131 -0
- package/dist/engine/publication-receipt/receipt.js.map +1 -0
- package/dist/engine/publication-receipt/signature.d.ts +36 -0
- package/dist/engine/publication-receipt/signature.d.ts.map +1 -0
- package/dist/engine/publication-receipt/signature.js +79 -0
- package/dist/engine/publication-receipt/signature.js.map +1 -0
- package/dist/engine/publication.d.ts.map +1 -1
- package/dist/engine/publication.js +2 -0
- package/dist/engine/publication.js.map +1 -1
- package/dist/engine/publisher.d.ts.map +1 -1
- package/dist/engine/publisher.js +2 -0
- package/dist/engine/publisher.js.map +1 -1
- package/dist/engine/slug.d.ts.map +1 -1
- package/dist/engine/slug.js +11 -1
- package/dist/engine/slug.js.map +1 -1
- package/dist/engine/source-sections.d.ts +20 -0
- package/dist/engine/source-sections.d.ts.map +1 -0
- package/dist/engine/source-sections.js +130 -0
- package/dist/engine/source-sections.js.map +1 -0
- package/dist/engine/validator/checks/source-section-diagnostics.d.ts +7 -0
- package/dist/engine/validator/checks/source-section-diagnostics.d.ts.map +1 -0
- package/dist/engine/validator/checks/source-section-diagnostics.js +120 -0
- package/dist/engine/validator/checks/source-section-diagnostics.js.map +1 -0
- package/dist/engine/validator/index.d.ts +10 -0
- package/dist/engine/validator/index.d.ts.map +1 -1
- package/dist/engine/validator/index.js +4 -0
- package/dist/engine/validator/index.js.map +1 -1
- package/dist/engine/validator/types.d.ts +1 -1
- package/dist/engine/validator/types.d.ts.map +1 -1
- package/dist/engine/validator/types.js +10 -0
- package/dist/engine/validator/types.js.map +1 -1
- package/dist/integration/options.d.ts +196 -0
- package/dist/integration/options.d.ts.map +1 -1
- package/dist/integration/options.js +62 -0
- package/dist/integration/options.js.map +1 -1
- package/dist/providers/types.d.ts +1 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/routes/content.d.ts.map +1 -1
- package/dist/routes/content.js +52 -2
- package/dist/routes/content.js.map +1 -1
- package/dist/routes/surveys.d.ts.map +1 -1
- package/dist/routes/surveys.js +13 -1
- package/dist/routes/surveys.js.map +1 -1
- package/dist/schema/insights-ingest.d.ts +28 -28
- package/dist/surveys/access.d.ts +2 -0
- package/dist/surveys/access.d.ts.map +1 -1
- package/dist/surveys/access.js +7 -0
- package/dist/surveys/access.js.map +1 -1
- package/dist/surveys/errors.d.ts +8 -0
- package/dist/surveys/errors.d.ts.map +1 -1
- package/dist/surveys/errors.js +12 -0
- package/dist/surveys/errors.js.map +1 -1
- package/dist/surveys/schema.d.ts +75 -0
- package/dist/surveys/schema.d.ts.map +1 -1
- package/dist/surveys/schema.js +45 -0
- package/dist/surveys/schema.js.map +1 -1
- package/dist/ui/client/mount.d.ts.map +1 -1
- package/dist/ui/client/mount.js +1 -0
- package/dist/ui/client/mount.js.map +1 -1
- package/dist/ui/editor/ContentForm.d.ts +3 -1
- package/dist/ui/editor/ContentForm.d.ts.map +1 -1
- package/dist/ui/editor/ContentForm.js +87 -9
- package/dist/ui/editor/ContentForm.js.map +1 -1
- package/dist/ui/editor/body-warnings.d.ts +27 -0
- package/dist/ui/editor/body-warnings.d.ts.map +1 -0
- package/dist/ui/editor/body-warnings.js +58 -0
- package/dist/ui/editor/body-warnings.js.map +1 -0
- package/dist/ui/editor/content-payload.d.ts +12 -0
- package/dist/ui/editor/content-payload.d.ts.map +1 -1
- package/dist/ui/editor/content-payload.js +24 -0
- package/dist/ui/editor/content-payload.js.map +1 -1
- package/dist/ui/screens/ContentRoute.d.ts +3 -1
- package/dist/ui/screens/ContentRoute.d.ts.map +1 -1
- package/dist/ui/screens/ContentRoute.js +2 -2
- package/dist/ui/screens/ContentRoute.js.map +1 -1
- package/dist/ui/screens/EditorScreen.d.ts +3 -1
- package/dist/ui/screens/EditorScreen.d.ts.map +1 -1
- package/dist/ui/screens/EditorScreen.js +2 -2
- package/dist/ui/screens/EditorScreen.js.map +1 -1
- package/dist/ui/screens/SurveyResponsesScreen.d.ts +7 -1
- package/dist/ui/screens/SurveyResponsesScreen.d.ts.map +1 -1
- package/dist/ui/screens/SurveyResponsesScreen.js +141 -32
- package/dist/ui/screens/SurveyResponsesScreen.js.map +1 -1
- package/dist/ui/screens/registry.d.ts +3 -1
- package/dist/ui/screens/registry.d.ts.map +1 -1
- package/dist/ui/screens/registry.js +2 -2
- package/dist/ui/screens/registry.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/index.ts +33 -0
- package/src/engine/publication-continuity.ts +140 -0
- package/src/engine/publication-receipt/canonical-json.ts +123 -0
- package/src/engine/publication-receipt/receipt.ts +160 -0
- package/src/engine/publication-receipt/signature.ts +112 -0
- package/src/engine/publication.ts +2 -0
- package/src/engine/publisher.ts +2 -0
- package/src/engine/slug.ts +12 -1
- package/src/engine/source-sections.ts +153 -0
- package/src/engine/validator/checks/source-section-diagnostics.ts +187 -0
- package/src/engine/validator/index.ts +12 -0
- package/src/engine/validator/types.ts +19 -0
- package/src/integration/options.ts +69 -0
- package/src/providers/types.ts +1 -1
- package/src/routes/content.ts +60 -2
- package/src/routes/surveys.ts +12 -1
- package/src/surveys/access.ts +9 -0
- package/src/surveys/errors.ts +12 -0
- package/src/surveys/schema.ts +47 -0
- package/src/ui/client/mount.tsx +1 -0
- package/src/ui/editor/ContentForm.tsx +167 -5
- package/src/ui/editor/body-warnings.ts +78 -0
- package/src/ui/editor/content-payload.ts +39 -0
- package/src/ui/screens/ContentRoute.tsx +4 -0
- package/src/ui/screens/EditorScreen.tsx +4 -0
- package/src/ui/screens/SurveyResponsesScreen.tsx +369 -121
- package/src/ui/screens/registry.tsx +4 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { canViewSurveyVerbatims } from '../../surveys/access.js';
|
|
3
4
|
import { isSurveyErrorCode, SURVEY_ERROR_CODE_HEADER, SURVEY_ERROR_DEFINITIONS, } from '../../surveys/errors.js';
|
|
4
|
-
import { SurveyResultsSchema } from '../../surveys/schema.js';
|
|
5
|
+
import { SurveyResultsSchema, } from '../../surveys/schema.js';
|
|
6
|
+
import { useWorkspace } from '../workspace-context.js';
|
|
5
7
|
export function parseSurveyResultsPayload(value) {
|
|
6
8
|
const parsed = SurveyResultsSchema.safeParse(value);
|
|
7
9
|
return parsed.success ? parsed.data : null;
|
|
@@ -17,20 +19,26 @@ export async function classifySurveyResultsResponse(response) {
|
|
|
17
19
|
}
|
|
18
20
|
if (response.status === 404 && code === 'survey_not_found')
|
|
19
21
|
return { kind: 'not_found' };
|
|
20
|
-
if (response.status === 502 && code === 'survey_provider_malformed')
|
|
22
|
+
if (response.status === 502 && code === 'survey_provider_malformed')
|
|
21
23
|
return { kind: 'malformed' };
|
|
24
|
+
if (response.status === 502 && code === 'survey_invalid_response')
|
|
25
|
+
return { kind: 'malformed' };
|
|
26
|
+
if (response.status === 502 && code === 'survey_upstream_auth_failed') {
|
|
27
|
+
return { kind: 'auth_failed' };
|
|
22
28
|
}
|
|
23
29
|
if (response.status === 503 && code === 'survey_provider_unavailable') {
|
|
24
30
|
return { kind: 'unavailable' };
|
|
25
31
|
}
|
|
26
32
|
return { kind: 'retryable' };
|
|
27
33
|
}
|
|
34
|
+
const PAGE_SIZE = 100;
|
|
28
35
|
export function SurveyResponsesScreen({ surveyId }) {
|
|
29
36
|
const [state, setState] = useState({ kind: 'loading' });
|
|
30
|
-
const
|
|
37
|
+
const [offset, setOffset] = useState(0);
|
|
38
|
+
const load = useCallback(async (nextOffset) => {
|
|
31
39
|
setState({ kind: 'loading' });
|
|
32
40
|
try {
|
|
33
|
-
const response = await fetch(`/admin/api/surveys/${encodeURIComponent(surveyId)}`);
|
|
41
|
+
const response = await fetch(`/admin/api/surveys/${encodeURIComponent(surveyId)}?offset=${nextOffset}`);
|
|
34
42
|
setState(await classifySurveyResultsResponse(response));
|
|
35
43
|
}
|
|
36
44
|
catch {
|
|
@@ -38,33 +46,120 @@ export function SurveyResponsesScreen({ surveyId }) {
|
|
|
38
46
|
}
|
|
39
47
|
}, [surveyId]);
|
|
40
48
|
useEffect(() => {
|
|
41
|
-
void load();
|
|
42
|
-
}, [load]);
|
|
43
|
-
|
|
49
|
+
void load(offset);
|
|
50
|
+
}, [load, offset]);
|
|
51
|
+
const { state: workspace } = useWorkspace();
|
|
52
|
+
return (_jsx(SurveyResponsesBody, { surveyId: surveyId, state: state, offset: offset, role: workspace.user?.role ?? null, onRetry: () => void load(offset), onOffsetChange: setOffset }));
|
|
44
53
|
}
|
|
45
|
-
export function SurveyResponsesBody({ surveyId, state, onRetry, }) {
|
|
54
|
+
export function SurveyResponsesBody({ surveyId, state, offset = 0, role = null, onRetry, onOffsetChange, }) {
|
|
55
|
+
const canSeeVerbatims = canViewSurveyVerbatims(role);
|
|
46
56
|
if (state.kind === 'loading')
|
|
47
57
|
return _jsx(StatusPage, { title: "Loading survey responses\u2026" });
|
|
48
58
|
if (state.kind === 'forbidden')
|
|
49
59
|
return _jsx(StatusPage, { title: "You do not have permission to view survey responses." });
|
|
50
60
|
if (state.kind === 'unavailable')
|
|
51
61
|
return _jsx(StatusPage, { title: "Survey reporting is not configured for this site." });
|
|
62
|
+
if (state.kind === 'auth_failed')
|
|
63
|
+
return (_jsx(StatusPage, { title: "Survey reporting rejected this site\u2019s credentials.", detail: "The signing secret shared with the reporting upstream is missing or does not match.", retry: onRetry }));
|
|
52
64
|
if (state.kind === 'malformed')
|
|
53
65
|
return _jsx(StatusPage, { title: "Masthead received invalid survey data.", retry: onRetry });
|
|
54
66
|
if (state.kind === 'not_found')
|
|
55
67
|
return _jsx(StatusPage, { title: "The configured survey could not be found." });
|
|
56
68
|
if (state.kind === 'retryable')
|
|
57
|
-
return _jsx(StatusPage, { title: "Survey responses could not be loaded.", retry: onRetry });
|
|
69
|
+
return (_jsx(StatusPage, { title: "Survey responses could not be loaded.", detail: "The request did not reach the reporting upstream, or it failed before replying.", retry: onRetry }));
|
|
58
70
|
const { data } = state;
|
|
59
|
-
const
|
|
71
|
+
const shown = data.responses.length;
|
|
72
|
+
const total = data.survey.responseCount;
|
|
73
|
+
const rangeStart = total === 0 ? 0 : offset + 1;
|
|
74
|
+
const rangeEnd = offset + shown;
|
|
75
|
+
const hasMore = rangeEnd < total;
|
|
76
|
+
return (_jsxs("div", { className: "page page-wide fade-in", style: { maxWidth: 1340 }, children: [_jsxs("div", { className: "page-head", children: [_jsxs("div", { children: [_jsx("h1", { className: "page-title", children: data.survey.title }), _jsxs("div", { className: "page-sub", children: [total === 0
|
|
77
|
+
? 'No responses yet'
|
|
78
|
+
: `Showing ${rangeStart}–${rangeEnd} of ${total} ${total === 1 ? 'response' : 'responses'}`, ' ', "\u00B7 ", data.survey.status] })] }), _jsx("a", { className: "btn", href: `/admin/api/surveys/${encodeURIComponent(surveyId)}/responses.csv`, children: "Export CSV" })] }), total === 0 ? (_jsxs("div", { className: "card", role: "status", children: [_jsx("h2", { className: "card-title", children: "No responses yet" }), _jsx("p", { className: "page-sub", children: "Aggregates and answers will appear after submission." })] })) : (_jsxs(_Fragment, { children: [_jsx(HeadlineScale, { questions: data.questions }), canSeeVerbatims ? (_jsx(VerbatimFeed, { data: data })) : (_jsxs("div", { className: "card", role: "status", style: { marginTop: 24 }, children: [_jsx("h2", { className: "card-title", children: "Individual answers are restricted" }), _jsx("p", { className: "page-sub", children: "Aggregates below are available to your role. Verbatim answers and respondent attribution require owner or senior editor." })] })), _jsx(Aggregates, { data: data }), (offset > 0 || hasMore) && onOffsetChange ? (_jsxs("div", { className: "page-head", style: { marginTop: 24 }, children: [_jsx("button", { className: "btn", type: "button", disabled: offset === 0, onClick: () => onOffsetChange(Math.max(offset - PAGE_SIZE, 0)), children: "Previous" }), _jsx("button", { className: "btn", type: "button", disabled: !hasMore, onClick: () => onOffsetChange(offset + PAGE_SIZE), children: "Next" })] })) : null] }))] }));
|
|
79
|
+
}
|
|
80
|
+
// The first scale question is the survey's headline number. Leading with the
|
|
81
|
+
// distribution keeps one harsh verbatim from setting the tone of a readout.
|
|
82
|
+
function HeadlineScale({ questions }) {
|
|
83
|
+
const scale = questions.find((question) => question.kind === 'scale');
|
|
84
|
+
if (!scale || scale.kind !== 'scale' || scale.answerCount === 0)
|
|
85
|
+
return null;
|
|
86
|
+
const midpoint = (scale.options.min + scale.options.max) / 2;
|
|
87
|
+
const favourable = Object.entries(scale.distribution)
|
|
88
|
+
.filter(([value]) => Number(value) > midpoint)
|
|
89
|
+
.reduce((sum, [, count]) => sum + count, 0);
|
|
90
|
+
const share = Math.round((favourable / scale.answerCount) * 100);
|
|
91
|
+
return (_jsxs("section", { className: "card", "aria-labelledby": "survey-headline", style: { marginTop: 24 }, children: [_jsx("div", { className: "kicker", children: scale.prompt }), _jsxs("h2", { className: "card-title", id: "survey-headline", children: [share, "% rate ", midpoint.toFixed(1), " or better \u00B7 average", ' ', scale.average === null ? '—' : scale.average.toFixed(2)] }), _jsx(CountTable, { values: scale.distribution })] }));
|
|
92
|
+
}
|
|
93
|
+
function VerbatimFeed({ data }) {
|
|
94
|
+
const textQuestionIds = new Set(data.questions.filter((question) => question.kind === 'text').map((question) => question.id));
|
|
95
|
+
const promptById = new Map(data.questions.map((question) => [question.id, question.prompt]));
|
|
96
|
+
const freeTextByResponse = new Map();
|
|
60
97
|
for (const entry of data.freeText) {
|
|
61
|
-
const entries =
|
|
62
|
-
entries.push(entry);
|
|
63
|
-
|
|
98
|
+
const entries = freeTextByResponse.get(entry.responseId) ?? [];
|
|
99
|
+
entries.push(entry.value);
|
|
100
|
+
freeTextByResponse.set(entry.responseId, entries);
|
|
64
101
|
}
|
|
65
|
-
return (_jsxs("
|
|
66
|
-
|
|
67
|
-
|
|
102
|
+
return (_jsxs("section", { "aria-labelledby": "survey-verbatims", style: { marginTop: 24 }, children: [_jsx("h2", { className: "page-title", id: "survey-verbatims", style: { fontSize: 22 }, children: "Responses" }), _jsx("div", { style: { marginTop: 12 }, children: data.responses.map((response) => {
|
|
103
|
+
const written = freeTextByResponse.get(response.id) ?? [];
|
|
104
|
+
const choices = (response.answers ?? []).filter((answer) => !textQuestionIds.has(answer.questionId));
|
|
105
|
+
return (_jsxs("article", { className: "card", style: { marginTop: 12 }, children: [_jsxs("div", { className: "kicker", children: [_jsx("time", { dateTime: response.submittedAt, children: formatTime(response.submittedAt) }), " \u00B7", ' ', segmentLabel(response.respondentSegment), " \u00B7 ", respondentLabel(response)] }), written.length === 0 ? (_jsx("p", { className: "page-sub", children: "No written answer." })) : (written.map((value, index) => (
|
|
106
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: values are free text with no stable id
|
|
107
|
+
_jsx("blockquote", { children: value }, `${response.id}:${index}`)))), _jsx("div", { className: "chip-row", children: choices.map((answer) => (_jsx("span", { className: "chip", title: promptById.get(answer.questionId) ?? answer.questionId, children: formatAnswerValue(answer.value) }, `${response.id}:${answer.questionId}`))) })] }, response.id));
|
|
108
|
+
}) })] }));
|
|
109
|
+
}
|
|
110
|
+
function Aggregates({ data }) {
|
|
111
|
+
// Flat counts cannot express the finding that matters most — how one cohort
|
|
112
|
+
// differs from another — so every aggregate can be split by another question.
|
|
113
|
+
const splitCandidates = data.questions.filter((question) => question.kind === 'single_choice' || question.kind === 'scale');
|
|
114
|
+
const [splitBy, setSplitBy] = useState('');
|
|
115
|
+
const splitQuestion = splitCandidates.find((question) => question.id === splitBy);
|
|
116
|
+
const answersByResponse = useMemo(() => {
|
|
117
|
+
const map = new Map();
|
|
118
|
+
for (const response of data.responses) {
|
|
119
|
+
map.set(response.id, new Map((response.answers ?? []).map((answer) => [answer.questionId, answer.value])));
|
|
120
|
+
}
|
|
121
|
+
return map;
|
|
122
|
+
}, [data.responses]);
|
|
123
|
+
const cohorts = useMemo(() => {
|
|
124
|
+
if (!splitQuestion)
|
|
125
|
+
return null;
|
|
126
|
+
const buckets = new Map();
|
|
127
|
+
for (const response of data.responses) {
|
|
128
|
+
const value = answersByResponse.get(response.id)?.get(splitQuestion.id);
|
|
129
|
+
if (value === undefined)
|
|
130
|
+
continue;
|
|
131
|
+
const key = formatAnswerValue(value);
|
|
132
|
+
const ids = buckets.get(key) ?? [];
|
|
133
|
+
ids.push(response.id);
|
|
134
|
+
buckets.set(key, ids);
|
|
135
|
+
}
|
|
136
|
+
return buckets;
|
|
137
|
+
}, [answersByResponse, data.responses, splitQuestion]);
|
|
138
|
+
return (_jsxs("section", { "aria-labelledby": "survey-aggregates", style: { marginTop: 24 }, children: [_jsxs("div", { className: "page-head", children: [_jsx("h2", { className: "page-title", id: "survey-aggregates", style: { fontSize: 22 }, children: "Question aggregates" }), _jsxs("label", { children: [_jsx("span", { className: "page-sub", children: "Split by " }), _jsxs("select", { value: splitBy, onChange: (event) => setSplitBy(event.target.value), children: [_jsx("option", { value: "", children: "No split" }), splitCandidates.map((question) => (_jsx("option", { value: question.id, children: question.prompt }, question.id)))] })] })] }), _jsx("div", { className: "grid-split-wide", style: { alignItems: 'start', marginTop: 12 }, children: data.questions.map((question) => (_jsxs("article", { className: "card", children: [_jsxs("div", { className: "kicker", children: ["Q", question.position + 1, " \u00B7 ", questionAudienceLabel(question.audience)] }), _jsx("h3", { className: "card-title", children: question.prompt }), question.counts && _jsx(CountTable, { values: question.counts }), question.distribution && (_jsxs(_Fragment, { children: [_jsxs("p", { className: "page-sub", children: ["Average: ", question.average === null ? '—' : question.average.toFixed(2)] }), _jsx(CountTable, { values: question.distribution })] })), question.kind === 'text' && (_jsxs("p", { className: "page-sub", children: [question.responseCount ?? 0, " written answers"] })), cohorts && splitQuestion && splitQuestion.id !== question.id ? (_jsx(CrossTab, { question: question, cohorts: cohorts, answersByResponse: answersByResponse })) : null] }, question.id))) })] }));
|
|
139
|
+
}
|
|
140
|
+
function CrossTab({ question, cohorts, answersByResponse, }) {
|
|
141
|
+
const rows = [...cohorts.entries()].map(([cohort, responseIds]) => {
|
|
142
|
+
const values = responseIds
|
|
143
|
+
.map((id) => answersByResponse.get(id)?.get(question.id))
|
|
144
|
+
.filter((value) => value !== undefined);
|
|
145
|
+
if (question.kind === 'scale') {
|
|
146
|
+
const numbers = values.filter((value) => typeof value === 'number');
|
|
147
|
+
const average = numbers.length
|
|
148
|
+
? numbers.reduce((sum, value) => sum + value, 0) / numbers.length
|
|
149
|
+
: null;
|
|
150
|
+
return { cohort, n: values.length, summary: average === null ? '—' : average.toFixed(2) };
|
|
151
|
+
}
|
|
152
|
+
const counts = new Map();
|
|
153
|
+
for (const value of values.flatMap((value) => (Array.isArray(value) ? value : [value]))) {
|
|
154
|
+
const key = formatAnswerValue(value);
|
|
155
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
156
|
+
}
|
|
157
|
+
const top = [...counts.entries()].sort((left, right) => right[1] - left[1])[0];
|
|
158
|
+
return { cohort, n: values.length, summary: top ? `${top[0]} (${top[1]})` : '—' };
|
|
159
|
+
});
|
|
160
|
+
if (rows.length === 0)
|
|
161
|
+
return null;
|
|
162
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "masthead-rule" }), _jsxs("table", { className: "tbl", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Cohort" }), _jsx("th", { children: "n" }), _jsx("th", { children: question.kind === 'scale' ? 'Average' : 'Most common' })] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { children: [_jsx("td", { children: row.cohort }), _jsx("td", { children: row.n }), _jsx("td", { children: row.summary })] }, row.cohort))) })] })] }));
|
|
68
163
|
}
|
|
69
164
|
async function readSurveyErrorCode(response) {
|
|
70
165
|
const headerCode = response.headers.get(SURVEY_ERROR_CODE_HEADER);
|
|
@@ -83,28 +178,42 @@ async function readSurveyErrorCode(response) {
|
|
|
83
178
|
function isPlainRecord(value) {
|
|
84
179
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
85
180
|
}
|
|
181
|
+
function respondentLabel(response) {
|
|
182
|
+
if (response.respondent?.label) {
|
|
183
|
+
return response.respondent.detail
|
|
184
|
+
? `${response.respondent.label} · ${response.respondent.detail}`
|
|
185
|
+
: response.respondent.label;
|
|
186
|
+
}
|
|
187
|
+
return response.anonymous ? 'Anonymous' : 'Known respondent';
|
|
188
|
+
}
|
|
189
|
+
function formatAnswerValue(value) {
|
|
190
|
+
if (Array.isArray(value))
|
|
191
|
+
return value.join(', ');
|
|
192
|
+
return String(value);
|
|
193
|
+
}
|
|
86
194
|
function StatusPage({ title, detail, retry, }) {
|
|
87
|
-
return (_jsxs("div", { className: "page", role: "status", children: [_jsx("h1", { className: "page-title", children: "Survey responses" }), _jsx("p", { className: "page-sub", children: title }), detail
|
|
195
|
+
return (_jsxs("div", { className: "page", role: "status", children: [_jsx("h1", { className: "page-title", children: "Survey responses" }), _jsx("p", { className: "page-sub", children: title }), detail ? _jsx("p", { className: "page-sub", children: detail }) : null, retry ? (_jsx("button", { className: "btn", onClick: retry, type: "button", children: "Retry" })) : null] }));
|
|
88
196
|
}
|
|
89
197
|
function CountTable({ values }) {
|
|
90
|
-
|
|
198
|
+
const total = Object.values(values).reduce((sum, count) => sum + count, 0);
|
|
199
|
+
return (_jsx("dl", { className: "count-list", children: Object.entries(values).map(([label, count]) => (_jsxs("div", { children: [_jsx("dt", { children: label }), _jsxs("dd", { children: [count, total > 0 ? ` · ${Math.round((count / total) * 100)}%` : ''] })] }, label))) }));
|
|
91
200
|
}
|
|
92
|
-
function
|
|
93
|
-
|
|
94
|
-
return Number.isNaN(date.getTime()) ? value : date.toLocaleString();
|
|
95
|
-
}
|
|
96
|
-
function segmentLabel(value) {
|
|
97
|
-
if (value === 'member')
|
|
201
|
+
function segmentLabel(segment) {
|
|
202
|
+
if (segment === 'member')
|
|
98
203
|
return 'Member';
|
|
99
|
-
if (
|
|
204
|
+
if (segment === 'non_member')
|
|
100
205
|
return 'Non-member';
|
|
101
206
|
return 'Unknown';
|
|
102
207
|
}
|
|
103
|
-
function questionAudienceLabel(
|
|
104
|
-
if (
|
|
105
|
-
return 'Members
|
|
106
|
-
if (
|
|
107
|
-
return 'Non-members
|
|
108
|
-
return '
|
|
208
|
+
function questionAudienceLabel(audience) {
|
|
209
|
+
if (audience === 'member')
|
|
210
|
+
return 'Members';
|
|
211
|
+
if (audience === 'non_member')
|
|
212
|
+
return 'Non-members';
|
|
213
|
+
return 'Everyone';
|
|
214
|
+
}
|
|
215
|
+
function formatTime(value) {
|
|
216
|
+
const date = new Date(value);
|
|
217
|
+
return Number.isNaN(date.getTime()) ? value : date.toLocaleString();
|
|
109
218
|
}
|
|
110
219
|
//# sourceMappingURL=SurveyResponsesScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SurveyResponsesScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/SurveyResponsesScreen.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SurveyResponsesScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/SurveyResponsesScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import type { ContentMetadataSelectField } from '../../integration/options.js';
|
|
1
2
|
import type { ScreenRegistry } from '../components/CmsApp.js';
|
|
2
|
-
export declare function createCmsScreens({ allowInlineAuthorCreation, primaryCategories, surveyId, }?: {
|
|
3
|
+
export declare function createCmsScreens({ allowInlineAuthorCreation, primaryCategories, contentMetadataSelects, surveyId, }?: {
|
|
3
4
|
allowInlineAuthorCreation?: boolean;
|
|
4
5
|
primaryCategories?: Array<{
|
|
5
6
|
slug: string;
|
|
6
7
|
label: string;
|
|
7
8
|
}>;
|
|
9
|
+
contentMetadataSelects?: ContentMetadataSelectField[];
|
|
8
10
|
surveyId?: string;
|
|
9
11
|
}): ScreenRegistry;
|
|
10
12
|
export declare const cmsScreens: ScreenRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AA4B7D,wBAAgB,gBAAgB,CAAC,EAChC,yBAAgC,EAChC,iBAAsB,EACtB,QAAQ,GACR,GAAE;IACF,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AA4B7D,wBAAgB,gBAAgB,CAAC,EAChC,yBAAgC,EAChC,iBAAsB,EACtB,sBAA2B,EAC3B,QAAQ,GACR,GAAE;IACF,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,sBAAsB,CAAC,EAAE,0BAA0B,EAAE,CAAA;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,cAAc,CAyBtB;AAED,eAAO,MAAM,UAAU,EAAE,cAAmC,CAAA"}
|
|
@@ -23,9 +23,9 @@ function CalendarRoute() {
|
|
|
23
23
|
const { navigate } = useHashRouter();
|
|
24
24
|
return _jsx(CalendarScreen, { openDoc: () => navigate('content') });
|
|
25
25
|
}
|
|
26
|
-
export function createCmsScreens({ allowInlineAuthorCreation = true, primaryCategories = [], surveyId, } = {}) {
|
|
26
|
+
export function createCmsScreens({ allowInlineAuthorCreation = true, primaryCategories = [], contentMetadataSelects = [], surveyId, } = {}) {
|
|
27
27
|
return {
|
|
28
|
-
content: () => (_jsx(ContentRoute, { allowInlineAuthorCreation: allowInlineAuthorCreation, primaryCategories: primaryCategories })),
|
|
28
|
+
content: () => (_jsx(ContentRoute, { allowInlineAuthorCreation: allowInlineAuthorCreation, primaryCategories: primaryCategories, contentMetadataSelects: contentMetadataSelects })),
|
|
29
29
|
'content-insights': () => _jsx(ContentInsightsScreen, {}),
|
|
30
30
|
dashboard: () => _jsx(DashboardRoute, {}),
|
|
31
31
|
calendar: () => _jsx(CalendarRoute, {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,uEAAuE;AACvE,2EAA2E;AAC3E,+EAA+E;AAC/E,SAAS,cAAc;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;IACpC,OAAO,KAAC,eAAe,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAI,CAAA;AAC/D,CAAC;AAED,SAAS,aAAa;IACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;IACpC,OAAO,KAAC,cAAc,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAI,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAChC,yBAAyB,GAAG,IAAI,EAChC,iBAAiB,GAAG,EAAE,EACtB,sBAAsB,GAAG,EAAE,EAC3B,QAAQ,MAML,EAAE;IACL,OAAO;QACN,OAAO,EAAE,GAAG,EAAE,CAAC,CACd,KAAC,YAAY,IACZ,yBAAyB,EAAE,yBAAyB,EACpD,iBAAiB,EAAE,iBAAiB,EACpC,sBAAsB,EAAE,sBAAsB,GAC7C,CACF;QACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAC,qBAAqB,KAAG;QACnD,SAAS,EAAE,GAAG,EAAE,CAAC,KAAC,cAAc,KAAG;QACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAC,aAAa,KAAG;QACjC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAC,WAAW,KAAG;QAC5B,SAAS,EAAE,GAAG,EAAE,CAAC,KAAC,eAAe,KAAG;QACpC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAC,aAAa,KAAG;QAChC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,YAAY,KAAG;QAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,KAAC,mBAAmB,KAAG;QAC5C,GAAG,CAAC,QAAQ;YACX,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAC,qBAAqB,IAAC,QAAQ,EAAE,QAAQ,GAAI,EAAE;YAC7E,CAAC,CAAC,EAAE,CAAC;QACN,cAAc,EAAE,GAAG,EAAE,CAAC,CACrB,KAAC,iBAAiB,IAAC,yBAAyB,EAAE,yBAAyB,GAAI,CAC3E;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAC,cAAc,KAAG;KAClC,CAAA;AACF,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAmB,gBAAgB,EAAE,CAAA"}
|
package/package.json
CHANGED
package/src/engine/index.ts
CHANGED
|
@@ -168,6 +168,35 @@ export {
|
|
|
168
168
|
rollbackPublication,
|
|
169
169
|
type SkippedArchiveItem,
|
|
170
170
|
} from './publication.js'
|
|
171
|
+
export {
|
|
172
|
+
acceptsProbeStatus,
|
|
173
|
+
type ContinuityArchiveItem,
|
|
174
|
+
type ContinuityDrift,
|
|
175
|
+
type ContinuityDriftField,
|
|
176
|
+
type ContinuityPublishedRow,
|
|
177
|
+
isRetiredItem,
|
|
178
|
+
payloadDrift,
|
|
179
|
+
} from './publication-continuity.js'
|
|
180
|
+
export {
|
|
181
|
+
CanonicalJsonError,
|
|
182
|
+
canonicalJson,
|
|
183
|
+
canonicalJsonBytes,
|
|
184
|
+
canonicalJsonSha256,
|
|
185
|
+
type JsonValue,
|
|
186
|
+
} from './publication-receipt/canonical-json.js'
|
|
187
|
+
export {
|
|
188
|
+
canonicalizeReceiptBody,
|
|
189
|
+
PublicationReceiptError,
|
|
190
|
+
SITE_PUBLICATION_RECEIPT_AUDIENCE,
|
|
191
|
+
SITE_PUBLICATION_RECEIPT_SCHEMA,
|
|
192
|
+
type SitePublicationReceiptBody,
|
|
193
|
+
sitePublicationReceiptBodySchema,
|
|
194
|
+
} from './publication-receipt/receipt.js'
|
|
195
|
+
export {
|
|
196
|
+
type SignedPublicationReceipt,
|
|
197
|
+
signPublicationReceipt,
|
|
198
|
+
verifyPublicationReceipt,
|
|
199
|
+
} from './publication-receipt/signature.js'
|
|
171
200
|
// Pre-publish body validation guard.
|
|
172
201
|
export {
|
|
173
202
|
evaluateArticleBody,
|
|
@@ -312,6 +341,10 @@ export {
|
|
|
312
341
|
restoreContent,
|
|
313
342
|
softDeleteContent,
|
|
314
343
|
} from './soft-delete.js'
|
|
344
|
+
export {
|
|
345
|
+
normalizeSourceSections,
|
|
346
|
+
type SourceSectionNormalization,
|
|
347
|
+
} from './source-sections.js'
|
|
315
348
|
// Tag CRUD engine — listTags / searchTags / renameTag / deleteTag.
|
|
316
349
|
export {
|
|
317
350
|
createTag,
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Publication continuity decisions (#342).
|
|
2
|
+
//
|
|
3
|
+
// Extracted from the Warfronts publish bridge so every site shares one rule set
|
|
4
|
+
// instead of each re-deriving it. These are the decisions a continuity run makes
|
|
5
|
+
// before it touches the database: is this item retired, did the published
|
|
6
|
+
// revision drift from the archive, and does a live probe response mean success.
|
|
7
|
+
//
|
|
8
|
+
// All pure. The bridge's DB, network and filesystem work stays site-owned; only
|
|
9
|
+
// the judgement moves here.
|
|
10
|
+
|
|
11
|
+
/** The archive-side fields a continuity run compares. */
|
|
12
|
+
export interface ContinuityArchiveItem {
|
|
13
|
+
title?: string | null
|
|
14
|
+
description?: string | null
|
|
15
|
+
featured?: boolean | null
|
|
16
|
+
heroImageId?: string | null
|
|
17
|
+
visibility?: string | null
|
|
18
|
+
/** The archive's name for what the engine stores as `channel`. */
|
|
19
|
+
primaryCategory?: string | null
|
|
20
|
+
bodyMarkdown?: string | null
|
|
21
|
+
metadata?: { originalStatus?: string | null } | null
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The joined `content_items` + published-revision row, as the engine stores it. */
|
|
25
|
+
export interface ContinuityPublishedRow {
|
|
26
|
+
rev_title?: string | null
|
|
27
|
+
rev_description?: string | null
|
|
28
|
+
rev_featured?: number | null
|
|
29
|
+
rev_hero_image_id?: string | null
|
|
30
|
+
rev_visibility?: string | null
|
|
31
|
+
rev_channel?: string | null
|
|
32
|
+
rev_body_markdown?: string | null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type ContinuityDriftField =
|
|
36
|
+
| 'title'
|
|
37
|
+
| 'description'
|
|
38
|
+
| 'featured'
|
|
39
|
+
| 'heroImage'
|
|
40
|
+
| 'visibility'
|
|
41
|
+
| 'channel'
|
|
42
|
+
| 'body'
|
|
43
|
+
|
|
44
|
+
export interface ContinuityDrift {
|
|
45
|
+
drifted: boolean
|
|
46
|
+
fields: ContinuityDriftField[]
|
|
47
|
+
title: string
|
|
48
|
+
description: string | null
|
|
49
|
+
/** `content_items.featured` is INTEGER; the archive item carries a boolean. */
|
|
50
|
+
featured: 0 | 1
|
|
51
|
+
heroImageId: string | null
|
|
52
|
+
visibility: 'free' | 'premium'
|
|
53
|
+
channel: string | null
|
|
54
|
+
body: string
|
|
55
|
+
bodyDrifted: boolean
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** An item the archive has taken down rather than published. */
|
|
59
|
+
export function isRetiredItem(item: ContinuityArchiveItem | null | undefined): boolean {
|
|
60
|
+
return item?.metadata?.originalStatus === 'archived'
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Compare the fields a reader actually sees against the published revision.
|
|
65
|
+
*
|
|
66
|
+
* The site renders from the published revision payload, so an edit to any field
|
|
67
|
+
* this does not examine is classified "already in sync", skipped, and never
|
|
68
|
+
* reaches a reader — while the run reports success. That has stranded real work
|
|
69
|
+
* twice: fourteen restored article bodies, and a `featured` flag flip, both
|
|
70
|
+
* merged, both reporting `failed=0`, neither ever visible.
|
|
71
|
+
*
|
|
72
|
+
* Comparison is exact rather than a length or prefix heuristic. The entire class
|
|
73
|
+
* of bug being prevented is a cheap test that silently misses a real edit: a
|
|
74
|
+
* false "stale" costs one idempotent republish, a false "in sync" loses the edit.
|
|
75
|
+
*
|
|
76
|
+
* NOT COMPARED: tags. The revision stores them canonicalized and sorted while
|
|
77
|
+
* the archive carries raw frontmatter strings, and the engine exports no
|
|
78
|
+
* canonicalizer to reuse. Detecting a field this cannot also REPAIR would be
|
|
79
|
+
* worse than not detecting it — tag writes go through the engine, so a tag-only
|
|
80
|
+
* drift would republish unchanged and stay stale on every run, forever.
|
|
81
|
+
*/
|
|
82
|
+
export function payloadDrift(
|
|
83
|
+
item: ContinuityArchiveItem,
|
|
84
|
+
row: ContinuityPublishedRow,
|
|
85
|
+
): ContinuityDrift {
|
|
86
|
+
// The engine stores an absent body as a single space, so normalize the same
|
|
87
|
+
// way before comparing or the first resync of a body-less article would
|
|
88
|
+
// churn forever.
|
|
89
|
+
const body = item.bodyMarkdown ?? ' '
|
|
90
|
+
const title = String(item.title ?? '')
|
|
91
|
+
const description = item.description ?? null
|
|
92
|
+
const featured: 0 | 1 = item.featured ? 1 : 0
|
|
93
|
+
const heroImageId = item.heroImageId ?? null
|
|
94
|
+
const visibility: 'free' | 'premium' = item.visibility === 'premium' ? 'premium' : 'free'
|
|
95
|
+
const channel = item.primaryCategory ?? null
|
|
96
|
+
|
|
97
|
+
const fields: ContinuityDriftField[] = []
|
|
98
|
+
if (row.rev_title !== title) fields.push('title')
|
|
99
|
+
if ((row.rev_description ?? null) !== description) fields.push('description')
|
|
100
|
+
if (Number(row.rev_featured ?? 0) !== featured) fields.push('featured')
|
|
101
|
+
if ((row.rev_hero_image_id ?? null) !== heroImageId) fields.push('heroImage')
|
|
102
|
+
if ((row.rev_visibility ?? 'free') !== visibility) fields.push('visibility')
|
|
103
|
+
if ((row.rev_channel ?? null) !== channel) fields.push('channel')
|
|
104
|
+
// A revision predating this check can lack the key entirely; treat an absent
|
|
105
|
+
// body as drift rather than silently matching.
|
|
106
|
+
if ((row.rev_body_markdown ?? null) !== body) fields.push('body')
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
drifted: fields.length > 0,
|
|
110
|
+
fields,
|
|
111
|
+
title,
|
|
112
|
+
description,
|
|
113
|
+
featured,
|
|
114
|
+
heroImageId,
|
|
115
|
+
visibility,
|
|
116
|
+
channel,
|
|
117
|
+
body,
|
|
118
|
+
bodyDrifted: fields.includes('body'),
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Whether a live probe response means the publication succeeded.
|
|
124
|
+
*
|
|
125
|
+
* LIVE → 200 only.
|
|
126
|
+
* RETIRED → 301/308 (redirected to a surviving twin) or 404 (gone, with no
|
|
127
|
+
* honest target to redirect to).
|
|
128
|
+
*
|
|
129
|
+
* The invariant: **a retired article must never answer 200.** That is the
|
|
130
|
+
* stale-row symptom a teardown exists to remove, and it is the only status this
|
|
131
|
+
* rejects for a retirement. Demanding 200 for retirements instead would fail the
|
|
132
|
+
* run forever on exactly the articles the archive deliberately took down.
|
|
133
|
+
*
|
|
134
|
+
* 301 and 308 are both permanent; a server may answer GET with one and other
|
|
135
|
+
* methods with the other, so both are accepted.
|
|
136
|
+
*/
|
|
137
|
+
export function acceptsProbeStatus(status: number, retired: boolean): boolean {
|
|
138
|
+
if (!retired) return status === 200
|
|
139
|
+
return status === 301 || status === 308 || status === 404
|
|
140
|
+
}
|