CDS pluginCDS plugintypeInstalls into a CAP project and extends the runtime. CAP loads it through cds.requires or the plugin hook.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

cap-js-geoloc-plugin

A CAP plugin for geocoding, address correction and route calculation, driven by three annotations on the model, with the geocoder and router chosen in configuration from providers such as OSRM and Nominatim.

Three annotations on a CAP entity do the work: @AddressSearch puts a selection popup on an address field, @AddressAutoCorrect geocodes what was typed and writes the corrected address back into a second field, and @RouteCalculation fills in distance and duration between two coordinate fields. The provider is named in configuration rather than in code, a geocoder and a router chosen from OSRM, Nominatim, OpenRouteService, LocationIQ, HERE, Mapbox and Google Maps and set through GEOLOC_ environment variables; the defaults, OSRM for routing and Nominatim for geocoding, need no API key. Answers are cached, thirty days by default, and the pause between geocoding calls is configurable; the free Nominatim tier allows one request per second.

Facts

Latestv1.0.1ReleasedLicenceMIT

Where it sits

Lives in
Provides
Fiori annotationsCAPFiori annotationscapabilityDescribing a service so a Fiori client can render it without hand-written UI code — titles, value helps, hierarchies and visibility expressed as model annotations rather than screen logic.Location servicesCAPLocation servicescapabilityPutting a place on business data from a location provider: an address turned into coordinates or corrected, a base map to draw on, and a route with its distance and duration between two or more points. Storing geometries in the database and querying them there is [graph, spatial and document data](capability:multi-model-data).
Flavors
Node.jsfrom its runtime
Requires
@sap/cds≥ 8@sap/cdsartifactThe peer range, as published.

Who is behind it

sebsst

Before choosing this

Conditions

LicenceSAP Developer License Agreement 3.2 CAP§ 1, 2, 3A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.
  • § 1 License. Productive customer applications are limited to SAP BTP or another SAP-licensed platform, and mass extraction to a non-SAP product is restricted except where solely required for SAP interoperability.
  • § 2 Intellectual Property. The agreement retains SAP's rights in the covered materials and limits making APIs, tools or software available to third parties, while preserving ownership of customer applications subject to SAP's underlying rights.
  • § 3 Artificial Intelligence Training. The agreement prohibits use of the covered materials and customer applications for training artificial-intelligence models or systems.
SAP Developer License Agreement 3.2 CAP →
PracticalFunctional boundary

Nothing about it is readable from outside the package: there is no repository, no issue tracker, and the npm page carries no readme, so the README, the examples and the changelog can be read only from the tarball or a CDN mirror, and a bug has nowhere to be filed. Provider URLs are called from the plugin with API keys taken from environment variables in a .env file, so on BTP no call resolves through a destination and the keys live in the environment. The npm line stops at 1.0.1 on 3 November 2025; the changelog shipped inside that version is headed v2.1, so the version npm shows and the version the author counts are not the same.

What it declares

Every artifact

Type
CDS plugin
Origin
Independently maintained
Runtime
Node.js

As a CDS plugin

Declared for
>=8
Distributed through
npm

Connections2

cap-js-geoloc-plugin connectionscap-js-geoloc-pluginPROVIDES→ provides2provides stated Generates the actions its own annotations imply, searchAddress_*, calculateRoute and selectAddress, so an annotated address field gets its selection popup and a route its calculation without either being written into the service. Where @RouteCalculation sets autoCalculate, it also injects the SideEffects that refresh distance and duration after a save. The SideEffects that tie the search actions to the suggestions list are not injected: the examples file offers them as annotations to add. cap-js-geoloc-plugin 1.0.1 — README: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/README.md cap-js-geoloc-plugin 1.0.1 — README: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/README.md cap-js-geoloc-plugin 1.0.1 — README: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/README.md cap-js-geoloc-plugin 1.0.1 — EXAMPLES: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/EXAMPLES.md cap-js-geoloc-plugin 1.0.1 — EXAMPLES: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/EXAMPLES.mdFiori annotationsprovides stated Address search, address correction and route calculation with distance and duration, driven from @AddressSearch, @AddressAutoCorrect and @RouteCalculation on the model and answered by the geocoding and routing provider the configuration names; the defaults, Nominatim and OSRM, need no API key. cap-js-geoloc-plugin 1.0.1 — README: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/README.md cap-js-geoloc-plugin 1.0.1 — README: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/README.md cap-js-geoloc-plugin 1.0.1 — README: https://cdn.jsdelivr.net/npm/cap-js-geoloc-plugin@1.0.1/README.mdLocation services

Install

npm add cap-js-geoloc-plugin

Derived from the package name. No recipe recorded; the README has the configuration.

README

quoted from cap-js-geoloc-plugin@1.0.1 under MIT, read
cap-js-geoloc-plugin@1.0.1/README.mdOn npm

🌍 GeolocPlugin - address search/validation and route calculation CAP Plugin

Geolocation plugin for SAP CAP.

Add annotations → The plugin allows, address search, address auto correct and route calculation (duration, distance)

Features

  • Address Search: Automatic selection popup
  • Address Auto-Correction: Automatic geocoding and normalization
  • Route Calculation: Distances and durations in one click
  • Optimized Cache: Drastic reduction of API calls
  • Multi-transport: Car, bike, pedestrian (depends on chosen provider)

Installation

npm install cap-js-geoloc-plugin

In your package.json:

{
 "cds": {
    "requires": {
      "cap-js-geoloc-plugin": {}
    }
  }
}

Create .env file based on .env.example define PROVIDERS and API keys


Usage

Annotate your fields
// db/schema.cds
entity Routes {
  key ID : UUID;

  // Automatic address search with @AddressSearch
  @AddressSearch: true
  startingPoint : String(500);
  startingPointCoordinates : String(50);

  @AddressSearch: true
  endingPoint : String(500);
  endingPointCoordinates : String(50);

  // Automatic calculation with @RouteCalculation
  @RouteCalculation: {
    from: 'startingPointCoordinates',
    to: 'endingPointCoordinates',
    mode: 'transportMode',
    distanceField: 'distance',
    durationField: 'duration',
    autoCalculate: true  // Automatic calculation on save when coordinates change
  }
  distance : Decimal(10, 2);
  duration : String;
  transportMode : String default 'car';
}
Declare your service (as usual)
// srv/routes-service.cds
using { myapp as db } from '../db/schema';

service RoutesService {
  @odata.draft.enabled
  entity Routes as projection on db.Routes;
}
No JavaScript code needed!** The plugin works automatically with annotations only

The plugin automatically detects and creates:

  • @AddressSearch fields → Search popups
  • @RouteCalculation fields → Calculate Route button
  • All actions (searchAddress_*, calculateRoute, selectAddress) → Auto-generated
  • All handlers → Auto-registered
  • @AddressAutoCorrect automatic correction adress according to country format and can be parsed to additional fields (country, street...)
  • @AddressSearch and @AddressAutoCorrect can be combined

Optional: If you need custom validation, create a service handler:

// srv/routes-service.js (OPTIONAL)
module.exports = function() {
  this.before('CREATE', 'Routes', async (req) => {
    // Your custom validation here
  });
};

User Workflow

  1. Type "Paris" in the startingPoint field
  2. Click on "🔍 Search Starting Point"
  3. Choose an address from the popup
  4. Done: startingPoint and startingPointCoordinates are automatically filled
Route Calculation
  1. Validate both addresses (starting point + destination)
  2. Click on "🚗 Calculate Route"
  3. Done: distance and duration are automatically calculated

Advanced Features

Automatic Route Calculation on Save

Enable automatic route calculation when coordinates change by setting autoCalculate: true:

entity Routes {
  @RouteCalculation: {
    from: 'startingPointCoordinates',
    to: 'endingPointCoordinates',
    mode: 'transportMode',
    distanceField: 'distance',
    durationField: 'duration',
    autoCalculate: true  // Enables auto-calculation AND auto-refresh in Fiori UI
  }
  distance : Decimal(10, 2);
  duration : String;
  calculatedAt : DateTime;  // Optional: will auto-refresh if present
  mapImageURL : String;     // Optional: will auto-refresh if present
}

How it works:

  • When you CREATE a route with both coordinates filled, distance and duration are automatically calculated
  • When you UPDATE the from or to coordinates, the route is automatically recalculated
  • Fiori UI auto-refreshes: SideEffects are automatically injected - no manual annotations needed!
  • If the calculation fails, the save operation continues (non-blocking)
  • The "Calculate Route" button is still available for manual recalculation
Auto-Correction with @AddressAutoCorrect

Automatically geocode and normalize addresses when users type them:

entity Routes {
  @AddressAutoCorrect: {
    correctedField: 'correctedStartingPoint',
    coordinatesField: 'startingPointCoordinates',
    cityField: 'startingPointCity',
    streetField: 'startingPointStreet'
  }
  startingPoint : String(500);          // User input
  correctedStartingPoint : String(500);  // Auto-filled with formatted address
  startingPointCoordinates : String(50); // Auto-filled with coordinates
  startingPointCity : String(100);       // Auto-filled with city
  startingPointStreet : String(100);     // Auto-filled with street
}

How it works:

  1. User types: "21 rue liberte dijon" (with typos)
  2. On CREATE/UPDATE, the plugin automatically:
    • Geocodes the address
    • Fills correctedStartingPoint: "21 Rue de la Liberté, 21000 Dijon, France" (formatted by country)
    • Fills startingPointCoordinates: "47.3220, 5.0415"
    • Fills startingPointCity: "Dijon"
    • Fills startingPointStreet: "Rue de la Liberté"

Country-specific formatting:

The plugin automatically formats addresses according to each country's conventions:

  • France: "23 rue des Pigeons, 67000 Strasbourg"
  • Germany: "Musterstraße 23, 10115 Berlin"
  • UK: "10 Downing Street, London SW1A 2AA"
  • USA: "123 Main Street, New York, NY 10001"
  • Spain: "Calle Mayor 23, 28013 Madrid"
  • Italy: "Via Roma 123, 00100 Roma"
  • And 20+ more countries...

The plugin detects the country from geocoding results (works with country names in multiple languages: English, French, German, Spanish, Italian, Dutch, and native names).

Manual override for non-existent addresses:

For new streets or addresses not yet in geocoding databases, you can bypass automatic geocoding:

entity Routes {
  @AddressAutoCorrect: {
    correctedField: 'correctedStartingPoint',
    coordinatesField: 'startingPointCoordinates',
    manualOverrideField: 'isManualAddress'  // Flag to skip geocoding
  }
  startingPoint : String(500);
  correctedStartingPoint : String(500);
  startingPointCoordinates : String(50);
  isManualAddress : Boolean default false;  // Set to true to skip geocoding
}

How it works:

  • If isManualAddress = true → geocoding is skipped, you can enter any address and coordinates manually
  • If isManualAddress = false → normal geocoding and validation
  • Useful for construction sites, new developments, or addresses not yet in mapping databases

Simple notation (only corrected field):

@AddressAutoCorrect: 'correctedStartingPoint'
startingPoint : String(500);
correctedStartingPoint : String(500);

Fiori Interface (Optional)

If you want to customize the Fiori UI, add annotations:

// app/routes/annotations.cds
using { RoutesService } from '../../srv/routes-service';

// Buttons in the header
annotate RoutesService.Routes with @(
  UI.Identification : [
    {
      $Type : 'UI.DataFieldForAction',
      Action : 'RoutesService.calculateRoute',
      Label : '🚗 Calculate Route',
      ![@UI.Hidden] : {$edmJson: {$Path: 'IsActiveEntity'}}
    }
  ]
);

Configuration (Optional)

Create a .env file to customize:

# Geocoding (Free Nominatim by default)
GEOLOC_GEOCODING_PROVIDER=nominatim
GEOLOC_GEOCODING_DELAY=1000  # Rate limit: ms between requests (1000 = 1 req/sec)

# Routing (Free OSRM by default)
GEOLOC_ROUTING_PROVIDER=osrm
GEOLOC_ROUTING_PROFILE=car  # car | bike | foot

# Cache
GEOLOC_CACHE_ENABLED=true
GEOLOC_CACHE_TTL=2592000  # 30 days

.env.example:
# =============================================================================
# GeolocPlugin Configuration
# =============================================================================

# -----------------------------------------------------------------------------
# ROUTING - Real distance calculation by route
# -----------------------------------------------------------------------------

# Routing provider: 'osrm' | 'openrouteservice' | 'locationiq' | 'googlemaps' | 'mapbox' | 'here'
# - osrm: FREE, unlimited, no API key required (recommended)
# - openrouteservice: Free up to 2,500 req/day (API key required)
# - locationiq: Free up to 5,000 req/day (API key required)
# - googlemaps: Pay-as-you-go (API key required, $5 per 1000 requests)
# - mapbox: Free up to 100,000 req/month (API key required)
# - here: Free up to 250,000 req/month (API key required)
GEOLOC_ROUTING_PROVIDER=osrm

# Default transport profile: 'car' | 'bike' | 'foot'
GEOLOC_ROUTING_PROFILE=car

# Fallback to OSRM on error: 'true' | 'false'
GEOLOC_ROUTING_FALLBACK=true

# -----------------------------------------------------------------------------
# API KEYS (optional - only if you're not using OSRM)
# -----------------------------------------------------------------------------

# OpenRouteService API Key (free: https://openrouteservice.org/dev/#/signup)
OPENROUTESERVICE_API_KEY=

# LocationIQ API Key (free: https://locationiq.com/register)
LOCATIONIQ_API_KEY=

# Google Maps API Key (pay-as-you-go: https://console.cloud.google.com/google/maps-apis)
# Enable "Directions API" in your Google Cloud Console
GOOGLE_MAPS_API_KEY=

# Mapbox API Key (free: https://account.mapbox.com/auth/signup/)
# Free tier: 100,000 requests/month
MAPBOX_API_KEY=

# HERE API Key (free: https://developer.here.com/sign-up)
# Free tier: 250,000 requests/month
HERE_API_KEY=

# -----------------------------------------------------------------------------
# GEOCODING - Address validation and normalization
# -----------------------------------------------------------------------------

# Geocoding provider: 'nominatim' | 'openrouteservice' | 'locationiq' | 'googlemaps' | 'here' | 'mapbox'
# - nominatim: FREE, limited to 1 req/sec (no API key required, recommended for development)
# - openrouteservice: Uses your existing quota (API key required, shared with routing)
#   does not allow full address search in free mode
# - locationiq: Uses your existing quota (API key required, shared with routing)
# - googlemaps: Pay-as-you-go, excellent quality (API key required, enable "Geocoding API")
# - here: Free up to 250,000 req/month, excellent quality (API key required)
# - mapbox: Free up to 100,000 req/month, excellent quality (API key required)
# Note: API keys for googlemaps, here, and mapbox are shared with routing if configured
GEOLOC_GEOCODING_PROVIDER=nominatim

# Rate limiting: delay in milliseconds between geocoding requests (applies to ALL providers)
# Default: 1000ms (1 second) - respects Nominatim usage policy
# Set to 0 to disable rate limiting (useful for paid APIs with higher limits)
# Examples: 1000 = 1 req/sec | 500 = 2 req/sec | 200 = 5 req/sec | 0 = no limit
GEOLOC_GEOCODING_DELAY=1000

# -----------------------------------------------------------------------------
# CACHE - API call optimization
# -----------------------------------------------------------------------------

# Enable cache: 'true' | 'false'
GEOLOC_CACHE_ENABLED=true

# Cache time-to-live in seconds (30 days = 2592000)
GEOLOC_CACHE_TTL=2592000

# Maximum number of cache entries
GEOLOC_CACHE_MAX_SIZE=1000

# =============================================================================
# CONFIGURATION EXAMPLES
# =============================================================================

# -----------------------------------------------------------------------------
# Example 1: FREE configuration (OSRM + Nominatim)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=osrm
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_GEOCODING_PROVIDER=nominatim
# GEOLOC_CACHE_ENABLED=true
#
# → 100% free, unlimited (OSRM)
# → No API key required

# -----------------------------------------------------------------------------
# Example 2: Production with OpenRouteService (2,500 req/day)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=openrouteservice
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_ROUTING_FALLBACK=true
# GEOLOC_GEOCODING_PROVIDER=openrouteservice
# OPENROUTESERVICE_API_KEY=your-api-key-here
# GEOLOC_CACHE_ENABLED=true
#
# → Routing AND Geocoding via OpenRouteService (shared quota)
# → Fallback to OSRM if routing quota exceeded

# -----------------------------------------------------------------------------
# Example 3: Production with LocationIQ (5,000 req/day)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=locationiq
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_ROUTING_FALLBACK=true
# GEOLOC_GEOCODING_PROVIDER=locationiq
# LOCATIONIQ_API_KEY=your-api-key-here
# GEOLOC_CACHE_ENABLED=true
#
# → Routing AND Geocoding via LocationIQ (shared quota)
# → Fallback to OSRM if routing quota exceeded

# -----------------------------------------------------------------------------
# Example 4: Bike application
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=osrm
# GEOLOC_ROUTING_PROFILE=bike
# GEOLOC_CACHE_ENABLED=true
#
# → Uses bike paths for routing

# -----------------------------------------------------------------------------
# Example 5: Mix OSRM (routing) + LocationIQ (geocoding)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=osrm
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_GEOCODING_PROVIDER=locationiq
# LOCATIONIQ_API_KEY=your-api-key-here
# GEOLOC_CACHE_ENABLED=true
#
# → Free unlimited routing (OSRM)
# → Geocoding via LocationIQ (5,000 req/day)
# → Optimal: LocationIQ quota saved for geocoding only

# -----------------------------------------------------------------------------
# Example 6: Disable cache (development/debug)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=osrm
# GEOLOC_GEOCODING_PROVIDER=nominatim
# GEOLOC_CACHE_ENABLED=false
#
# → All requests call the API (useful for testing)

# -----------------------------------------------------------------------------
# Example 7: Production with Google Maps Directions API
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=googlemaps
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_ROUTING_FALLBACK=true
# GOOGLE_MAPS_API_KEY=your-api-key-here
# GEOLOC_GEOCODING_PROVIDER=nominatim
# GEOLOC_CACHE_ENABLED=true
#
# → High accuracy routing via Google Maps (pay-as-you-go)
# → Fallback to OSRM if quota exceeded
# → Free geocoding via Nominatim

# -----------------------------------------------------------------------------
# Example 8: Production with Mapbox Directions API (100k req/month free)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=mapbox
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_ROUTING_FALLBACK=true
# MAPBOX_API_KEY=your-api-key-here
# GEOLOC_GEOCODING_PROVIDER=nominatim
# GEOLOC_CACHE_ENABLED=true
#
# → Routing via Mapbox (100,000 free requests/month)
# → Fallback to OSRM if quota exceeded
# → Free geocoding via Nominatim

# -----------------------------------------------------------------------------
# Example 9: Production with HERE Maps Routing API (250k req/month free)
# -----------------------------------------------------------------------------
# GEOLOC_ROUTING_PROVIDER=here
# GEOLOC_ROUTING_PROFILE=car
# GEOLOC_ROUTING_FALLBACK=true
# HERE_API_KEY=your-api-key-here
# GEOLOC_GEOCODING_PROVIDER=nominatim
# GEOLOC_CACHE_ENABLED=true
#
# → Routing via HERE Maps (250,000 free requests/month)
# → Fallback to OSRM if quota exceeded
# → Free geocoding via Nominatim
# → Best free tier option (highest quota)



Available Providers
Routing Providers
ProviderFreeLimitAPI KeyUse Case
OSRMYesUnlimited*NoDevelopment
OpenRouteService2500/day2500 req/dayYesProduction
LocationIQ5000/day5000 req/dayYesProduction
Google MapsPay-as-you-go$5/1000 reqYesEnterprise
HERE250000/month250k req/monthYesProduction
Mapbox100000/month100k req/monthYesProduction
ProviderFreeLimitAPI KeyQuality
NominatimYes1 req/sec*NoGood (OSM data)
LocationIQ5000/day5,000 req/dayYesGood (OSM data)
OpenRouteService2500/day2,500 req/dayYesLimited features
Google MapsPay-as-you-go$5/1,000 reqYesExcellent
HERE250000/month250k req/monthYesExcellent
Mapbox100,000/month100k req/monthYesExcellent

*Fair use policy applies (no SLA)


Programmatic API (Optional)

If you want to use the plugin directly in your code:

Geocoding
const GeolocPlugin = require('geoloc-plugin');

// Validate an address
const result = await GeolocPlugin.geocoding.validateAddress('Paris, France');
// → { formatted: "Paris, Île-de-France, France", coordinates: "48.8566,2.3522", ... }

// Search for multiple suggestions
const results = await GeolocPlugin.geocoding.searchAddress('Lyon', 10);
// → { found: true, count: 10, results: [...] }
Routing
// Calculate a route
const route = await GeolocPlugin.routing.calculateRoute(
  '48.8566,2.3522',  // Paris
  '45.7640,4.8357',  // Lyon
  'car'
);
// → { distanceKm: 465.87, durationMinutes: 297, formattedDuration: "4h 57min" }

🎓 Complete Documentation


Development


Contributing

Contributions are welcome! Create an issue or pull request.


MIT, read

History

Latest

v1.0

Other 2

Notes

Users need to:

  1. Annotate fields with @AddressSearch: true
  2. Include the AddressSuggestions entity via using { geoloc.plugin } from 'geoloc-plugin/cds/address-suggestions-mixin'
  3. Declare actions in the CDS service
🔮 Future Roadmap
  • Automatic generation of actions in CSN
  • Support for additional providers (on request)

9downloads per week, npm
Weekly downloads for cap-js-geoloc-plugin26 complete calendar weeks from 2026-04-27 to 2026-10-25; the latest total is 9.27 Apr – 3 May: 34 May – 10 May: 1211 May – 17 May: 618 May – 24 May: 425 May – 31 May: 61 Jun – 7 Jun: 28 Jun – 14 Jun: 515 Jun – 21 Jun: 122 Jun – 28 Jun: 629 Jun – 5 Jul: 26 Jul – 12 Jul: 513 Jul – 19 Jul: 220 Jul – 26 Jul: 227 Jul – 2 Aug: 23 Aug – 9 Aug: 610 Aug – 16 Aug: 217 Aug – 23 Aug: 324 Aug – 30 Aug: 431 Aug – 6 Sept: 87 Sept – 13 Sept: 514 Sept – 20 Sept: 721 Sept – 27 Sept: 628 Sept – 4 Oct: 55 Oct – 11 Oct: 212 Oct – 18 Oct: 419 Oct – 25 Oct: 9

Others providing13

Fiori annotations
  1. com.sap.cds:cds-services-bomMaven bill of materials pinning CAP Java module versions
  2. urp-vocabCDS vocabulary for User-Rendered Patterns display annotations
  3. @mpah/enum-value-helpCAP plugin generating value help for enum fields from an annotation
  4. @sap/cds-fioriFiori draft handling and UI-facing behaviour for CAP services
  5. @sap/cdsCAP Node.js runtime
  6. @sap/generator-fioriEntry point for generating a Fiori application from a template
  7. @sap-ux/cds-annotation-parserParser for annotations in CDS source
  8. @sap/ux-cds-compiler-facadeWrapper around the CDS compiler for annotation handling
  9. @sap-ux/cds-odata-annotation-converterConverter from CDS annotations to their OData form
  10. @sap/ux-cds-odata-language-server-extensionOData annotation features for the @sap/vscode-cds extension
  11. @sap-ux/fiori-annotation-apiProgrammatic API for reading and writing project annotations
  12. @sap-ux/odata-vocabulariesOASIS and SAP OData vocabularies with a VocabularyService
  13. cap-user-infoUser details and quickview links for createdBy and modifiedBy

Details

Sources3
npm registrydiscovered here, keywords:cdschecked
npm registry, cap-js-geoloc-pluginversion, releases, installschecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
runtimesnode
declared for>=8
latestv1.0.1
first release
releases and cadence1
discovered vianpm registry · keywords:cds
first seen in the atlas
ecosystem and domaincap, integration-and-messaging
History in the atlas5
  1. The package was re-read on 2026-09-18. Its README, examples file and changelog name no destination and no destination service; providers are addressed by URL with API keys read from GEOLOC_ environment variables in a .env file, which is what the entry's own when_not_to_use already said. A requires edge points at what the README names, and this one pointed at the opposite.
  2. capability:fiori-annotations: generated actions, SideEffects under autoCalculate, search SideEffects left to the developer
  3. one_line, what_it_solves, when_not_to_use
  4. capability:fiori-annotations, capability:location-services
  5. First seen.
For your agent
Ref
artifact:sebsst-cap-js-geoloc-plugin
JSON
/artifacts/sebsst-cap-js-geoloc-plugin.json
MCP
Connecting an agent