@documentation-robotics/cli 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -16
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/active-analyzer.js +62 -0
- package/dist/analyzers/active-analyzer.js.map +7 -0
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +191 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/extract.js +138 -0
- package/dist/analyzers/cards/extract.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/routes.js +96 -0
- package/dist/analyzers/cards/routes.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +270 -174
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +342 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/code-changes.js +159 -0
- package/dist/analyzers/code-changes.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +49 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/extraction-plan.js +541 -0
- package/dist/analyzers/extraction-plan.js.map +7 -0
- package/dist/analyzers/index-job.js +229 -0
- package/dist/analyzers/index-job.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +23 -11
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +269 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +7 -4
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +143 -40
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +63 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +80 -29
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/init.js +9 -26
- package/dist/commands/init.js.map +2 -2
- package/dist/commands/mcp.js +40 -21
- package/dist/commands/mcp.js.map +3 -3
- package/dist/commands/relationship.js +208 -37
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/reports.js +3 -3
- package/dist/commands/reports.js.map +2 -2
- package/dist/commands/update.js +52 -32
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -103
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/validate.js +19 -3
- package/dist/commands/validate.js.map +2 -2
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +34 -15
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/annotation-store.js +15 -5
- package/dist/core/annotation-store.js.map +2 -2
- package/dist/core/catalog-migration.js +34 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +160 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-compact.js +256 -0
- package/dist/core/changeset-brief-compact.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +848 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/extraction-observability.js +161 -0
- package/dist/core/extraction-observability.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +88 -47
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/project-init.js +53 -0
- package/dist/core/project-init.js.map +7 -0
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +161 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +145 -18
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +166 -24
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/upgrade-plan.js +117 -0
- package/dist/core/upgrade-plan.js.map +7 -0
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2468 -7913
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/.claude-plugin/plugin.json +24 -0
- package/dist/integrations/claude_code/agents/dr-architect.md +30 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +8 -2
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-changeset.md +2 -1
- package/dist/integrations/claude_code/commands/dr-map.md +20 -1
- package/dist/integrations/claude_code/commands/dr-plan.md +66 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +47 -26
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +68 -2
- package/dist/integrations/claude_code/plugin-agents/dr-advisor.md +255 -0
- package/dist/integrations/claude_code/plugin-agents/dr-architect.md +306 -0
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +95 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +178 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +8 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +6 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +3 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +225 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +177 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +45 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/project-root.js +85 -0
- package/dist/mcp/project-root.js.map +7 -0
- package/dist/mcp/server-instructions.js +27 -0
- package/dist/mcp/server-instructions.js.map +7 -0
- package/dist/mcp/strict-schema.js +52 -0
- package/dist/mcp/strict-schema.js.map +7 -0
- package/dist/mcp/tool-registry.js +55 -5
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +98 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-commit.js +224 -0
- package/dist/mcp/tools/changeset-commit.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +260 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +49 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/codebase-extract.js +836 -0
- package/dist/mcp/tools/codebase-extract.js.map +7 -0
- package/dist/mcp/tools/codebase-index.js +125 -0
- package/dist/mcp/tools/codebase-index.js.map +7 -0
- package/dist/mcp/tools/codebase-shared.js +265 -0
- package/dist/mcp/tools/codebase-shared.js.map +7 -0
- package/dist/mcp/tools/codebase-verify.js +48 -0
- package/dist/mcp/tools/codebase-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +34 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +191 -74
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +46 -26
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/model-validate.js +46 -4
- package/dist/mcp/tools/model-validate.js.map +2 -2
- package/dist/mcp/tools/project-status-collectors.js +381 -0
- package/dist/mcp/tools/project-status-collectors.js.map +7 -0
- package/dist/mcp/tools/project-status.js +237 -0
- package/dist/mcp/tools/project-status.js.map +7 -0
- package/dist/mcp/tools/project-tools.js +505 -0
- package/dist/mcp/tools/project-tools.js.map +7 -0
- package/dist/mcp/tools/relationship-tools.js +167 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/review-open.js +210 -0
- package/dist/mcp/tools/review-open.js.map +7 -0
- package/dist/mcp/tools/shared.js +35 -4
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/reports/model-report-orchestrator.js +31 -2
- package/dist/reports/model-report-orchestrator.js.map +2 -2
- package/dist/schemas/bundled/analyzers/cbm.json +1200 -70
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +865 -1646
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +686 -231
- package/dist/server/server.js.map +3 -3
- package/dist/server/viewer-registry.js +264 -0
- package/dist/server/viewer-registry.js.map +7 -0
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/id-generator.js +5 -2
- package/dist/utils/id-generator.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +64 -31
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/model-warnings.js +28 -0
- package/dist/validators/model-warnings.js.map +7 -0
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CUOQGGRA.css +1 -0
- package/dist/viewer/assets/main-DvH3gYrI.js +84 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.12.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "navigation",
|
|
5
5
|
"number": 11,
|
|
6
6
|
"name": "Navigation Layer",
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "Describes how a user moves through the application: routes and route parameters, navigation flows and their steps, guards and redirects, menus, deep links and the transitions between views (single-page-application navigation patterns). Router configuration and route tables are the usual evidence; the views reached belong to the UX layer and server-side HTTP endpoints to the API layer. Modelling rules: a navigation graph composes its routes and transitions and aggregates its flows, guards and breadcrumb configurations; a route composes its route meta and may contain child routes; a flow composes its steps and aggregates the context variables it carries. A transition leaves its source route (the route flows to it) and navigates to its destination route; a flow step navigates to its route, and a guard action redirects by navigating to a route. A guard evaluates its condition, triggers its action on denial and protects what it guards (routes, transitions, flows and flow steps); the condition and the action do not link to each other. Context variables are passive state: the steps, guards, conditions, actions and transitions that read or write them access them, and their value types map to data-model schema properties or reference data objects and schema documents. A breadcrumb configuration references the route meta it reads labels from, its home route and the flows it shows progress for. Across layers, a route maps to the UX view it renders and may lazy-load or depend on application components; routes, steps and guards use application services, access the data-model schemas they load or check, and are served by the API operations they call; they never reach the data store directly. Navigation reaches the business and motivation layers through the product user workflows and workflow steps that flows and steps realize, and satisfies requirements, constraints and principles.",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "SPA Navigation Patterns",
|
|
10
10
|
"version": "1.0",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"breadcrumbconfig": {
|
|
29
29
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
30
30
|
"title": "BreadcrumbConfig",
|
|
31
|
-
"description": "
|
|
31
|
+
"description": "A navigation-scope configuration object that governs how the breadcrumb location trail is derived from the active route hierarchy and rendered. It covers label resolution, the home link, separators and truncation, and applies to every route in a NavigationGraph or NavigationFlow rather than to one route. Use RouteMeta instead when the evidence is a breadcrumb label or flag set on a single route's meta/data object rather than a shared rule for building the whole trail. Use NavigationFlow instead when the trail being shown is a progress indicator through ordered wizard or checkout steps rather than the user's position in the route hierarchy. Use NavigationGraph instead when the object is the overall route table or router instance and breadcrumb settings are only one incidental option inside it.",
|
|
32
32
|
"allOf": [
|
|
33
33
|
{
|
|
34
34
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -48,32 +48,47 @@
|
|
|
48
48
|
"type": "object",
|
|
49
49
|
"properties": {
|
|
50
50
|
"label": {
|
|
51
|
-
"type": "string"
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "Default static text for breadcrumb items in this scope. It is used when neither labelTemplate nor a route's own breadcrumb meta yields a label, or it names the scope's root segment."
|
|
52
53
|
},
|
|
53
54
|
"labelTemplate": {
|
|
54
55
|
"type": "string",
|
|
55
56
|
"description": "Template string for dynamic label generation using {title} placeholder syntax to interpolate route metadata. Used when breadcrumb labels need to vary by route context rather than a static label."
|
|
56
57
|
},
|
|
57
58
|
"showHome": {
|
|
58
|
-
"type": "boolean"
|
|
59
|
+
"type": "boolean",
|
|
60
|
+
"description": "Boolean that, when true, prepends a home link as the first breadcrumb item. Set it to false when the trail should start at the current section."
|
|
59
61
|
},
|
|
60
62
|
"homeLabel": {
|
|
61
|
-
"type": "string"
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Display text for the home breadcrumb item, such as 'Home' or an i18n key. It is meaningful only when showHome is true."
|
|
62
65
|
},
|
|
63
66
|
"homeRoute": {
|
|
64
|
-
"type": "string"
|
|
67
|
+
"type": "string",
|
|
68
|
+
"description": "Route ID or URL path, such as 'home' or '/', that the home breadcrumb item links to. It is meaningful only when showHome is true and should resolve to a declared Route."
|
|
65
69
|
}
|
|
66
70
|
},
|
|
67
71
|
"required": ["label"],
|
|
68
72
|
"additionalProperties": false
|
|
69
73
|
}
|
|
70
74
|
},
|
|
75
|
+
"x-dr-standard": "SPA Navigation Patterns: Breadcrumb (hierarchical location trail) pattern; cf. WAI-ARIA Authoring Practices Breadcrumb Pattern",
|
|
76
|
+
"x-dr-evidence": [
|
|
77
|
+
"An options object or provider passed to a breadcrumb library or component (e.g. xng-breadcrumb BreadcrumbService config, use-react-router-breadcrumbs options, MUI <Breadcrumbs separator maxItems itemsBeforeCollapse>) defined once and reused across pages",
|
|
78
|
+
"A breadcrumb service or composable that walks the router's matched route chain (route.matched, ActivatedRoute.parent, useMatches) and builds items from meta.breadcrumb or a title template",
|
|
79
|
+
"Shared constants or settings such as BREADCRUMB_SEPARATOR, HOME_BREADCRUMB = { label: 'Home', to: '/' } or a showHome flag imported by a layout-level breadcrumb component"
|
|
80
|
+
],
|
|
81
|
+
"x-dr-distinguish": {
|
|
82
|
+
"navigation.routemeta": "the evidence is a breadcrumb label or flag set on a single route's meta/data object rather than a shared rule for building the whole trail",
|
|
83
|
+
"navigation.navigationflow": "the trail being shown is a progress indicator through ordered wizard or checkout steps rather than the user's position in the route hierarchy",
|
|
84
|
+
"navigation.navigationgraph": "the object is the overall route table or router instance and breadcrumb settings are only one incidental option inside it"
|
|
85
|
+
},
|
|
71
86
|
"$id": "urn:dr:spec:node:navigation.breadcrumbconfig"
|
|
72
87
|
},
|
|
73
88
|
"contextvariable": {
|
|
74
89
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
75
90
|
"title": "ContextVariable",
|
|
76
|
-
"description": "A typed
|
|
91
|
+
"description": "A named, typed item of client-side state that a NavigationFlow carries between its FlowSteps across route transitions, declared with a schema, a lifetime scope and a storage mechanism such as session storage, local storage, memory or URL query string. It is runtime data written by one step and read by later steps or guards, not static per-route configuration or a path parameter of a single route. Use RouteMeta instead when the value is static configuration declared on one route (layout, roles, keepAlive, breadcrumb) rather than data produced and consumed at runtime as the user moves through a flow. Use Route instead when the value is a path segment parameter (e.g. ':orderId') that is part of a single route's URL pattern and identifies the resource that route addresses, rather than state carried across several steps. Use FlowStep instead when the thing being modelled is a position in the flow bound to a route, not the data passed between such positions. Use GuardCondition instead when the symbol is the boolean predicate that reads session or flow state to permit or deny access, rather than the state item itself.",
|
|
77
92
|
"allOf": [
|
|
78
93
|
{
|
|
79
94
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -93,7 +108,8 @@
|
|
|
93
108
|
"type": "object",
|
|
94
109
|
"properties": {
|
|
95
110
|
"schemaRef": {
|
|
96
|
-
"type": "string"
|
|
111
|
+
"type": "string",
|
|
112
|
+
"description": "Reference (ID or URI) to the data-model JSON Schema or application DataObject that defines the variable's type and shape, e.g. 'data-model.jsonschema.shipping-address'. Always set, so steps and guards can validate the value."
|
|
97
113
|
},
|
|
98
114
|
"scope": {
|
|
99
115
|
"type": "string",
|
|
@@ -106,7 +122,8 @@
|
|
|
106
122
|
"description": "Storage mechanism used to persist the variable across route transitions: sessionStorage (browser session), localStorage (cross-session), memory (in-process only), url-param (serialized into the URL query string)."
|
|
107
123
|
},
|
|
108
124
|
"defaultValue": {
|
|
109
|
-
"type": "string"
|
|
125
|
+
"type": "string",
|
|
126
|
+
"description": "Serialized initial value (literal or JSON string conforming to schemaRef) assigned when the flow or scope starts before any step writes the variable. Omit when the variable must be explicitly collected, typically when required is true."
|
|
110
127
|
},
|
|
111
128
|
"required": {
|
|
112
129
|
"type": "boolean",
|
|
@@ -117,12 +134,24 @@
|
|
|
117
134
|
"additionalProperties": false
|
|
118
135
|
}
|
|
119
136
|
},
|
|
137
|
+
"x-dr-standard": "SPA Navigation Patterns: wizard/flow state passing (router navigation state, query-string state and session-persisted state)",
|
|
138
|
+
"x-dr-evidence": [
|
|
139
|
+
"A wizard or checkout store (Redux slice, Pinia/Vuex module, NgRx feature, or XState machine context) whose fields are written in one route's component and read in subsequent routes of the same flow",
|
|
140
|
+
"Calls such as sessionStorage.setItem('checkout.shippingAddress', ...), localStorage writes, or a useSessionStorage hook keyed by flow name, with the value read back on a later step page",
|
|
141
|
+
"Navigation calls that pass values forward, such as router.push({ query: { planId } }), navigate('/step-2', { state: { orderId } }), or Angular NavigationExtras.state, read on arrival via useLocation().state or getCurrentNavigation()"
|
|
142
|
+
],
|
|
143
|
+
"x-dr-distinguish": {
|
|
144
|
+
"navigation.routemeta": "the value is static configuration declared on one route (layout, roles, keepAlive, breadcrumb) rather than data produced and consumed at runtime as the user moves through a flow",
|
|
145
|
+
"navigation.route": "the value is a path segment parameter (e.g. ':orderId') that is part of a single route's URL pattern and identifies the resource that route addresses, rather than state carried across several steps",
|
|
146
|
+
"navigation.flowstep": "the thing being modelled is a position in the flow bound to a route, not the data passed between such positions",
|
|
147
|
+
"navigation.guardcondition": "the symbol is the boolean predicate that reads session or flow state to permit or deny access, rather than the state item itself"
|
|
148
|
+
},
|
|
120
149
|
"$id": "urn:dr:spec:node:navigation.contextvariable"
|
|
121
150
|
},
|
|
122
151
|
"flowstep": {
|
|
123
152
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
124
153
|
"title": "FlowStep",
|
|
125
|
-
"description": "
|
|
154
|
+
"description": "An ordered position within a NavigationFlow that binds a sequence index to one route the user visits as part of a multi-step process, together with whether the step may be skipped and how the flow waits on it before advancing. It exists only as a member of a flow; the same route outside any ordered process is not a step. Use Route instead when the symbol declares a URL path pattern and the component it resolves to, independent of any position in an ordered multi-step process. Use NavigationFlow instead when the symbol is the whole ordered wizard, checkout or onboarding sequence that contains the steps, not a single position within it. Use NavigationTransition instead when the symbol describes the edge between two routes and what triggers it (click, redirect, back) rather than a numbered stop in a flow. Use ContextVariable instead when the symbol is state carried between steps (e.g. a cart or form draft held in sessionStorage) rather than the step itself.",
|
|
126
155
|
"allOf": [
|
|
127
156
|
{
|
|
128
157
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -142,16 +171,20 @@
|
|
|
142
171
|
"type": "object",
|
|
143
172
|
"properties": {
|
|
144
173
|
"sequence": {
|
|
145
|
-
"type": "integer"
|
|
174
|
+
"type": "integer",
|
|
175
|
+
"description": "Integer position of the step within its NavigationFlow, starting at 1 and unique within the flow, that sets traversal order; always set it, taking the value from the array index or explicit step number in code."
|
|
146
176
|
},
|
|
147
177
|
"route": {
|
|
148
|
-
"type": "string"
|
|
178
|
+
"type": "string",
|
|
179
|
+
"description": "Identifier or path of the navigation.route the user visits at this step (e.g. 'checkout-payment' or '/checkout/payment'); set it to the route ID where one exists, otherwise to the literal path."
|
|
149
180
|
},
|
|
150
181
|
"description": {
|
|
151
|
-
"type": "string"
|
|
182
|
+
"type": "string",
|
|
183
|
+
"description": "Free-text summary of what the user accomplishes at this step (e.g. 'enter shipping address'); set it when the route name alone does not convey the step's purpose."
|
|
152
184
|
},
|
|
153
185
|
"required": {
|
|
154
|
-
"type": "boolean"
|
|
186
|
+
"type": "boolean",
|
|
187
|
+
"description": "Boolean flag; true means the flow cannot advance past this step without completing it, and false means the step may be skipped. Set it to false for steps marked optional or skippable in code."
|
|
155
188
|
},
|
|
156
189
|
"waitBehavior": {
|
|
157
190
|
"type": "string",
|
|
@@ -163,12 +196,24 @@
|
|
|
163
196
|
"additionalProperties": false
|
|
164
197
|
}
|
|
165
198
|
},
|
|
199
|
+
"x-dr-standard": "SPA Navigation Patterns – multi-step wizard / stepper step",
|
|
200
|
+
"x-dr-evidence": [
|
|
201
|
+
"An entry in a steps array of a wizard or stepper configuration (e.g. `steps: [{ path: '/checkout/shipping', ... }, { path: '/checkout/payment', ... }]`) whose position or explicit index defines order",
|
|
202
|
+
"A stepper component child (e.g. `<Step>`, `<mat-step>`, `<el-step>`) bound to a route path, carrying an `optional` or `required` flag or a completion or validation gate",
|
|
203
|
+
"Next/previous step logic, such as `goToStep(n)`, `currentStep + 1` or a state-machine state in an onboarding or checkout flow, that resolves a step index to a router push of a specific path"
|
|
204
|
+
],
|
|
205
|
+
"x-dr-distinguish": {
|
|
206
|
+
"navigation.route": "the symbol declares a URL path pattern and the component it resolves to, independent of any position in an ordered multi-step process",
|
|
207
|
+
"navigation.navigationflow": "the symbol is the whole ordered wizard, checkout or onboarding sequence that contains the steps, not a single position within it",
|
|
208
|
+
"navigation.navigationtransition": "the symbol describes the edge between two routes and what triggers it (click, redirect, back) rather than a numbered stop in a flow",
|
|
209
|
+
"navigation.contextvariable": "the symbol is state carried between steps (e.g. a cart or form draft held in sessionStorage) rather than the step itself"
|
|
210
|
+
},
|
|
166
211
|
"$id": "urn:dr:spec:node:navigation.flowstep"
|
|
167
212
|
},
|
|
168
213
|
"guardaction": {
|
|
169
214
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
170
215
|
"title": "GuardAction",
|
|
171
|
-
"description": "
|
|
216
|
+
"description": "A denial-handling outcome attached to a NavigationGuard that specifies what the router does when the guard's condition fails. It either redirects to a route or URL, cancels navigation in place, shows a message, or asks for confirmation, and it records whether the attempted route is kept so the user can return to it later. Use NavigationGuard instead when you are modelling the interceptor itself: its mechanism type (auth, role, feature-flag), its execution order, and the routes it protects, rather than what happens on denial. Use GuardCondition instead when you are modelling the boolean predicate the guard evaluates (e.g. 'user.isAuthenticated'), not the response executed when that predicate is false. Use NavigationTransition instead when you are modelling a standing edge between two routes in the navigation graph (including one with trigger 'redirect') rather than a guard's conditional denial response. Use Route instead when the redirect is unconditional, such as a route of type 'redirect' whose router entry always forwards (e.g. { path: '/', redirectTo: '/home' }) regardless of any access check.",
|
|
172
217
|
"allOf": [
|
|
173
218
|
{
|
|
174
219
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -209,12 +254,24 @@
|
|
|
209
254
|
"additionalProperties": false
|
|
210
255
|
}
|
|
211
256
|
},
|
|
257
|
+
"x-dr-standard": "SPA Navigation Patterns: navigation guard outcome (redirect or cancel), e.g. Angular CanActivate/CanDeactivate returning a UrlTree or false, and Vue Router beforeEach returning a route location or false",
|
|
258
|
+
"x-dr-evidence": [
|
|
259
|
+
"The denied branch of a beforeEach/canActivate guard that returns a redirect location carrying the attempted path, e.g. return { name: 'login', query: { redirect: to.fullPath } } or router.createUrlTree(['/login'], { queryParams: { returnUrl: state.url } }).",
|
|
260
|
+
"A guard branch that aborts navigation with next(false), return false, or event.preventDefault(), optionally preceded by a toast or notification call explaining the denial.",
|
|
261
|
+
"A window.confirm(...) or modal-dialog prompt inside a canDeactivate or beforeRouteLeave hook, or a React protected-route wrapper rendering <Navigate to=\"/login\" state={{ from: location }} replace />."
|
|
262
|
+
],
|
|
263
|
+
"x-dr-distinguish": {
|
|
264
|
+
"navigation.navigationguard": "you are modelling the interceptor itself: its mechanism type (auth, role, feature-flag), its execution order, and the routes it protects, rather than what happens on denial.",
|
|
265
|
+
"navigation.guardcondition": "you are modelling the boolean predicate the guard evaluates (e.g. 'user.isAuthenticated'), not the response executed when that predicate is false.",
|
|
266
|
+
"navigation.navigationtransition": "you are modelling a standing edge between two routes in the navigation graph (including one with trigger 'redirect') rather than a guard's conditional denial response.",
|
|
267
|
+
"navigation.route": "the redirect is unconditional, such as a route of type 'redirect' whose router entry always forwards (e.g. { path: '/', redirectTo: '/home' }) regardless of any access check."
|
|
268
|
+
},
|
|
212
269
|
"$id": "urn:dr:spec:node:navigation.guardaction"
|
|
213
270
|
},
|
|
214
271
|
"guardcondition": {
|
|
215
272
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
216
273
|
"title": "GuardCondition",
|
|
217
|
-
"description": "
|
|
274
|
+
"description": "A boolean predicate, possibly asynchronous with a millisecond timeout, that a NavigationGuard evaluates against session state, roles, permissions, feature flags, route metadata or flow context to decide whether activation of a target route is allowed. It is the test only: it neither registers interception on routes nor specifies what happens on denial. Use NavigationGuard instead when the symbol is the interceptor registered with the router (beforeEach hook, canActivate class, route-level beforeEnter) that carries a guard type and execution order, rather than the predicate expression it calls. Use GuardAction instead when the code describes the denial response, such as a redirect to '/login', returning false to block, showing a toast, or prompting for confirmation, rather than the true/false test that precedes it. Use RouteMeta instead when the symbol is declarative per-route data like requiresAuth, roles or permissions that a predicate reads, rather than the logic that evaluates that data. Use ContextVariable instead when the symbol is the flow-scoped state value itself (e.g. a stored cartId or wizard progress) that a condition may inspect, rather than a predicate over it.",
|
|
218
275
|
"allOf": [
|
|
219
276
|
{
|
|
220
277
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -250,12 +307,24 @@
|
|
|
250
307
|
"additionalProperties": false
|
|
251
308
|
}
|
|
252
309
|
},
|
|
310
|
+
"x-dr-standard": "SPA Navigation Patterns: route guard predicate (e.g. the boolean/Promise<boolean> result of Angular CanActivate or the condition inside a Vue Router beforeEach guard)",
|
|
311
|
+
"x-dr-evidence": [
|
|
312
|
+
"A named function or method returning boolean, Promise<boolean> or Observable<boolean> (e.g. isAuthenticated(), hasRole(route.meta.roles), isFeatureEnabled('beta')) that is invoked from inside a router guard hook.",
|
|
313
|
+
"An inline conditional expression in a beforeEach/canActivate/loader body, such as `if (!store.user || !to.meta.roles.includes(store.user.role))`, whose result selects between next()/true and a redirect or block.",
|
|
314
|
+
"An awaited token or permission check (e.g. `await authService.validateToken()`), often wrapped in Promise.race or a timeout option, that returns false or throws on expiry before a route is allowed to activate."
|
|
315
|
+
],
|
|
316
|
+
"x-dr-distinguish": {
|
|
317
|
+
"navigation.navigationguard": "the symbol is the interceptor registered with the router (beforeEach hook, canActivate class, route-level beforeEnter) that carries a guard type and execution order, rather than the predicate expression it calls.",
|
|
318
|
+
"navigation.guardaction": "the code describes the denial response, such as a redirect to '/login', returning false to block, showing a toast, or prompting for confirmation, rather than the true/false test that precedes it.",
|
|
319
|
+
"navigation.routemeta": "the symbol is declarative per-route data like requiresAuth, roles or permissions that a predicate reads, rather than the logic that evaluates that data.",
|
|
320
|
+
"navigation.contextvariable": "the symbol is the flow-scoped state value itself (e.g. a stored cartId or wizard progress) that a condition may inspect, rather than a predicate over it."
|
|
321
|
+
},
|
|
253
322
|
"$id": "urn:dr:spec:node:navigation.guardcondition"
|
|
254
323
|
},
|
|
255
324
|
"navigationflow": {
|
|
256
325
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
257
326
|
"title": "NavigationFlow",
|
|
258
|
-
"description": "
|
|
327
|
+
"description": "A named, ordered grouping of FlowSteps that links two or more routes into a single multi-step user process, such as a checkout, onboarding sequence or wizard, with a defined first step, a defined final step and an imposed traversal order. It is the container for the journey as a whole, not for any individual step, route or edge. Use FlowStep instead when the symbol is one position in the sequence, binding a single index to a single route, rather than the whole ordered journey. Use NavigationGraph instead when the symbol is the application's complete route table or router instance, covering all routes, rather than one bounded multi-step process. Use NavigationTransition instead when the symbol is a single from-to route change with a trigger, such as a next button handler or a redirect, rather than an ordered set of steps. Use Route instead when the symbol is one URL path pattern resolving to a view, even if that view internally renders a stepper without changing route.",
|
|
259
328
|
"allOf": [
|
|
260
329
|
{
|
|
261
330
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -275,7 +344,8 @@
|
|
|
275
344
|
"type": "object",
|
|
276
345
|
"properties": {
|
|
277
346
|
"description": {
|
|
278
|
-
"type": "string"
|
|
347
|
+
"type": "string",
|
|
348
|
+
"description": "Free-text summary of the user process the flow realizes, naming its purpose, its entry and exit steps and its completion outcome (e.g. 'Guest checkout from cart review to order confirmation'); set it whenever the flow's name alone does not convey its scope."
|
|
279
349
|
},
|
|
280
350
|
"source": {
|
|
281
351
|
"type": "object",
|
|
@@ -285,12 +355,24 @@
|
|
|
285
355
|
"additionalProperties": false
|
|
286
356
|
}
|
|
287
357
|
},
|
|
358
|
+
"x-dr-standard": "SPA Navigation Patterns: multi-step flow / wizard pattern",
|
|
359
|
+
"x-dr-evidence": [
|
|
360
|
+
"A configuration array or object listing ordered step entries, each naming a route path (e.g. steps: [{path: '/checkout/cart'}, {path: '/checkout/shipping'}, ...]), consumed by a stepper or wizard component or hook.",
|
|
361
|
+
"A parent route with ordered child routes that share a flow layout showing a progress indicator, plus next/back handlers that compute the following child path from the current index.",
|
|
362
|
+
"A state machine or flow store (e.g. XState machine, Redux slice, useWizard hook) whose states map to routes and that exposes start, next, previous and complete transitions, often carrying shared flow state between steps."
|
|
363
|
+
],
|
|
364
|
+
"x-dr-distinguish": {
|
|
365
|
+
"navigation.flowstep": "the symbol is one position in the sequence, binding a single index to a single route, rather than the whole ordered journey.",
|
|
366
|
+
"navigation.navigationgraph": "the symbol is the application's complete route table or router instance, covering all routes, rather than one bounded multi-step process.",
|
|
367
|
+
"navigation.navigationtransition": "the symbol is a single from-to route change with a trigger, such as a next button handler or a redirect, rather than an ordered set of steps.",
|
|
368
|
+
"navigation.route": "the symbol is one URL path pattern resolving to a view, even if that view internally renders a stepper without changing route."
|
|
369
|
+
},
|
|
288
370
|
"$id": "urn:dr:spec:node:navigation.navigationflow"
|
|
289
371
|
},
|
|
290
372
|
"navigationgraph": {
|
|
291
373
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
292
374
|
"title": "NavigationGraph",
|
|
293
|
-
"description": "
|
|
375
|
+
"description": "A root container representing one application's complete router configuration, the single top-level route table or router instance whose scope covers every Route, NavigationTransition, NavigationGuard, NavigationFlow and BreadcrumbConfig reachable in that application. Exactly one exists per independently bootstrapped router, as opposed to a subset, journey or single entry. Use NavigationFlow instead when the symbol describes an ordered, goal-directed subset of routes, such as a wizard or checkout, rather than the whole route table of the application. Use Route instead when the symbol is a single path entry, including a parent route with nested children or a lazily loaded child route module, rather than the root router configuration. Use BreadcrumbConfig instead when the symbol only configures breadcrumb trail rendering for a navigation scope rather than defining the routes themselves.",
|
|
294
376
|
"allOf": [
|
|
295
377
|
{
|
|
296
378
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -310,26 +392,39 @@
|
|
|
310
392
|
"type": "object",
|
|
311
393
|
"properties": {
|
|
312
394
|
"version": {
|
|
313
|
-
"type": "string"
|
|
395
|
+
"type": "string",
|
|
396
|
+
"description": "Version identifier of this navigation model, such as a semver string matching the application release or route-table revision it reflects. Set it whenever the graph is extracted or published, so that changes to the routing structure can be tracked over time."
|
|
314
397
|
},
|
|
315
398
|
"application": {
|
|
316
399
|
"type": "string",
|
|
317
400
|
"description": "Reference to the Layer 4 ApplicationComponent that this navigation graph belongs to, enabling cross-layer traceability from routing to application architecture."
|
|
318
401
|
},
|
|
319
402
|
"description": {
|
|
320
|
-
"type": "string"
|
|
403
|
+
"type": "string",
|
|
404
|
+
"description": "Free-text summary of the graph's scope: which application or router instance it covers and any notable boundaries, such as excluded micro-frontends or admin sub-apps. Set it when the scope is not obvious from the application reference."
|
|
321
405
|
}
|
|
322
406
|
},
|
|
323
407
|
"required": ["version", "application"],
|
|
324
408
|
"additionalProperties": false
|
|
325
409
|
}
|
|
326
410
|
},
|
|
411
|
+
"x-dr-standard": "SPA Navigation Patterns: root router configuration / route table (e.g., Vue Router createRouter instance, Angular RouterModule.forRoot, React Router createBrowserRouter)",
|
|
412
|
+
"x-dr-evidence": [
|
|
413
|
+
"A root router bootstrap call that receives the full routes array, such as createRouter({ history, routes }), RouterModule.forRoot(routes), createBrowserRouter([...]) or provideRouter(routes), which is mounted once on the app instance.",
|
|
414
|
+
"A top-level routing file, such as router/index.ts, app-routing.module.ts or routes.tsx, that imports and assembles all feature route modules and registers global guards like router.beforeEach.",
|
|
415
|
+
"The root directory of a file-system routing convention, such as Next.js app/ or pages/, Nuxt pages/ or SvelteKit src/routes, treated as one application's complete route tree."
|
|
416
|
+
],
|
|
417
|
+
"x-dr-distinguish": {
|
|
418
|
+
"navigation.navigationflow": "the symbol describes an ordered, goal-directed subset of routes, such as a wizard or checkout, rather than the whole route table of the application.",
|
|
419
|
+
"navigation.route": "the symbol is a single path entry, including a parent route with nested children or a lazily loaded child route module, rather than the root router configuration.",
|
|
420
|
+
"navigation.breadcrumbconfig": "the symbol only configures breadcrumb trail rendering for a navigation scope rather than defining the routes themselves."
|
|
421
|
+
},
|
|
327
422
|
"$id": "urn:dr:spec:node:navigation.navigationgraph"
|
|
328
423
|
},
|
|
329
424
|
"navigationguard": {
|
|
330
425
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
331
426
|
"title": "NavigationGuard",
|
|
332
|
-
"description": "A
|
|
427
|
+
"description": "A client-side router interceptor that runs during route resolution, before the target view renders, and decides whether a navigation to one or more routes may proceed, by evaluating a GuardCondition and, on denial, triggering a GuardAction. It is the executable hook registered with the SPA router (global, per-route or per-flow), not the predicate it evaluates, the response it takes on denial, or the route metadata it reads. Use GuardCondition instead when the symbol is only the boolean predicate or expression (e.g. isAuthenticated(), hasRole('admin')) and is not itself registered with the router as an interceptor. Use GuardAction instead when the symbol is only the denial response: the redirect target, block, notification message or confirmation prompt returned or executed when access is refused. Use RouteMeta instead when the symbol is declarative per-route data (meta.requiresAuth, data.roles, canDeactivate flags) that a guard reads but which performs no evaluation itself. Use NavigationTransition instead when the symbol models the edge between two routes and its trigger, rather than the check that permits or denies traversing that edge.",
|
|
333
428
|
"allOf": [
|
|
334
429
|
{
|
|
335
430
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -354,10 +449,12 @@
|
|
|
354
449
|
"description": "Classification of the guard mechanism: auth (authentication check), role (role membership), permission (fine-grained permission), feature-flag (feature toggle), custom (arbitrary condition)."
|
|
355
450
|
},
|
|
356
451
|
"description": {
|
|
357
|
-
"type": "string"
|
|
452
|
+
"type": "string",
|
|
453
|
+
"description": "Free-text summary of the access policy the guard enforces and the routes or flows it protects, e.g. 'Blocks admin routes for users without the admin role'; set whenever the guard's purpose is not obvious from its type and name."
|
|
358
454
|
},
|
|
359
455
|
"order": {
|
|
360
|
-
"type": "integer"
|
|
456
|
+
"type": "integer",
|
|
457
|
+
"description": "Non-negative integer execution priority among guards protecting the same route, evaluated lowest value first; derive it from registration order in the router (array position in canActivate, beforeEach registration sequence) and set it whenever more than one guard can apply."
|
|
361
458
|
},
|
|
362
459
|
"source": {
|
|
363
460
|
"type": "object",
|
|
@@ -368,12 +465,24 @@
|
|
|
368
465
|
"additionalProperties": false
|
|
369
466
|
}
|
|
370
467
|
},
|
|
468
|
+
"x-dr-standard": "SPA Navigation Patterns: Route Guard / navigation hook (e.g. Angular CanActivate/CanMatch/CanDeactivate, Vue Router beforeEach/beforeEnter, React Router loader-based redirect)",
|
|
469
|
+
"x-dr-evidence": [
|
|
470
|
+
"a function or class implementing CanActivate, CanActivateChild, CanMatch or CanDeactivate (or a CanActivateFn) listed in a route's canActivate/canMatch array",
|
|
471
|
+
"a callback registered via router.beforeEach, router.beforeResolve or a route's beforeEnter that calls next(false), next('/login') or returns a redirect location",
|
|
472
|
+
"a React Router loader or wrapper component such as <RequireAuth>/<ProtectedRoute> that checks session, role or feature flag and returns redirect('/login') or <Navigate> before rendering the child route"
|
|
473
|
+
],
|
|
474
|
+
"x-dr-distinguish": {
|
|
475
|
+
"navigation.guardcondition": "the symbol is only the boolean predicate or expression (e.g. isAuthenticated(), hasRole('admin')) and is not itself registered with the router as an interceptor",
|
|
476
|
+
"navigation.guardaction": "the symbol is only the denial response: the redirect target, block, notification message or confirmation prompt returned or executed when access is refused",
|
|
477
|
+
"navigation.routemeta": "the symbol is declarative per-route data (meta.requiresAuth, data.roles, canDeactivate flags) that a guard reads but which performs no evaluation itself",
|
|
478
|
+
"navigation.navigationtransition": "the symbol models the edge between two routes and its trigger, rather than the check that permits or denies traversing that edge"
|
|
479
|
+
},
|
|
371
480
|
"$id": "urn:dr:spec:node:navigation.navigationguard"
|
|
372
481
|
},
|
|
373
482
|
"navigationtransition": {
|
|
374
483
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
375
484
|
"title": "NavigationTransition",
|
|
376
|
-
"description": "A directed edge
|
|
485
|
+
"description": "A directed edge between exactly one source Route and one destination Route that records a single permitted route change in the client-side router, together with the mechanism that initiates it (user click, programmatic call, timeout, browser history, or redirect). It represents the move between routes, not either route, and carries no sequence position in a multi-step process. Use Route instead when the element is the addressable URL pattern or route-table entry itself, including a route declared with type 'redirect' or 'alias', rather than the move from one route to another. Use FlowStep instead when the element is an ordered position in a multi-step process (it has a sequence index and a required/wait behavior) rather than an edge between two routes. Use GuardAction instead when the redirect or block is the response a NavigationGuard executes on denial, with a message and preserveRoute setting, rather than a modeled edge between two routes. Use RouteMeta instead when 'transition' refers to the CSS or animation effect applied on entering or leaving a route (e.g. 'fade'), not to a route-to-route edge.",
|
|
377
486
|
"allOf": [
|
|
378
487
|
{
|
|
379
488
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -393,10 +502,12 @@
|
|
|
393
502
|
"type": "object",
|
|
394
503
|
"properties": {
|
|
395
504
|
"from": {
|
|
396
|
-
"type": "string"
|
|
505
|
+
"type": "string",
|
|
506
|
+
"description": "Identifier (Route ID or path pattern) of the source Route from which the transition starts; set to the route whose view or config contains the link, call, or redirect, or to '*' only when the transition can be fired from any route."
|
|
397
507
|
},
|
|
398
508
|
"to": {
|
|
399
|
-
"type": "string"
|
|
509
|
+
"type": "string",
|
|
510
|
+
"description": "Identifier (Route ID or path pattern, with parameter placeholders such as '/orders/:id') of the destination Route that becomes active once the transition completes; always set to a Route defined in the same NavigationGraph."
|
|
400
511
|
},
|
|
401
512
|
"trigger": {
|
|
402
513
|
"type": "string",
|
|
@@ -410,19 +521,32 @@
|
|
|
410
521
|
"description": "Mechanism that initiates the route transition: user-click (explicit user interaction), programmatic (code-driven), timeout (time-based), browser-back (browser history navigation), redirect (automatic server/guard redirect)."
|
|
411
522
|
},
|
|
412
523
|
"description": {
|
|
413
|
-
"type": "string"
|
|
524
|
+
"type": "string",
|
|
525
|
+
"description": "Free-text explanation of when and why the transition occurs, such as the UI control or business event that fires it; set when the trigger alone does not make the user intent clear."
|
|
414
526
|
}
|
|
415
527
|
},
|
|
416
528
|
"required": ["from", "to", "trigger"],
|
|
417
529
|
"additionalProperties": false
|
|
418
530
|
}
|
|
419
531
|
},
|
|
532
|
+
"x-dr-standard": "SPA Navigation Patterns: declarative and programmatic navigation (route change via History API pushState/replaceState/popstate)",
|
|
533
|
+
"x-dr-evidence": [
|
|
534
|
+
"A router link component (<Link to=\"/orders\">, <router-link :to=\"{name:'checkout'}\">, [routerLink]) rendered in the view of one route and targeting another route",
|
|
535
|
+
"An imperative navigation call such as router.push(), navigate('/x'), history.replace(), Navigator.pushNamed() or this.router.navigateByUrl() inside an event handler, effect, form-submit callback, or setTimeout",
|
|
536
|
+
"A route-table entry or loader/guard return that forwards one path to another, e.g. { path: '/old', redirect: '/new' }, <Navigate to=\"/login\" replace/>, or return redirect('/dashboard')"
|
|
537
|
+
],
|
|
538
|
+
"x-dr-distinguish": {
|
|
539
|
+
"navigation.route": "the element is the addressable URL pattern or route-table entry itself, including a route declared with type 'redirect' or 'alias', rather than the move from one route to another",
|
|
540
|
+
"navigation.flowstep": "the element is an ordered position in a multi-step process (it has a sequence index and a required/wait behavior) rather than an edge between two routes",
|
|
541
|
+
"navigation.guardaction": "the redirect or block is the response a NavigationGuard executes on denial, with a message and preserveRoute setting, rather than a modeled edge between two routes",
|
|
542
|
+
"navigation.routemeta": "'transition' refers to the CSS or animation effect applied on entering or leaving a route (e.g. 'fade'), not to a route-to-route edge"
|
|
543
|
+
},
|
|
420
544
|
"$id": "urn:dr:spec:node:navigation.navigationtransition"
|
|
421
545
|
},
|
|
422
546
|
"route": {
|
|
423
547
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
424
548
|
"title": "Route",
|
|
425
|
-
"description": "A
|
|
549
|
+
"description": "A client-side router entry that binds a URL path pattern, with any route parameters, to the view or component the single-page-application router renders, lazily loads, or forwards to when the browser location matches it. It is one entry in a front-end route table, not a server-side HTTP endpoint. Use NavigationTransition instead when the element is a movement from one route to another, such as a Link, router.push call or redirect between two paths, rather than the destination path itself. Use FlowStep instead when the element is an ordered position in a multi-step wizard or checkout that refers to a route, rather than the route definition itself. Use RouteMeta instead when the element is the meta or data object attached to a route entry, holding layout, keepAlive, transition, breadcrumb or role hints, rather than the path-to-component mapping. Use NavigationGuard instead when the element is a beforeEnter, canActivate or loader function that decides whether a route may be activated, rather than the route entry it protects.",
|
|
426
550
|
"allOf": [
|
|
427
551
|
{
|
|
428
552
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -442,10 +566,12 @@
|
|
|
442
566
|
"type": "object",
|
|
443
567
|
"properties": {
|
|
444
568
|
"title": {
|
|
445
|
-
"type": "string"
|
|
569
|
+
"type": "string",
|
|
570
|
+
"description": "Human-readable page title for the route, usually taken from route meta or document.title, used for headings, tab titles and default breadcrumb text. Set it when the route renders a user-visible page."
|
|
446
571
|
},
|
|
447
572
|
"description": {
|
|
448
|
-
"type": "string"
|
|
573
|
+
"type": "string",
|
|
574
|
+
"description": "Free-text prose explaining what the route displays and why a user reaches it. Set it when the path and title alone do not convey the route's purpose."
|
|
449
575
|
},
|
|
450
576
|
"type": {
|
|
451
577
|
"type": "string",
|
|
@@ -461,12 +587,24 @@
|
|
|
461
587
|
"additionalProperties": false
|
|
462
588
|
}
|
|
463
589
|
},
|
|
590
|
+
"x-dr-standard": "SPA Navigation Patterns: Route definition (route-table entry mapping a path pattern to a view component)",
|
|
591
|
+
"x-dr-evidence": [
|
|
592
|
+
"An object in a client-side router's routes array, such as Vue Router createRouter({routes}), Angular Routes or React Router createBrowserRouter, that has a path property together with component/element, loadComponent/lazy, redirect/redirectTo, or alias.",
|
|
593
|
+
"A file in a file-system routing convention whose location defines a URL path, such as Next.js app/**/page.tsx, SvelteKit +page.svelte, Nuxt pages/*.vue or Remix routes/*.tsx, including dynamic segments like [id] or $id.",
|
|
594
|
+
"A named path constant or route-name enum, such as ROUTES.USER_DETAIL = '/users/:id', that is passed to router.push, navigate(), <Link to> or <router-link :to> elsewhere in the front-end code."
|
|
595
|
+
],
|
|
596
|
+
"x-dr-distinguish": {
|
|
597
|
+
"navigation.navigationtransition": "the element is a movement from one route to another, such as a Link, router.push call or redirect between two paths, rather than the destination path itself.",
|
|
598
|
+
"navigation.flowstep": "the element is an ordered position in a multi-step wizard or checkout that refers to a route, rather than the route definition itself.",
|
|
599
|
+
"navigation.routemeta": "the element is the meta or data object attached to a route entry, holding layout, keepAlive, transition, breadcrumb or role hints, rather than the path-to-component mapping.",
|
|
600
|
+
"navigation.navigationguard": "the element is a beforeEnter, canActivate or loader function that decides whether a route may be activated, rather than the route entry it protects."
|
|
601
|
+
},
|
|
464
602
|
"$id": "urn:dr:spec:node:navigation.route"
|
|
465
603
|
},
|
|
466
604
|
"routemeta": {
|
|
467
605
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
468
606
|
"title": "RouteMeta",
|
|
469
|
-
"description": "
|
|
607
|
+
"description": "A declarative metadata record attached to a single Route that the SPA router reads at runtime. It sets how that route's view is rendered (layout wrapper, keep-alive caching, enter/leave animation, breadcrumb label) and exposes access hints (requiresAuth, roles, permissions) for guards to read; it carries no URL path and no executable logic of its own. Use Route instead when the symbol defines the addressable path pattern and the component it resolves to, rather than the auxiliary meta/data object hanging off that route record. Use NavigationGuard instead when the symbol is executable interception logic (beforeEach, canActivate, a loader redirect) that evaluates and enforces access, rather than the static hints such logic reads. Use BreadcrumbConfig instead when the configuration sets breadcrumb generation rules, separators or home-link behaviour for a whole navigation scope rather than one route's breadcrumb label. Use NavigationTransition instead when modelling a directed change from one route to another with a trigger, not the CSS/animation name stored in a route's meta 'transition' field.",
|
|
470
608
|
"allOf": [
|
|
471
609
|
{
|
|
472
610
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -524,31 +662,33 @@
|
|
|
524
662
|
"additionalProperties": false
|
|
525
663
|
}
|
|
526
664
|
},
|
|
665
|
+
"x-dr-standard": "SPA Navigation Patterns: Route Meta Fields (e.g., Vue Router RouteMeta, Angular Route.data, React Router route handle)",
|
|
666
|
+
"x-dr-evidence": [
|
|
667
|
+
"a `meta: { requiresAuth: true, layout: 'AuthLayout', keepAlive: true }` object inside a Vue Router route record, or a `declare module 'vue-router' { interface RouteMeta { ... } }` type augmentation",
|
|
668
|
+
"an Angular route definition with `data: { roles: ['admin'], breadcrumb: 'Reports' }` that is read through ActivatedRoute.snapshot.data or in a guard",
|
|
669
|
+
"a root shell that wraps `<router-view>` in `<keep-alive>` or `<transition :name=\"route.meta.transition\">`, or that picks a layout component from `route.meta.layout` / `useMatches()[i].handle`"
|
|
670
|
+
],
|
|
671
|
+
"x-dr-distinguish": {
|
|
672
|
+
"navigation.route": "the symbol defines the addressable path pattern and the component it resolves to, rather than the auxiliary meta/data object hanging off that route record",
|
|
673
|
+
"navigation.navigationguard": "the symbol is executable interception logic (beforeEach, canActivate, a loader redirect) that evaluates and enforces access, rather than the static hints such logic reads",
|
|
674
|
+
"navigation.breadcrumbconfig": "the configuration sets breadcrumb generation rules, separators or home-link behaviour for a whole navigation scope rather than one route's breadcrumb label",
|
|
675
|
+
"navigation.navigationtransition": "modelling a directed change from one route to another with a trigger, not the CSS/animation name stored in a route's meta 'transition' field"
|
|
676
|
+
},
|
|
527
677
|
"$id": "urn:dr:spec:node:navigation.routemeta"
|
|
528
678
|
}
|
|
529
679
|
},
|
|
530
680
|
"relationshipSchemas": {
|
|
531
|
-
"navigation.breadcrumbconfig.
|
|
532
|
-
"id": "navigation.breadcrumbconfig.
|
|
533
|
-
"source_spec_node_id": "navigation.breadcrumbconfig",
|
|
534
|
-
"source_layer": "navigation",
|
|
535
|
-
"destination_spec_node_id": "navigation.navigationgraph",
|
|
536
|
-
"destination_layer": "navigation",
|
|
537
|
-
"predicate": "associated-with",
|
|
538
|
-
"cardinality": "many-to-many",
|
|
539
|
-
"strength": "medium",
|
|
540
|
-
"required": false
|
|
541
|
-
},
|
|
542
|
-
"navigation.breadcrumbconfig.provides.navigation.routemeta": {
|
|
543
|
-
"id": "navigation.breadcrumbconfig.provides.navigation.routemeta",
|
|
681
|
+
"navigation.breadcrumbconfig.references.navigation.navigationflow": {
|
|
682
|
+
"id": "navigation.breadcrumbconfig.references.navigation.navigationflow",
|
|
544
683
|
"source_spec_node_id": "navigation.breadcrumbconfig",
|
|
545
684
|
"source_layer": "navigation",
|
|
546
|
-
"destination_spec_node_id": "navigation.
|
|
685
|
+
"destination_spec_node_id": "navigation.navigationflow",
|
|
547
686
|
"destination_layer": "navigation",
|
|
548
|
-
"predicate": "
|
|
687
|
+
"predicate": "references",
|
|
549
688
|
"cardinality": "many-to-many",
|
|
550
689
|
"strength": "medium",
|
|
551
|
-
"required": false
|
|
690
|
+
"required": false,
|
|
691
|
+
"description": "The breadcrumb configuration shows the user's progress through the flow, such as a step trail in a checkout."
|
|
552
692
|
},
|
|
553
693
|
"navigation.breadcrumbconfig.references.navigation.route": {
|
|
554
694
|
"id": "navigation.breadcrumbconfig.references.navigation.route",
|
|
@@ -559,40 +699,20 @@
|
|
|
559
699
|
"predicate": "references",
|
|
560
700
|
"cardinality": "many-to-many",
|
|
561
701
|
"strength": "medium",
|
|
562
|
-
"required": false
|
|
702
|
+
"required": false,
|
|
703
|
+
"description": "The breadcrumb configuration links to the route, typically its home route at the start of the trail."
|
|
563
704
|
},
|
|
564
|
-
"navigation.breadcrumbconfig.
|
|
565
|
-
"id": "navigation.breadcrumbconfig.
|
|
705
|
+
"navigation.breadcrumbconfig.references.navigation.routemeta": {
|
|
706
|
+
"id": "navigation.breadcrumbconfig.references.navigation.routemeta",
|
|
566
707
|
"source_spec_node_id": "navigation.breadcrumbconfig",
|
|
567
708
|
"source_layer": "navigation",
|
|
568
|
-
"destination_spec_node_id": "navigation.
|
|
569
|
-
"destination_layer": "navigation",
|
|
570
|
-
"predicate": "tracks",
|
|
571
|
-
"cardinality": "many-to-many",
|
|
572
|
-
"strength": "medium",
|
|
573
|
-
"required": false
|
|
574
|
-
},
|
|
575
|
-
"navigation.contextvariable.consumes.navigation.route": {
|
|
576
|
-
"id": "navigation.contextvariable.consumes.navigation.route",
|
|
577
|
-
"source_spec_node_id": "navigation.contextvariable",
|
|
578
|
-
"source_layer": "navigation",
|
|
579
|
-
"destination_spec_node_id": "navigation.route",
|
|
580
|
-
"destination_layer": "navigation",
|
|
581
|
-
"predicate": "consumes",
|
|
582
|
-
"cardinality": "many-to-many",
|
|
583
|
-
"strength": "medium",
|
|
584
|
-
"required": false
|
|
585
|
-
},
|
|
586
|
-
"navigation.contextvariable.flows-to.navigation.flowstep": {
|
|
587
|
-
"id": "navigation.contextvariable.flows-to.navigation.flowstep",
|
|
588
|
-
"source_spec_node_id": "navigation.contextvariable",
|
|
589
|
-
"source_layer": "navigation",
|
|
590
|
-
"destination_spec_node_id": "navigation.flowstep",
|
|
709
|
+
"destination_spec_node_id": "navigation.routemeta",
|
|
591
710
|
"destination_layer": "navigation",
|
|
592
|
-
"predicate": "
|
|
711
|
+
"predicate": "references",
|
|
593
712
|
"cardinality": "many-to-many",
|
|
594
713
|
"strength": "medium",
|
|
595
|
-
"required": false
|
|
714
|
+
"required": false,
|
|
715
|
+
"description": "The breadcrumb configuration reads labels from the route meta, such as a breadcrumb title declared on each route."
|
|
596
716
|
},
|
|
597
717
|
"navigation.contextvariable.maps-to.api.parameter": {
|
|
598
718
|
"id": "navigation.contextvariable.maps-to.api.parameter",
|
|
@@ -603,7 +723,8 @@
|
|
|
603
723
|
"predicate": "maps-to",
|
|
604
724
|
"cardinality": "many-to-many",
|
|
605
725
|
"strength": "medium",
|
|
606
|
-
"required": false
|
|
726
|
+
"required": false,
|
|
727
|
+
"description": "The context variable carries the same value as an API parameter, such as a selected order id later sent as a path parameter."
|
|
607
728
|
},
|
|
608
729
|
"navigation.contextvariable.maps-to.data-model.schemaproperty": {
|
|
609
730
|
"id": "navigation.contextvariable.maps-to.data-model.schemaproperty",
|
|
@@ -614,7 +735,8 @@
|
|
|
614
735
|
"predicate": "maps-to",
|
|
615
736
|
"cardinality": "many-to-many",
|
|
616
737
|
"strength": "medium",
|
|
617
|
-
"required": false
|
|
738
|
+
"required": false,
|
|
739
|
+
"description": "The context variable holds the value of a schema property, which gives it its type, such as selectedOrderId mapping to Order.id."
|
|
618
740
|
},
|
|
619
741
|
"navigation.contextvariable.references.application.dataobject": {
|
|
620
742
|
"id": "navigation.contextvariable.references.application.dataobject",
|
|
@@ -625,7 +747,8 @@
|
|
|
625
747
|
"predicate": "references",
|
|
626
748
|
"cardinality": "many-to-many",
|
|
627
749
|
"strength": "medium",
|
|
628
|
-
"required": false
|
|
750
|
+
"required": false,
|
|
751
|
+
"description": "The context variable holds an instance of the data object, such as a draft cart carried between checkout steps."
|
|
629
752
|
},
|
|
630
753
|
"navigation.contextvariable.references.data-model.jsonschema": {
|
|
631
754
|
"id": "navigation.contextvariable.references.data-model.jsonschema",
|
|
@@ -636,40 +759,20 @@
|
|
|
636
759
|
"predicate": "references",
|
|
637
760
|
"cardinality": "many-to-many",
|
|
638
761
|
"strength": "medium",
|
|
639
|
-
"required": false
|
|
640
|
-
|
|
641
|
-
"navigation.contextvariable.triggers.navigation.navigationtransition": {
|
|
642
|
-
"id": "navigation.contextvariable.triggers.navigation.navigationtransition",
|
|
643
|
-
"source_spec_node_id": "navigation.contextvariable",
|
|
644
|
-
"source_layer": "navigation",
|
|
645
|
-
"destination_spec_node_id": "navigation.navigationtransition",
|
|
646
|
-
"destination_layer": "navigation",
|
|
647
|
-
"predicate": "triggers",
|
|
648
|
-
"cardinality": "many-to-many",
|
|
649
|
-
"strength": "medium",
|
|
650
|
-
"required": false
|
|
762
|
+
"required": false,
|
|
763
|
+
"description": "The context variable's value is validated by the schema document. Use maps-to a schema property instead when its type is one field."
|
|
651
764
|
},
|
|
652
|
-
"navigation.flowstep.accesses.
|
|
653
|
-
"id": "navigation.flowstep.accesses.
|
|
765
|
+
"navigation.flowstep.accesses.navigation.contextvariable": {
|
|
766
|
+
"id": "navigation.flowstep.accesses.navigation.contextvariable",
|
|
654
767
|
"source_spec_node_id": "navigation.flowstep",
|
|
655
768
|
"source_layer": "navigation",
|
|
656
|
-
"destination_spec_node_id": "
|
|
657
|
-
"destination_layer": "
|
|
658
|
-
"predicate": "accesses",
|
|
659
|
-
"cardinality": "many-to-many",
|
|
660
|
-
"strength": "medium",
|
|
661
|
-
"required": false
|
|
662
|
-
},
|
|
663
|
-
"navigation.flowstep.accesses.data-store.collection": {
|
|
664
|
-
"id": "navigation.flowstep.accesses.data-store.collection",
|
|
665
|
-
"source_spec_node_id": "navigation.flowstep",
|
|
666
|
-
"source_layer": "navigation",
|
|
667
|
-
"destination_spec_node_id": "data-store.collection",
|
|
668
|
-
"destination_layer": "data-store",
|
|
769
|
+
"destination_spec_node_id": "navigation.contextvariable",
|
|
770
|
+
"destination_layer": "navigation",
|
|
669
771
|
"predicate": "accesses",
|
|
670
772
|
"cardinality": "many-to-many",
|
|
671
773
|
"strength": "medium",
|
|
672
|
-
"required": false
|
|
774
|
+
"required": false,
|
|
775
|
+
"description": "The flow step reads or writes the context variable, such as a shipping step that stores the chosen address for later steps."
|
|
673
776
|
},
|
|
674
777
|
"navigation.flowstep.accesses.data-model.objectschema": {
|
|
675
778
|
"id": "navigation.flowstep.accesses.data-model.objectschema",
|
|
@@ -680,40 +783,8 @@
|
|
|
680
783
|
"predicate": "accesses",
|
|
681
784
|
"cardinality": "many-to-many",
|
|
682
785
|
"strength": "medium",
|
|
683
|
-
"required": false
|
|
684
|
-
|
|
685
|
-
"navigation.flowstep.accesses.api.operation": {
|
|
686
|
-
"id": "navigation.flowstep.accesses.api.operation",
|
|
687
|
-
"source_spec_node_id": "navigation.flowstep",
|
|
688
|
-
"source_layer": "navigation",
|
|
689
|
-
"destination_spec_node_id": "api.operation",
|
|
690
|
-
"destination_layer": "api",
|
|
691
|
-
"predicate": "accesses",
|
|
692
|
-
"cardinality": "many-to-many",
|
|
693
|
-
"strength": "medium",
|
|
694
|
-
"required": false
|
|
695
|
-
},
|
|
696
|
-
"navigation.flowstep.consumes.navigation.contextvariable": {
|
|
697
|
-
"id": "navigation.flowstep.consumes.navigation.contextvariable",
|
|
698
|
-
"source_spec_node_id": "navigation.flowstep",
|
|
699
|
-
"source_layer": "navigation",
|
|
700
|
-
"destination_spec_node_id": "navigation.contextvariable",
|
|
701
|
-
"destination_layer": "navigation",
|
|
702
|
-
"predicate": "consumes",
|
|
703
|
-
"cardinality": "many-to-many",
|
|
704
|
-
"strength": "medium",
|
|
705
|
-
"required": false
|
|
706
|
-
},
|
|
707
|
-
"navigation.flowstep.maps-to.ux.view": {
|
|
708
|
-
"id": "navigation.flowstep.maps-to.ux.view",
|
|
709
|
-
"source_spec_node_id": "navigation.flowstep",
|
|
710
|
-
"source_layer": "navigation",
|
|
711
|
-
"destination_spec_node_id": "ux.view",
|
|
712
|
-
"destination_layer": "ux",
|
|
713
|
-
"predicate": "maps-to",
|
|
714
|
-
"cardinality": "many-to-many",
|
|
715
|
-
"strength": "medium",
|
|
716
|
-
"required": false
|
|
786
|
+
"required": false,
|
|
787
|
+
"description": "The flow step loads or edits data of the object schema, such as a review step showing the Order."
|
|
717
788
|
},
|
|
718
789
|
"navigation.flowstep.navigates-to.navigation.route": {
|
|
719
790
|
"id": "navigation.flowstep.navigates-to.navigation.route",
|
|
@@ -724,40 +795,20 @@
|
|
|
724
795
|
"predicate": "navigates-to",
|
|
725
796
|
"cardinality": "many-to-many",
|
|
726
797
|
"strength": "medium",
|
|
727
|
-
"required": false
|
|
798
|
+
"required": false,
|
|
799
|
+
"description": "The flow step takes the user to its route; each step is bound to one route."
|
|
728
800
|
},
|
|
729
|
-
"navigation.flowstep.realizes.
|
|
730
|
-
"id": "navigation.flowstep.realizes.
|
|
801
|
+
"navigation.flowstep.realizes.product.workflowstep": {
|
|
802
|
+
"id": "navigation.flowstep.realizes.product.workflowstep",
|
|
731
803
|
"source_spec_node_id": "navigation.flowstep",
|
|
732
804
|
"source_layer": "navigation",
|
|
733
|
-
"destination_spec_node_id": "
|
|
734
|
-
"destination_layer": "
|
|
805
|
+
"destination_spec_node_id": "product.workflowstep",
|
|
806
|
+
"destination_layer": "product",
|
|
735
807
|
"predicate": "realizes",
|
|
736
808
|
"cardinality": "many-to-many",
|
|
737
809
|
"strength": "medium",
|
|
738
|
-
"required": false
|
|
739
|
-
|
|
740
|
-
"navigation.flowstep.realizes.navigation.route": {
|
|
741
|
-
"id": "navigation.flowstep.realizes.navigation.route",
|
|
742
|
-
"source_spec_node_id": "navigation.flowstep",
|
|
743
|
-
"source_layer": "navigation",
|
|
744
|
-
"destination_spec_node_id": "navigation.route",
|
|
745
|
-
"destination_layer": "navigation",
|
|
746
|
-
"predicate": "realizes",
|
|
747
|
-
"cardinality": "many-to-many",
|
|
748
|
-
"strength": "medium",
|
|
749
|
-
"required": false
|
|
750
|
-
},
|
|
751
|
-
"navigation.flowstep.requires.navigation.navigationguard": {
|
|
752
|
-
"id": "navigation.flowstep.requires.navigation.navigationguard",
|
|
753
|
-
"source_spec_node_id": "navigation.flowstep",
|
|
754
|
-
"source_layer": "navigation",
|
|
755
|
-
"destination_spec_node_id": "navigation.navigationguard",
|
|
756
|
-
"destination_layer": "navigation",
|
|
757
|
-
"predicate": "requires",
|
|
758
|
-
"cardinality": "many-to-many",
|
|
759
|
-
"strength": "medium",
|
|
760
|
-
"required": false
|
|
810
|
+
"required": false,
|
|
811
|
+
"description": "The flow step is the navigation implementation of the product workflow step."
|
|
761
812
|
},
|
|
762
813
|
"navigation.flowstep.satisfies.motivation.requirement": {
|
|
763
814
|
"id": "navigation.flowstep.satisfies.motivation.requirement",
|
|
@@ -768,7 +819,8 @@
|
|
|
768
819
|
"predicate": "satisfies",
|
|
769
820
|
"cardinality": "many-to-many",
|
|
770
821
|
"strength": "medium",
|
|
771
|
-
"required": false
|
|
822
|
+
"required": false,
|
|
823
|
+
"description": "The flow step meets a requirement, such as a confirmation step a regulation requires."
|
|
772
824
|
},
|
|
773
825
|
"navigation.flowstep.triggers.navigation.navigationtransition": {
|
|
774
826
|
"id": "navigation.flowstep.triggers.navigation.navigationtransition",
|
|
@@ -779,62 +831,56 @@
|
|
|
779
831
|
"predicate": "triggers",
|
|
780
832
|
"cardinality": "many-to-many",
|
|
781
833
|
"strength": "medium",
|
|
782
|
-
"required": false
|
|
783
|
-
|
|
784
|
-
"navigation.guardaction.depends-on.navigation.guardcondition": {
|
|
785
|
-
"id": "navigation.guardaction.depends-on.navigation.guardcondition",
|
|
786
|
-
"source_spec_node_id": "navigation.guardaction",
|
|
787
|
-
"source_layer": "navigation",
|
|
788
|
-
"destination_spec_node_id": "navigation.guardcondition",
|
|
789
|
-
"destination_layer": "navigation",
|
|
790
|
-
"predicate": "depends-on",
|
|
791
|
-
"cardinality": "many-to-many",
|
|
792
|
-
"strength": "medium",
|
|
793
|
-
"required": false
|
|
834
|
+
"required": false,
|
|
835
|
+
"description": "Completing the flow step fires the transition to the next route of the flow."
|
|
794
836
|
},
|
|
795
|
-
"navigation.
|
|
796
|
-
"id": "navigation.
|
|
797
|
-
"source_spec_node_id": "navigation.
|
|
837
|
+
"navigation.flowstep.uses.application.applicationservice": {
|
|
838
|
+
"id": "navigation.flowstep.uses.application.applicationservice",
|
|
839
|
+
"source_spec_node_id": "navigation.flowstep",
|
|
798
840
|
"source_layer": "navigation",
|
|
799
|
-
"destination_spec_node_id": "
|
|
800
|
-
"destination_layer": "
|
|
801
|
-
"predicate": "
|
|
841
|
+
"destination_spec_node_id": "application.applicationservice",
|
|
842
|
+
"destination_layer": "application",
|
|
843
|
+
"predicate": "uses",
|
|
802
844
|
"cardinality": "many-to-many",
|
|
803
845
|
"strength": "medium",
|
|
804
|
-
"required": false
|
|
846
|
+
"required": false,
|
|
847
|
+
"description": "The flow step relies on an application service, such as a payment step using the payment service."
|
|
805
848
|
},
|
|
806
|
-
"navigation.guardaction.
|
|
807
|
-
"id": "navigation.guardaction.
|
|
849
|
+
"navigation.guardaction.accesses.navigation.contextvariable": {
|
|
850
|
+
"id": "navigation.guardaction.accesses.navigation.contextvariable",
|
|
808
851
|
"source_spec_node_id": "navigation.guardaction",
|
|
809
852
|
"source_layer": "navigation",
|
|
810
853
|
"destination_spec_node_id": "navigation.contextvariable",
|
|
811
854
|
"destination_layer": "navigation",
|
|
812
|
-
"predicate": "
|
|
855
|
+
"predicate": "accesses",
|
|
813
856
|
"cardinality": "many-to-many",
|
|
814
857
|
"strength": "medium",
|
|
815
|
-
"required": false
|
|
858
|
+
"required": false,
|
|
859
|
+
"description": "The guard action reads or writes the context variable, such as saving the attempted route to return to after sign-in."
|
|
816
860
|
},
|
|
817
|
-
"navigation.
|
|
818
|
-
"id": "navigation.
|
|
819
|
-
"source_spec_node_id": "navigation.
|
|
861
|
+
"navigation.guardaction.navigates-to.navigation.route": {
|
|
862
|
+
"id": "navigation.guardaction.navigates-to.navigation.route",
|
|
863
|
+
"source_spec_node_id": "navigation.guardaction",
|
|
820
864
|
"source_layer": "navigation",
|
|
821
865
|
"destination_spec_node_id": "navigation.route",
|
|
822
866
|
"destination_layer": "navigation",
|
|
823
|
-
"predicate": "
|
|
867
|
+
"predicate": "navigates-to",
|
|
824
868
|
"cardinality": "many-to-many",
|
|
825
869
|
"strength": "medium",
|
|
826
|
-
"required": false
|
|
870
|
+
"required": false,
|
|
871
|
+
"description": "The guard action redirects the user to the route when the guard denies navigation, such as the sign-in route."
|
|
827
872
|
},
|
|
828
|
-
"navigation.guardcondition.
|
|
829
|
-
"id": "navigation.guardcondition.
|
|
873
|
+
"navigation.guardcondition.accesses.navigation.contextvariable": {
|
|
874
|
+
"id": "navigation.guardcondition.accesses.navigation.contextvariable",
|
|
830
875
|
"source_spec_node_id": "navigation.guardcondition",
|
|
831
876
|
"source_layer": "navigation",
|
|
832
877
|
"destination_spec_node_id": "navigation.contextvariable",
|
|
833
878
|
"destination_layer": "navigation",
|
|
834
|
-
"predicate": "
|
|
879
|
+
"predicate": "accesses",
|
|
835
880
|
"cardinality": "many-to-many",
|
|
836
881
|
"strength": "medium",
|
|
837
|
-
"required": false
|
|
882
|
+
"required": false,
|
|
883
|
+
"description": "The guard condition reads the context variable to decide, such as checking that earlier steps of the flow are complete."
|
|
838
884
|
},
|
|
839
885
|
"navigation.guardcondition.references.data-model.objectschema": {
|
|
840
886
|
"id": "navigation.guardcondition.references.data-model.objectschema",
|
|
@@ -845,7 +891,8 @@
|
|
|
845
891
|
"predicate": "references",
|
|
846
892
|
"cardinality": "many-to-many",
|
|
847
893
|
"strength": "medium",
|
|
848
|
-
"required": false
|
|
894
|
+
"required": false,
|
|
895
|
+
"description": "The guard condition tests data of the object schema, such as the current user's subscription status."
|
|
849
896
|
},
|
|
850
897
|
"navigation.guardcondition.references.security.permission": {
|
|
851
898
|
"id": "navigation.guardcondition.references.security.permission",
|
|
@@ -856,7 +903,8 @@
|
|
|
856
903
|
"predicate": "references",
|
|
857
904
|
"cardinality": "many-to-many",
|
|
858
905
|
"strength": "medium",
|
|
859
|
-
"required": false
|
|
906
|
+
"required": false,
|
|
907
|
+
"description": "The guard condition tests whether the user holds the permission."
|
|
860
908
|
},
|
|
861
909
|
"navigation.guardcondition.references.navigation.routemeta": {
|
|
862
910
|
"id": "navigation.guardcondition.references.navigation.routemeta",
|
|
@@ -867,40 +915,8 @@
|
|
|
867
915
|
"predicate": "references",
|
|
868
916
|
"cardinality": "many-to-many",
|
|
869
917
|
"strength": "medium",
|
|
870
|
-
"required": false
|
|
871
|
-
|
|
872
|
-
"navigation.guardcondition.triggers.navigation.guardaction": {
|
|
873
|
-
"id": "navigation.guardcondition.triggers.navigation.guardaction",
|
|
874
|
-
"source_spec_node_id": "navigation.guardcondition",
|
|
875
|
-
"source_layer": "navigation",
|
|
876
|
-
"destination_spec_node_id": "navigation.guardaction",
|
|
877
|
-
"destination_layer": "navigation",
|
|
878
|
-
"predicate": "triggers",
|
|
879
|
-
"cardinality": "many-to-many",
|
|
880
|
-
"strength": "medium",
|
|
881
|
-
"required": false
|
|
882
|
-
},
|
|
883
|
-
"navigation.guardcondition.uses.navigation.contextvariable": {
|
|
884
|
-
"id": "navigation.guardcondition.uses.navigation.contextvariable",
|
|
885
|
-
"source_spec_node_id": "navigation.guardcondition",
|
|
886
|
-
"source_layer": "navigation",
|
|
887
|
-
"destination_spec_node_id": "navigation.contextvariable",
|
|
888
|
-
"destination_layer": "navigation",
|
|
889
|
-
"predicate": "uses",
|
|
890
|
-
"cardinality": "many-to-many",
|
|
891
|
-
"strength": "medium",
|
|
892
|
-
"required": false
|
|
893
|
-
},
|
|
894
|
-
"navigation.navigationflow.accesses.data-store.collection": {
|
|
895
|
-
"id": "navigation.navigationflow.accesses.data-store.collection",
|
|
896
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
897
|
-
"source_layer": "navigation",
|
|
898
|
-
"destination_spec_node_id": "data-store.collection",
|
|
899
|
-
"destination_layer": "data-store",
|
|
900
|
-
"predicate": "accesses",
|
|
901
|
-
"cardinality": "many-to-many",
|
|
902
|
-
"strength": "medium",
|
|
903
|
-
"required": false
|
|
918
|
+
"required": false,
|
|
919
|
+
"description": "The guard condition reads the access hints in route meta, such as requiresAuth or the roles a route lists."
|
|
904
920
|
},
|
|
905
921
|
"navigation.navigationflow.accesses.data-model.objectschema": {
|
|
906
922
|
"id": "navigation.navigationflow.accesses.data-model.objectschema",
|
|
@@ -911,18 +927,8 @@
|
|
|
911
927
|
"predicate": "accesses",
|
|
912
928
|
"cardinality": "many-to-many",
|
|
913
929
|
"strength": "medium",
|
|
914
|
-
"required": false
|
|
915
|
-
|
|
916
|
-
"navigation.navigationflow.accesses.ux.view": {
|
|
917
|
-
"id": "navigation.navigationflow.accesses.ux.view",
|
|
918
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
919
|
-
"source_layer": "navigation",
|
|
920
|
-
"destination_spec_node_id": "ux.view",
|
|
921
|
-
"destination_layer": "ux",
|
|
922
|
-
"predicate": "accesses",
|
|
923
|
-
"cardinality": "many-to-many",
|
|
924
|
-
"strength": "medium",
|
|
925
|
-
"required": false
|
|
930
|
+
"required": false,
|
|
931
|
+
"description": "The flow loads or builds data of the object schema across its steps, such as the Order a checkout assembles."
|
|
926
932
|
},
|
|
927
933
|
"navigation.navigationflow.aggregates.navigation.contextvariable": {
|
|
928
934
|
"id": "navigation.navigationflow.aggregates.navigation.contextvariable",
|
|
@@ -933,18 +939,8 @@
|
|
|
933
939
|
"predicate": "aggregates",
|
|
934
940
|
"cardinality": "many-to-many",
|
|
935
941
|
"strength": "medium",
|
|
936
|
-
"required": false
|
|
937
|
-
|
|
938
|
-
"navigation.navigationflow.aggregates.navigation.flowstep": {
|
|
939
|
-
"id": "navigation.navigationflow.aggregates.navigation.flowstep",
|
|
940
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
941
|
-
"source_layer": "navigation",
|
|
942
|
-
"destination_spec_node_id": "navigation.flowstep",
|
|
943
|
-
"destination_layer": "navigation",
|
|
944
|
-
"predicate": "aggregates",
|
|
945
|
-
"cardinality": "many-to-many",
|
|
946
|
-
"strength": "medium",
|
|
947
|
-
"required": false
|
|
942
|
+
"required": false,
|
|
943
|
+
"description": "The context variable is part of the state the flow carries between its steps."
|
|
948
944
|
},
|
|
949
945
|
"navigation.navigationflow.composes.navigation.flowstep": {
|
|
950
946
|
"id": "navigation.navigationflow.composes.navigation.flowstep",
|
|
@@ -955,18 +951,8 @@
|
|
|
955
951
|
"predicate": "composes",
|
|
956
952
|
"cardinality": "many-to-many",
|
|
957
953
|
"strength": "medium",
|
|
958
|
-
"required": false
|
|
959
|
-
|
|
960
|
-
"navigation.navigationflow.flows-to.navigation.navigationtransition": {
|
|
961
|
-
"id": "navigation.navigationflow.flows-to.navigation.navigationtransition",
|
|
962
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
963
|
-
"source_layer": "navigation",
|
|
964
|
-
"destination_spec_node_id": "navigation.navigationtransition",
|
|
965
|
-
"destination_layer": "navigation",
|
|
966
|
-
"predicate": "flows-to",
|
|
967
|
-
"cardinality": "many-to-many",
|
|
968
|
-
"strength": "medium",
|
|
969
|
-
"required": false
|
|
954
|
+
"required": false,
|
|
955
|
+
"description": "The flow step is one ordered position in the flow and exists only within it."
|
|
970
956
|
},
|
|
971
957
|
"navigation.navigationflow.realizes.application.applicationprocess": {
|
|
972
958
|
"id": "navigation.navigationflow.realizes.application.applicationprocess",
|
|
@@ -977,40 +963,32 @@
|
|
|
977
963
|
"predicate": "realizes",
|
|
978
964
|
"cardinality": "many-to-many",
|
|
979
965
|
"strength": "medium",
|
|
980
|
-
"required": false
|
|
966
|
+
"required": false,
|
|
967
|
+
"description": "The flow is the user-facing side of an application process, such as a checkout flow for the order-placement process."
|
|
981
968
|
},
|
|
982
|
-
"navigation.navigationflow.realizes.
|
|
983
|
-
"id": "navigation.navigationflow.realizes.
|
|
969
|
+
"navigation.navigationflow.realizes.product.userworkflow": {
|
|
970
|
+
"id": "navigation.navigationflow.realizes.product.userworkflow",
|
|
984
971
|
"source_spec_node_id": "navigation.navigationflow",
|
|
985
972
|
"source_layer": "navigation",
|
|
986
|
-
"destination_spec_node_id": "
|
|
987
|
-
"destination_layer": "
|
|
988
|
-
"predicate": "realizes",
|
|
989
|
-
"cardinality": "many-to-many",
|
|
990
|
-
"strength": "medium",
|
|
991
|
-
"required": false
|
|
992
|
-
},
|
|
993
|
-
"navigation.navigationflow.realizes.motivation.goal": {
|
|
994
|
-
"id": "navigation.navigationflow.realizes.motivation.goal",
|
|
995
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
996
|
-
"source_layer": "navigation",
|
|
997
|
-
"destination_spec_node_id": "motivation.goal",
|
|
998
|
-
"destination_layer": "motivation",
|
|
973
|
+
"destination_spec_node_id": "product.userworkflow",
|
|
974
|
+
"destination_layer": "product",
|
|
999
975
|
"predicate": "realizes",
|
|
1000
976
|
"cardinality": "many-to-many",
|
|
1001
977
|
"strength": "medium",
|
|
1002
|
-
"required": false
|
|
978
|
+
"required": false,
|
|
979
|
+
"description": "The flow is the navigation implementation of the product user workflow; this is how navigation reaches the business and motivation layers."
|
|
1003
980
|
},
|
|
1004
|
-
"navigation.navigationflow.
|
|
1005
|
-
"id": "navigation.navigationflow.
|
|
981
|
+
"navigation.navigationflow.satisfies.security.bindingofduty": {
|
|
982
|
+
"id": "navigation.navigationflow.satisfies.security.bindingofduty",
|
|
1006
983
|
"source_spec_node_id": "navigation.navigationflow",
|
|
1007
984
|
"source_layer": "navigation",
|
|
1008
|
-
"destination_spec_node_id": "
|
|
1009
|
-
"destination_layer": "
|
|
1010
|
-
"predicate": "
|
|
985
|
+
"destination_spec_node_id": "security.bindingofduty",
|
|
986
|
+
"destination_layer": "security",
|
|
987
|
+
"predicate": "satisfies",
|
|
1011
988
|
"cardinality": "many-to-many",
|
|
1012
989
|
"strength": "medium",
|
|
1013
|
-
"required": false
|
|
990
|
+
"required": false,
|
|
991
|
+
"description": "The flow keeps the bound steps with one actor, as the binding-of-duty rule requires, such as the same user confirming the order they started."
|
|
1014
992
|
},
|
|
1015
993
|
"navigation.navigationflow.satisfies.motivation.requirement": {
|
|
1016
994
|
"id": "navigation.navigationflow.satisfies.motivation.requirement",
|
|
@@ -1021,29 +999,8 @@
|
|
|
1021
999
|
"predicate": "satisfies",
|
|
1022
1000
|
"cardinality": "many-to-many",
|
|
1023
1001
|
"strength": "medium",
|
|
1024
|
-
"required": false
|
|
1025
|
-
|
|
1026
|
-
"navigation.navigationflow.satisfies.security.securityconstraints": {
|
|
1027
|
-
"id": "navigation.navigationflow.satisfies.security.securityconstraints",
|
|
1028
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
1029
|
-
"source_layer": "navigation",
|
|
1030
|
-
"destination_spec_node_id": "security.securityconstraints",
|
|
1031
|
-
"destination_layer": "security",
|
|
1032
|
-
"predicate": "satisfies",
|
|
1033
|
-
"cardinality": "many-to-many",
|
|
1034
|
-
"strength": "medium",
|
|
1035
|
-
"required": false
|
|
1036
|
-
},
|
|
1037
|
-
"navigation.navigationflow.serves.business.businessservice": {
|
|
1038
|
-
"id": "navigation.navigationflow.serves.business.businessservice",
|
|
1039
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
1040
|
-
"source_layer": "navigation",
|
|
1041
|
-
"destination_spec_node_id": "business.businessservice",
|
|
1042
|
-
"destination_layer": "business",
|
|
1043
|
-
"predicate": "serves",
|
|
1044
|
-
"cardinality": "many-to-many",
|
|
1045
|
-
"strength": "medium",
|
|
1046
|
-
"required": false
|
|
1002
|
+
"required": false,
|
|
1003
|
+
"description": "The flow meets a requirement, such as an onboarding sequence a requirement prescribes."
|
|
1047
1004
|
},
|
|
1048
1005
|
"navigation.navigationflow.triggers.application.applicationevent": {
|
|
1049
1006
|
"id": "navigation.navigationflow.triggers.application.applicationevent",
|
|
@@ -1054,29 +1011,8 @@
|
|
|
1054
1011
|
"predicate": "triggers",
|
|
1055
1012
|
"cardinality": "many-to-many",
|
|
1056
1013
|
"strength": "medium",
|
|
1057
|
-
"required": false
|
|
1058
|
-
|
|
1059
|
-
"navigation.navigationflow.triggers.business.businessprocess": {
|
|
1060
|
-
"id": "navigation.navigationflow.triggers.business.businessprocess",
|
|
1061
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
1062
|
-
"source_layer": "navigation",
|
|
1063
|
-
"destination_spec_node_id": "business.businessprocess",
|
|
1064
|
-
"destination_layer": "business",
|
|
1065
|
-
"predicate": "triggers",
|
|
1066
|
-
"cardinality": "many-to-many",
|
|
1067
|
-
"strength": "medium",
|
|
1068
|
-
"required": false
|
|
1069
|
-
},
|
|
1070
|
-
"navigation.navigationflow.uses.technology.systemsoftware": {
|
|
1071
|
-
"id": "navigation.navigationflow.uses.technology.systemsoftware",
|
|
1072
|
-
"source_spec_node_id": "navigation.navigationflow",
|
|
1073
|
-
"source_layer": "navigation",
|
|
1074
|
-
"destination_spec_node_id": "technology.systemsoftware",
|
|
1075
|
-
"destination_layer": "technology",
|
|
1076
|
-
"predicate": "uses",
|
|
1077
|
-
"cardinality": "many-to-many",
|
|
1078
|
-
"strength": "medium",
|
|
1079
|
-
"required": false
|
|
1014
|
+
"required": false,
|
|
1015
|
+
"description": "Completing or abandoning the flow raises an application event, such as CheckoutCompleted."
|
|
1080
1016
|
},
|
|
1081
1017
|
"navigation.navigationgraph.aggregates.navigation.breadcrumbconfig": {
|
|
1082
1018
|
"id": "navigation.navigationgraph.aggregates.navigation.breadcrumbconfig",
|
|
@@ -1087,7 +1023,8 @@
|
|
|
1087
1023
|
"predicate": "aggregates",
|
|
1088
1024
|
"cardinality": "many-to-many",
|
|
1089
1025
|
"strength": "medium",
|
|
1090
|
-
"required": false
|
|
1026
|
+
"required": false,
|
|
1027
|
+
"description": "The breadcrumb configuration applies within the graph's routes."
|
|
1091
1028
|
},
|
|
1092
1029
|
"navigation.navigationgraph.aggregates.navigation.navigationflow": {
|
|
1093
1030
|
"id": "navigation.navigationgraph.aggregates.navigation.navigationflow",
|
|
@@ -1098,7 +1035,8 @@
|
|
|
1098
1035
|
"predicate": "aggregates",
|
|
1099
1036
|
"cardinality": "many-to-many",
|
|
1100
1037
|
"strength": "medium",
|
|
1101
|
-
"required": false
|
|
1038
|
+
"required": false,
|
|
1039
|
+
"description": "The flow runs over the graph's routes."
|
|
1102
1040
|
},
|
|
1103
1041
|
"navigation.navigationgraph.aggregates.navigation.navigationguard": {
|
|
1104
1042
|
"id": "navigation.navigationgraph.aggregates.navigation.navigationguard",
|
|
@@ -1109,29 +1047,8 @@
|
|
|
1109
1047
|
"predicate": "aggregates",
|
|
1110
1048
|
"cardinality": "many-to-many",
|
|
1111
1049
|
"strength": "medium",
|
|
1112
|
-
"required": false
|
|
1113
|
-
|
|
1114
|
-
"navigation.navigationgraph.aggregates.navigation.navigationtransition": {
|
|
1115
|
-
"id": "navigation.navigationgraph.aggregates.navigation.navigationtransition",
|
|
1116
|
-
"source_spec_node_id": "navigation.navigationgraph",
|
|
1117
|
-
"source_layer": "navigation",
|
|
1118
|
-
"destination_spec_node_id": "navigation.navigationtransition",
|
|
1119
|
-
"destination_layer": "navigation",
|
|
1120
|
-
"predicate": "aggregates",
|
|
1121
|
-
"cardinality": "many-to-many",
|
|
1122
|
-
"strength": "medium",
|
|
1123
|
-
"required": false
|
|
1124
|
-
},
|
|
1125
|
-
"navigation.navigationgraph.aggregates.navigation.route": {
|
|
1126
|
-
"id": "navigation.navigationgraph.aggregates.navigation.route",
|
|
1127
|
-
"source_spec_node_id": "navigation.navigationgraph",
|
|
1128
|
-
"source_layer": "navigation",
|
|
1129
|
-
"destination_spec_node_id": "navigation.route",
|
|
1130
|
-
"destination_layer": "navigation",
|
|
1131
|
-
"predicate": "aggregates",
|
|
1132
|
-
"cardinality": "many-to-many",
|
|
1133
|
-
"strength": "medium",
|
|
1134
|
-
"required": false
|
|
1050
|
+
"required": false,
|
|
1051
|
+
"description": "The guard is registered with the graph's router, globally or on some of its routes."
|
|
1135
1052
|
},
|
|
1136
1053
|
"navigation.navigationgraph.composes.navigation.navigationtransition": {
|
|
1137
1054
|
"id": "navigation.navigationgraph.composes.navigation.navigationtransition",
|
|
@@ -1142,7 +1059,8 @@
|
|
|
1142
1059
|
"predicate": "composes",
|
|
1143
1060
|
"cardinality": "many-to-many",
|
|
1144
1061
|
"strength": "medium",
|
|
1145
|
-
"required": false
|
|
1062
|
+
"required": false,
|
|
1063
|
+
"description": "The transition is one permitted route change in the graph's router."
|
|
1146
1064
|
},
|
|
1147
1065
|
"navigation.navigationgraph.composes.navigation.route": {
|
|
1148
1066
|
"id": "navigation.navigationgraph.composes.navigation.route",
|
|
@@ -1153,95 +1071,92 @@
|
|
|
1153
1071
|
"predicate": "composes",
|
|
1154
1072
|
"cardinality": "many-to-many",
|
|
1155
1073
|
"strength": "medium",
|
|
1156
|
-
"required": false
|
|
1074
|
+
"required": false,
|
|
1075
|
+
"description": "The route is an entry in the graph's route table and exists only within it."
|
|
1157
1076
|
},
|
|
1158
|
-
"navigation.navigationgraph.
|
|
1159
|
-
"id": "navigation.navigationgraph.
|
|
1077
|
+
"navigation.navigationgraph.depends-on.technology.systemsoftware": {
|
|
1078
|
+
"id": "navigation.navigationgraph.depends-on.technology.systemsoftware",
|
|
1160
1079
|
"source_spec_node_id": "navigation.navigationgraph",
|
|
1161
1080
|
"source_layer": "navigation",
|
|
1162
1081
|
"destination_spec_node_id": "technology.systemsoftware",
|
|
1163
1082
|
"destination_layer": "technology",
|
|
1164
|
-
"predicate": "
|
|
1083
|
+
"predicate": "depends-on",
|
|
1165
1084
|
"cardinality": "many-to-many",
|
|
1166
1085
|
"strength": "medium",
|
|
1167
|
-
"required": false
|
|
1086
|
+
"required": false,
|
|
1087
|
+
"description": "The graph is configured for a router library or framework, such as React Router or Vue Router."
|
|
1168
1088
|
},
|
|
1169
|
-
"navigation.navigationguard.accesses.
|
|
1170
|
-
"id": "navigation.navigationguard.accesses.
|
|
1089
|
+
"navigation.navigationguard.accesses.navigation.contextvariable": {
|
|
1090
|
+
"id": "navigation.navigationguard.accesses.navigation.contextvariable",
|
|
1171
1091
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1172
1092
|
"source_layer": "navigation",
|
|
1173
|
-
"destination_spec_node_id": "
|
|
1174
|
-
"destination_layer": "
|
|
1093
|
+
"destination_spec_node_id": "navigation.contextvariable",
|
|
1094
|
+
"destination_layer": "navigation",
|
|
1175
1095
|
"predicate": "accesses",
|
|
1176
1096
|
"cardinality": "many-to-many",
|
|
1177
1097
|
"strength": "medium",
|
|
1178
|
-
"required": false
|
|
1098
|
+
"required": false,
|
|
1099
|
+
"description": "The guard reads or writes the context variable, such as checking that a flow was started properly."
|
|
1179
1100
|
},
|
|
1180
|
-
"navigation.navigationguard.accesses.
|
|
1181
|
-
"id": "navigation.navigationguard.accesses.
|
|
1101
|
+
"navigation.navigationguard.accesses.data-model.objectschema": {
|
|
1102
|
+
"id": "navigation.navigationguard.accesses.data-model.objectschema",
|
|
1182
1103
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1183
1104
|
"source_layer": "navigation",
|
|
1184
|
-
"destination_spec_node_id": "
|
|
1185
|
-
"destination_layer": "
|
|
1105
|
+
"destination_spec_node_id": "data-model.objectschema",
|
|
1106
|
+
"destination_layer": "data-model",
|
|
1186
1107
|
"predicate": "accesses",
|
|
1187
1108
|
"cardinality": "many-to-many",
|
|
1188
1109
|
"strength": "medium",
|
|
1189
|
-
"required": false
|
|
1110
|
+
"required": false,
|
|
1111
|
+
"description": "The guard reads data of the object schema to decide, such as loading the user profile it checks."
|
|
1190
1112
|
},
|
|
1191
|
-
"navigation.navigationguard.
|
|
1192
|
-
"id": "navigation.navigationguard.
|
|
1113
|
+
"navigation.navigationguard.evaluates.navigation.guardcondition": {
|
|
1114
|
+
"id": "navigation.navigationguard.evaluates.navigation.guardcondition",
|
|
1193
1115
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1194
1116
|
"source_layer": "navigation",
|
|
1195
|
-
"destination_spec_node_id": "navigation.
|
|
1117
|
+
"destination_spec_node_id": "navigation.guardcondition",
|
|
1196
1118
|
"destination_layer": "navigation",
|
|
1197
|
-
"predicate": "
|
|
1119
|
+
"predicate": "evaluates",
|
|
1198
1120
|
"cardinality": "many-to-many",
|
|
1199
1121
|
"strength": "medium",
|
|
1200
|
-
"required": false
|
|
1122
|
+
"required": false,
|
|
1123
|
+
"description": "The guard runs the condition to decide whether navigation may proceed."
|
|
1201
1124
|
},
|
|
1202
|
-
"navigation.navigationguard.
|
|
1203
|
-
"id": "navigation.navigationguard.
|
|
1125
|
+
"navigation.navigationguard.protects.navigation.flowstep": {
|
|
1126
|
+
"id": "navigation.navigationguard.protects.navigation.flowstep",
|
|
1204
1127
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1205
1128
|
"source_layer": "navigation",
|
|
1206
|
-
"destination_spec_node_id": "navigation.
|
|
1129
|
+
"destination_spec_node_id": "navigation.flowstep",
|
|
1207
1130
|
"destination_layer": "navigation",
|
|
1208
|
-
"predicate": "
|
|
1131
|
+
"predicate": "protects",
|
|
1209
1132
|
"cardinality": "many-to-many",
|
|
1210
1133
|
"strength": "medium",
|
|
1211
|
-
"required": false
|
|
1134
|
+
"required": false,
|
|
1135
|
+
"description": "The guard decides whether the user may enter the flow step."
|
|
1212
1136
|
},
|
|
1213
|
-
"navigation.navigationguard.
|
|
1214
|
-
"id": "navigation.navigationguard.
|
|
1137
|
+
"navigation.navigationguard.protects.navigation.navigationflow": {
|
|
1138
|
+
"id": "navigation.navigationguard.protects.navigation.navigationflow",
|
|
1215
1139
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1216
1140
|
"source_layer": "navigation",
|
|
1217
|
-
"destination_spec_node_id": "navigation.
|
|
1141
|
+
"destination_spec_node_id": "navigation.navigationflow",
|
|
1218
1142
|
"destination_layer": "navigation",
|
|
1219
|
-
"predicate": "
|
|
1220
|
-
"cardinality": "many-to-many",
|
|
1221
|
-
"strength": "medium",
|
|
1222
|
-
"required": false
|
|
1223
|
-
},
|
|
1224
|
-
"navigation.navigationguard.implements.security.securitypolicy": {
|
|
1225
|
-
"id": "navigation.navigationguard.implements.security.securitypolicy",
|
|
1226
|
-
"source_spec_node_id": "navigation.navigationguard",
|
|
1227
|
-
"source_layer": "navigation",
|
|
1228
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
1229
|
-
"destination_layer": "security",
|
|
1230
|
-
"predicate": "implements",
|
|
1143
|
+
"predicate": "protects",
|
|
1231
1144
|
"cardinality": "many-to-many",
|
|
1232
1145
|
"strength": "medium",
|
|
1233
|
-
"required": false
|
|
1146
|
+
"required": false,
|
|
1147
|
+
"description": "The guard decides whether the user may enter or continue the flow."
|
|
1234
1148
|
},
|
|
1235
|
-
"navigation.navigationguard.
|
|
1236
|
-
"id": "navigation.navigationguard.
|
|
1149
|
+
"navigation.navigationguard.protects.navigation.navigationtransition": {
|
|
1150
|
+
"id": "navigation.navigationguard.protects.navigation.navigationtransition",
|
|
1237
1151
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1238
1152
|
"source_layer": "navigation",
|
|
1239
|
-
"destination_spec_node_id": "navigation.
|
|
1153
|
+
"destination_spec_node_id": "navigation.navigationtransition",
|
|
1240
1154
|
"destination_layer": "navigation",
|
|
1241
|
-
"predicate": "
|
|
1155
|
+
"predicate": "protects",
|
|
1242
1156
|
"cardinality": "many-to-many",
|
|
1243
1157
|
"strength": "medium",
|
|
1244
|
-
"required": false
|
|
1158
|
+
"required": false,
|
|
1159
|
+
"description": "The guard decides whether the transition may happen, such as a leave guard on unsaved changes."
|
|
1245
1160
|
},
|
|
1246
1161
|
"navigation.navigationguard.protects.navigation.route": {
|
|
1247
1162
|
"id": "navigation.navigationguard.protects.navigation.route",
|
|
@@ -1252,18 +1167,20 @@
|
|
|
1252
1167
|
"predicate": "protects",
|
|
1253
1168
|
"cardinality": "many-to-many",
|
|
1254
1169
|
"strength": "medium",
|
|
1255
|
-
"required": false
|
|
1170
|
+
"required": false,
|
|
1171
|
+
"description": "The guard decides whether the user may activate the route."
|
|
1256
1172
|
},
|
|
1257
|
-
"navigation.navigationguard.realizes.
|
|
1258
|
-
"id": "navigation.navigationguard.realizes.
|
|
1173
|
+
"navigation.navigationguard.realizes.security.securitypolicy": {
|
|
1174
|
+
"id": "navigation.navigationguard.realizes.security.securitypolicy",
|
|
1259
1175
|
"source_spec_node_id": "navigation.navigationguard",
|
|
1260
1176
|
"source_layer": "navigation",
|
|
1261
|
-
"destination_spec_node_id": "
|
|
1262
|
-
"destination_layer": "
|
|
1177
|
+
"destination_spec_node_id": "security.securitypolicy",
|
|
1178
|
+
"destination_layer": "security",
|
|
1263
1179
|
"predicate": "realizes",
|
|
1264
1180
|
"cardinality": "many-to-many",
|
|
1265
1181
|
"strength": "medium",
|
|
1266
|
-
"required": false
|
|
1182
|
+
"required": false,
|
|
1183
|
+
"description": "The guard is the client-side part of enforcing the security policy; enforcement on the server is still needed."
|
|
1267
1184
|
},
|
|
1268
1185
|
"navigation.navigationguard.references.business.businessrole": {
|
|
1269
1186
|
"id": "navigation.navigationguard.references.business.businessrole",
|
|
@@ -1274,7 +1191,8 @@
|
|
|
1274
1191
|
"predicate": "references",
|
|
1275
1192
|
"cardinality": "many-to-many",
|
|
1276
1193
|
"strength": "medium",
|
|
1277
|
-
"required": false
|
|
1194
|
+
"required": false,
|
|
1195
|
+
"description": "The guard checks the business role the user plays."
|
|
1278
1196
|
},
|
|
1279
1197
|
"navigation.navigationguard.requires.security.role": {
|
|
1280
1198
|
"id": "navigation.navigationguard.requires.security.role",
|
|
@@ -1285,7 +1203,8 @@
|
|
|
1285
1203
|
"predicate": "requires",
|
|
1286
1204
|
"cardinality": "many-to-many",
|
|
1287
1205
|
"strength": "medium",
|
|
1288
|
-
"required": false
|
|
1206
|
+
"required": false,
|
|
1207
|
+
"description": "The guard admits only users who hold the security role."
|
|
1289
1208
|
},
|
|
1290
1209
|
"navigation.navigationguard.satisfies.motivation.constraint": {
|
|
1291
1210
|
"id": "navigation.navigationguard.satisfies.motivation.constraint",
|
|
@@ -1296,7 +1215,20 @@
|
|
|
1296
1215
|
"predicate": "satisfies",
|
|
1297
1216
|
"cardinality": "many-to-many",
|
|
1298
1217
|
"strength": "medium",
|
|
1299
|
-
"required": false
|
|
1218
|
+
"required": false,
|
|
1219
|
+
"description": "The guard meets a constraint, such as blocking a region where a feature may not be offered."
|
|
1220
|
+
},
|
|
1221
|
+
"navigation.navigationguard.satisfies.motivation.principle": {
|
|
1222
|
+
"id": "navigation.navigationguard.satisfies.motivation.principle",
|
|
1223
|
+
"source_spec_node_id": "navigation.navigationguard",
|
|
1224
|
+
"source_layer": "navigation",
|
|
1225
|
+
"destination_spec_node_id": "motivation.principle",
|
|
1226
|
+
"destination_layer": "motivation",
|
|
1227
|
+
"predicate": "satisfies",
|
|
1228
|
+
"cardinality": "many-to-many",
|
|
1229
|
+
"strength": "medium",
|
|
1230
|
+
"required": false,
|
|
1231
|
+
"description": "The guard enforces the principle on navigation, such as a guard that applies 'deny by default' to protected routes."
|
|
1300
1232
|
},
|
|
1301
1233
|
"navigation.navigationguard.triggers.ux.experiencestate": {
|
|
1302
1234
|
"id": "navigation.navigationguard.triggers.ux.experiencestate",
|
|
@@ -1307,7 +1239,8 @@
|
|
|
1307
1239
|
"predicate": "triggers",
|
|
1308
1240
|
"cardinality": "many-to-many",
|
|
1309
1241
|
"strength": "medium",
|
|
1310
|
-
"required": false
|
|
1242
|
+
"required": false,
|
|
1243
|
+
"description": "The guard puts the UI into an experience state, such as a locked or upgrade-prompt state."
|
|
1311
1244
|
},
|
|
1312
1245
|
"navigation.navigationguard.triggers.navigation.guardaction": {
|
|
1313
1246
|
"id": "navigation.navigationguard.triggers.navigation.guardaction",
|
|
@@ -1318,7 +1251,8 @@
|
|
|
1318
1251
|
"predicate": "triggers",
|
|
1319
1252
|
"cardinality": "many-to-many",
|
|
1320
1253
|
"strength": "medium",
|
|
1321
|
-
"required": false
|
|
1254
|
+
"required": false,
|
|
1255
|
+
"description": "The guard runs the action when its condition fails."
|
|
1322
1256
|
},
|
|
1323
1257
|
"navigation.navigationguard.uses.application.applicationservice": {
|
|
1324
1258
|
"id": "navigation.navigationguard.uses.application.applicationservice",
|
|
@@ -1329,29 +1263,8 @@
|
|
|
1329
1263
|
"predicate": "uses",
|
|
1330
1264
|
"cardinality": "many-to-many",
|
|
1331
1265
|
"strength": "medium",
|
|
1332
|
-
"required": false
|
|
1333
|
-
|
|
1334
|
-
"navigation.navigationguard.uses.navigation.guardcondition": {
|
|
1335
|
-
"id": "navigation.navigationguard.uses.navigation.guardcondition",
|
|
1336
|
-
"source_spec_node_id": "navigation.navigationguard",
|
|
1337
|
-
"source_layer": "navigation",
|
|
1338
|
-
"destination_spec_node_id": "navigation.guardcondition",
|
|
1339
|
-
"destination_layer": "navigation",
|
|
1340
|
-
"predicate": "uses",
|
|
1341
|
-
"cardinality": "many-to-many",
|
|
1342
|
-
"strength": "medium",
|
|
1343
|
-
"required": false
|
|
1344
|
-
},
|
|
1345
|
-
"navigation.navigationguard.uses.data-model.objectschema": {
|
|
1346
|
-
"id": "navigation.navigationguard.uses.data-model.objectschema",
|
|
1347
|
-
"source_spec_node_id": "navigation.navigationguard",
|
|
1348
|
-
"source_layer": "navigation",
|
|
1349
|
-
"destination_spec_node_id": "data-model.objectschema",
|
|
1350
|
-
"destination_layer": "data-model",
|
|
1351
|
-
"predicate": "uses",
|
|
1352
|
-
"cardinality": "many-to-many",
|
|
1353
|
-
"strength": "medium",
|
|
1354
|
-
"required": false
|
|
1266
|
+
"required": false,
|
|
1267
|
+
"description": "The guard relies on an application service, such as the authentication service."
|
|
1355
1268
|
},
|
|
1356
1269
|
"navigation.navigationguard.uses.api.securityscheme": {
|
|
1357
1270
|
"id": "navigation.navigationguard.uses.api.securityscheme",
|
|
@@ -1362,29 +1275,20 @@
|
|
|
1362
1275
|
"predicate": "uses",
|
|
1363
1276
|
"cardinality": "many-to-many",
|
|
1364
1277
|
"strength": "medium",
|
|
1365
|
-
"required": false
|
|
1278
|
+
"required": false,
|
|
1279
|
+
"description": "The guard relies on the security scheme, such as checking for a valid bearer token."
|
|
1366
1280
|
},
|
|
1367
|
-
"navigation.
|
|
1368
|
-
"id": "navigation.
|
|
1369
|
-
"source_spec_node_id": "navigation.navigationguard",
|
|
1370
|
-
"source_layer": "navigation",
|
|
1371
|
-
"destination_spec_node_id": "technology.systemsoftware",
|
|
1372
|
-
"destination_layer": "technology",
|
|
1373
|
-
"predicate": "uses",
|
|
1374
|
-
"cardinality": "many-to-many",
|
|
1375
|
-
"strength": "medium",
|
|
1376
|
-
"required": false
|
|
1377
|
-
},
|
|
1378
|
-
"navigation.navigationtransition.flows-to.navigation.route": {
|
|
1379
|
-
"id": "navigation.navigationtransition.flows-to.navigation.route",
|
|
1281
|
+
"navigation.navigationtransition.accesses.navigation.contextvariable": {
|
|
1282
|
+
"id": "navigation.navigationtransition.accesses.navigation.contextvariable",
|
|
1380
1283
|
"source_spec_node_id": "navigation.navigationtransition",
|
|
1381
1284
|
"source_layer": "navigation",
|
|
1382
|
-
"destination_spec_node_id": "navigation.
|
|
1285
|
+
"destination_spec_node_id": "navigation.contextvariable",
|
|
1383
1286
|
"destination_layer": "navigation",
|
|
1384
|
-
"predicate": "
|
|
1287
|
+
"predicate": "accesses",
|
|
1385
1288
|
"cardinality": "many-to-many",
|
|
1386
1289
|
"strength": "medium",
|
|
1387
|
-
"required": false
|
|
1290
|
+
"required": false,
|
|
1291
|
+
"description": "The transition reads or writes the context variable, such as passing the selected item to the destination route."
|
|
1388
1292
|
},
|
|
1389
1293
|
"navigation.navigationtransition.navigates-to.navigation.route": {
|
|
1390
1294
|
"id": "navigation.navigationtransition.navigates-to.navigation.route",
|
|
@@ -1395,29 +1299,8 @@
|
|
|
1395
1299
|
"predicate": "navigates-to",
|
|
1396
1300
|
"cardinality": "many-to-many",
|
|
1397
1301
|
"strength": "medium",
|
|
1398
|
-
"required": false
|
|
1399
|
-
|
|
1400
|
-
"navigation.navigationtransition.requires.navigation.navigationguard": {
|
|
1401
|
-
"id": "navigation.navigationtransition.requires.navigation.navigationguard",
|
|
1402
|
-
"source_spec_node_id": "navigation.navigationtransition",
|
|
1403
|
-
"source_layer": "navigation",
|
|
1404
|
-
"destination_spec_node_id": "navigation.navigationguard",
|
|
1405
|
-
"destination_layer": "navigation",
|
|
1406
|
-
"predicate": "requires",
|
|
1407
|
-
"cardinality": "many-to-many",
|
|
1408
|
-
"strength": "medium",
|
|
1409
|
-
"required": false
|
|
1410
|
-
},
|
|
1411
|
-
"navigation.navigationtransition.triggers.navigation.guardaction": {
|
|
1412
|
-
"id": "navigation.navigationtransition.triggers.navigation.guardaction",
|
|
1413
|
-
"source_spec_node_id": "navigation.navigationtransition",
|
|
1414
|
-
"source_layer": "navigation",
|
|
1415
|
-
"destination_spec_node_id": "navigation.guardaction",
|
|
1416
|
-
"destination_layer": "navigation",
|
|
1417
|
-
"predicate": "triggers",
|
|
1418
|
-
"cardinality": "many-to-many",
|
|
1419
|
-
"strength": "medium",
|
|
1420
|
-
"required": false
|
|
1302
|
+
"required": false,
|
|
1303
|
+
"description": "The transition's destination is the route."
|
|
1421
1304
|
},
|
|
1422
1305
|
"navigation.navigationtransition.triggers.ux.statetransition": {
|
|
1423
1306
|
"id": "navigation.navigationtransition.triggers.ux.statetransition",
|
|
@@ -1428,18 +1311,8 @@
|
|
|
1428
1311
|
"predicate": "triggers",
|
|
1429
1312
|
"cardinality": "many-to-many",
|
|
1430
1313
|
"strength": "medium",
|
|
1431
|
-
"required": false
|
|
1432
|
-
|
|
1433
|
-
"navigation.navigationtransition.uses.navigation.contextvariable": {
|
|
1434
|
-
"id": "navigation.navigationtransition.uses.navigation.contextvariable",
|
|
1435
|
-
"source_spec_node_id": "navigation.navigationtransition",
|
|
1436
|
-
"source_layer": "navigation",
|
|
1437
|
-
"destination_spec_node_id": "navigation.contextvariable",
|
|
1438
|
-
"destination_layer": "navigation",
|
|
1439
|
-
"predicate": "uses",
|
|
1440
|
-
"cardinality": "many-to-many",
|
|
1441
|
-
"strength": "medium",
|
|
1442
|
-
"required": false
|
|
1314
|
+
"required": false,
|
|
1315
|
+
"description": "The route change runs a UX state transition, such as an animation between views."
|
|
1443
1316
|
},
|
|
1444
1317
|
"navigation.route.accesses.application.applicationinterface": {
|
|
1445
1318
|
"id": "navigation.route.accesses.application.applicationinterface",
|
|
@@ -1450,18 +1323,8 @@
|
|
|
1450
1323
|
"predicate": "accesses",
|
|
1451
1324
|
"cardinality": "many-to-many",
|
|
1452
1325
|
"strength": "medium",
|
|
1453
|
-
"required": false
|
|
1454
|
-
|
|
1455
|
-
"navigation.route.accesses.data-store.collection": {
|
|
1456
|
-
"id": "navigation.route.accesses.data-store.collection",
|
|
1457
|
-
"source_spec_node_id": "navigation.route",
|
|
1458
|
-
"source_layer": "navigation",
|
|
1459
|
-
"destination_spec_node_id": "data-store.collection",
|
|
1460
|
-
"destination_layer": "data-store",
|
|
1461
|
-
"predicate": "accesses",
|
|
1462
|
-
"cardinality": "many-to-many",
|
|
1463
|
-
"strength": "medium",
|
|
1464
|
-
"required": false
|
|
1326
|
+
"required": false,
|
|
1327
|
+
"description": "The route reaches the application through the interface, such as a client SDK its loader calls."
|
|
1465
1328
|
},
|
|
1466
1329
|
"navigation.route.accesses.data-model.objectschema": {
|
|
1467
1330
|
"id": "navigation.route.accesses.data-model.objectschema",
|
|
@@ -1472,18 +1335,8 @@
|
|
|
1472
1335
|
"predicate": "accesses",
|
|
1473
1336
|
"cardinality": "many-to-many",
|
|
1474
1337
|
"strength": "medium",
|
|
1475
|
-
"required": false
|
|
1476
|
-
|
|
1477
|
-
"navigation.route.accesses.api.operation": {
|
|
1478
|
-
"id": "navigation.route.accesses.api.operation",
|
|
1479
|
-
"source_spec_node_id": "navigation.route",
|
|
1480
|
-
"source_layer": "navigation",
|
|
1481
|
-
"destination_spec_node_id": "api.operation",
|
|
1482
|
-
"destination_layer": "api",
|
|
1483
|
-
"predicate": "accesses",
|
|
1484
|
-
"cardinality": "many-to-many",
|
|
1485
|
-
"strength": "medium",
|
|
1486
|
-
"required": false
|
|
1338
|
+
"required": false,
|
|
1339
|
+
"description": "The route loads data of the object schema, such as an order detail route loading an Order."
|
|
1487
1340
|
},
|
|
1488
1341
|
"navigation.route.accesses.security.secureresource": {
|
|
1489
1342
|
"id": "navigation.route.accesses.security.secureresource",
|
|
@@ -1494,7 +1347,8 @@
|
|
|
1494
1347
|
"predicate": "accesses",
|
|
1495
1348
|
"cardinality": "many-to-many",
|
|
1496
1349
|
"strength": "medium",
|
|
1497
|
-
"required": false
|
|
1350
|
+
"required": false,
|
|
1351
|
+
"description": "The route exposes a resource the security model protects."
|
|
1498
1352
|
},
|
|
1499
1353
|
"navigation.route.aggregates.navigation.route": {
|
|
1500
1354
|
"id": "navigation.route.aggregates.navigation.route",
|
|
@@ -1505,18 +1359,8 @@
|
|
|
1505
1359
|
"predicate": "aggregates",
|
|
1506
1360
|
"cardinality": "many-to-many",
|
|
1507
1361
|
"strength": "medium",
|
|
1508
|
-
"required": false
|
|
1509
|
-
|
|
1510
|
-
"navigation.route.associated-with.navigation.routemeta": {
|
|
1511
|
-
"id": "navigation.route.associated-with.navigation.routemeta",
|
|
1512
|
-
"source_spec_node_id": "navigation.route",
|
|
1513
|
-
"source_layer": "navigation",
|
|
1514
|
-
"destination_spec_node_id": "navigation.routemeta",
|
|
1515
|
-
"destination_layer": "navigation",
|
|
1516
|
-
"predicate": "associated-with",
|
|
1517
|
-
"cardinality": "many-to-many",
|
|
1518
|
-
"strength": "medium",
|
|
1519
|
-
"required": false
|
|
1362
|
+
"required": false,
|
|
1363
|
+
"description": "The route contains child routes nested under its path."
|
|
1520
1364
|
},
|
|
1521
1365
|
"navigation.route.composes.navigation.routemeta": {
|
|
1522
1366
|
"id": "navigation.route.composes.navigation.routemeta",
|
|
@@ -1527,18 +1371,8 @@
|
|
|
1527
1371
|
"predicate": "composes",
|
|
1528
1372
|
"cardinality": "many-to-many",
|
|
1529
1373
|
"strength": "medium",
|
|
1530
|
-
"required": false
|
|
1531
|
-
|
|
1532
|
-
"navigation.route.depends-on.data-store.accesspattern": {
|
|
1533
|
-
"id": "navigation.route.depends-on.data-store.accesspattern",
|
|
1534
|
-
"source_spec_node_id": "navigation.route",
|
|
1535
|
-
"source_layer": "navigation",
|
|
1536
|
-
"destination_spec_node_id": "data-store.accesspattern",
|
|
1537
|
-
"destination_layer": "data-store",
|
|
1538
|
-
"predicate": "depends-on",
|
|
1539
|
-
"cardinality": "many-to-many",
|
|
1540
|
-
"strength": "medium",
|
|
1541
|
-
"required": false
|
|
1374
|
+
"required": false,
|
|
1375
|
+
"description": "The route meta belongs to the route and is read by the router for it."
|
|
1542
1376
|
},
|
|
1543
1377
|
"navigation.route.depends-on.application.applicationcomponent": {
|
|
1544
1378
|
"id": "navigation.route.depends-on.application.applicationcomponent",
|
|
@@ -1549,18 +1383,8 @@
|
|
|
1549
1383
|
"predicate": "depends-on",
|
|
1550
1384
|
"cardinality": "many-to-many",
|
|
1551
1385
|
"strength": "medium",
|
|
1552
|
-
"required": false
|
|
1553
|
-
|
|
1554
|
-
"navigation.route.depends-on.technology.technologyservice": {
|
|
1555
|
-
"id": "navigation.route.depends-on.technology.technologyservice",
|
|
1556
|
-
"source_spec_node_id": "navigation.route",
|
|
1557
|
-
"source_layer": "navigation",
|
|
1558
|
-
"destination_spec_node_id": "technology.technologyservice",
|
|
1559
|
-
"destination_layer": "technology",
|
|
1560
|
-
"predicate": "depends-on",
|
|
1561
|
-
"cardinality": "many-to-many",
|
|
1562
|
-
"strength": "medium",
|
|
1563
|
-
"required": false
|
|
1386
|
+
"required": false,
|
|
1387
|
+
"description": "The route renders or needs the component, loaded eagerly. Use lazy-loads instead when the component is loaded only on navigation."
|
|
1564
1388
|
},
|
|
1565
1389
|
"navigation.route.flows-to.navigation.navigationtransition": {
|
|
1566
1390
|
"id": "navigation.route.flows-to.navigation.navigationtransition",
|
|
@@ -1571,7 +1395,8 @@
|
|
|
1571
1395
|
"predicate": "flows-to",
|
|
1572
1396
|
"cardinality": "many-to-many",
|
|
1573
1397
|
"strength": "medium",
|
|
1574
|
-
"required": false
|
|
1398
|
+
"required": false,
|
|
1399
|
+
"description": "The transition leaves this route: the route is its source."
|
|
1575
1400
|
},
|
|
1576
1401
|
"navigation.route.lazy-loads.application.applicationcomponent": {
|
|
1577
1402
|
"id": "navigation.route.lazy-loads.application.applicationcomponent",
|
|
@@ -1582,18 +1407,8 @@
|
|
|
1582
1407
|
"predicate": "lazy-loads",
|
|
1583
1408
|
"cardinality": "many-to-many",
|
|
1584
1409
|
"strength": "medium",
|
|
1585
|
-
"required": false
|
|
1586
|
-
|
|
1587
|
-
"navigation.route.maps-to.business.businessfunction": {
|
|
1588
|
-
"id": "navigation.route.maps-to.business.businessfunction",
|
|
1589
|
-
"source_spec_node_id": "navigation.route",
|
|
1590
|
-
"source_layer": "navigation",
|
|
1591
|
-
"destination_spec_node_id": "business.businessfunction",
|
|
1592
|
-
"destination_layer": "business",
|
|
1593
|
-
"predicate": "maps-to",
|
|
1594
|
-
"cardinality": "many-to-many",
|
|
1595
|
-
"strength": "medium",
|
|
1596
|
-
"required": false
|
|
1410
|
+
"required": false,
|
|
1411
|
+
"description": "The route loads the component's code only when it is first activated, such as a dynamic import."
|
|
1597
1412
|
},
|
|
1598
1413
|
"navigation.route.maps-to.api.pathitem": {
|
|
1599
1414
|
"id": "navigation.route.maps-to.api.pathitem",
|
|
@@ -1604,7 +1419,8 @@
|
|
|
1604
1419
|
"predicate": "maps-to",
|
|
1605
1420
|
"cardinality": "many-to-many",
|
|
1606
1421
|
"strength": "medium",
|
|
1607
|
-
"required": false
|
|
1422
|
+
"required": false,
|
|
1423
|
+
"description": "The client route mirrors a server path, such as /orders/:id and GET /orders/{id}. Use the operation's serves instead when the route calls the operation."
|
|
1608
1424
|
},
|
|
1609
1425
|
"navigation.route.maps-to.ux.view": {
|
|
1610
1426
|
"id": "navigation.route.maps-to.ux.view",
|
|
@@ -1615,7 +1431,8 @@
|
|
|
1615
1431
|
"predicate": "maps-to",
|
|
1616
1432
|
"cardinality": "many-to-many",
|
|
1617
1433
|
"strength": "medium",
|
|
1618
|
-
"required": false
|
|
1434
|
+
"required": false,
|
|
1435
|
+
"description": "The route renders the view when the browser location matches it."
|
|
1619
1436
|
},
|
|
1620
1437
|
"navigation.route.navigates-to.navigation.route": {
|
|
1621
1438
|
"id": "navigation.route.navigates-to.navigation.route",
|
|
@@ -1626,29 +1443,8 @@
|
|
|
1626
1443
|
"predicate": "navigates-to",
|
|
1627
1444
|
"cardinality": "many-to-many",
|
|
1628
1445
|
"strength": "medium",
|
|
1629
|
-
"required": false
|
|
1630
|
-
|
|
1631
|
-
"navigation.route.realizes.business.businessprocess": {
|
|
1632
|
-
"id": "navigation.route.realizes.business.businessprocess",
|
|
1633
|
-
"source_spec_node_id": "navigation.route",
|
|
1634
|
-
"source_layer": "navigation",
|
|
1635
|
-
"destination_spec_node_id": "business.businessprocess",
|
|
1636
|
-
"destination_layer": "business",
|
|
1637
|
-
"predicate": "realizes",
|
|
1638
|
-
"cardinality": "many-to-many",
|
|
1639
|
-
"strength": "medium",
|
|
1640
|
-
"required": false
|
|
1641
|
-
},
|
|
1642
|
-
"navigation.route.realizes.motivation.outcome": {
|
|
1643
|
-
"id": "navigation.route.realizes.motivation.outcome",
|
|
1644
|
-
"source_spec_node_id": "navigation.route",
|
|
1645
|
-
"source_layer": "navigation",
|
|
1646
|
-
"destination_spec_node_id": "motivation.outcome",
|
|
1647
|
-
"destination_layer": "motivation",
|
|
1648
|
-
"predicate": "realizes",
|
|
1649
|
-
"cardinality": "many-to-many",
|
|
1650
|
-
"strength": "medium",
|
|
1651
|
-
"required": false
|
|
1446
|
+
"required": false,
|
|
1447
|
+
"description": "The route forwards to another route without a modelled transition, such as a redirect or alias entry."
|
|
1652
1448
|
},
|
|
1653
1449
|
"navigation.route.references.data-model.schemadefinition": {
|
|
1654
1450
|
"id": "navigation.route.references.data-model.schemadefinition",
|
|
@@ -1659,7 +1455,8 @@
|
|
|
1659
1455
|
"predicate": "references",
|
|
1660
1456
|
"cardinality": "many-to-many",
|
|
1661
1457
|
"strength": "medium",
|
|
1662
|
-
"required": false
|
|
1458
|
+
"required": false,
|
|
1459
|
+
"description": "A route parameter or query takes values of the definition, such as an OrderStatus filter."
|
|
1663
1460
|
},
|
|
1664
1461
|
"navigation.route.requires.security.permission": {
|
|
1665
1462
|
"id": "navigation.route.requires.security.permission",
|
|
@@ -1670,7 +1467,8 @@
|
|
|
1670
1467
|
"predicate": "requires",
|
|
1671
1468
|
"cardinality": "many-to-many",
|
|
1672
1469
|
"strength": "medium",
|
|
1673
|
-
"required": false
|
|
1470
|
+
"required": false,
|
|
1471
|
+
"description": "Only users holding the permission may activate the route."
|
|
1674
1472
|
},
|
|
1675
1473
|
"navigation.route.requires.api.securityscheme": {
|
|
1676
1474
|
"id": "navigation.route.requires.api.securityscheme",
|
|
@@ -1681,18 +1479,8 @@
|
|
|
1681
1479
|
"predicate": "requires",
|
|
1682
1480
|
"cardinality": "many-to-many",
|
|
1683
1481
|
"strength": "medium",
|
|
1684
|
-
"required": false
|
|
1685
|
-
|
|
1686
|
-
"navigation.route.resolves-with.application.applicationservice": {
|
|
1687
|
-
"id": "navigation.route.resolves-with.application.applicationservice",
|
|
1688
|
-
"source_spec_node_id": "navigation.route",
|
|
1689
|
-
"source_layer": "navigation",
|
|
1690
|
-
"destination_spec_node_id": "application.applicationservice",
|
|
1691
|
-
"destination_layer": "application",
|
|
1692
|
-
"predicate": "resolves-with",
|
|
1693
|
-
"cardinality": "many-to-many",
|
|
1694
|
-
"strength": "medium",
|
|
1695
|
-
"required": false
|
|
1482
|
+
"required": false,
|
|
1483
|
+
"description": "The route's data needs credentials of the security scheme, such as a bearer token."
|
|
1696
1484
|
},
|
|
1697
1485
|
"navigation.route.satisfies.motivation.requirement": {
|
|
1698
1486
|
"id": "navigation.route.satisfies.motivation.requirement",
|
|
@@ -1703,29 +1491,8 @@
|
|
|
1703
1491
|
"predicate": "satisfies",
|
|
1704
1492
|
"cardinality": "many-to-many",
|
|
1705
1493
|
"strength": "medium",
|
|
1706
|
-
"required": false
|
|
1707
|
-
|
|
1708
|
-
"navigation.route.serves.business.businessrole": {
|
|
1709
|
-
"id": "navigation.route.serves.business.businessrole",
|
|
1710
|
-
"source_spec_node_id": "navigation.route",
|
|
1711
|
-
"source_layer": "navigation",
|
|
1712
|
-
"destination_spec_node_id": "business.businessrole",
|
|
1713
|
-
"destination_layer": "business",
|
|
1714
|
-
"predicate": "serves",
|
|
1715
|
-
"cardinality": "many-to-many",
|
|
1716
|
-
"strength": "medium",
|
|
1717
|
-
"required": false
|
|
1718
|
-
},
|
|
1719
|
-
"navigation.route.triggers.navigation.navigationtransition": {
|
|
1720
|
-
"id": "navigation.route.triggers.navigation.navigationtransition",
|
|
1721
|
-
"source_spec_node_id": "navigation.route",
|
|
1722
|
-
"source_layer": "navigation",
|
|
1723
|
-
"destination_spec_node_id": "navigation.navigationtransition",
|
|
1724
|
-
"destination_layer": "navigation",
|
|
1725
|
-
"predicate": "triggers",
|
|
1726
|
-
"cardinality": "many-to-many",
|
|
1727
|
-
"strength": "medium",
|
|
1728
|
-
"required": false
|
|
1494
|
+
"required": false,
|
|
1495
|
+
"description": "The route meets a requirement, such as a deep link a requirement asks for."
|
|
1729
1496
|
},
|
|
1730
1497
|
"navigation.route.uses.application.applicationservice": {
|
|
1731
1498
|
"id": "navigation.route.uses.application.applicationservice",
|
|
@@ -1736,7 +1503,8 @@
|
|
|
1736
1503
|
"predicate": "uses",
|
|
1737
1504
|
"cardinality": "many-to-many",
|
|
1738
1505
|
"strength": "medium",
|
|
1739
|
-
"required": false
|
|
1506
|
+
"required": false,
|
|
1507
|
+
"description": "The route relies on an application service, such as a resolver that loads its data before rendering."
|
|
1740
1508
|
},
|
|
1741
1509
|
"navigation.route.uses.ux.errorconfig": {
|
|
1742
1510
|
"id": "navigation.route.uses.ux.errorconfig",
|
|
@@ -1747,73 +1515,8 @@
|
|
|
1747
1515
|
"predicate": "uses",
|
|
1748
1516
|
"cardinality": "many-to-many",
|
|
1749
1517
|
"strength": "medium",
|
|
1750
|
-
"required": false
|
|
1751
|
-
|
|
1752
|
-
"navigation.route.uses.ux.layoutconfig": {
|
|
1753
|
-
"id": "navigation.route.uses.ux.layoutconfig",
|
|
1754
|
-
"source_spec_node_id": "navigation.route",
|
|
1755
|
-
"source_layer": "navigation",
|
|
1756
|
-
"destination_spec_node_id": "ux.layoutconfig",
|
|
1757
|
-
"destination_layer": "ux",
|
|
1758
|
-
"predicate": "uses",
|
|
1759
|
-
"cardinality": "many-to-many",
|
|
1760
|
-
"strength": "medium",
|
|
1761
|
-
"required": false
|
|
1762
|
-
},
|
|
1763
|
-
"navigation.route.uses.technology.systemsoftware": {
|
|
1764
|
-
"id": "navigation.route.uses.technology.systemsoftware",
|
|
1765
|
-
"source_spec_node_id": "navigation.route",
|
|
1766
|
-
"source_layer": "navigation",
|
|
1767
|
-
"destination_spec_node_id": "technology.systemsoftware",
|
|
1768
|
-
"destination_layer": "technology",
|
|
1769
|
-
"predicate": "uses",
|
|
1770
|
-
"cardinality": "many-to-many",
|
|
1771
|
-
"strength": "medium",
|
|
1772
|
-
"required": false
|
|
1773
|
-
},
|
|
1774
|
-
"navigation.route.uses.technology.technologyfunction": {
|
|
1775
|
-
"id": "navigation.route.uses.technology.technologyfunction",
|
|
1776
|
-
"source_spec_node_id": "navigation.route",
|
|
1777
|
-
"source_layer": "navigation",
|
|
1778
|
-
"destination_spec_node_id": "technology.technologyfunction",
|
|
1779
|
-
"destination_layer": "technology",
|
|
1780
|
-
"predicate": "uses",
|
|
1781
|
-
"cardinality": "many-to-many",
|
|
1782
|
-
"strength": "medium",
|
|
1783
|
-
"required": false
|
|
1784
|
-
},
|
|
1785
|
-
"navigation.route.uses.data-store.view": {
|
|
1786
|
-
"id": "navigation.route.uses.data-store.view",
|
|
1787
|
-
"source_spec_node_id": "navigation.route",
|
|
1788
|
-
"source_layer": "navigation",
|
|
1789
|
-
"destination_spec_node_id": "data-store.view",
|
|
1790
|
-
"destination_layer": "data-store",
|
|
1791
|
-
"predicate": "uses",
|
|
1792
|
-
"cardinality": "many-to-many",
|
|
1793
|
-
"strength": "medium",
|
|
1794
|
-
"required": false
|
|
1795
|
-
},
|
|
1796
|
-
"navigation.routemeta.governs.navigation.navigationguard": {
|
|
1797
|
-
"id": "navigation.routemeta.governs.navigation.navigationguard",
|
|
1798
|
-
"source_spec_node_id": "navigation.routemeta",
|
|
1799
|
-
"source_layer": "navigation",
|
|
1800
|
-
"destination_spec_node_id": "navigation.navigationguard",
|
|
1801
|
-
"destination_layer": "navigation",
|
|
1802
|
-
"predicate": "governs",
|
|
1803
|
-
"cardinality": "many-to-many",
|
|
1804
|
-
"strength": "medium",
|
|
1805
|
-
"required": false
|
|
1806
|
-
},
|
|
1807
|
-
"navigation.routemeta.references.navigation.breadcrumbconfig": {
|
|
1808
|
-
"id": "navigation.routemeta.references.navigation.breadcrumbconfig",
|
|
1809
|
-
"source_spec_node_id": "navigation.routemeta",
|
|
1810
|
-
"source_layer": "navigation",
|
|
1811
|
-
"destination_spec_node_id": "navigation.breadcrumbconfig",
|
|
1812
|
-
"destination_layer": "navigation",
|
|
1813
|
-
"predicate": "references",
|
|
1814
|
-
"cardinality": "many-to-many",
|
|
1815
|
-
"strength": "medium",
|
|
1816
|
-
"required": false
|
|
1518
|
+
"required": false,
|
|
1519
|
+
"description": "The route uses the error configuration for failures while it loads."
|
|
1817
1520
|
},
|
|
1818
1521
|
"navigation.routemeta.references.api.operation": {
|
|
1819
1522
|
"id": "navigation.routemeta.references.api.operation",
|
|
@@ -1824,7 +1527,8 @@
|
|
|
1824
1527
|
"predicate": "references",
|
|
1825
1528
|
"cardinality": "many-to-many",
|
|
1826
1529
|
"strength": "medium",
|
|
1827
|
-
"required": false
|
|
1530
|
+
"required": false,
|
|
1531
|
+
"description": "The route meta names an operation, such as the prefetch request its loader issues."
|
|
1828
1532
|
},
|
|
1829
1533
|
"navigation.routemeta.references.security.securitypolicy": {
|
|
1830
1534
|
"id": "navigation.routemeta.references.security.securitypolicy",
|
|
@@ -1835,18 +1539,8 @@
|
|
|
1835
1539
|
"predicate": "references",
|
|
1836
1540
|
"cardinality": "many-to-many",
|
|
1837
1541
|
"strength": "medium",
|
|
1838
|
-
"required": false
|
|
1839
|
-
|
|
1840
|
-
"navigation.routemeta.serves.navigation.route": {
|
|
1841
|
-
"id": "navigation.routemeta.serves.navigation.route",
|
|
1842
|
-
"source_spec_node_id": "navigation.routemeta",
|
|
1843
|
-
"source_layer": "navigation",
|
|
1844
|
-
"destination_spec_node_id": "navigation.route",
|
|
1845
|
-
"destination_layer": "navigation",
|
|
1846
|
-
"predicate": "serves",
|
|
1847
|
-
"cardinality": "many-to-many",
|
|
1848
|
-
"strength": "medium",
|
|
1849
|
-
"required": false
|
|
1542
|
+
"required": false,
|
|
1543
|
+
"description": "The route meta names the security policy whose hints it carries."
|
|
1850
1544
|
},
|
|
1851
1545
|
"navigation.routemeta.uses.ux.layoutconfig": {
|
|
1852
1546
|
"id": "navigation.routemeta.uses.ux.layoutconfig",
|
|
@@ -1857,18 +1551,8 @@
|
|
|
1857
1551
|
"predicate": "uses",
|
|
1858
1552
|
"cardinality": "many-to-many",
|
|
1859
1553
|
"strength": "medium",
|
|
1860
|
-
"required": false
|
|
1861
|
-
|
|
1862
|
-
"navigation.routemeta.uses.navigation.navigationtransition": {
|
|
1863
|
-
"id": "navigation.routemeta.uses.navigation.navigationtransition",
|
|
1864
|
-
"source_spec_node_id": "navigation.routemeta",
|
|
1865
|
-
"source_layer": "navigation",
|
|
1866
|
-
"destination_spec_node_id": "navigation.navigationtransition",
|
|
1867
|
-
"destination_layer": "navigation",
|
|
1868
|
-
"predicate": "uses",
|
|
1869
|
-
"cardinality": "many-to-many",
|
|
1870
|
-
"strength": "medium",
|
|
1871
|
-
"required": false
|
|
1554
|
+
"required": false,
|
|
1555
|
+
"description": "The route meta selects the layout the route's view is wrapped in."
|
|
1872
1556
|
}
|
|
1873
1557
|
}
|
|
1874
1558
|
}
|