Keep the library layer namespace in the layer lifecycle package

The core layer lifecycle imported the whole Data Library manifest
contract only to check the lib- prefix, so the layer-lifecycle package
owned a feature module. The namespace rule (prefix, entry id pattern,
the two id helpers) now lives in src/data/libraryLayerIds.js, which the
lifecycle owns; the manifest contract imports and re-exports it, so
library callers are unchanged.
This commit is contained in:
Sameh Khamis committed 2026-11-12 16:04:55 -08:00
1 parent 9e57fd84c8
commit 1a657e2a64
4 files changed
+38 -16

No files matched your search

+2 -1
View File
@@ -3500,6 +3500,7 @@
"src/voice/geminiCaptureWorklet.js", "src/voice/geminiCaptureWorklet.js",
"src/ui/libraryBrowser.js", "src/ui/libraryBrowser.js",
"src/library/manifest.js", "src/library/manifest.js",
"src/data/libraryLayerIds.js",
"src/library/selection.js", "src/library/selection.js",
"src/library/ledger.json", "src/library/ledger.json",
"src/library/entries/ak-statewide-imagery.json", "src/library/entries/ak-statewide-imagery.json",
@@ -4571,7 +4572,7 @@
"modules": [ "modules": [
"src/data/lifecycle.js", "src/data/lifecycle.js",
"src/data/cameraArrival.js", "src/data/cameraArrival.js",
"src/library/manifest.js" "src/data/libraryLayerIds.js"
], ],
"external": [] "external": []
}, },
+22
View File
@@ -0,0 +1,22 @@
/**
* The Data Library's layer namespace, owned by the layer lifecycle: the
* manager accepts a late registration only under `lib-<entry id>`, and the
* library names its layers with the same rule.
*/
/** A library entry id: lowercase, digits and hyphens, 3–48 characters. */
export const LIBRARY_ID_PATTERN = /^[a-z0-9][a-z0-9-]{2,47}$/;
export const LIBRARY_LAYER_PREFIX = 'lib-';
/** The manager id a library entry's layer registers under. */
export function libraryLayerId(entryId) {
return `${LIBRARY_LAYER_PREFIX}${entryId}`;
}
/** The entry id behind a library layer id, or null. */
export function libraryEntryIdOf(layerId) {
if (typeof layerId !== 'string' || !layerId.startsWith(LIBRARY_LAYER_PREFIX))
return null;
const id = layerId.slice(LIBRARY_LAYER_PREFIX.length);
return LIBRARY_ID_PATTERN.test(id) ? id : null;
}
+1 -1
View File
@@ -1,5 +1,5 @@
import { cancelCameraArrival } from './cameraArrival.js'; import { cancelCameraArrival } from './cameraArrival.js';
import { libraryEntryIdOf } from '../library/manifest.js'; import { libraryEntryIdOf } from './libraryLayerIds.js';
function cloneLayerParams(value) { function cloneLayerParams(value) {
if (Array.isArray(value)) return value.map(cloneLayerParams); if (Array.isArray(value)) return value.map(cloneLayerParams);
+13 -14
View File
@@ -10,6 +10,12 @@
* this module, so it loads no catalogs and touches no DOM. See * this module, so it loads no catalogs and touches no DOM. See
* docs/DATA-LIBRARY.md for the authoring guide. * docs/DATA-LIBRARY.md for the authoring guide.
*/ */
import {
LIBRARY_ID_PATTERN,
LIBRARY_LAYER_PREFIX,
libraryEntryIdOf,
libraryLayerId,
} from '../data/libraryLayerIds.js';
/** The three entry kinds this build renders. */ /** The three entry kinds this build renders. */
export const LIBRARY_KINDS = Object.freeze(['dataset', 'tiles', 'pack']); export const LIBRARY_KINDS = Object.freeze(['dataset', 'tiles', 'pack']);
@@ -88,8 +94,6 @@ export const LIBRARY_FAMILIES = Object.freeze([
/** Host layers a `pack` entry may extend, with the env switch grammar. */ /** Host layers a `pack` entry may extend, with the env switch grammar. */
export const PACK_HOSTS = Object.freeze(['cctv']); export const PACK_HOSTS = Object.freeze(['cctv']);
export const LIBRARY_ID_PATTERN = /^[a-z0-9][a-z0-9-]{2,47}$/;
export const LIBRARY_LAYER_PREFIX = 'lib-';
export const DEFAULT_CACHE_SECONDS = 3600; export const DEFAULT_CACHE_SECONDS = 3600;
export const MIN_CACHE_SECONDS = 60; export const MIN_CACHE_SECONDS = 60;
export const MAX_CACHE_SECONDS = 86_400; export const MAX_CACHE_SECONDS = 86_400;
@@ -742,18 +746,13 @@ export function validateLibraryCatalog(manifests) {
return { ok: errors.length === 0, errors, entries }; return { ok: errors.length === 0, errors, entries };
} }
/** The manager id a library entry's layer registers under. */ // The layer namespace belongs to the layer lifecycle; the library reads it.
export function libraryLayerId(entryId) { export {
return `${LIBRARY_LAYER_PREFIX}${entryId}`; LIBRARY_ID_PATTERN,
} LIBRARY_LAYER_PREFIX,
libraryEntryIdOf,
/** The entry id behind a library layer id, or null. */ libraryLayerId,
export function libraryEntryIdOf(layerId) { };
if (typeof layerId !== 'string' || !layerId.startsWith(LIBRARY_LAYER_PREFIX))
return null;
const id = layerId.slice(LIBRARY_LAYER_PREFIX.length);
return LIBRARY_ID_PATTERN.test(id) ? id : null;
}
/** /**
* Whether the operator switched an opt-in entry on. `GEV_LIBRARY_ENABLE` * Whether the operator switched an opt-in entry on. `GEV_LIBRARY_ENABLE`