alchemy_cms 7.0.0.pre.b → 7.0.0.pre.c

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.

Potentially problematic release.


This version of alchemy_cms might be problematic. Click here for more details.

Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/lint.yml +21 -1
  3. data/.github/workflows/{ci.yml → test.yml} +1 -1
  4. data/.gitignore +0 -5
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +0 -1
  7. data/README.md +3 -3
  8. data/Rakefile +0 -19
  9. data/alchemy_cms.gemspec +2 -1
  10. data/app/assets/config/alchemy_manifest.js +1 -0
  11. data/app/assets/javascripts/alchemy/admin.js +0 -1
  12. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +1 -1
  13. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +5 -12
  14. data/app/assets/stylesheets/alchemy/base.scss +2 -2
  15. data/app/controllers/alchemy/base_controller.rb +0 -7
  16. data/{package/src → app/javascript/alchemy_admin}/node_tree.js +2 -2
  17. data/{package/src → app/javascript/alchemy_admin}/page_publication_fields.js +1 -1
  18. data/{package/src → app/javascript/alchemy_admin}/page_sorter.js +1 -1
  19. data/{package/src → app/javascript/alchemy_admin}/picture_editors.js +2 -2
  20. data/{package/src → app/javascript/alchemy_admin}/sitemap.js +4 -4
  21. data/app/javascript/alchemy_admin.js +34 -0
  22. data/app/views/alchemy/_menubar.html.erb +1 -1
  23. data/app/views/alchemy/admin/attachments/_replace_button.html.erb +1 -1
  24. data/app/views/alchemy/admin/attachments/destroy.js.erb +1 -1
  25. data/app/views/alchemy/admin/nodes/index.html.erb +4 -2
  26. data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +1 -1
  27. data/app/views/alchemy/admin/pages/edit.html.erb +3 -4
  28. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  29. data/app/views/alchemy/admin/pages/update.js.erb +2 -2
  30. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +1 -1
  31. data/app/views/alchemy/admin/styleguide/index.html.erb +1 -1
  32. data/app/views/alchemy/admin/uploader/_button.html.erb +1 -1
  33. data/app/views/alchemy/base/permission_denied.js.erb +1 -1
  34. data/app/views/alchemy/base/redirect.js.erb +1 -1
  35. data/app/views/layouts/alchemy/admin.html.erb +4 -8
  36. data/bin/importmap +4 -0
  37. data/bin/setup +0 -9
  38. data/bin/start +1 -1
  39. data/config/brakeman.ignore +0 -46
  40. data/config/importmap.rb +8 -0
  41. data/lib/alchemy/engine.rb +14 -0
  42. data/lib/alchemy/upgrader/seven_point_zero.rb +13 -23
  43. data/lib/alchemy/upgrader.rb +0 -11
  44. data/lib/alchemy/version.rb +1 -1
  45. data/lib/alchemy.rb +5 -0
  46. data/lib/alchemy_cms.rb +2 -1
  47. data/lib/generators/alchemy/install/files/application.html.erb +2 -2
  48. data/lib/generators/alchemy/install/install_generator.rb +0 -24
  49. data/lib/tasks/alchemy/upgrade.rake +6 -12
  50. data/package.json +6 -26
  51. metadata +44 -27
  52. data/package/admin.js +0 -34
  53. data/package/dist/admin.js +0 -16
  54. data/package/dist/admin.js.map +0 -7
  55. data/package/src/__tests__/i18n.spec.js +0 -93
  56. data/package/src/utils/__tests__/ajax.spec.js +0 -168
  57. data/package/src/utils/__tests__/events.spec.js +0 -38
  58. /data/{package/src → app/javascript/alchemy_admin}/datepicker.js +0 -0
  59. /data/{package/src → app/javascript/alchemy_admin}/file_editors.js +0 -0
  60. /data/{package/src → app/javascript/alchemy_admin}/i18n.js +0 -0
  61. /data/{package/src → app/javascript/alchemy_admin}/image_cropper.js +0 -0
  62. /data/{package/src → app/javascript/alchemy_admin}/image_loader.js +0 -0
  63. /data/{package/src → app/javascript/alchemy_admin}/ingredient_anchor_link.js +0 -0
  64. /data/{package/src → app/javascript/alchemy_admin}/tinymce.js +0 -0
  65. /data/{package/src → app/javascript/alchemy_admin}/translations.js +0 -0
  66. /data/{package/src → app/javascript/alchemy_admin}/utils/ajax.js +0 -0
  67. /data/{package/src → app/javascript/alchemy_admin}/utils/events.js +0 -0
@@ -20,6 +20,20 @@ module Alchemy
20
20
  NonStupidDigestAssets.whitelist += [/^tinymce\//]
21
21
  end
22
22
 
23
+ initializer "alchemy.importmap" do |app|
24
+ Alchemy.importmap.draw(Engine.root.join("config", "importmap.rb"))
25
+
26
+ package_path = Engine.root.join("app/javascript")
27
+ app.config.assets.paths << package_path
28
+
29
+ if app.config.importmap.sweep_cache
30
+ Alchemy.importmap.cache_sweeper(watches: package_path)
31
+ ActiveSupport.on_load(:action_controller_base) do
32
+ before_action { Alchemy.importmap.cache_sweeper.execute_if_updated }
33
+ end
34
+ end
35
+ end
36
+
23
37
  # Gutentag downcases all tags before save
24
38
  # and Gutentag validations are not case sensitive.
25
39
  # But we support having tags with uppercase characters.
@@ -8,30 +8,20 @@ module Alchemy
8
8
  include Thor::Actions
9
9
 
10
10
  class << self
11
- def update_admin_entrypoint
12
- if File.exist? "app/javascript/packs/alchemy/admin.js"
13
- FileUtils.mv "app/javascript/packs/alchemy/admin.js", "app/javascript/alchemy_admin.js"
14
- else
15
- log "Skipping. No alchemy/admin entrypoint found. Maybe already migrated from Webpacker?", :info
16
- end
17
- if Dir.exist?("app/javascript/packs/alchemy") && Dir.empty?("app/javascript/packs/alchemy")
18
- FileUtils.rm_r "app/javascript/packs/alchemy"
19
- end
20
- if File.exist? "config/importmap.rb"
21
- # We want the bundled package if using importmaps
22
- task.gsub_file "app/javascript/alchemy_admin.js", 'import "@alchemy_cms/admin"', 'import "@alchemy_cms/dist/admin"'
23
- end
24
- if task.ask("Do you want to remove webpacker now? (y/N)", default: "N") == "y"
11
+ def remove_admin_entrypoint
12
+ FileUtils.rm_rf "app/javascript/packs/alchemy/admin.js"
13
+ FileUtils.rm_rf "app/javascript/packs/alchemy_admin.js"
14
+ FileUtils.rm_rf "app/javascript/packs/alchemy"
15
+ FileUtils.rm_rf "app/javascript/packs/alchemy"
16
+ task.run "yarn remove @alchemy_cms/admin"
17
+ if task.ask("Do you want to remove webpacker as well? (y/N)", default: "N") == "y"
18
+ task.run "bundle remove webpacker"
25
19
  task.run "yarn remove @rails/webpacker webpack webpack-cli webpack-dev-server"
26
- FileUtils.rm_r "app/javascript/packs"
27
- FileUtils.rm_r "config/webpack"
28
- FileUtils.rm "config/webpacker.yml"
29
- FileUtils.rm "bin/webpack"
30
- FileUtils.rm "bin/webpack-dev-server"
31
- end
32
- if task.ask("Do you want to add jsbundling-rails now? (Y/n)", default: "Y") == "Y"
33
- task.run "bundle add jsbundling-rails"
34
- task.run "bin/rails javascript:install:esbuild"
20
+ FileUtils.rm_rf "app/javascript/packs"
21
+ FileUtils.rm_rf "config/webpack"
22
+ FileUtils.rm_f "config/webpacker.yml"
23
+ FileUtils.rm_f "bin/webpack"
24
+ FileUtils.rm_f "bin/webpack-dev-server"
35
25
  end
36
26
  end
37
27
 
@@ -25,17 +25,6 @@ module Alchemy
25
25
  todo "Check the default configuration file (./config/alchemy/config.yml.defaults) for new configuration options and insert them into your config file.", "Configuration has changed"
26
26
  end
27
27
  end
28
-
29
- def update_npm_package
30
- desc "Update npm package."
31
- if File.exist? Rails.root.join("config/importmap.rb")
32
- `bin/importmap pin @alchemy_cms/admin@~#{Alchemy.version}`
33
- elsif File.exist? Rails.root.join("package.json")
34
- `yarn add @alchemy_cms/admin@~#{Alchemy.version}`
35
- else
36
- log("Could not update alchemy admin package! Make sure you have a JS bundler installed", :warning)
37
- end
38
- end
39
28
  end
40
29
  end
41
30
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Alchemy
4
- VERSION = "7.0.0-b"
4
+ VERSION = "7.0.0-c"
5
5
 
6
6
  def self.version
7
7
  VERSION
data/lib/alchemy.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "alchemy/admin/preview_url"
4
+ require "importmap-rails"
4
5
 
5
6
  module Alchemy
6
7
  YAML_PERMITTED_CLASSES = %w[Symbol Date Regexp]
@@ -78,4 +79,8 @@ module Alchemy
78
79
  # Alchemy.enable_searchable = true
79
80
  #
80
81
  mattr_accessor :enable_searchable, default: false
82
+
83
+ # JS Importmap instance
84
+ singleton_class.attr_accessor :importmap
85
+ self.importmap = Importmap::Map.new
81
86
  end
data/lib/alchemy_cms.rb CHANGED
@@ -12,6 +12,7 @@ require "cancan"
12
12
  require "dragonfly"
13
13
  require "gutentag"
14
14
  require "handlebars_assets"
15
+ require "importmap-rails"
15
16
  require "jquery-rails"
16
17
  require "jquery-ui-rails"
17
18
  require "kaminari"
@@ -21,7 +22,7 @@ require "request_store"
21
22
  require "responders"
22
23
  require "sassc-rails"
23
24
  require "simple_form"
24
- require "turbolinks"
25
+ require "turbo-rails"
25
26
  require "userstamp"
26
27
  require "view_component"
27
28
 
@@ -5,8 +5,8 @@
5
5
  <%= csrf_meta_tags %>
6
6
  <%= csp_meta_tag %>
7
7
 
8
- <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
9
- <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
8
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbo-track': 'reload' %>
9
+ <%= javascript_include_tag 'application', 'data-turbo-track': 'reload' %>
10
10
  </head>
11
11
 
12
12
  <body>
@@ -99,30 +99,6 @@ module Alchemy
99
99
  rake "gutentag:install:migrations"
100
100
  end
101
101
 
102
- def add_npm_package
103
- if File.exist? app_root.join("package.json")
104
- run "yarn add @alchemy_cms/admin@~#{Alchemy.version}"
105
- elsif File.exist? app_root.join("config/importmap.rb")
106
- run "bin/importmap pin @alchemy_cms/admin@~#{Alchemy.version}"
107
- else
108
- log("Could not add alchemy admin package! Make sure you have a JS bundler installed", :warning)
109
- end
110
- end
111
-
112
- def copy_alchemy_entry_point
113
- if Dir.exist? app_root.join("app/javascript")
114
- if File.exist? app_root.join("config/importmap.rb")
115
- # We want the bundled package if using importmaps
116
- create_file app_root.join("app/javascript/alchemy_admin.js"), 'import "@alchemy_cms/dist/admin"'
117
- else
118
- # We want the normal package if using a bundler locally
119
- create_file app_root.join("app/javascript/alchemy_admin.js"), 'import "@alchemy_cms/admin"'
120
- end
121
- else
122
- log("Could not add alchemy admin entry point! Make sure you have a JS bundler installed", :warning)
123
- end
124
- end
125
-
126
102
  def set_primary_language
127
103
  header
128
104
  install_tasks.set_primary_language(
@@ -16,8 +16,7 @@ namespace :alchemy do
16
16
  desc "Alchemy Upgrader: Prepares the database and updates Alchemys configuration file."
17
17
  task prepare: [
18
18
  "alchemy:upgrade:database",
19
- "alchemy:upgrade:config",
20
- "alchemy:upgrade:package"
19
+ "alchemy:upgrade:config"
21
20
  ]
22
21
 
23
22
  desc "Alchemy Upgrader: Prepares the database."
@@ -31,11 +30,6 @@ namespace :alchemy do
31
30
  Alchemy::Upgrader.copy_new_config_file
32
31
  end
33
32
 
34
- desc "Alchemy Upgrader: Install new Node package."
35
- task package: [:environment] do
36
- Alchemy::Upgrader.update_npm_package
37
- end
38
-
39
33
  desc "Upgrade Alchemy to v7.0"
40
34
  task "7.0" => [
41
35
  "alchemy:upgrade:prepare",
@@ -46,13 +40,13 @@ namespace :alchemy do
46
40
 
47
41
  namespace "7.0" do
48
42
  task "run" => [
49
- "alchemy:upgrade:7.0:update_admin_entrypoint"
43
+ "alchemy:upgrade:7.0:remove_admin_entrypoint"
50
44
  ]
51
45
 
52
- desc "Update alchemy admin entrypoint"
53
- task update_admin_entrypoint: [:environment] do
54
- puts "adding npm_package..."
55
- Alchemy::Upgrader::SevenPointZero.update_admin_entrypoint
46
+ desc "Remove alchemy admin entrypoint"
47
+ task remove_admin_entrypoint: [:environment] do
48
+ puts "removing npm_package..."
49
+ Alchemy::Upgrader::SevenPointZero.remove_admin_entrypoint
56
50
  end
57
51
  end
58
52
  end
data/package.json CHANGED
@@ -1,41 +1,21 @@
1
1
  {
2
- "name": "@alchemy_cms/admin",
3
- "version": "7.0.0-b",
4
- "description": "AlchemyCMS",
5
- "browser": "package/dist/admin.js",
6
- "files": [
7
- "package/**/*"
8
- ],
9
- "directories": {
10
- "lib": "package"
11
- },
2
+ "name": "alchemy_admin",
12
3
  "scripts": {
13
4
  "test": "jest",
14
- "build": "esbuild package/admin.js --bundle --sourcemap --minify --outdir=package/dist --public-path=assets"
15
- },
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/AlchemyCMS/alchemy_cms.git"
5
+ "lint": "prettier --check 'app/javascript/**/*.js'"
19
6
  },
20
7
  "keywords": [],
21
8
  "author": "Thomas von Deyen",
22
9
  "license": "BSD-3-Clause",
23
- "bugs": {
24
- "url": "https://github.com/AlchemyCMS/alchemy_cms/issues"
25
- },
26
- "homepage": "https://github.com/AlchemyCMS/alchemy_cms#readme",
27
- "dependencies": {
28
- "flatpickr": "^4.6.9",
29
- "lodash-es": "^4.17.21",
30
- "sortablejs": "^1.10.2"
31
- },
32
10
  "devDependencies": {
33
11
  "@babel/core": "^7.9.6",
34
12
  "@babel/preset-env": "^7.9.6",
35
13
  "babel-jest": "^29.0.1",
36
- "esbuild": "^0.18.4",
14
+ "flatpickr": "^4.6.9",
37
15
  "jest": "^25.2.7",
16
+ "lodash-es": "^4.17.21",
38
17
  "prettier": "^2.0.2",
18
+ "sortablejs": "^1.10.2",
39
19
  "xhr-mock": "^2.5.1"
40
20
  },
41
21
  "jest": {
@@ -43,7 +23,7 @@
43
23
  "Alchemy": {}
44
24
  },
45
25
  "roots": [
46
- "package"
26
+ "spec/javascript/alchemy_admin"
47
27
  ]
48
28
  }
49
29
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alchemy_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0.pre.b
4
+ version: 7.0.0.pre.c
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2023-06-22 00:00:00.000000000 Z
16
+ date: 2023-06-30 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: actionmailer
@@ -325,6 +325,26 @@ dependencies:
325
325
  - - "~>"
326
326
  - !ruby/object:Gem::Version
327
327
  version: '0.23'
328
+ - !ruby/object:Gem::Dependency
329
+ name: importmap-rails
330
+ requirement: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - "~>"
333
+ - !ruby/object:Gem::Version
334
+ version: '1.2'
335
+ - - ">="
336
+ - !ruby/object:Gem::Version
337
+ version: 1.2.1
338
+ type: :runtime
339
+ prerelease: false
340
+ version_requirements: !ruby/object:Gem::Requirement
341
+ requirements:
342
+ - - "~>"
343
+ - !ruby/object:Gem::Version
344
+ version: '1.2'
345
+ - - ">="
346
+ - !ruby/object:Gem::Version
347
+ version: 1.2.1
328
348
  - !ruby/object:Gem::Dependency
329
349
  name: jquery-rails
330
350
  requirement: !ruby/object:Gem::Requirement
@@ -496,19 +516,19 @@ dependencies:
496
516
  - !ruby/object:Gem::Version
497
517
  version: '5'
498
518
  - !ruby/object:Gem::Dependency
499
- name: turbolinks
519
+ name: turbo-rails
500
520
  requirement: !ruby/object:Gem::Requirement
501
521
  requirements:
502
522
  - - ">="
503
523
  - !ruby/object:Gem::Version
504
- version: '2.5'
524
+ version: '1.4'
505
525
  type: :runtime
506
526
  prerelease: false
507
527
  version_requirements: !ruby/object:Gem::Requirement
508
528
  requirements:
509
529
  - - ">="
510
530
  - !ruby/object:Gem::Version
511
- version: '2.5'
531
+ version: '1.4'
512
532
  - !ruby/object:Gem::Dependency
513
533
  name: view_component
514
534
  requirement: !ruby/object:Gem::Requirement
@@ -705,9 +725,9 @@ files:
705
725
  - ".github/ISSUE_TEMPLATE/Feature_request.md"
706
726
  - ".github/PULL_REQUEST_TEMPLATE.md"
707
727
  - ".github/workflows/brakeman-analysis.yml"
708
- - ".github/workflows/ci.yml"
709
728
  - ".github/workflows/lint.yml"
710
729
  - ".github/workflows/stale.yml"
730
+ - ".github/workflows/test.yml"
711
731
  - ".gitignore"
712
732
  - ".hound.yml"
713
733
  - ".localeapp/config.rb"
@@ -895,6 +915,22 @@ files:
895
915
  - app/helpers/alchemy/elements_helper.rb
896
916
  - app/helpers/alchemy/pages_helper.rb
897
917
  - app/helpers/alchemy/url_helper.rb
918
+ - app/javascript/alchemy_admin.js
919
+ - app/javascript/alchemy_admin/datepicker.js
920
+ - app/javascript/alchemy_admin/file_editors.js
921
+ - app/javascript/alchemy_admin/i18n.js
922
+ - app/javascript/alchemy_admin/image_cropper.js
923
+ - app/javascript/alchemy_admin/image_loader.js
924
+ - app/javascript/alchemy_admin/ingredient_anchor_link.js
925
+ - app/javascript/alchemy_admin/node_tree.js
926
+ - app/javascript/alchemy_admin/page_publication_fields.js
927
+ - app/javascript/alchemy_admin/page_sorter.js
928
+ - app/javascript/alchemy_admin/picture_editors.js
929
+ - app/javascript/alchemy_admin/sitemap.js
930
+ - app/javascript/alchemy_admin/tinymce.js
931
+ - app/javascript/alchemy_admin/translations.js
932
+ - app/javascript/alchemy_admin/utils/ajax.js
933
+ - app/javascript/alchemy_admin/utils/events.js
898
934
  - app/jobs/alchemy/base_job.rb
899
935
  - app/jobs/alchemy/publish_page_job.rb
900
936
  - app/mailers/alchemy/base_mailer.rb
@@ -1191,6 +1227,7 @@ files:
1191
1227
  - app/views/layouts/alchemy/admin.html.erb
1192
1228
  - app/views/layouts/alchemy/sitemap.xml.erb
1193
1229
  - babel.config.js
1230
+ - bin/importmap
1194
1231
  - bin/rails
1195
1232
  - bin/rspec
1196
1233
  - bin/setup
@@ -1198,6 +1235,7 @@ files:
1198
1235
  - config/alchemy/config.yml
1199
1236
  - config/alchemy/modules.yml
1200
1237
  - config/brakeman.ignore
1238
+ - config/importmap.rb
1201
1239
  - config/initializers/assets.rb
1202
1240
  - config/initializers/dragonfly.rb
1203
1241
  - config/initializers/mime_types.rb
@@ -1328,27 +1366,6 @@ files:
1328
1366
  - lib/tasks/alchemy/tidy.rake
1329
1367
  - lib/tasks/alchemy/upgrade.rake
1330
1368
  - package.json
1331
- - package/admin.js
1332
- - package/dist/admin.js
1333
- - package/dist/admin.js.map
1334
- - package/src/__tests__/i18n.spec.js
1335
- - package/src/datepicker.js
1336
- - package/src/file_editors.js
1337
- - package/src/i18n.js
1338
- - package/src/image_cropper.js
1339
- - package/src/image_loader.js
1340
- - package/src/ingredient_anchor_link.js
1341
- - package/src/node_tree.js
1342
- - package/src/page_publication_fields.js
1343
- - package/src/page_sorter.js
1344
- - package/src/picture_editors.js
1345
- - package/src/sitemap.js
1346
- - package/src/tinymce.js
1347
- - package/src/translations.js
1348
- - package/src/utils/__tests__/ajax.spec.js
1349
- - package/src/utils/__tests__/events.spec.js
1350
- - package/src/utils/ajax.js
1351
- - package/src/utils/events.js
1352
1369
  - vendor/assets/fonts/fa-regular-400.eot
1353
1370
  - vendor/assets/fonts/fa-regular-400.svg
1354
1371
  - vendor/assets/fonts/fa-regular-400.ttf
data/package/admin.js DELETED
@@ -1,34 +0,0 @@
1
- import translate from "./src/i18n"
2
- import translationData from "./src/translations"
3
- import NodeTree from "./src/node_tree"
4
- import fileEditors from "./src/file_editors"
5
- import IngredientAnchorLink from "./src/ingredient_anchor_link"
6
- import pictureEditors from "./src/picture_editors"
7
- import ImageLoader from "./src/image_loader"
8
- import ImageCropper from "./src/image_cropper"
9
- import Datepicker from "./src/datepicker"
10
- import Sitemap from "./src/sitemap"
11
- import Tinymce from "./src/tinymce"
12
- import PagePublicationFields from "./src/page_publication_fields.js"
13
-
14
- // Global Alchemy object
15
- if (typeof window.Alchemy === "undefined") {
16
- window.Alchemy = {}
17
- }
18
-
19
- // Enhance the global Alchemy object with imported features
20
- Object.assign(Alchemy, {
21
- // Global utility method for translating a given string
22
- t: translate,
23
- translations: Object.assign(Alchemy.translations || {}, translationData),
24
- NodeTree,
25
- fileEditors,
26
- pictureEditors,
27
- ImageLoader: ImageLoader.init,
28
- ImageCropper,
29
- IngredientAnchorLink,
30
- Datepicker,
31
- Sitemap,
32
- Tinymce,
33
- PagePublicationFields
34
- })