Stop telling readers the audio sweep is unfinished — it finished
Some checks are pending
build-gate / build (push) Waiting to run

The legend's caveat is the paragraph a reader uses to decide what "nothing
found" is worth. It said GRN was being swept a batch at a time and part of the
pool was still unread. That was true while the crawl ran and false the moment it
ended, and it stayed on the page through four commits that knew better. Found by
reading a screenshot, which is the only thing that could have found it.

Corrected on all three surfaces, and scoped honestly rather than upgraded: the
sweep finished for every one of the 1,192 languages in the gap, so "nothing
found" no longer rests on an unread pool — but codes that already carry a
resource were not all asked, because the sweep was spent on the gap first. Both
halves are now on the page.

A gate holds it. The DATA decides whether the claim is allowed: while codes are
genuinely undecided it passes, and it starts failing the moment they are all
decided, so it re-arms itself for the next slow pool. It does not flag a claim
rendered under a v-if on the pending count, because that form expires on its own
and is the one to copy. Its first version asked about every code on the map
instead of the gap, measured 3,202 undecided and would have let the stale
sentence stand.
This commit is contained in:
doxa-maps-88655c70 2026-09-25 02:57:50 +00:00
parent 8a3d836e44
commit 2087074e9d
12 changed files with 203 additions and 46 deletions

View file

@ -0,0 +1,152 @@
/**
* check-no-stale-sweep-claim.mjs — a caveat that has stopped being true is a wrong number.
*
* THE BUG, THREE TIMES. The gospel surfaces carry a paragraph telling the reader how much
* "nothing found" is worth: which pools were searched, and which were not. Twice already that
* paragraph had to stop claiming a pool was unsearched — once when Faith Comes By Hearing was
* added, once when GRN was reached through 5fish — and resources-map.vue carries a comment
* saying so, written by whoever fixed it the second time.
*
* It happened a third time anyway. The GRN sweep ran a batch at a time at the ten-second crawl
* delay 5fish asks for, and while it ran, every surface truthfully said "part of that pool is
* still unread". The sweep finished. The sentence did not change. So the map went on telling
* readers that the largest gospel-audio catalogue on it was only partly searched, on the one
* paragraph whose entire job is calibrating trust in the gap. Nothing failed; nothing could.
* It was found by reading a screenshot.
*
* WHY A GATE AND NOT MORE CARE. The comment asking for care was already there, in the file,
* two lines above the stale sentence. Care is not a mechanism.
*
* THE RULE. The DATA decides whether the claim is allowed. If every language code the map
* carries has been decided by the pool's index, then no surface may state in prose that part
* of that pool is unread. If codes really are undecided, the claim is true and this passes —
* so the check re-enables itself automatically the next time a slow pool starts sweeping.
*
* WHAT IT DELIBERATELY DOES NOT FLAG. A claim rendered under a v-if on the pending COUNT is
* data-driven: it disappears on its own when the count reaches zero, which is the correct
* construction and the one that should be copied. Flagging it would punish the fix. Lines
* inside such a block are skipped, and the block is tracked by nesting rather than by
* proximity, because a detector that cannot see how the expression is guarded reports the
* wrong thing confidently — the failure this bundle has now met in a forced token, a
* swallowed flag and a class extractor.
*
* Run with --poison to prove it can fail.
*/
import { readFileSync, readdirSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const HERE = dirname(fileURLToPath(import.meta.url))
const REPO = resolve(HERE, '..')
const DIR = resolve(REPO, 'plugin-designs/gospel-resources')
const POISON = process.argv.includes('--poison')
/** Prose that asserts, in the present tense, that part of a pool has not been read. */
const CLAIMS = [
/part of (?:that|this|it|the) pool is still unread/i,
/part of it is still unread/i,
/is being swept\b/i,
/is swept a batch at a time/i,
/so part of that pool is still unread/i,
/still being crawled/i,
]
/** A guard whose value IS the pending count: the claim inside it cannot go stale. */
const PENDING_GUARD = /v-if="[^"]*\b(?:pending|notYetSwept|unswept)\b[^"]*"/
/* ── is the pool actually finished? ─────────────────────────────────────────────────────── */
const grn = JSON.parse(readFileSync(resolve(REPO, 'data/tables/grn-index.json'), 'utf8'))
const decided = new Set([...Object.keys(grn.byIso || {}), ...(grn.none || [])])
const { codes } = JSON.parse(readFileSync(resolve(REPO, 'data/tables/people-group-pins.json'), 'utf8'))
/* WHICH CODES THE CAVEAT IS ABOUT, and this is the whole subtlety.
*
* The sentence being judged calibrates "NOTHING FOUND". So the population it speaks for is the
* gap: tier-0 pins, minus sign languages, which are skipped on purpose because GRN publishes
* audio. The sweep ran against exactly that population and finished it.
*
* It did NOT ask GRN about the 3,202 codes that already carry a resource, and a first draft of
* this check measured those instead — reporting 3,202 undecided and skipping, which would have
* let the stale sentence stand. The wider number is real and belongs in its own caveat one day
* (a Words of Life recording for a group that already has text is still worth surfacing), but
* it is NOT what "nothing found" depends on, and conflating the two is how a check ends up
* measuring something true and irrelevant. */
const { pins } = JSON.parse(readFileSync(resolve(REPO, 'data/tables/people-group-pins.json'), 'utf8'))
const carried = [...new Set(
pins.filter((p) => p[6] === 0 && p[4] && codes[p[4]] && codes[p[4]].sg !== 1).map((p) => p[4]),
)]
const pending = carried.filter((c) => !decided.has(c))
if (pending.length) {
console.log(
`NO-STALE-SWEEP-CLAIM: SKIP — ${pending.length} of ${carried.length} gap code(s) are ` +
'genuinely undecided, so a surface saying the pool is part-read is telling the truth.',
)
process.exit(0)
}
/* ── the claim is no longer allowed ─────────────────────────────────────────────────────── */
function offendersIn(src, label) {
const out = []
const lines = src.split('\n')
let guard = 0
for (let i = 0; i < lines.length; i++) {
const line = lines[i]
if (guard > 0) {
if (/<\/template>/.test(line)) guard--
else if (/<template\b/.test(line)) guard++
continue
}
if (/<template\b/.test(line) && PENDING_GUARD.test(line)) { guard = 1; continue }
for (const re of CLAIMS) {
if (re.test(line)) { out.push(`${label}:${i + 1} ${line.trim().slice(0, 96)}`); break }
}
}
return out
}
const surfaces = readdirSync(DIR).filter((f) => f.endsWith('.vue'))
if (!surfaces.length) {
console.error('NO-STALE-SWEEP-CLAIM: no .vue surfaces found — the check would pass vacuously.')
process.exit(1)
}
if (POISON) {
const INJECT = ' crawl delay they ask for, so part of that pool is still unread.\n'
let caught = 0
for (const f of surfaces) {
const poisoned = `${readFileSync(resolve(DIR, f), 'utf8')}\n${INJECT}`
if (offendersIn(poisoned, f).length) caught++
else console.error(` NOT CAUGHT in ${f}`)
}
/* And the guarded form must NOT be caught, or the check punishes the correct construction. */
const guarded =
' <template v-if="gapMakeup.pending">\n' +
' GRN is being swept, so part of that pool is still unread.\n' +
' </template>\n'
const falsePositive = offendersIn(guarded, 'guarded-sample')
if (caught === surfaces.length && !falsePositive.length) {
console.log(`NO-STALE-SWEEP-CLAIM --poison: ${caught}/${surfaces.length} surface(s) caught the stale claim, and the data-driven form was not flagged.`)
console.log('NO-STALE-SWEEP-CLAIM: SELF-TEST PASS — the check fails as designed.')
process.exit(0)
}
if (falsePositive.length) console.error(` FALSE POSITIVE on the guarded form: ${falsePositive[0]}`)
console.error('NO-STALE-SWEEP-CLAIM: SELF-TEST FAIL.')
process.exit(1)
}
const offenders = surfaces.flatMap((f) => offendersIn(readFileSync(resolve(DIR, f), 'utf8'), f))
if (offenders.length) {
console.error(
`NO-STALE-SWEEP-CLAIM: FAIL — every one of ${carried.length} gap code(s) has been decided, but ` +
`${offenders.length} line(s) still tell the reader the pool is part-read:`,
)
for (const o of offenders) console.error(` ${o}`)
console.error(' Say the sweep finished, and name what is genuinely still unchecked. If you')
console.error(' want a claim that expires on its own, render it under a v-if on the count.')
process.exit(1)
}
console.log(
`NO-STALE-SWEEP-CLAIM: PASS — all ${carried.length} gap code(s) decided, and no surface ` +
`claims otherwise (${surfaces.length} file(s) checked).`,
)

View file

@ -22,8 +22,8 @@
* Scripture), Arclight/JESUS Film (film), Door43/unfoldingWord (stories and Scripture)
* Faith Comes By Hearing (audio Scripture), Scripture Earth (minority-language Scripture)
* and Global Recordings Network (gospel audio). It is NEVER proof of absence. Three pools
* remain unchecked — API.Bible, DBL and progress.bible — and GRN is swept a batch at a time
* at the crawl delay they ask for, so part of it is still unread.
* remain unchecked — API.Bible, DBL, progress.bible and YouVersion. GRN is not among them
* any more for the gap: that sweep finished, at the crawl delay they ask for.
*
* Three consequences the charts are built around:
* 1. A pool nobody has queried is drawn as a HATCHED "not measured" row, never a zero
@ -202,7 +202,7 @@ const poolSets = computed(() => {
}
return { ck: [...ck], un: [...un], sck: [...sck], sun: [...sun] }
})
// A POOL CANNOT BE IN BOTH LISTS. GRN is swept a batch at a time, so some codes carry "grn"
// A POOL CANNOT BE IN BOTH LISTS. GRN was swept a batch at a time, so some codes carried "grn"
// as checked and the rest carry "grn (not yet swept)" as unchecked — and unioning across the
// corpus printed it on BOTH sides, which reads as a flat contradiction to anyone who notices.
// It is neither fully checked nor untouched, and the honest rendering says exactly that once.
@ -420,8 +420,8 @@ useShadowStyles(
Faith Comes By Hearing was added, then again when GRN was reached through 5fish.
A stale caveat misleads exactly as much as a stale number. -->
<br>Not found is not the same as not existing. Audio has been searched at Faith Comes By
Hearing and at Global Recordings Network, the latter a batch at a time at the ten-second
crawl delay they ask for, so part of that pool is still unread. api.bible, the Digital
Hearing and at Global Recordings Network, the latter swept for every language in the gap
at the ten-second crawl delay they ask for. api.bible, YouVersion, the Digital
Bible Library and progress.bible all need credentials this build does not have.
</div>

View file

@ -21,8 +21,8 @@ import { resourceRows } from './gospel-resource-rows.js'
* `has_scripture:false` means NOT FOUND IN THE POOLS CHECKED — eBible.org, PNG.Bible and
* Faith Comes By Hearing for text, Arclight for film, Door43 for stories, and FCBH again
* for audio, Scripture Earth for minority-language Scripture, and Global Recordings Network
* for gospel audio. It does NOT mean no scripture exists: GRN is swept a batch at a time at
* the crawl delay they ask for, so part of it is still unread, and API.Bible, DBL and
* for gospel audio. It does NOT mean no scripture exists: GRN has now been swept for every
* language in the gap, at the crawl delay they ask for, but API.Bible, DBL, YouVersion and
* progress.bible need keys. Every
* card names its checked and unchecked pools, and a pool nobody queried renders as
* "unknown" rather than "no".
@ -351,8 +351,8 @@ useShadowStyles(
{{ fmt(stats.ebible_languages) }} languages, public data), plus PNG.Bible, the JESUS
Film catalogue, Door43, and Faith Comes By Hearing for both text and audio Scripture. It does
<b>not</b> mean no scripture exists: Scripture Earth and Global Recordings Network are
searched too, GRN a batch at a time at the crawl delay they ask for, so part of it is
still unread; api.bible, the Digital Bible Library and progress.bible need credentials
searched too, GRN swept for every language in the gap at the crawl delay they ask for;
api.bible, the Digital Bible Library, progress.bible and YouVersion need credentials
this build does not have. A pool nobody has queried shows as unknown, never as “no”.
Languages are joined to people groups by exact ISO&nbsp;639-3 code.
<br><br>

View file

@ -38,7 +38,7 @@
* it is no resource at all; the pools are not "eBible + Arclight" but eBible,
* PNG.Bible, Arclight, Door43, Faith Comes By Hearing, Scripture Earth, Cru and
* Global Recordings Network; and GRN is NOT key-blocked — it is reached through
* their 5fish site, needs no key, and is swept a batch at a time at the crawl
* their 5fish site, needs no key, and has now been swept in full at the crawl
* delay their robots.txt asks for. API.Bible, DBL and progress.bible are the ones
* that still need credentials this build does not have.
*
@ -360,8 +360,8 @@ const gapBy = ref('groups')
// cataloguing problem and no amount of searching will move it;
// - a sign language: the pools that would hold signed Scripture are key-gated, so this is
// an access problem — 136 groups and fifty million people sit here;
// - a code GRN has not reached yet: the sweep is still running at their crawl delay, and
// these will resolve themselves one batch at a time;
// - a code GRN has not reached yet: this bucket is now EMPTY — the sweep finished — but the
// branch stays, because the next pool swept a batch at a time will need it again;
// - everything else: every pool this build can reach was checked and found nothing. That
// last line is the real translation gap, and it is the only one of the four that a
// translator rather than an administrator can close.
@ -1237,8 +1237,12 @@ useShadowStyles(
same index, so the colour and the dots can no longer disagree.
<br>“None found” = not in the pools checked (eBible, PNG.Bible, JESUS Film, Door43,
Faith Comes By Hearing, Scripture Earth and Global Recordings Network). GRN is reached
through their 5fish site and is being swept <b>a batch at a time</b>, at the ten-second
crawl delay they ask for, so part of that pool is still unread. Never proof of absence.
through their 5fish site, and that sweep is now <b>finished for every group in the gap</b>
— every language with nothing else was asked for, at the ten-second crawl delay they
request — so “nothing found” no longer rests on an unread pool. Codes that already carry
a resource were not all asked, because the sweep was spent on the gap first. What is still
unread is api.bible, the Digital Bible Library, progress.bible and YouVersion, which need
credentials or permission this build does not have. Never proof of absence.
<template v-if="mode === 'coverage'">
A “found” colour is equally bounded: it counts what these pools list, not everything that exists.
</template>
@ -1325,8 +1329,9 @@ useShadowStyles(
stale caveat is as misleading as a stale number. -->
<template v-if="gapBy !== 'hnr'">
<br>Audio <b>has</b> been searched — at Faith Comes By Hearing, and at Global
Recordings Network through their 5fish site, which is being swept a batch at a time
because they ask crawlers for a ten-second delay. These groups have none in either.
Recordings Network through their 5fish site, whose sweep is finished for every group
in this list, at the ten-second delay they ask crawlers for. These groups have none in
either.
</template>
<template v-if="gapBy !== 'hnr'">
<br><em>related:</em> where a line below carries it, ISO 639-3 files that code under a
@ -1768,10 +1773,10 @@ useShadowStyles(
being true is not a safe default — it understates what the map can show. -->
“No resource found” means not present in any pool checked: eBible, PNG.Bible, the
JESUS Film catalogue, Door43, Faith Comes By Hearing, Scripture Earth and Global
Recordings Network. Audio <b>is</b> searched — GRN through their 5fish site, a batch
at a time at the crawl delay they ask for, so part of that pool is still unread.
API.Bible, the Digital Bible Library and progress.bible need credentials this build
does not have.
Recordings Network. Audio <b>is</b> searched — GRN through their 5fish site, at the
crawl delay they ask for, with every language in the gap now decided. API.Bible, the
Digital Bible Library, progress.bible and YouVersion need credentials or permission
this build does not have.
<br>Link states: <b>link checked</b> = the target resolves to the language claimed.
Scripture links are fetched from eBible directly. Film links are checked against the Arclight
catalogue, not jesusfilm.org — that page is client-rendered and returns an identical page for a

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -596,7 +596,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk",
"integrity": "sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN",
"elements": [
"gospel-resources-map"
],
@ -616,7 +616,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -630,7 +630,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -644,7 +644,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -658,7 +658,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -672,7 +672,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Rk/GweMycOMDCXZUZk7mCQWpjJQQTK8zSh+QRJ1IpmstN+kbv4V+kxkk5UsEXQmk\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-XpeHNmxfR6m5MXfy9PJAvgr8JreK0ZvhFVosdiDhct9rwThm0rsOvg80Tv3Kq1GN\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
}
]