alchemy_cms 7.0.5 → 7.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -0
  3. data/CHANGELOG.md +6 -0
  4. data/Gemfile +6 -1
  5. data/alchemy_cms.gemspec +2 -3
  6. data/app/assets/javascripts/alchemy/admin.js +0 -1
  7. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -1
  8. data/app/controllers/alchemy/admin/ingredients_controller.rb +2 -1
  9. data/app/models/alchemy/page/publisher.rb +14 -12
  10. data/app/models/alchemy/page_mutex.rb +31 -0
  11. data/app/models/alchemy/picture/url.rb +9 -1
  12. data/db/migrate/20231113104432_create_page_mutexes.rb +8 -0
  13. data/lib/alchemy/version.rb +1 -1
  14. data/lib/alchemy_cms.rb +0 -1
  15. data/vendor/assets/javascripts/jquery-ui/data.js +45 -0
  16. data/vendor/assets/javascripts/jquery-ui/ie.js +20 -0
  17. data/vendor/assets/javascripts/jquery-ui/keycode.js +51 -0
  18. data/vendor/assets/javascripts/jquery-ui/plugin.js +49 -0
  19. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +46 -0
  20. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +27 -0
  21. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +50 -0
  22. data/vendor/assets/javascripts/jquery-ui/unique-id.js +54 -0
  23. data/vendor/assets/javascripts/jquery-ui/version.js +20 -0
  24. data/vendor/assets/javascripts/jquery-ui/widget.js +754 -0
  25. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1268 -0
  26. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +241 -0
  27. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1623 -0
  28. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  29. metadata +36 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4eb5a0535db07358911a52c75a9d3f0552119d547f6f6b7ff0d4b64ac51e1e96
4
- data.tar.gz: 6d9009861880e870ca5cf9617a5bdaad8bc467a87ff842ff2722a10a1b08767a
3
+ metadata.gz: c585dd53e50006dabd57cbac098ba15c8acc5dc0ea9dd18a432df5feeca4dc89
4
+ data.tar.gz: 19518e22d715dfc11dbc46dfbd72245bd8a88156360bb8702e345bdc5d52ff7f
5
5
  SHA512:
6
- metadata.gz: 64045d0762ec1a803b87992b154a9cde5f202603e415d5086f61d74ccb16db4f9de10d80b313b37883f104f8c0877bffa83b631ad705cde329229a7a873a4dff
7
- data.tar.gz: 5da92fe5ed83c535ffdd683fcc00d5781e5be7e2563c6767d7d972176ac995346922b70a2b20541a3a6bf51688664bc2ba5e449630d57b862f65972a75b1fe1e
6
+ metadata.gz: d721b898bf3a4c76daf7ec9a925d76d9782252751355b797922fc5c0d2a3a95e97e1e05a5f9fe6b01f670d2453c7b63bcdc54d64f0c845c0145817fc517fd577
7
+ data.tar.gz: 4867e081525cc3ff481dcadb7d5625a3ddaade4e030ed46522ddd0d8d71c65c55a403d9599a7b4adbef3027e06947bcbfd6386aee4470669bc1e13650d671d74
@@ -11,6 +11,7 @@ jobs:
11
11
  rails:
12
12
  - "6.1"
13
13
  - "7.0"
14
+ - "7.1"
14
15
  ruby:
15
16
  - "3.0"
16
17
  - "3.1"
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 7.0.6 (2023-11-15)
4
+
5
+ - [7.0-stable] Merge pull request #2612 from sascha-karnatz/harden-page-publisher [#2613](https://github.com/AlchemyCMS/alchemy_cms/pull/2613) ([alchemycms-bot](https://github.com/alchemycms-bot))
6
+ - [7.0] Allow Rails 7.1 [#2603](https://github.com/AlchemyCMS/alchemy_cms/pull/2603) ([tvdeyen](https://github.com/tvdeyen))
7
+ - [7.0-stable] Merge pull request #2601 from tvdeyen/remove-jquery-ui-rails [#2602](https://github.com/AlchemyCMS/alchemy_cms/pull/2602) ([alchemycms-bot](https://github.com/alchemycms-bot))
8
+
3
9
  ## 7.0.5 (2023-10-06)
4
10
 
5
11
  - [7.0-stable] Merge pull request #2593 from tvdeyen/fix-turbo-redirect [#2594](https://github.com/AlchemyCMS/alchemy_cms/pull/2594) ([alchemycms-bot](https://github.com/alchemycms-bot))
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
- rails_version = ENV.fetch("RAILS_VERSION", 7.0).to_f
7
+ rails_version = ENV.fetch("RAILS_VERSION", "7.1")
8
8
  gem "rails", "~> #{rails_version}.0"
9
9
 
10
10
  if ENV["DB"].nil? || ENV["DB"] == "sqlite"
@@ -27,6 +27,11 @@ group :development, :test do
27
27
  # Necessary because GH Actions gem cache does not have this "Bundled with Ruby" gem installed
28
28
  gem "rexml", "~> 3.2.4"
29
29
  gem "sassc", "~> 2.4.0" # https://github.com/sass/sassc-ruby/issues/146
30
+
31
+ # https://github.com/hotwired/turbo-rails/issues/512
32
+ if rails_version == "7.1"
33
+ gem "actioncable", "~> #{rails_version}.0"
34
+ end
30
35
  else
31
36
  gem "launchy"
32
37
  gem "annotate"
data/alchemy_cms.gemspec CHANGED
@@ -29,10 +29,10 @@ Gem::Specification.new do |gem|
29
29
  activesupport
30
30
  railties
31
31
  ].each do |rails_gem|
32
- gem.add_runtime_dependency rails_gem, [">= 6.1", "< 7.1"]
32
+ gem.add_runtime_dependency rails_gem, [">= 6.1", "< 7.2"]
33
33
  end
34
34
 
35
- gem.add_runtime_dependency "active_model_serializers", ["~> 0.10.0"]
35
+ gem.add_runtime_dependency "active_model_serializers", ["~> 0.10.14"]
36
36
  gem.add_runtime_dependency "acts_as_list", [">= 0.3", "< 2"]
37
37
  gem.add_runtime_dependency "awesome_nested_set", ["~> 3.1"]
38
38
  gem.add_runtime_dependency "cancancan", [">= 2.1", "< 4.0"]
@@ -43,7 +43,6 @@ Gem::Specification.new do |gem|
43
43
  gem.add_runtime_dependency "handlebars_assets", ["~> 0.23"]
44
44
  gem.add_runtime_dependency "importmap-rails", ["~> 1.2", ">= 1.2.1"]
45
45
  gem.add_runtime_dependency "jquery-rails", ["~> 4.0", ">= 4.0.4"]
46
- gem.add_runtime_dependency "jquery-ui-rails", ["~> 6.0"]
47
46
  gem.add_runtime_dependency "kaminari", ["~> 1.1"]
48
47
  gem.add_runtime_dependency "originator", ["~> 3.1"]
49
48
  gem.add_runtime_dependency "ransack", [">= 1.8", "< 5.0"]
@@ -2,7 +2,6 @@
2
2
  // ------------------------------
3
3
  //= require jquery2
4
4
  //= require jquery_ujs
5
- //= require jquery-ui/effects/effect-fade
6
5
  //= require jquery-ui/widgets/draggable
7
6
  //= require jquery-ui/widgets/sortable
8
7
  //= require jquery-ui/widgets/tabs
@@ -90,7 +90,7 @@ class window.Alchemy.Dialog
90
90
  ))
91
91
  if @options.ready?
92
92
  @options.ready(@dialog_body)
93
- @dialog_body.show('fade', 200)
93
+ @dialog_body.show()
94
94
  true
95
95
 
96
96
  # Adds a spinner into Dialog body
@@ -19,7 +19,8 @@ module Alchemy
19
19
  private
20
20
 
21
21
  def ingredient_params
22
- params[:ingredient]&.permit(@ingredient.class.stored_attributes[:data]) || {}
22
+ params[:ingredient]&.permit(@ingredient.class.stored_attributes[:data]) ||
23
+ ActionController::Parameters.new
23
24
  end
24
25
 
25
26
  def load_croppable_resource
@@ -20,21 +20,23 @@ module Alchemy
20
20
  #
21
21
  def publish!(public_on:)
22
22
  Page.transaction do
23
- version = public_version(public_on)
24
- DeleteElements.new(version.elements).call
25
-
26
- repository = page.draft_version.element_repository
27
- ActiveRecord::Base.no_touching do
28
- Element.acts_as_list_no_update do
29
- repository.visible.not_nested.each.with_index(1) do |element, position|
30
- Alchemy::DuplicateElement.new(element, repository: repository).call(
31
- page_version_id: version.id,
32
- position: position
33
- )
23
+ PageMutex.with_lock!(@page) do
24
+ version = public_version(public_on)
25
+ DeleteElements.new(version.elements).call
26
+
27
+ repository = page.draft_version.element_repository
28
+ ActiveRecord::Base.no_touching do
29
+ Element.acts_as_list_no_update do
30
+ repository.visible.not_nested.each.with_index(1) do |element, position|
31
+ Alchemy::DuplicateElement.new(element, repository: repository).call(
32
+ page_version_id: version.id,
33
+ position: position
34
+ )
35
+ end
34
36
  end
35
37
  end
38
+ page.update(published_at: public_on)
36
39
  end
37
- page.update(published_at: public_on)
38
40
  end
39
41
 
40
42
  Alchemy.publish_targets.each { |p| p.perform_later(page) }
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Alchemy
4
+ class PageMutex < BaseRecord
5
+ class LockFailed < StandardError; end
6
+
7
+ MAX_AGE = 300 # seconds
8
+
9
+ belongs_to :page, class_name: "Alchemy::Page", optional: true
10
+
11
+ scope :expired, -> { where(arel_table[:created_at].lteq(MAX_AGE.seconds.ago)) }
12
+
13
+ def self.with_lock!(page)
14
+ raise ArgumentError, "A page is necessary to lock it" if page.nil?
15
+
16
+ # remove old expired page if it wasn't deleted before
17
+ expired.where(page: page).delete_all
18
+
19
+ begin
20
+ page_mutex = create!(page: page)
21
+ rescue ActiveRecord::RecordNotUnique
22
+ error = LockFailed.new("Can't lock page #{page.id} twice!")
23
+ logger.error error.inspect
24
+ raise error
25
+ end
26
+ yield
27
+ ensure
28
+ page_mutex&.destroy
29
+ end
30
+ end
31
+ end
@@ -35,7 +35,7 @@ module Alchemy
35
35
  thumb.uid
36
36
  else
37
37
  uid = PictureThumb::Uid.call(signature, variant)
38
- ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role) do
38
+ ActiveRecord::Base.connected_to(role: db_writing_role) do
39
39
  PictureThumb::Create.call(variant, signature, uid)
40
40
  end
41
41
  uid
@@ -49,6 +49,14 @@ module Alchemy
49
49
  variant.picture.thumbs.find_by(signature: signature)
50
50
  end
51
51
  end
52
+
53
+ def db_writing_role
54
+ if ActiveRecord::Base.respond_to?(:writing_role)
55
+ ActiveRecord::Base.writing_role
56
+ else
57
+ ActiveRecord.writing_role
58
+ end
59
+ end
52
60
  end
53
61
  end
54
62
  end
@@ -0,0 +1,8 @@
1
+ class CreatePageMutexes < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :alchemy_page_mutexes do |t|
4
+ t.references :page, null: false, index: {unique: true}, foreign_key: {to_table: :alchemy_pages}
5
+ t.datetime :created_at
6
+ end
7
+ end
8
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Alchemy
4
- VERSION = "7.0.5"
4
+ VERSION = "7.0.6"
5
5
 
6
6
  def self.version
7
7
  VERSION
data/lib/alchemy_cms.rb CHANGED
@@ -14,7 +14,6 @@ require "gutentag"
14
14
  require "handlebars_assets"
15
15
  require "importmap-rails"
16
16
  require "jquery-rails"
17
- require "jquery-ui-rails"
18
17
  require "kaminari"
19
18
  require "non_stupid_digest_assets"
20
19
  require "ransack"
@@ -0,0 +1,45 @@
1
+ //= require jquery-ui/version
2
+
3
+ /*!
4
+ * jQuery UI :data 1.13.0
5
+ * http://jqueryui.com
6
+ *
7
+ * Copyright jQuery Foundation and other contributors
8
+ * Released under the MIT license.
9
+ * http://jquery.org/license
10
+ */
11
+
12
+ //>>label: :data Selector
13
+ //>>group: Core
14
+ //>>description: Selects elements which have data stored under the specified key.
15
+ //>>docs: http://api.jqueryui.com/data-selector/
16
+
17
+ ( function( factory ) {
18
+ "use strict";
19
+
20
+ if ( typeof define === "function" && define.amd ) {
21
+
22
+ // AMD. Register as an anonymous module.
23
+ define( [ "jquery", "./version" ], factory );
24
+ } else {
25
+
26
+ // Browser globals
27
+ factory( jQuery );
28
+ }
29
+ } )( function( $ ) {
30
+ "use strict";
31
+
32
+ return $.extend( $.expr.pseudos, {
33
+ data: $.expr.createPseudo ?
34
+ $.expr.createPseudo( function( dataName ) {
35
+ return function( elem ) {
36
+ return !!$.data( elem, dataName );
37
+ };
38
+ } ) :
39
+
40
+ // Support: jQuery <1.8
41
+ function( elem, i, match ) {
42
+ return !!$.data( elem, match[ 3 ] );
43
+ }
44
+ } );
45
+ } );
@@ -0,0 +1,20 @@
1
+ //= require jquery-ui/version
2
+
3
+ ( function( factory ) {
4
+ "use strict";
5
+
6
+ if ( typeof define === "function" && define.amd ) {
7
+
8
+ // AMD. Register as an anonymous module.
9
+ define( [ "jquery", "./version" ], factory );
10
+ } else {
11
+
12
+ // Browser globals
13
+ factory( jQuery );
14
+ }
15
+ } )( function( $ ) {
16
+ "use strict";
17
+
18
+ // This file is deprecated
19
+ return $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
20
+ } );
@@ -0,0 +1,51 @@
1
+ //= require jquery-ui/version
2
+
3
+ /*!
4
+ * jQuery UI Keycode 1.13.0
5
+ * http://jqueryui.com
6
+ *
7
+ * Copyright jQuery Foundation and other contributors
8
+ * Released under the MIT license.
9
+ * http://jquery.org/license
10
+ */
11
+
12
+ //>>label: Keycode
13
+ //>>group: Core
14
+ //>>description: Provide keycodes as keynames
15
+ //>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
16
+
17
+ ( function( factory ) {
18
+ "use strict";
19
+
20
+ if ( typeof define === "function" && define.amd ) {
21
+
22
+ // AMD. Register as an anonymous module.
23
+ define( [ "jquery", "./version" ], factory );
24
+ } else {
25
+
26
+ // Browser globals
27
+ factory( jQuery );
28
+ }
29
+ } )( function( $ ) {
30
+ "use strict";
31
+
32
+ return $.ui.keyCode = {
33
+ BACKSPACE: 8,
34
+ COMMA: 188,
35
+ DELETE: 46,
36
+ DOWN: 40,
37
+ END: 35,
38
+ ENTER: 13,
39
+ ESCAPE: 27,
40
+ HOME: 36,
41
+ LEFT: 37,
42
+ PAGE_DOWN: 34,
43
+ PAGE_UP: 33,
44
+ PERIOD: 190,
45
+ RIGHT: 39,
46
+ SPACE: 32,
47
+ TAB: 9,
48
+ UP: 38
49
+ };
50
+
51
+ } );
@@ -0,0 +1,49 @@
1
+ //= require jquery-ui/version
2
+
3
+ ( function( factory ) {
4
+ "use strict";
5
+
6
+ if ( typeof define === "function" && define.amd ) {
7
+
8
+ // AMD. Register as an anonymous module.
9
+ define( [ "jquery", "./version" ], factory );
10
+ } else {
11
+
12
+ // Browser globals
13
+ factory( jQuery );
14
+ }
15
+ } )( function( $ ) {
16
+ "use strict";
17
+
18
+ // $.ui.plugin is deprecated. Use $.widget() extensions instead.
19
+ return $.ui.plugin = {
20
+ add: function( module, option, set ) {
21
+ var i,
22
+ proto = $.ui[ module ].prototype;
23
+ for ( i in set ) {
24
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
25
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
26
+ }
27
+ },
28
+ call: function( instance, name, args, allowDisconnected ) {
29
+ var i,
30
+ set = instance.plugins[ name ];
31
+
32
+ if ( !set ) {
33
+ return;
34
+ }
35
+
36
+ if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
37
+ instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
38
+ return;
39
+ }
40
+
41
+ for ( i = 0; i < set.length; i++ ) {
42
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
43
+ set[ i ][ 1 ].apply( instance.element, args );
44
+ }
45
+ }
46
+ }
47
+ };
48
+
49
+ } );
@@ -0,0 +1,46 @@
1
+ //= require jquery-ui/version
2
+
3
+ ( function( factory ) {
4
+ "use strict";
5
+
6
+ if ( typeof define === "function" && define.amd ) {
7
+
8
+ // AMD. Register as an anonymous module.
9
+ define( [ "jquery", "./version" ], factory );
10
+ } else {
11
+
12
+ // Browser globals
13
+ factory( jQuery );
14
+ }
15
+ } )( function( $ ) {
16
+ "use strict";
17
+
18
+ return $.ui.safeActiveElement = function( document ) {
19
+ var activeElement;
20
+
21
+ // Support: IE 9 only
22
+ // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
23
+ try {
24
+ activeElement = document.activeElement;
25
+ } catch ( error ) {
26
+ activeElement = document.body;
27
+ }
28
+
29
+ // Support: IE 9 - 11 only
30
+ // IE may return null instead of an element
31
+ // Interestingly, this only seems to occur when NOT in an iframe
32
+ if ( !activeElement ) {
33
+ activeElement = document.body;
34
+ }
35
+
36
+ // Support: IE 11 only
37
+ // IE11 returns a seemingly empty object in some cases when accessing
38
+ // document.activeElement from an <iframe>
39
+ if ( !activeElement.nodeName ) {
40
+ activeElement = document.body;
41
+ }
42
+
43
+ return activeElement;
44
+ };
45
+
46
+ } );
@@ -0,0 +1,27 @@
1
+ //= require jquery-ui/version
2
+
3
+ ( function( factory ) {
4
+ "use strict";
5
+
6
+ if ( typeof define === "function" && define.amd ) {
7
+
8
+ // AMD. Register as an anonymous module.
9
+ define( [ "jquery", "./version" ], factory );
10
+ } else {
11
+
12
+ // Browser globals
13
+ factory( jQuery );
14
+ }
15
+ } )( function( $ ) {
16
+ "use strict";
17
+
18
+ return $.ui.safeBlur = function( element ) {
19
+
20
+ // Support: IE9 - 10 only
21
+ // If the <body> is blurred, IE will switch windows, see #9420
22
+ if ( element && element.nodeName.toLowerCase() !== "body" ) {
23
+ $( element ).trigger( "blur" );
24
+ }
25
+ };
26
+
27
+ } );
@@ -0,0 +1,50 @@
1
+ //= require jquery-ui/version
2
+
3
+ /*!
4
+ * jQuery UI Scroll Parent 1.13.0
5
+ * http://jqueryui.com
6
+ *
7
+ * Copyright jQuery Foundation and other contributors
8
+ * Released under the MIT license.
9
+ * http://jquery.org/license
10
+ */
11
+
12
+ //>>label: scrollParent
13
+ //>>group: Core
14
+ //>>description: Get the closest ancestor element that is scrollable.
15
+ //>>docs: http://api.jqueryui.com/scrollParent/
16
+
17
+ ( function( factory ) {
18
+ "use strict";
19
+
20
+ if ( typeof define === "function" && define.amd ) {
21
+
22
+ // AMD. Register as an anonymous module.
23
+ define( [ "jquery", "./version" ], factory );
24
+ } else {
25
+
26
+ // Browser globals
27
+ factory( jQuery );
28
+ }
29
+ } )( function( $ ) {
30
+ "use strict";
31
+
32
+ return $.fn.scrollParent = function( includeHidden ) {
33
+ var position = this.css( "position" ),
34
+ excludeStaticParent = position === "absolute",
35
+ overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
36
+ scrollParent = this.parents().filter( function() {
37
+ var parent = $( this );
38
+ if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
39
+ return false;
40
+ }
41
+ return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
42
+ parent.css( "overflow-x" ) );
43
+ } ).eq( 0 );
44
+
45
+ return position === "fixed" || !scrollParent.length ?
46
+ $( this[ 0 ].ownerDocument || document ) :
47
+ scrollParent;
48
+ };
49
+
50
+ } );
@@ -0,0 +1,54 @@
1
+ //= require jquery-ui/version
2
+
3
+ /*!
4
+ * jQuery UI Unique ID 1.13.0
5
+ * http://jqueryui.com
6
+ *
7
+ * Copyright jQuery Foundation and other contributors
8
+ * Released under the MIT license.
9
+ * http://jquery.org/license
10
+ */
11
+
12
+ //>>label: uniqueId
13
+ //>>group: Core
14
+ //>>description: Functions to generate and remove uniqueId's
15
+ //>>docs: http://api.jqueryui.com/uniqueId/
16
+
17
+ ( function( factory ) {
18
+ "use strict";
19
+
20
+ if ( typeof define === "function" && define.amd ) {
21
+
22
+ // AMD. Register as an anonymous module.
23
+ define( [ "jquery", "./version" ], factory );
24
+ } else {
25
+
26
+ // Browser globals
27
+ factory( jQuery );
28
+ }
29
+ } )( function( $ ) {
30
+ "use strict";
31
+
32
+ return $.fn.extend( {
33
+ uniqueId: ( function() {
34
+ var uuid = 0;
35
+
36
+ return function() {
37
+ return this.each( function() {
38
+ if ( !this.id ) {
39
+ this.id = "ui-id-" + ( ++uuid );
40
+ }
41
+ } );
42
+ };
43
+ } )(),
44
+
45
+ removeUniqueId: function() {
46
+ return this.each( function() {
47
+ if ( /^ui-id-\d+$/.test( this.id ) ) {
48
+ $( this ).removeAttr( "id" );
49
+ }
50
+ } );
51
+ }
52
+ } );
53
+
54
+ } );
@@ -0,0 +1,20 @@
1
+ ( function( factory ) {
2
+ "use strict";
3
+
4
+ if ( typeof define === "function" && define.amd ) {
5
+
6
+ // AMD. Register as an anonymous module.
7
+ define( [ "jquery" ], factory );
8
+ } else {
9
+
10
+ // Browser globals
11
+ factory( jQuery );
12
+ }
13
+ } )( function( $ ) {
14
+ "use strict";
15
+
16
+ $.ui = $.ui || {};
17
+
18
+ return $.ui.version = "1.13.0";
19
+
20
+ } );