A gate that asks whether anything is there — and it caught a dead bundle
Wrote this after shipping a page that returned 200 for every asset, reported zero console errors, and was completely dead: a throw during setup dies inside the custom-element boundary. Zero errors is not the same as working, so this does not trust their absence — it looks for PRESENCE, on all five leaves, in five steps that each name their own failure: the tag is defined, the host is in the document, a shadowRoot is attached, it has children, it renders text. Its first real run went red on all five, and it was right. Every gospel leaf was dead with "Identifier 'Ge' has already been declared" — while the SRI hash still matched and every request still returned 200. My own doing: four profiles imported en/gospel.json directly for an English fallback, and library/i18n already pulls that exact file in through an eager glob, so the IIFE carried two instances of one module. The fix is one module: library/i18n now exports EN_MESSAGES and the profiles read it from there. The duplicate is gone. Measured after: all five leaves mount with 3,228 to 233,307 characters of rendered text, verify-gospel-map passes with 2,107 pins and the gap cutting to 370, and --poison confirms the check goes red on a page with no element at all. The lesson is the gate's whole reason to exist. I had rich assertions about pin counts and filters and none of them ran on data-tables, charts or the list, so a bundle-level failure could take out every leaf while the one gate I did run was pointed elsewhere. Cheap and universal beats rich and narrow for THIS question.
This commit is contained in:
parent
41bda39377
commit
57fecfd0da
17 changed files with 177 additions and 110 deletions
|
|
@ -59,7 +59,7 @@ try {
|
|||
p.on('pageerror', (e) => bad.push(`pageerror: ${String(e.message).slice(0, 120)}`))
|
||||
|
||||
await p.goto(`${BASE}${PATHNAME}`, { waitUntil: 'networkidle', timeout: 90000 })
|
||||
await p.waitForFunction(() => window.__grState && window.__grState().pins > 0, { timeout: 60000 })
|
||||
await p.waitForFunction(() => window.__grState && window.__grState().pins > 0, null, { timeout: 60000 })
|
||||
await p.waitForTimeout(8000)
|
||||
|
||||
const read = () => p.evaluate(() => {
|
||||
|
|
|
|||
112
internal/check-gospel-leaves-mount.mjs
Normal file
112
internal/check-gospel-leaves-mount.mjs
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
/**
|
||||
* check-gospel-leaves-mount.mjs — did the element actually MOUNT, on every leaf?
|
||||
*
|
||||
* ═══ THE FAILURE THIS EXISTS FOR, WHICH I SHIPPED INTO MY OWN WORKING TREE ══════════════
|
||||
* An edit used a ref it never declared. The ReferenceError was thrown during setup, INSIDE
|
||||
* the custom-element boundary, where it was swallowed: the page loaded, every asset returned
|
||||
* 200, `pageerror` fired zero times, `console.error` fired zero times, and the element sat in
|
||||
* the DOM with an empty shadow root. A perfectly healthy-looking dead page.
|
||||
*
|
||||
* Nothing I had would have said so on its own. The rich gates would have — verify-gospel-map
|
||||
* asserts on pin counts — but they are slow, they need a token and a basemap, and they are
|
||||
* not run on every leaf. What was missing was the cheap, unambiguous question: IS ANYTHING
|
||||
* THERE. This asks exactly that, on all five leaves, in a few seconds each.
|
||||
*
|
||||
* WHAT IT ASSERTS PER LEAF, in the order a failure actually happens:
|
||||
* 1. the custom element tag is DEFINED (the bundle ran at all)
|
||||
* 2. the host element exists in the document (the leaf HTML embeds it)
|
||||
* 3. it has a shadowRoot (defineCustomElement attached one)
|
||||
* 4. the shadow root has real content (setup did not throw)
|
||||
* 5. it renders visible text (it is not an empty shell)
|
||||
* Any one of those failing is reported with its own sentence, because "the leaf is broken"
|
||||
* is useless and "the shadow root is empty, so setup threw" is a lead.
|
||||
*
|
||||
* ZERO ERRORS IS NOT THE SAME AS WORKING, and that is the whole lesson. This deliberately
|
||||
* does NOT trust the absence of console errors; it looks for presence of output.
|
||||
*
|
||||
* Run with --poison to prove it can fail: it asks the same questions of a URL that serves no
|
||||
* element at all, and requires every leaf-shaped assertion to go red.
|
||||
*/
|
||||
import { chromium } from 'playwright'
|
||||
import { serveReaped } from './_serve-reaped.mjs'
|
||||
import { resolve, dirname } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
const PUBLIC = resolve(HERE, '../public')
|
||||
const PORT = Number(process.env.PORT || 5399)
|
||||
const BASE = process.env.BASE_URL || `http://127.0.0.1:${PORT}`
|
||||
const POISON = process.argv.includes('--poison')
|
||||
const TAG = 'gospel-resources-map'
|
||||
const LEAVES = ['resources-map', 'resources-list', 'data-tables', 'charts', 'gospel-dashboard']
|
||||
|
||||
let srv = null
|
||||
if (!process.env.BASE_URL) srv = serveReaped(PUBLIC, PORT)
|
||||
|
||||
const probe = async (page, url) => {
|
||||
await page.goto(url, { waitUntil: 'networkidle', timeout: 90000 })
|
||||
/* Give setup a real chance; these leaves fetch tables before they render. */
|
||||
await page.waitForTimeout(9000)
|
||||
return page.evaluate((tag) => {
|
||||
const defined = !!customElements.get(tag)
|
||||
const host = document.querySelector(tag)
|
||||
const sr = host ? host.shadowRoot : null
|
||||
const text = sr ? (sr.textContent || '').replace(/\s+/g, ' ').trim() : ''
|
||||
return {
|
||||
defined,
|
||||
hostPresent: !!host,
|
||||
hasShadow: !!sr,
|
||||
shadowChildren: sr ? sr.childElementCount : 0,
|
||||
/* CSS injected into the shadow root counts as children, so text is the real signal. */
|
||||
visibleTextLength: text.replace(/\{[^}]*\}/g, '').length,
|
||||
}
|
||||
}, TAG)
|
||||
}
|
||||
|
||||
const failuresFor = (leaf, r) => {
|
||||
const out = []
|
||||
if (!r.defined) out.push(`${leaf}: <${TAG}> is not defined — the bundle never ran.`)
|
||||
else if (!r.hostPresent) out.push(`${leaf}: the leaf HTML does not embed <${TAG}>.`)
|
||||
else if (!r.hasShadow) out.push(`${leaf}: the element has no shadowRoot — it was never upgraded.`)
|
||||
else if (!r.shadowChildren) out.push(`${leaf}: the shadow root is EMPTY — setup threw, and the boundary swallowed it.`)
|
||||
else if (r.visibleTextLength < 40) out.push(`${leaf}: the shadow root renders ${r.visibleTextLength} characters of text — an empty shell.`)
|
||||
return out
|
||||
}
|
||||
|
||||
let browser
|
||||
try {
|
||||
browser = await chromium.launch()
|
||||
const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } })
|
||||
|
||||
if (POISON) {
|
||||
/* A URL that serves no element at all must fail EVERY leaf-shaped assertion. */
|
||||
const r = await probe(page, `${BASE}/doxa-maps/index.html`)
|
||||
const f = failuresFor('poison', r)
|
||||
if (!f.length) {
|
||||
console.error('LEAVES-MOUNT: SELF-TEST FAIL — a page with no gospel element passed as mounted.')
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`LEAVES-MOUNT --poison: caught it — ${f[0]}`)
|
||||
console.log('LEAVES-MOUNT: SELF-TEST PASS — the check fails as designed.')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const bad = []
|
||||
for (const leaf of LEAVES) {
|
||||
const r = await probe(page, `${BASE}/doxa-maps/gospel-resources/${leaf}/index.html`)
|
||||
const f = failuresFor(leaf, r)
|
||||
bad.push(...f)
|
||||
console.log(` ${f.length ? 'FAIL' : 'ok '} ${leaf.padEnd(18)} defined=${r.defined} shadow=${r.hasShadow} children=${r.shadowChildren} text=${r.visibleTextLength}`)
|
||||
}
|
||||
if (bad.length) {
|
||||
console.error(`LEAVES-MOUNT: FAIL — ${bad.length} leaf/leaves did not mount:`)
|
||||
for (const b of bad) console.error(` ${b}`)
|
||||
console.error(' A page can return 200 for every asset and report zero console errors while')
|
||||
console.error(' being completely dead: a throw during setup dies inside the element boundary.')
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`LEAVES-MOUNT: PASS — all ${LEAVES.length} leaves mount and render.`)
|
||||
} finally {
|
||||
await browser?.close()
|
||||
srv?.stop()
|
||||
}
|
||||
|
|
@ -59,6 +59,18 @@ for (const [path, subtree] of Object.entries(rawModules)) {
|
|||
messages[locale][area] = subtree
|
||||
}
|
||||
|
||||
/**
|
||||
* The English catalogue, exported from the ONE module that already owns it.
|
||||
*
|
||||
* Four gospel profiles used to `import enGospel from '@map/i18n/locales/en/gospel.json'` to
|
||||
* get a real English fallback for a host that never installed i18n. That file is ALSO pulled
|
||||
* in by the eager glob above, so the bundle ended up with two instances of the same module
|
||||
* and the IIFE threw "Identifier 'Ge' has already been declared" on evaluation — a hard
|
||||
* error that killed every gospel leaf while the SRI hash still matched and the page still
|
||||
* returned 200. Importing it from here instead means there is exactly one.
|
||||
*/
|
||||
export const EN_MESSAGES = messages.en || {}
|
||||
|
||||
export const SUPPORTED_LOCALES = ['ar', 'de', 'en', 'es', 'fr', 'hi', 'it', 'pt', 'ro', 'ru', 'zh']
|
||||
|
||||
export const RTL_LOCALES = new Set(['ar'])
|
||||
|
|
|
|||
|
|
@ -195,7 +195,9 @@
|
|||
"check:embed-base": "node internal/check-embed-base-resolution.mjs",
|
||||
"check:composed-filters": "node internal/check-gospel-composed-filters.mjs",
|
||||
"app:start-page": "node internal/set-app-start-page.mjs",
|
||||
"check:app-start-page": "node internal/set-app-start-page.mjs --check"
|
||||
"check:app-start-page": "node internal/set-app-start-page.mjs --check",
|
||||
"check:leaves-mount": "node internal/check-gospel-leaves-mount.mjs",
|
||||
"check:leaves-mount:poison": "node internal/check-gospel-leaves-mount.mjs --poison"
|
||||
},
|
||||
"//scripts": {
|
||||
"_": "What each script does. These notes used to sit inside the command strings as trailing \"# …\" comments, which made the shell discard any arguments passed after \"--\" (so a gate given --url silently measured its hardcoded default port — possibly another agent's server). Keep notes here, never in a command.",
|
||||
|
|
@ -294,7 +296,8 @@
|
|||
"check:composed-filters": "CELL C — the gospel map composed above its own tables. Asserts the composite keeps the reader INSIDE it: \"Every resource in <language>\" must be a <button> that filters in place, not an <a> that navigates away and throws out the map the reader just positioned. Checks the tag, that the URL did not change, that the table NARROWED (row count down but not to zero), that the pin count survived, and that nothing 4xx'd. Picks a tier-2 pin from the live source — the first version opened pin 0, a group with nothing found, and failed a working composite on an empty table. Browser gate: run under both rendezvous locks, product lock first.",
|
||||
"check:vision-card-numbers": "the DOXA Vision Card must show the numbers the DATA gives: independently recomputes all four funnel steps (and DOXA-in-frontier) from people_groups.csv + the saved DOXA list, compares with vision-funnel.json, and with --url also with the numbers painted in the card. A typed-in number, a stale funnel file or a rendering bug fails it.",
|
||||
"check:map-embed-cells": "PRODUCTION-MATRIX cells B (iframe) and C (script embed) for the seven Research Gallery maps on a genuinely foreign origin (tree on 127.0.0.1, partner page on localhost). C passes the HOST a distinct token and fails if any Mapbox request uses another. --only bundle/profile,… --cell B|C.",
|
||||
"check:gallery-embed:live-cors": "the Research Gallery on a foreign page under the LIVE static layer's CORS rule (Access-Control-Allow-Origin on files inside the tree's folders, NOT on the root manifest.json, measured on nuxtbase): it must still boot every tab, by reading the CORS-readable manifest copy generate-tree writes beside its bundle."
|
||||
"check:gallery-embed:live-cors": "the Research Gallery on a foreign page under the LIVE static layer's CORS rule (Access-Control-Allow-Origin on files inside the tree's folders, NOT on the root manifest.json, measured on nuxtbase): it must still boot every tab, by reading the CORS-readable manifest copy generate-tree writes beside its bundle.",
|
||||
"check:leaves-mount": "DID THE ELEMENT ACTUALLY MOUNT, on all five gospel leaves. Exists because a ReferenceError thrown during setup dies INSIDE the custom-element boundary: the page loads, every asset returns 200, pageerror fires zero times, and the element sits there with an empty shadow root. A healthy-looking dead page. This asks the cheap unambiguous question the rich gates are too slow to ask on every leaf — is anything there — in five steps that each name their own failure: tag defined, host present, shadowRoot attached, shadow root non-empty, visible text rendered. It does NOT trust the absence of console errors; zero errors is not the same as working. --poison for the negative test."
|
||||
},
|
||||
"devDependencies": {
|
||||
"@capacitor/android": "^7.6.9",
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
* inlining it into the IIFE would block first paint for every profile in the bundle).
|
||||
*/
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import enGospel from '@map/i18n/locales/en/gospel.json'
|
||||
import { EN_MESSAGES } from '@map/i18n/index.js'
|
||||
import { computed, inject, ref, watch } from 'vue'
|
||||
import BarChart from '@map/components/charts/BarChart.vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
|
|
@ -54,7 +54,7 @@ import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
|||
/* Guarded like every other useI18n() in this bundle — the host may never have installed it,
|
||||
and the shipped English catalogue is the fallback rather than a broken key. */
|
||||
const enLookup = (key) =>
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), enGospel)
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), EN_MESSAGES.gospel || {})
|
||||
let tr = (key) => enLookup(key) ?? String(key)
|
||||
try {
|
||||
const i18n = useI18n()
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
*/
|
||||
import { computed, inject, ref, watch } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import enGospel from '@map/i18n/locales/en/gospel.json'
|
||||
import { EN_MESSAGES } from '@map/i18n/index.js'
|
||||
import DataTable from '@map/components/tables/DataTable.vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { resolveAssetsBase } from '@map/utils/embedBase.js'
|
||||
|
|
@ -36,7 +36,7 @@ const assetsBase = computed(() => resolveAssetsBase(profileConfig.value))
|
|||
the labels would silently render as whatever the tab object stringifies to. Guarded like
|
||||
every other useI18n() call in this bundle: the host may never have installed i18n. */
|
||||
const enLookup = (key) =>
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), enGospel)
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), EN_MESSAGES.gospel || {})
|
||||
let tr = (key) => enLookup(key) ?? String(key)
|
||||
try {
|
||||
const i18n = useI18n()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<script setup>
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import enGospel from '@map/i18n/locales/en/gospel.json'
|
||||
import { EN_MESSAGES } from '@map/i18n/index.js'
|
||||
import { resourceRows } from './gospel-resource-rows.js'
|
||||
/**
|
||||
* resources-list.vue — GOSPEL RESOURCES, by language.
|
||||
|
|
@ -45,7 +45,7 @@ import { resolveAssetsBase } from '@map/utils/embedBase.js'
|
|||
/* Guarded like every other useI18n() in this bundle — the host may never have installed it,
|
||||
and the shipped English catalogue is the fallback rather than a broken key. */
|
||||
const enLookup = (key) =>
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), enGospel)
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), EN_MESSAGES.gospel || {})
|
||||
let tr = (key) => enLookup(key) ?? String(key)
|
||||
try {
|
||||
const i18n = useI18n()
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@
|
|||
*/
|
||||
import { computed, inject, ref, shallowRef, markRaw, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import enGospel from '@map/i18n/locales/en/gospel.json'
|
||||
import { EN_MESSAGES } from '@map/i18n/index.js'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { addMapAttribution } from '@map/composables/useMapAttribution'
|
||||
|
||||
|
|
@ -657,7 +657,7 @@ const pinsByIso = computed(() => {
|
|||
key. Returning the last dot-segment would have put "gap" and "deathsDay" on screen — a
|
||||
broken-looking label is not graceful degradation, it just moves the bug. */
|
||||
const enLookup = (key) =>
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), enGospel)
|
||||
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), EN_MESSAGES.gospel || {})
|
||||
let t = (key) => enLookup(key) ?? String(key)
|
||||
try {
|
||||
const i18n = useI18n()
|
||||
|
|
|
|||
12
public/doxa-maps/doxa-maps-spa/manifest.json
generated
12
public/doxa-maps/doxa-maps-spa/manifest.json
generated
|
|
@ -579,7 +579,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "doxa-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj",
|
||||
"integrity": "sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -599,7 +599,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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -613,7 +613,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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -627,7 +627,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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -641,7 +641,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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -655,7 +655,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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L" 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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L" 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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
102
public/doxa-maps/gospel-resources/gospel-resources.js
generated
102
public/doxa-maps/gospel-resources/gospel-resources.js
generated
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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L" 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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L" 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
|
|
@ -579,7 +579,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "doxa-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj",
|
||||
"integrity": "sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -599,7 +599,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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -613,7 +613,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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -627,7 +627,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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -641,7 +641,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-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -655,7 +655,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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-SNFMlwKISnpQzfZl8S6ClWBB/LgxXsvmaw6Wupl9vaQkOigNwwExruJn8u2H5oDj\" 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": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PEvIo9qJtlQUr7v+NdWX8BDcKxd5n6HrtzM7961RqfzHThKAs3GQ7xxUI5zGtY3L\" 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