periplus-map 0.2.1__py3-none-any.whl

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.
Files changed (272) hide show
  1. periplus/__init__.py +70 -0
  2. periplus/checkmap.py +80 -0
  3. periplus/cli.py +658 -0
  4. periplus/contract/schema/map.schema.json +138 -0
  5. periplus/contract/schema/navigation.schema.json +200 -0
  6. periplus/contract/schema/pack-file.schema.json +1405 -0
  7. periplus/contract/schema/pack-manifest.schema.json +245 -0
  8. periplus/contract/schema/project-settings.schema.json +85 -0
  9. periplus/contract/spec/engine.md +151 -0
  10. periplus/contract/spec/rules.md +352 -0
  11. periplus/detect.py +228 -0
  12. periplus/engine/__init__.py +5 -0
  13. periplus/engine/check.py +481 -0
  14. periplus/engine/emit.py +368 -0
  15. periplus/engine/packload.py +2321 -0
  16. periplus/engine/pattern.py +27 -0
  17. periplus/engine/rules.py +1946 -0
  18. periplus/engine/select.py +491 -0
  19. periplus/engine/source.py +172 -0
  20. periplus/engine/tree.py +424 -0
  21. periplus/errors.py +332 -0
  22. periplus/init.py +358 -0
  23. periplus/layout.py +28 -0
  24. periplus/manifest.py +498 -0
  25. periplus/map.py +364 -0
  26. periplus/navigate/__init__.py +1 -0
  27. periplus/navigate/find.py +143 -0
  28. periplus/navigate/ids.py +30 -0
  29. periplus/navigate/listing.py +42 -0
  30. periplus/navigate/mapfile.py +189 -0
  31. periplus/navigate/path.py +175 -0
  32. periplus/navigate/show.py +175 -0
  33. periplus/navigate/types.py +83 -0
  34. periplus/navigate/walk.py +138 -0
  35. periplus/packs/advancedqueue_basic@0.0.1/pack.yaml +14 -0
  36. periplus/packs/advancedqueue_basic@0.0.1/queue_job_type/queue_job_type.yaml +9 -0
  37. periplus/packs/advancedqueue_basic@0.0.1/queue_job_type/queue_job_type_annotation.yaml +43 -0
  38. periplus/packs/advancedqueue_basic@0.0.1/queue_job_type/queue_job_type_attribute.yaml +43 -0
  39. periplus/packs/ai_basic@0.0.1/ai_agent/ai_agent.yaml +8 -0
  40. periplus/packs/ai_basic@0.0.1/ai_agent/ai_agent_attribute.yaml +43 -0
  41. periplus/packs/ai_basic@0.0.1/ai_function_call/ai_function_call.yaml +8 -0
  42. periplus/packs/ai_basic@0.0.1/ai_function_call/ai_function_call_attribute.yaml +43 -0
  43. periplus/packs/ai_basic@0.0.1/pack.yaml +15 -0
  44. periplus/packs/config_pages_basic@0.0.1/bundle/config_pages_bundle_config.yaml +54 -0
  45. periplus/packs/config_pages_basic@0.0.1/pack.yaml +11 -0
  46. periplus/packs/crop_basic@0.0.1/bundle/crop_bundle_config.yaml +54 -0
  47. periplus/packs/crop_basic@0.0.1/pack.yaml +11 -0
  48. periplus/packs/drupal@0.1.0/block/block_placement.yaml +25 -0
  49. periplus/packs/drupal@0.1.0/block/block_placement_code.yaml +58 -0
  50. periplus/packs/drupal@0.1.0/block/block_placement_config.yaml +53 -0
  51. periplus/packs/drupal@0.1.0/block/block_plugin.yaml +52 -0
  52. periplus/packs/drupal@0.1.0/block/block_plugin_altered.yaml +61 -0
  53. periplus/packs/drupal@0.1.0/block/block_plugin_annotation.yaml +69 -0
  54. periplus/packs/drupal@0.1.0/block/block_plugin_attribute.yaml +56 -0
  55. periplus/packs/drupal@0.1.0/block/block_plugin_content.yaml +46 -0
  56. periplus/packs/drupal@0.1.0/block/block_plugin_derived.yaml +110 -0
  57. periplus/packs/drupal@0.1.0/block/block_plugin_deriver.yaml +30 -0
  58. periplus/packs/drupal@0.1.0/block/block_type.yaml +14 -0
  59. periplus/packs/drupal@0.1.0/block/block_type_code.yaml +43 -0
  60. periplus/packs/drupal@0.1.0/block/block_type_config.yaml +45 -0
  61. periplus/packs/drupal@0.1.0/cache/cache.yaml +18 -0
  62. periplus/packs/drupal@0.1.0/cache/cache_backend.yaml +31 -0
  63. periplus/packs/drupal@0.1.0/component/sdc.yaml +19 -0
  64. periplus/packs/drupal@0.1.0/component/sdc_definition.yaml +25 -0
  65. periplus/packs/drupal@0.1.0/component/sdc_use.yaml +25 -0
  66. periplus/packs/drupal@0.1.0/config/config_object.yaml +65 -0
  67. periplus/packs/drupal@0.1.0/display/display.yaml +32 -0
  68. periplus/packs/drupal@0.1.0/display/display_code.yaml +53 -0
  69. periplus/packs/drupal@0.1.0/display/display_config.yaml +95 -0
  70. periplus/packs/drupal@0.1.0/entity/entity.yaml +33 -0
  71. periplus/packs/drupal@0.1.0/entity/entity_class.yaml +60 -0
  72. periplus/packs/drupal@0.1.0/entity/entity_save.yaml +27 -0
  73. periplus/packs/drupal@0.1.0/entity/entity_type_annotation.yaml +85 -0
  74. periplus/packs/drupal@0.1.0/entity/entity_type_attribute.yaml +76 -0
  75. periplus/packs/drupal@0.1.0/field/field_instance_code.yaml +40 -0
  76. periplus/packs/drupal@0.1.0/field/field_instance_config.yaml +58 -0
  77. periplus/packs/drupal@0.1.0/field/field_storage.yaml +37 -0
  78. periplus/packs/drupal@0.1.0/field/field_storage_code.yaml +39 -0
  79. periplus/packs/drupal@0.1.0/field/field_storage_config.yaml +24 -0
  80. periplus/packs/drupal@0.1.0/form/form.yaml +48 -0
  81. periplus/packs/drupal@0.1.0/form/form_class.yaml +50 -0
  82. periplus/packs/drupal@0.1.0/form/form_id.yaml +48 -0
  83. periplus/packs/drupal@0.1.0/form/form_methods.yaml +39 -0
  84. periplus/packs/drupal@0.1.0/hook/hook.yaml +8 -0
  85. periplus/packs/drupal@0.1.0/hook/hook_attribute.yaml +28 -0
  86. periplus/packs/drupal@0.1.0/module/module.yaml +8 -0
  87. periplus/packs/drupal@0.1.0/module/module_info.yaml +50 -0
  88. periplus/packs/drupal@0.1.0/pack.yaml +184 -0
  89. periplus/packs/drupal@0.1.0/plugin/plugin.yaml +17 -0
  90. periplus/packs/drupal@0.1.0/plugin/plugin_annotation.yaml +120 -0
  91. periplus/packs/drupal@0.1.0/recommendations/recommendations.yaml +14 -0
  92. periplus/packs/drupal@0.1.0/service/service.yaml +19 -0
  93. periplus/packs/drupal@0.1.0/service/service_autowire.yaml +28 -0
  94. periplus/packs/drupal@0.1.0/service/service_definition.yaml +24 -0
  95. periplus/packs/drupal@0.1.0/service/service_use.yaml +43 -0
  96. periplus/packs/drupal_basic@0.3.0/action/action.yaml +9 -0
  97. periplus/packs/drupal_basic@0.3.0/action/action_annotation.yaml +43 -0
  98. periplus/packs/drupal_basic@0.3.0/action/action_attribute.yaml +43 -0
  99. periplus/packs/drupal_basic@0.3.0/block/block_placement.yaml +16 -0
  100. periplus/packs/drupal_basic@0.3.0/block/block_placement_config.yaml +51 -0
  101. periplus/packs/drupal_basic@0.3.0/block_plugin/block_plugin.yaml +14 -0
  102. periplus/packs/drupal_basic@0.3.0/block_plugin/block_plugin_annotation.yaml +47 -0
  103. periplus/packs/drupal_basic@0.3.0/block_plugin/block_plugin_attribute.yaml +43 -0
  104. periplus/packs/drupal_basic@0.3.0/block_type/block_type.yaml +8 -0
  105. periplus/packs/drupal_basic@0.3.0/block_type/block_type_config.yaml +54 -0
  106. periplus/packs/drupal_basic@0.3.0/boundary/boundary_types.yaml +19 -0
  107. periplus/packs/drupal_basic@0.3.0/bundle/bundle.yaml +20 -0
  108. periplus/packs/drupal_basic@0.3.0/bundle/bundle_config.yaml +393 -0
  109. periplus/packs/drupal_basic@0.3.0/call/call.yaml +349 -0
  110. periplus/packs/drupal_basic@0.3.0/component/component.yaml +30 -0
  111. periplus/packs/drupal_basic@0.3.0/config/config_object.yaml +119 -0
  112. periplus/packs/drupal_basic@0.3.0/constraint/constraint.yaml +8 -0
  113. periplus/packs/drupal_basic@0.3.0/constraint/constraint_annotation.yaml +43 -0
  114. periplus/packs/drupal_basic@0.3.0/constraint/constraint_attribute.yaml +43 -0
  115. periplus/packs/drupal_basic@0.3.0/display/display.yaml +30 -0
  116. periplus/packs/drupal_basic@0.3.0/display/display_config.yaml +203 -0
  117. periplus/packs/drupal_basic@0.3.0/display/display_mode_config.yaml +60 -0
  118. periplus/packs/drupal_basic@0.3.0/entity_type/config_entity_type_annotation.yaml +46 -0
  119. periplus/packs/drupal_basic@0.3.0/entity_type/config_entity_type_attribute.yaml +43 -0
  120. periplus/packs/drupal_basic@0.3.0/entity_type/content_entity_type_annotation.yaml +46 -0
  121. periplus/packs/drupal_basic@0.3.0/entity_type/content_entity_type_attribute.yaml +43 -0
  122. periplus/packs/drupal_basic@0.3.0/entity_type/entity_type.yaml +16 -0
  123. periplus/packs/drupal_basic@0.3.0/field/field_instance_config.yaml +116 -0
  124. periplus/packs/drupal_basic@0.3.0/field/field_storage.yaml +21 -0
  125. periplus/packs/drupal_basic@0.3.0/field/field_storage_config.yaml +45 -0
  126. periplus/packs/drupal_basic@0.3.0/field_formatter/field_formatter.yaml +8 -0
  127. periplus/packs/drupal_basic@0.3.0/field_formatter/field_formatter_annotation.yaml +46 -0
  128. periplus/packs/drupal_basic@0.3.0/field_formatter/field_formatter_attribute.yaml +43 -0
  129. periplus/packs/drupal_basic@0.3.0/field_type/field_type_annotation.yaml +46 -0
  130. periplus/packs/drupal_basic@0.3.0/field_type/field_type_attribute.yaml +50 -0
  131. periplus/packs/drupal_basic@0.3.0/field_widget/field_widget_annotation.yaml +46 -0
  132. periplus/packs/drupal_basic@0.3.0/field_widget/field_widget_attribute.yaml +50 -0
  133. periplus/packs/drupal_basic@0.3.0/form/form_id.yaml +80 -0
  134. periplus/packs/drupal_basic@0.3.0/hook/hook.yaml +100 -0
  135. periplus/packs/drupal_basic@0.3.0/hook/hook_attribute.yaml +64 -0
  136. periplus/packs/drupal_basic@0.3.0/hook/hook_theme_include.yaml +34 -0
  137. periplus/packs/drupal_basic@0.3.0/library/library.yaml +12 -0
  138. periplus/packs/drupal_basic@0.3.0/library/library_definition.yaml +58 -0
  139. periplus/packs/drupal_basic@0.3.0/local_action/local_action.yaml +12 -0
  140. periplus/packs/drupal_basic@0.3.0/local_action/local_action_definition.yaml +49 -0
  141. periplus/packs/drupal_basic@0.3.0/mail/mail.yaml +8 -0
  142. periplus/packs/drupal_basic@0.3.0/mail/mail_attribute.yaml +43 -0
  143. periplus/packs/drupal_basic@0.3.0/media_source/media_source.yaml +8 -0
  144. periplus/packs/drupal_basic@0.3.0/media_source/media_source_annotation.yaml +43 -0
  145. periplus/packs/drupal_basic@0.3.0/media_source/media_source_attribute.yaml +79 -0
  146. periplus/packs/drupal_basic@0.3.0/menu_link/menu_link.yaml +18 -0
  147. periplus/packs/drupal_basic@0.3.0/menu_link/menu_link_definition.yaml +48 -0
  148. periplus/packs/drupal_basic@0.3.0/module/module.yaml +7 -0
  149. periplus/packs/drupal_basic@0.3.0/module/module_info.yaml +58 -0
  150. periplus/packs/drupal_basic@0.3.0/pack.yaml +528 -0
  151. periplus/packs/drupal_basic@0.3.0/permission/permission.yaml +7 -0
  152. periplus/packs/drupal_basic@0.3.0/permission/permission_definition.yaml +27 -0
  153. periplus/packs/drupal_basic@0.3.0/queue_worker/queue_worker.yaml +9 -0
  154. periplus/packs/drupal_basic@0.3.0/queue_worker/queue_worker_annotation.yaml +43 -0
  155. periplus/packs/drupal_basic@0.3.0/queue_worker/queue_worker_attribute.yaml +43 -0
  156. periplus/packs/drupal_basic@0.3.0/rest_resource/rest_resource.yaml +8 -0
  157. periplus/packs/drupal_basic@0.3.0/rest_resource/rest_resource_annotation.yaml +43 -0
  158. periplus/packs/drupal_basic@0.3.0/rest_resource/rest_resource_attribute.yaml +43 -0
  159. periplus/packs/drupal_basic@0.3.0/role/role.yaml +14 -0
  160. periplus/packs/drupal_basic@0.3.0/role/role_config.yaml +44 -0
  161. periplus/packs/drupal_basic@0.3.0/route/route.yaml +42 -0
  162. periplus/packs/drupal_basic@0.3.0/route/route_definition.yaml +113 -0
  163. periplus/packs/drupal_basic@0.3.0/route/route_options.yaml +55 -0
  164. periplus/packs/drupal_basic@0.3.0/route/route_requirements.yaml +108 -0
  165. periplus/packs/drupal_basic@0.3.0/service/service.yaml +56 -0
  166. periplus/packs/drupal_basic@0.3.0/service/service_definition.yaml +181 -0
  167. periplus/packs/drupal_basic@0.3.0/template/template.yaml +86 -0
  168. periplus/packs/drupal_basic@0.3.0/template/template_route_link.yaml +30 -0
  169. periplus/packs/drupal_basic@0.3.0/theme/theme.yaml +15 -0
  170. periplus/packs/drupal_basic@0.3.0/theme/theme_info.yaml +61 -0
  171. periplus/packs/drupal_basic@0.3.0/theme_hook/template_suggestion.yaml +29 -0
  172. periplus/packs/drupal_basic@0.3.0/theme_hook/theme_hook.yaml +87 -0
  173. periplus/packs/drupal_basic@0.3.0/theme_hook/theme_hook_render.yaml +20 -0
  174. periplus/packs/drupal_basic@0.3.0/url/url.yaml +88 -0
  175. periplus/packs/drupal_basic@0.3.0/views_plugin/views_field_attribute.yaml +80 -0
  176. periplus/packs/drupal_basic@0.3.0/views_plugin/views_filter_attribute.yaml +80 -0
  177. periplus/packs/drupal_basic@0.3.0/views_plugin/views_plugin.yaml +15 -0
  178. periplus/packs/drupal_basic@0.3.0/views_plugin/views_style_attribute.yaml +80 -0
  179. periplus/packs/drupal_js_basic@0.0.1/attachment/attachment.yaml +12 -0
  180. periplus/packs/drupal_js_basic@0.0.1/attachment/attachment_in_php.yaml +15 -0
  181. periplus/packs/drupal_js_basic@0.0.1/attachment/attachment_in_php_array.yaml +52 -0
  182. periplus/packs/drupal_js_basic@0.0.1/attachment/attachment_in_twig.yaml +26 -0
  183. periplus/packs/drupal_js_basic@0.0.1/attachment/php_function_holder.yaml +13 -0
  184. periplus/packs/drupal_js_basic@0.0.1/behavior/behavior.yaml +198 -0
  185. periplus/packs/drupal_js_basic@0.0.1/pack.yaml +153 -0
  186. periplus/packs/drupal_js_basic@0.0.1/setting/setting.yaml +13 -0
  187. periplus/packs/drupal_js_basic@0.0.1/setting/setting_in_js.yaml +15 -0
  188. periplus/packs/drupal_js_basic@0.0.1/setting/setting_in_php.yaml +92 -0
  189. periplus/packs/drush_basic@0.0.1/command/command.yaml +15 -0
  190. periplus/packs/drush_basic@0.0.1/command/command_annotation.yaml +60 -0
  191. periplus/packs/drush_basic@0.0.1/command/command_attribute.yaml +88 -0
  192. periplus/packs/drush_basic@0.0.1/pack.yaml +29 -0
  193. periplus/packs/eck_basic@0.0.1/bundle/eck_bundle_config.yaml +56 -0
  194. periplus/packs/eck_basic@0.0.1/entity_type/eck_entity_type_config.yaml +26 -0
  195. periplus/packs/eck_basic@0.0.1/pack.yaml +28 -0
  196. periplus/packs/go@0.0.2/interfaces/satisfies.yaml +47 -0
  197. periplus/packs/go@0.0.2/pack.yaml +51 -0
  198. periplus/packs/go@0.0.2/types/find_declarations.yaml +137 -0
  199. periplus/packs/go@0.0.2/types/node_types.yaml +36 -0
  200. periplus/packs/go_basic@0.0.3/pack.yaml +104 -0
  201. periplus/packs/go_basic@0.0.3/rules/calls.yaml +25 -0
  202. periplus/packs/go_basic@0.0.3/rules/declarations.yaml +40 -0
  203. periplus/packs/go_basic@0.0.3/rules/imports.yaml +16 -0
  204. periplus/packs/go_basic@0.0.3/types/node_types.yaml +15 -0
  205. periplus/packs/js_basic@0.0.1/function/function.yaml +68 -0
  206. periplus/packs/js_basic@0.0.1/pack.yaml +50 -0
  207. periplus/packs/laravel_basic@0.0.5/pack.yaml +313 -0
  208. periplus/packs/laravel_basic@0.0.5/rules/classes.yaml +42 -0
  209. periplus/packs/laravel_basic@0.0.5/rules/config.yaml +229 -0
  210. periplus/packs/laravel_basic@0.0.5/rules/routes.yaml +210 -0
  211. periplus/packs/laravel_basic@0.0.5/rules/types.yaml +50 -0
  212. periplus/packs/laravel_basic@0.0.5/rules/views.yaml +100 -0
  213. periplus/packs/paragraphs_basic@0.0.1/bundle/paragraph_bundle_config.yaml +54 -0
  214. periplus/packs/paragraphs_basic@0.0.1/pack.yaml +12 -0
  215. periplus/packs/php@0.1.0/edges/edge_kinds.yaml +64 -0
  216. periplus/packs/php@0.1.0/edges/find_calls.yaml +34 -0
  217. periplus/packs/php@0.1.0/edges/find_imports.yaml +18 -0
  218. periplus/packs/php@0.1.0/edges/find_member_access.yaml +22 -0
  219. periplus/packs/php@0.1.0/edges/find_structure.yaml +38 -0
  220. periplus/packs/php@0.1.0/embedded/embedded_regions.yaml +19 -0
  221. periplus/packs/php@0.1.0/imports/imports.yaml +20 -0
  222. periplus/packs/php@0.1.0/pack.yaml +117 -0
  223. periplus/packs/php@0.1.0/resolution/excluded_tokens.yaml +23 -0
  224. periplus/packs/php@0.1.0/resolution/resolution.yaml +35 -0
  225. periplus/packs/php@0.1.0/types/find_declarations.yaml +102 -0
  226. periplus/packs/php@0.1.0/types/node_types.yaml +55 -0
  227. periplus/packs/php_basic@0.2.0/edges/edge_kinds.yaml +48 -0
  228. periplus/packs/php_basic@0.2.0/edges/find_structure.yaml +750 -0
  229. periplus/packs/php_basic@0.2.0/imports/imports.yaml +19 -0
  230. periplus/packs/php_basic@0.2.0/pack.yaml +94 -0
  231. periplus/packs/php_basic@0.2.0/types/find_declarations.yaml +267 -0
  232. periplus/packs/php_basic@0.2.0/types/node_types.yaml +55 -0
  233. periplus/packs/profile_basic@0.0.1/bundle/profile_bundle_config.yaml +54 -0
  234. periplus/packs/profile_basic@0.0.1/pack.yaml +12 -0
  235. periplus/packs/salesforce_basic@0.0.1/event/salesforce_event.yaml +36 -0
  236. periplus/packs/salesforce_basic@0.0.1/pack.yaml +31 -0
  237. periplus/packs/salesforce_basic@0.0.1/salesforce_mapping/salesforce_mapping.yaml +19 -0
  238. periplus/packs/salesforce_basic@0.0.1/salesforce_mapping/salesforce_mapping_config.yaml +83 -0
  239. periplus/packs/salesforce_basic@0.0.1/salesforce_mapping_field/salesforce_mapping_field.yaml +8 -0
  240. periplus/packs/salesforce_basic@0.0.1/salesforce_mapping_field/salesforce_mapping_field_annotation.yaml +43 -0
  241. periplus/packs/twig@0.0.1/pack.yaml +26 -0
  242. periplus/packs/twig@0.0.1/types/template.yaml +57 -0
  243. periplus/packs/twig_basic@0.1.0/pack.yaml +11 -0
  244. periplus/packs/twig_tweak_basic@0.0.1/pack.yaml +27 -0
  245. periplus/packs/twig_tweak_basic@0.0.1/rules/block.yaml +20 -0
  246. periplus/packs/twig_tweak_basic@0.0.1/rules/entity.yaml +35 -0
  247. periplus/packs/twig_tweak_basic@0.0.1/rules/field.yaml +21 -0
  248. periplus/packs/twig_tweak_basic@0.0.1/rules/menu.yaml +21 -0
  249. periplus/packs/webform_basic@0.0.1/bundle/webform_submission_bundle_config.yaml +54 -0
  250. periplus/packs/webform_basic@0.0.1/pack.yaml +20 -0
  251. periplus/packs/webform_basic@0.0.1/webform_handler/webform_handler.yaml +8 -0
  252. periplus/packs/webform_basic@0.0.1/webform_handler/webform_handler_annotation.yaml +43 -0
  253. periplus/packs/yaml@0.0.1/pack.yaml +72 -0
  254. periplus/packs/yaml@0.0.1/types/find_mapping_entry.yaml +21 -0
  255. periplus/packs/yaml@0.0.1/types/yaml_types.yaml +44 -0
  256. periplus/packs/yaml_basic@0.1.0/pack.yaml +10 -0
  257. periplus/packs.py +447 -0
  258. periplus/preflight.py +102 -0
  259. periplus/py.typed +0 -0
  260. periplus/report.py +596 -0
  261. periplus/resolution.py +355 -0
  262. periplus/settings.py +617 -0
  263. periplus/settings.stub.yml +99 -0
  264. periplus/spec.py +774 -0
  265. periplus/update.py +197 -0
  266. periplus/validate.py +655 -0
  267. periplus_map-0.2.1.dist-info/METADATA +566 -0
  268. periplus_map-0.2.1.dist-info/RECORD +272 -0
  269. periplus_map-0.2.1.dist-info/WHEEL +4 -0
  270. periplus_map-0.2.1.dist-info/entry_points.txt +2 -0
  271. periplus_map-0.2.1.dist-info/licenses/LICENSE +202 -0
  272. periplus_map-0.2.1.dist-info/licenses/NOTICE +2 -0
@@ -0,0 +1,65 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — declares the config object and the catch-all that finds every config file.
4
+ #
5
+ # The catch-all is the reason a gap is visible instead of silent. Every file in the config
6
+ # folders becomes a node here, and the specific rules elsewhere refine the ones they
7
+ # understand. Measured on a private Drupal site: 431 files in, 162 refined by a specific rule,
8
+ # 269 left as plain drupal.config_object — present, named, not understood.
9
+ #
10
+ # The path used to be written into this rule as **/config/{install,sync}/*.yml. All three
11
+ # real sites keep config somewhere else, so it matched nothing and 431 files vanished
12
+ # without a word. That is exactly the failure the catch-all exists to prevent.
13
+
14
+ node_types:
15
+ - name: drupal.config_object
16
+ id_namespace: drupal.config
17
+ edge_kinds:
18
+ - kind: config_depends
19
+ from: drupal.config_object
20
+ to: drupal.config_object
21
+ - kind: depends_on_module
22
+ from:
23
+ - drupal.module
24
+ - drupal.config_object
25
+ to: drupal.module
26
+ rules:
27
+ - rule: any_config_file
28
+ reads: file
29
+ in:
30
+ - config
31
+ - module_config
32
+ match:
33
+ file: '*'
34
+ filetype: yaml
35
+ id: &id001
36
+ from: file_stem
37
+ emits:
38
+ - node:
39
+ type: drupal.config_object
40
+ confidence: declared
41
+ - rule: any_config_file_edges
42
+ reads: file
43
+ in:
44
+ - config
45
+ - module_config
46
+ match:
47
+ file: '*'
48
+ filetype: yaml
49
+ emits:
50
+ - edge:
51
+ kind: config_depends
52
+ from: this_node
53
+ to:
54
+ from:
55
+ key: dependencies.config
56
+ each: true
57
+ - edge:
58
+ kind: depends_on_module
59
+ from: this_node
60
+ to:
61
+ from:
62
+ key: dependencies.module
63
+ each: true
64
+ confidence: declared
65
+ id: *id001
@@ -0,0 +1,32 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — declares entity displays. Finds nothing.
4
+ #
5
+ # A display says how a bundle is edited or rendered, one config object per mode. Two kinds,
6
+ # and they are genuinely two: a form display and a view display of the same bundle and mode
7
+ # carry the SAME internal id.
8
+ #
9
+ # core.entity_form_display.block_content.block_ways_note.default.yml:9
10
+ # core.entity_view_display.block_content.block_ways_note.default.yml:9
11
+ # both: id: block_content.block_ways_note.default
12
+ #
13
+ # That is the evidence for minting config ids from the file name rather than from the file's
14
+ # own id key, and it was found by transcribing a map rather than by reading the schema.
15
+
16
+ node_types:
17
+
18
+ - name: drupal.form_display
19
+ parent: drupal.config_object
20
+
21
+ - name: drupal.view_display
22
+ parent: drupal.config_object
23
+
24
+ edge_kinds:
25
+
26
+ - kind: displays
27
+ from: [drupal.form_display, drupal.view_display]
28
+ to: drupal.block_type
29
+
30
+ - kind: shows_field
31
+ from: [drupal.form_display, drupal.view_display]
32
+ to: drupal.field_instance
@@ -0,0 +1,53 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — displays built by PHP. One rule, and the one that does not fit the shape.
4
+ #
5
+ # Every other PHP rule in this pack matches a config entity class, ::create, and an array.
6
+ # This one does not. A display is built through a service and a fluent chain:
7
+ #
8
+ # block_type_ways.install:51 $display_repository = \Drupal::service('entity_display.repository');
9
+ # block_type_ways.install:53 $form_display = $display_repository->getFormDisplay('block_content', 'type_way_code');
10
+ # block_type_ways.install:54-58 ->setComponent(…)->setComponent(…)->save();
11
+ #
12
+ # So it is written here rather than folded into a shared ::create rule, and it is the
13
+ # evidence that a single generic "config entity created in PHP" rule would not cover
14
+ # everything.
15
+
16
+ needs:
17
+ types:
18
+ - drupal.form_display
19
+ - drupal.view_display
20
+ rules:
21
+ - rule: display_from_code
22
+ reads: file
23
+ in:
24
+ - custom_module
25
+ match:
26
+ method_call: getFormDisplay
27
+ where:
28
+ - on_service: entity_display.repository
29
+ id: &id001
30
+ from:
31
+ - argument: 0
32
+ - argument: 1
33
+ template: core.entity_form_display.{0}.{1}.default
34
+ on_miss: unresolved
35
+ emits:
36
+ - node:
37
+ type: drupal.form_display
38
+ confidence: inferred
39
+ - rule: display_from_code_edges
40
+ reads: file
41
+ in:
42
+ - custom_module
43
+ match:
44
+ method_call: getFormDisplay
45
+ where:
46
+ - on_service: entity_display.repository
47
+ emits:
48
+ - edge:
49
+ kind: declares
50
+ from: enclosing_callable
51
+ to: this_node
52
+ confidence: inferred
53
+ id: *id001
@@ -0,0 +1,95 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — displays from config files. Two rules, one per kind.
4
+
5
+ needs:
6
+ types:
7
+ - drupal.form_display
8
+ - drupal.view_display
9
+ - drupal.block_type
10
+ - drupal.field_instance
11
+ rules:
12
+ - rule: form_display_from_config
13
+ reads: file
14
+ in:
15
+ - config
16
+ - module_config
17
+ match:
18
+ file: core.entity_form_display.*
19
+ filetype: yaml
20
+ id: &id001
21
+ from: file_stem
22
+ emits:
23
+ - node:
24
+ type: drupal.form_display
25
+ confidence: declared
26
+ - rule: view_display_from_config
27
+ reads: file
28
+ in:
29
+ - config
30
+ - module_config
31
+ match:
32
+ file: core.entity_view_display.*
33
+ filetype: yaml
34
+ id: &id002
35
+ from: file_stem
36
+ emits:
37
+ - node:
38
+ type: drupal.view_display
39
+ confidence: declared
40
+ - rule: form_display_from_config_edges
41
+ reads: file
42
+ in:
43
+ - config
44
+ - module_config
45
+ match:
46
+ file: core.entity_form_display.*
47
+ filetype: yaml
48
+ emits:
49
+ - edge:
50
+ kind: displays
51
+ from: this_node
52
+ to:
53
+ from:
54
+ - key: targetEntityType
55
+ - key: bundle
56
+ template: '{targetEntityType}.type.{bundle}'
57
+ - edge:
58
+ kind: shows_field
59
+ from: this_node
60
+ to:
61
+ from:
62
+ - key: targetEntityType
63
+ - key: bundle
64
+ - each: content.*
65
+ template: field.field.{targetEntityType}.{bundle}.{key}
66
+ confidence: declared
67
+ id: *id001
68
+ - rule: view_display_from_config_edges
69
+ reads: file
70
+ in:
71
+ - config
72
+ - module_config
73
+ match:
74
+ file: core.entity_view_display.*
75
+ filetype: yaml
76
+ emits:
77
+ - edge:
78
+ kind: displays
79
+ from: this_node
80
+ to:
81
+ from:
82
+ - key: targetEntityType
83
+ - key: bundle
84
+ template: '{targetEntityType}.type.{bundle}'
85
+ - edge:
86
+ kind: shows_field
87
+ from: this_node
88
+ to:
89
+ from:
90
+ - key: targetEntityType
91
+ - key: bundle
92
+ - each: content.*
93
+ template: field.field.{targetEntityType}.{bundle}.{key}
94
+ confidence: declared
95
+ id: *id002
@@ -0,0 +1,33 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — declares the Entity API types and edges. Finds nothing.
4
+ #
5
+ # The entity type is NOT the class that implements it, and the file this replaces got that
6
+ # wrong. It made the class the node and treated id = "redirect" as the class's identity.
7
+ #
8
+ # References say otherwise. Everything that names an entity type names the machine name:
9
+ # field.storage.node.body -> node
10
+ # core.entity_view_display.node.article.… -> node
11
+ # Nothing anywhere writes Drupal\node\Entity\Node. So the entity type is its own node, the
12
+ # class is another, and an edge joins them — the same finding as block plugin versus block
13
+ # class, which was made first and not carried across.
14
+
15
+ node_types:
16
+ - name: drupal.entity_type
17
+ id_namespace: drupal.entity_type
18
+ - name: drupal.content_entity_type
19
+ parent: drupal.entity_type
20
+ - name: drupal.config_entity_type
21
+ parent: drupal.entity_type
22
+ - name: drupal.entity_class
23
+ parent: php.class
24
+ - name: drupal.content_entity_class
25
+ parent: drupal.entity_class
26
+ - name: drupal.config_entity_class
27
+ parent: drupal.entity_class
28
+ - name: drupal.entity_save
29
+ parent: php.method
30
+ edge_kinds:
31
+ - kind: entity_class
32
+ from: drupal.entity_type
33
+ to: php.class
@@ -0,0 +1,60 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — classifies a class as an entity class. One rule, and it reads the map.
4
+ #
5
+ # This is the rule that settled a question the old file got wrong by omission. It looks
6
+ # like a rule about one file, and it is not.
7
+ #
8
+ # A class becomes an entity class because of what it extends, and the chain has to be
9
+ # followed. In the common case that is one hop into a class the pack already describes:
10
+ # all 19 custom entities in a private Drupal site write `extends ContentEntityBase` directly,
11
+ # so the pack's own hierarchy table answers it without the map.
12
+ #
13
+ # But the same rule shape, applied to the rest of that codebase, chains through FIRST-PARTY
14
+ # base classes:
15
+ # OrgScopedEntityAccessControlHandler extended 7 times, itself first-party
16
+ # JobTypeBase extended 9 times
17
+ # ChatToolLoop extended 7 times
18
+ # A class extending one of those cannot be classified until that base has been, and nothing
19
+ # tells you in advance which case a file is.
20
+ #
21
+ # So transitive classification is ALWAYS a map rule. Not sometimes. The fixpoint sorts the
22
+ # order out, and no pack author has to think about it.
23
+
24
+ needs:
25
+ types: [drupal.entity_class, drupal.content_entity_class, drupal.config_entity_class]
26
+
27
+ rules:
28
+
29
+ - rule: entity_class_content
30
+ reads: map
31
+ match:
32
+ node_type: php.class
33
+ where:
34
+ - ancestor_reaches: "Drupal\\Core\\Entity\\ContentEntityInterface"
35
+ emits:
36
+ - type: drupal.content_entity_class
37
+ confidence: declared
38
+ # Verified: a private Drupal site has 19 classes reaching this through ContentEntityBase,
39
+ # and not one of them writes `implements ContentEntityInterface` at its own declaration.
40
+ # A rule matching the written clause would match nothing real.
41
+
42
+ - rule: entity_class_config
43
+ reads: map
44
+ match:
45
+ node_type: php.class
46
+ where:
47
+ - ancestor_reaches: "Drupal\\Core\\Config\\Entity\\ConfigEntityInterface"
48
+ emits:
49
+ - type: drupal.config_entity_class
50
+ confidence: declared
51
+ # contrib pathauto PathautoPattern.php:74 extends ConfigEntityBase.
52
+
53
+ # ------------------------------------------------------------------------------------
54
+ # Deduplication is engine behaviour, not a switch.
55
+ #
56
+ # The old file carried `dedupe_paths: true` on one rule. It exists because EntityForm
57
+ # reaches FormInterface twice — through FormBase, and through EntityFormInterface which
58
+ # extends BaseFormIdInterface. Following both paths and counting the hit twice is never
59
+ # what anyone wants, so the engine always dedupes and a pack never says so.
60
+ # ------------------------------------------------------------------------------------
@@ -0,0 +1,27 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — the entity save method. One rule, and it reads the map.
4
+ #
5
+ # The case that proves a rule cannot key on a name. Core has two methods called `save` that
6
+ # differ only in what their containing class is:
7
+ # EntityBase.php:368 save()
8
+ # EntityForm.php:293 save(array $form, FormStateInterface $form_state)
9
+ # A name-only rule matches both and distinguishes neither.
10
+
11
+ needs:
12
+ types: [drupal.entity_class]
13
+
14
+ rules:
15
+
16
+ - rule: entity_save
17
+ reads: map
18
+ match:
19
+ node_type: php.method
20
+ where:
21
+ - name: save
22
+ - contained_by_type: drupal.entity_class
23
+ emits:
24
+ - type: drupal.entity_save
25
+ confidence: declared
26
+ # `reads: map` because the containing class's type is what decides it, and that type is
27
+ # itself assigned by a map rule. Two passes, and the old file said neither.
@@ -0,0 +1,85 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — entity type declared by a docblock annotation. One rule.
4
+ #
5
+ # Not a legacy tail, and the measurement that says so is the strongest argument in this
6
+ # directory. A private Drupal site, a 2026 codebase:
7
+ #
8
+ # 20 files carry @ContentEntityType
9
+ # 0 files carry #[ContentEntityType]
10
+ #
11
+ # A pack supporting attributes only would map that site's entire entity layer as nothing.
12
+
13
+ needs:
14
+ types:
15
+ - drupal.content_entity_type
16
+ - drupal.config_entity_type
17
+ rules:
18
+ - rule: content_entity_type_from_annotation
19
+ reads: file
20
+ in:
21
+ - custom_module
22
+ match:
23
+ annotation: ContentEntityType
24
+ grammar: doctrine-annotation
25
+ where:
26
+ - applies_to: class_declaration
27
+ id: &id001
28
+ from:
29
+ annotation_key: id
30
+ must_be: string_literal
31
+ on_miss: unresolved
32
+ emits:
33
+ - node:
34
+ type: drupal.content_entity_type
35
+ confidence: declared
36
+ - rule: config_entity_type_from_annotation
37
+ reads: file
38
+ in:
39
+ - custom_module
40
+ match:
41
+ annotation: ConfigEntityType
42
+ grammar: doctrine-annotation
43
+ where:
44
+ - applies_to: class_declaration
45
+ id: &id002
46
+ from:
47
+ annotation_key: id
48
+ must_be: string_literal
49
+ on_miss: unresolved
50
+ emits:
51
+ - node:
52
+ type: drupal.config_entity_type
53
+ confidence: declared
54
+ - rule: content_entity_type_from_annotation_edges
55
+ reads: file
56
+ in:
57
+ - custom_module
58
+ match:
59
+ annotation: ContentEntityType
60
+ grammar: doctrine-annotation
61
+ where:
62
+ - applies_to: class_declaration
63
+ emits:
64
+ - edge:
65
+ kind: entity_class
66
+ from: this_node
67
+ to: enclosing_class
68
+ confidence: declared
69
+ id: *id001
70
+ - rule: config_entity_type_from_annotation_edges
71
+ reads: file
72
+ in:
73
+ - custom_module
74
+ match:
75
+ annotation: ConfigEntityType
76
+ grammar: doctrine-annotation
77
+ where:
78
+ - applies_to: class_declaration
79
+ emits:
80
+ - edge:
81
+ kind: entity_class
82
+ from: this_node
83
+ to: enclosing_class
84
+ confidence: declared
85
+ id: *id002
@@ -0,0 +1,76 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — entity type declared by a PHP attribute. One rule.
4
+ #
5
+ # The current core form. Supplementary to entity_type_annotation.yaml: a class carries one
6
+ # or the other, both mint the same id, and neither needs the other.
7
+
8
+ needs:
9
+ types:
10
+ - drupal.content_entity_type
11
+ - drupal.config_entity_type
12
+ rules:
13
+ - rule: content_entity_type_from_attribute
14
+ reads: file
15
+ in:
16
+ - custom_module
17
+ match:
18
+ attribute: Drupal\Core\Entity\Attribute\ContentEntityType
19
+ where:
20
+ - applies_to: class_declaration
21
+ id: &id001
22
+ from:
23
+ attribute_argument: id
24
+ must_be: string_literal
25
+ on_miss: unresolved
26
+ emits:
27
+ - node:
28
+ type: drupal.content_entity_type
29
+ confidence: declared
30
+ - rule: config_entity_type_from_attribute
31
+ reads: file
32
+ in:
33
+ - custom_module
34
+ match:
35
+ attribute: Drupal\Core\Entity\Attribute\ConfigEntityType
36
+ where:
37
+ - applies_to: class_declaration
38
+ id: &id002
39
+ from:
40
+ attribute_argument: id
41
+ must_be: string_literal
42
+ on_miss: unresolved
43
+ emits:
44
+ - node:
45
+ type: drupal.config_entity_type
46
+ confidence: declared
47
+ - rule: content_entity_type_from_attribute_edges
48
+ reads: file
49
+ in:
50
+ - custom_module
51
+ match:
52
+ attribute: Drupal\Core\Entity\Attribute\ContentEntityType
53
+ where:
54
+ - applies_to: class_declaration
55
+ emits:
56
+ - edge:
57
+ kind: entity_class
58
+ from: this_node
59
+ to: enclosing_class
60
+ confidence: declared
61
+ id: *id001
62
+ - rule: config_entity_type_from_attribute_edges
63
+ reads: file
64
+ in:
65
+ - custom_module
66
+ match:
67
+ attribute: Drupal\Core\Entity\Attribute\ConfigEntityType
68
+ where:
69
+ - applies_to: class_declaration
70
+ emits:
71
+ - edge:
72
+ kind: entity_class
73
+ from: this_node
74
+ to: enclosing_class
75
+ confidence: declared
76
+ id: *id002
@@ -0,0 +1,40 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — field instance created by PHP. One rule.
4
+
5
+ needs:
6
+ types:
7
+ - drupal.field_instance
8
+ rules:
9
+ - rule: field_instance_from_code
10
+ reads: file
11
+ in:
12
+ - custom_module
13
+ match:
14
+ static_call: Drupal\field\Entity\FieldConfig::create
15
+ argument: 0
16
+ id: &id001
17
+ from:
18
+ - argument_key: entity_type
19
+ - argument_key: bundle
20
+ - argument_key: field_name
21
+ template: field.field.{entity_type}.{bundle}.{field_name}
22
+ on_miss: unresolved
23
+ emits:
24
+ - node:
25
+ type: drupal.field_instance
26
+ confidence: declared
27
+ - rule: field_instance_from_code_edges
28
+ reads: file
29
+ in:
30
+ - custom_module
31
+ match:
32
+ static_call: Drupal\field\Entity\FieldConfig::create
33
+ argument: 0
34
+ emits:
35
+ - edge:
36
+ kind: declares
37
+ from: enclosing_callable
38
+ to: this_node
39
+ confidence: declared
40
+ id: *id001
@@ -0,0 +1,58 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — field instance from a config file. One rule.
4
+ #
5
+ # The best example in the pack of a name carrying several facts at once, and so the case
6
+ # that earns the regex.
7
+
8
+ needs:
9
+ types:
10
+ - drupal.field_instance
11
+ - drupal.field_storage
12
+ - drupal.block_type
13
+ rules:
14
+ - rule: field_instance_from_config
15
+ reads: file
16
+ in:
17
+ - config
18
+ - module_config
19
+ match:
20
+ file: field.field.*
21
+ filetype: yaml
22
+ id: &id001
23
+ from: file_stem
24
+ emits:
25
+ - node:
26
+ type: drupal.field_instance
27
+ - attribute:
28
+ name: label
29
+ from:
30
+ key: label
31
+ confidence: declared
32
+ - rule: field_instance_from_config_edges
33
+ reads: file
34
+ in:
35
+ - config
36
+ - module_config
37
+ match:
38
+ file: field.field.*
39
+ filetype: yaml
40
+ emits:
41
+ - edge:
42
+ kind: stored_by
43
+ from: this_node
44
+ to:
45
+ from:
46
+ key: dependencies.config
47
+ where:
48
+ - matches: field.storage.*
49
+ - edge:
50
+ kind: field_of
51
+ from: this_node
52
+ to:
53
+ from:
54
+ - key: entity_type
55
+ - key: bundle
56
+ template: '{entity_type}.type.{bundle}'
57
+ confidence: declared
58
+ id: *id001
@@ -0,0 +1,37 @@
1
+ $schema: "https://periplus.dev/schema/0/pack-file.schema.json"
2
+
3
+ # drupal pack — declares field storage. Finds nothing.
4
+ #
5
+ # A storage is the field itself: its type, its cardinality, one per entity type. Many
6
+ # bundles point at one storage, and the fan-in is information the individual files do not
7
+ # carry.
8
+ #
9
+ # Verified in the export — one core storage, three instances, three different origins:
10
+ # field.storage.block_content.body core's own (_core hash at line 8)
11
+ # field.field.block_content.basic.body core's basic type
12
+ # field.field.block_content.block_ways_note.body block_ways config/install
13
+ # field.field.block_content.type_way_code.body added through the UI, label 'Body extra'
14
+ #
15
+ # The module's own storages are the opposite shape. field_tw_code_head has exactly one
16
+ # instance, and so does every other field the three test modules create.
17
+
18
+ node_types:
19
+
20
+ - name: drupal.field_storage
21
+ parent: drupal.config_object
22
+
23
+ - name: drupal.field_instance
24
+ parent: drupal.config_object
25
+
26
+ edge_kinds:
27
+
28
+ - kind: stored_by
29
+ from: drupal.field_instance
30
+ to: drupal.field_storage
31
+
32
+ - kind: field_of
33
+ from: drupal.field_instance
34
+ to: drupal.block_type
35
+ # Narrow on purpose. The bundle a field belongs to is an entity bundle, and block types
36
+ # are the only bundles this pack currently declares. When node types and media types
37
+ # arrive the endpoint list widens; it must not be guessed ahead of them.