Stop telling readers the audio sweep is unfinished — it finished
Some checks are pending
build-gate / build (push) Waiting to run
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:
parent
8a3d836e44
commit
2087074e9d
12 changed files with 203 additions and 46 deletions
152
internal/check-no-stale-sweep-claim.mjs
Normal file
152
internal/check-no-stale-sweep-claim.mjs
Normal 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).`,
|
||||
)
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 639-3 code.
|
||||
<br><br>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
2
public/doxa-maps/index.html
generated
2
public/doxa-maps/index.html
generated
File diff suppressed because one or more lines are too long
12
public/doxa-maps/manifest.json
generated
12
public/doxa-maps/manifest.json
generated
|
|
@ -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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
Loading…
Reference in a new issue