zendesk_apps_support 4.29.4
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.
- checksums.yaml +7 -0
- data/LICENSE +176 -0
- data/README.md +39 -0
- data/config/locales/en.yml +163 -0
- data/config/locales/translations/zendesk_apps_support.yml +405 -0
- data/lib/zendesk_apps_support.rb +42 -0
- data/lib/zendesk_apps_support/app_file.rb +44 -0
- data/lib/zendesk_apps_support/app_requirement.rb +11 -0
- data/lib/zendesk_apps_support/app_version.rb +78 -0
- data/lib/zendesk_apps_support/assets/default_app_logo.svg +10 -0
- data/lib/zendesk_apps_support/assets/default_styles.scss +3 -0
- data/lib/zendesk_apps_support/assets/default_template.html.erb +10 -0
- data/lib/zendesk_apps_support/assets/installed.js.erb +21 -0
- data/lib/zendesk_apps_support/assets/src.js.erb +37 -0
- data/lib/zendesk_apps_support/build_translation.rb +51 -0
- data/lib/zendesk_apps_support/engine.rb +11 -0
- data/lib/zendesk_apps_support/finders.rb +36 -0
- data/lib/zendesk_apps_support/i18n.rb +31 -0
- data/lib/zendesk_apps_support/installation.rb +22 -0
- data/lib/zendesk_apps_support/installed.rb +27 -0
- data/lib/zendesk_apps_support/location.rb +71 -0
- data/lib/zendesk_apps_support/manifest.rb +197 -0
- data/lib/zendesk_apps_support/manifest/location_options.rb +35 -0
- data/lib/zendesk_apps_support/manifest/no_override_hash.rb +50 -0
- data/lib/zendesk_apps_support/manifest/parameter.rb +23 -0
- data/lib/zendesk_apps_support/package.rb +402 -0
- data/lib/zendesk_apps_support/product.rb +31 -0
- data/lib/zendesk_apps_support/sass_functions.rb +43 -0
- data/lib/zendesk_apps_support/stylesheet_compiler.rb +38 -0
- data/lib/zendesk_apps_support/validations/banner.rb +35 -0
- data/lib/zendesk_apps_support/validations/manifest.rb +412 -0
- data/lib/zendesk_apps_support/validations/marketplace.rb +31 -0
- data/lib/zendesk_apps_support/validations/mime.rb +41 -0
- data/lib/zendesk_apps_support/validations/requests.rb +47 -0
- data/lib/zendesk_apps_support/validations/requirements.rb +154 -0
- data/lib/zendesk_apps_support/validations/secrets.rb +77 -0
- data/lib/zendesk_apps_support/validations/secure_settings.rb +37 -0
- data/lib/zendesk_apps_support/validations/source.rb +25 -0
- data/lib/zendesk_apps_support/validations/stylesheets.rb +28 -0
- data/lib/zendesk_apps_support/validations/svg.rb +81 -0
- data/lib/zendesk_apps_support/validations/templates.rb +20 -0
- data/lib/zendesk_apps_support/validations/translations.rb +160 -0
- data/lib/zendesk_apps_support/validations/validation_error.rb +77 -0
- metadata +327 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
require 'zendesk_apps_support/engine'
|
5
|
+
|
6
|
+
autoload :AppFile, 'zendesk_apps_support/app_file'
|
7
|
+
autoload :BuildTranslation, 'zendesk_apps_support/build_translation'
|
8
|
+
autoload :I18n, 'zendesk_apps_support/i18n'
|
9
|
+
autoload :Location, 'zendesk_apps_support/location'
|
10
|
+
autoload :Manifest, 'zendesk_apps_support/manifest'
|
11
|
+
autoload :Product, 'zendesk_apps_support/product'
|
12
|
+
autoload :Package, 'zendesk_apps_support/package'
|
13
|
+
autoload :Installed, 'zendesk_apps_support/installed'
|
14
|
+
autoload :Installation, 'zendesk_apps_support/installation'
|
15
|
+
autoload :Finders, 'zendesk_apps_support/finders'
|
16
|
+
autoload :AppRequirement, 'zendesk_apps_support/app_requirement'
|
17
|
+
autoload :AppVersion, 'zendesk_apps_support/app_version'
|
18
|
+
autoload :StylesheetCompiler, 'zendesk_apps_support/stylesheet_compiler'
|
19
|
+
|
20
|
+
module Validations
|
21
|
+
autoload :ValidationError, 'zendesk_apps_support/validations/validation_error'
|
22
|
+
autoload :Manifest, 'zendesk_apps_support/validations/manifest'
|
23
|
+
autoload :SecureSettings, 'zendesk_apps_support/validations/secure_settings'
|
24
|
+
autoload :Marketplace, 'zendesk_apps_support/validations/marketplace'
|
25
|
+
autoload :Mime, 'zendesk_apps_support/validations/mime'
|
26
|
+
autoload :Secrets, 'zendesk_apps_support/validations/secrets'
|
27
|
+
autoload :Source, 'zendesk_apps_support/validations/source'
|
28
|
+
autoload :Templates, 'zendesk_apps_support/validations/templates'
|
29
|
+
autoload :Translations, 'zendesk_apps_support/validations/translations'
|
30
|
+
autoload :Stylesheets, 'zendesk_apps_support/validations/stylesheets'
|
31
|
+
autoload :Requirements, 'zendesk_apps_support/validations/requirements'
|
32
|
+
autoload :Requests, 'zendesk_apps_support/validations/requests'
|
33
|
+
autoload :Banner, 'zendesk_apps_support/validations/banner'
|
34
|
+
autoload :Svg, 'zendesk_apps_support/validations/svg'
|
35
|
+
end
|
36
|
+
|
37
|
+
class Manifest
|
38
|
+
autoload :LocationOptions, 'zendesk_apps_support/manifest/location_options'
|
39
|
+
autoload :Parameter, 'zendesk_apps_support/manifest/parameter'
|
40
|
+
autoload :NoOverrideHash, 'zendesk_apps_support/manifest/no_override_hash'
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
class AppFile
|
5
|
+
attr_reader :relative_path
|
6
|
+
attr_reader :absolute_path
|
7
|
+
|
8
|
+
def initialize(package, relative_path)
|
9
|
+
@relative_path = relative_path
|
10
|
+
@file = File.new(package.path_to(relative_path))
|
11
|
+
@absolute_path = File.absolute_path @file.path
|
12
|
+
end
|
13
|
+
|
14
|
+
def read
|
15
|
+
File.read @file.path
|
16
|
+
end
|
17
|
+
|
18
|
+
def extension
|
19
|
+
File.extname relative_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def =~(regex)
|
23
|
+
relative_path =~ regex
|
24
|
+
end
|
25
|
+
|
26
|
+
def match(regex)
|
27
|
+
self =~ regex
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :to_s, :relative_path
|
31
|
+
|
32
|
+
def method_missing(sym, *args, &block)
|
33
|
+
if @file.respond_to?(sym)
|
34
|
+
@file.call(sym, *args, &block)
|
35
|
+
else
|
36
|
+
super
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def respond_to_missing?(sym, include_private = false)
|
41
|
+
@file.send(:respond_to_missing?, sym, include_private) || super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
class AppRequirement
|
5
|
+
CUSTOM_OBJECTS_KEY = 'custom_objects'
|
6
|
+
CUSTOM_OBJECTS_TYPE_KEY = 'custom_object_types'
|
7
|
+
CUSTOM_OBJECTS_RELATIONSHIP_TYPE_KEY = 'custom_object_relationship_types'
|
8
|
+
TYPES = %w[automations channel_integrations custom_objects macros targets views ticket_fields
|
9
|
+
triggers user_fields organization_fields].freeze
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
# At any point in time, we support up to four versions:
|
5
|
+
# * deprecated -- we will still serve apps targeting the deprecated version,
|
6
|
+
# but newly created or updated apps CANNOT target it
|
7
|
+
# * sunsetting -- we will soon be removing support for this version;
|
8
|
+
# updated apps SHOULD target the current version, no new apps allowed
|
9
|
+
# * current -- we will serve apps targeting the current version;
|
10
|
+
# newly created or updated apps SHOULD target it
|
11
|
+
# * future -- we will serve apps targeting the future version;
|
12
|
+
# newly created or updates apps MAY target it, but it
|
13
|
+
# may change without notice
|
14
|
+
class AppVersion
|
15
|
+
DEPRECATED = ['0.5', '1.0'].freeze
|
16
|
+
SUNSETTING = nil
|
17
|
+
CURRENT = '2.0'
|
18
|
+
FUTURE = nil
|
19
|
+
|
20
|
+
TO_BE_SERVED = [DEPRECATED, SUNSETTING, CURRENT, FUTURE].flatten.compact.freeze
|
21
|
+
VALID_FOR_UPDATE = [SUNSETTING, CURRENT, FUTURE].compact.freeze
|
22
|
+
VALID_FOR_CREATE = [CURRENT, FUTURE].compact.freeze
|
23
|
+
|
24
|
+
attr_reader :current
|
25
|
+
|
26
|
+
def initialize(version)
|
27
|
+
@version = version.to_s.freeze
|
28
|
+
@current = CURRENT
|
29
|
+
freeze
|
30
|
+
end
|
31
|
+
|
32
|
+
def servable?
|
33
|
+
TO_BE_SERVED.include?(@version)
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid_for_update?
|
37
|
+
VALID_FOR_UPDATE.include?(@version)
|
38
|
+
end
|
39
|
+
|
40
|
+
def valid_for_create?
|
41
|
+
VALID_FOR_CREATE.include?(@version)
|
42
|
+
end
|
43
|
+
|
44
|
+
def deprecated?
|
45
|
+
DEPRECATED.include?(@version)
|
46
|
+
end
|
47
|
+
|
48
|
+
def sunsetting?
|
49
|
+
@version == SUNSETTING
|
50
|
+
end
|
51
|
+
|
52
|
+
def obsolete?
|
53
|
+
!servable?
|
54
|
+
end
|
55
|
+
|
56
|
+
def blank?
|
57
|
+
@version.nil? || @version == ''
|
58
|
+
end
|
59
|
+
|
60
|
+
def present?
|
61
|
+
!blank?
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
@version
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_json(*)
|
69
|
+
@version.inspect
|
70
|
+
end
|
71
|
+
|
72
|
+
def ==(other)
|
73
|
+
@version == other.to_s
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
AppVersion.freeze
|
78
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
3
|
+
viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
|
4
|
+
<path id="Fill-3" d="M1.5,6.1C1.3,5.9,1,6,1,6.4l0,7c0,0.3,0.2,0.7,0.5,0.9l6,3.6C7.8,18.1,8,18,8,17.6l0-7.1c0-0.3-0.2-0.7-0.5-0.9
|
5
|
+
L1.5,6.1z"/>
|
6
|
+
<path id="Fill-5" d="M10.5,17.9c-0.3,0.2-0.5,0-0.5-0.3l0-7c0-0.3,0.2-0.7,0.5-0.9l6-3.6C16.8,5.9,17,6,17,6.4l0,7.1
|
7
|
+
c0,0.3-0.2,0.7-0.5,0.9L10.5,17.9z"/>
|
8
|
+
<path id="Fill-1" d="M2.2,3.7c-0.3,0.2-0.3,0.4,0,0.6l6.2,3.6C8.7,8,9.2,8,9.4,7.9l6.3-3.6c0.3-0.2,0.3-0.4,0-0.6L9.5,0.1
|
9
|
+
C9.2,0,8.8,0,8.5,0.1L2.2,3.7z"/>
|
10
|
+
</svg>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
(function() {
|
2
|
+
<% appsjs.each do |appjs| %>
|
3
|
+
<%= appjs %>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<% installations.each do |installation| %>
|
7
|
+
if (ZendeskApps[<%= installation.app_name.to_json %>]) {
|
8
|
+
ZendeskApps[<%= installation.app_name.to_json %>].install(<%= installation.to_json %>);
|
9
|
+
}
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% installation_orders.each do |loc_name, installation_list| %>
|
13
|
+
ZendeskApps.sortAppsForSite(<%= loc_name.to_json %>, <%= installation_list.to_json %>);
|
14
|
+
<% end %>
|
15
|
+
}());
|
16
|
+
|
17
|
+
<% unless rollbar_zaf_access_token.empty? %>
|
18
|
+
ZendeskApps.rollbarAccessToken = "<%= rollbar_zaf_access_token %>";
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
ZendeskApps.trigger && ZendeskApps.trigger('ready');
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<% unless iframe_only %>
|
2
|
+
with( ZendeskApps.AppScope.create() ) {
|
3
|
+
<% unless modules.empty? %>
|
4
|
+
require.modules = {
|
5
|
+
<% modules.each do |path, content| %>
|
6
|
+
<%= path.to_json %>: function(exports, require, module) {
|
7
|
+
<%= content %>
|
8
|
+
},
|
9
|
+
<% end %>
|
10
|
+
eom: undefined
|
11
|
+
};
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
var source = <%= source %>;
|
15
|
+
}
|
16
|
+
<% end %>
|
17
|
+
var app = ZendeskApps.defineApp(<%= iframe_only ? 'null' : 'source' %>)
|
18
|
+
.reopenClass(<%= app_class_properties.to_json %>)
|
19
|
+
.reopen({
|
20
|
+
appName: <%= name.to_json %>,
|
21
|
+
appVersion: <%= version.to_json %>,
|
22
|
+
locationIcons: <%= location_icons.to_json %>,
|
23
|
+
assetUrlPrefix: <%= asset_url_prefix.to_json %>,
|
24
|
+
logoAssetHash: <%= logo_asset_hash.to_json %>,
|
25
|
+
appClassName: <%= app_class_name.to_json %>,
|
26
|
+
author: {
|
27
|
+
name: <%= author['name'].to_json %>,
|
28
|
+
email: <%= author['email'].to_json %>
|
29
|
+
},
|
30
|
+
<% unless iframe_only %>
|
31
|
+
translations: <%= translations.to_json %>,
|
32
|
+
templates: <%= templates.to_json %>,
|
33
|
+
<% end %>
|
34
|
+
frameworkVersion: <%= framework_version.to_json %>
|
35
|
+
});
|
36
|
+
|
37
|
+
ZendeskApps[<%= name.to_json %>] = app;
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
module BuildTranslation
|
5
|
+
I18N_TITLE_KEY = 'title'
|
6
|
+
I18N_VALUE_KEY = 'value'
|
7
|
+
I18N_KEYS = [I18N_TITLE_KEY, I18N_VALUE_KEY].freeze
|
8
|
+
|
9
|
+
def to_flattened_namespaced_hash(hash, target_key = nil, prefix = nil)
|
10
|
+
hash.each_with_object({}) do |(key, value), result|
|
11
|
+
key = [prefix, key].compact.join('.')
|
12
|
+
if value.is_a?(Hash)
|
13
|
+
if target_key && translation_hash?(value)
|
14
|
+
result[key] = value[target_key]
|
15
|
+
else
|
16
|
+
result.update(to_flattened_namespaced_hash(value, target_key, key))
|
17
|
+
end
|
18
|
+
else
|
19
|
+
result[key] = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def remove_zendesk_keys(scope, translations = {})
|
25
|
+
scope.each_key do |key|
|
26
|
+
context = scope[key]
|
27
|
+
|
28
|
+
if context.is_a?(Hash)
|
29
|
+
|
30
|
+
if translation_hash?(context)
|
31
|
+
translations[key] = context[I18N_VALUE_KEY]
|
32
|
+
else
|
33
|
+
translations[key] ||= {}
|
34
|
+
translations[key] = remove_zendesk_keys(context, translations[key])
|
35
|
+
end
|
36
|
+
|
37
|
+
else
|
38
|
+
translations[key] = context
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
translations
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def translation_hash?(hash)
|
48
|
+
hash.keys.sort == I18N_KEYS
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
module Finders
|
5
|
+
class RecordNotFound < StandardError
|
6
|
+
def initialize(msg)
|
7
|
+
super(msg)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def find_by(arg)
|
12
|
+
all.find(&filter_by_arg(arg))
|
13
|
+
end
|
14
|
+
|
15
|
+
def find_by!(arg)
|
16
|
+
found = find_by(arg)
|
17
|
+
raise(RecordNotFound, "Unable to find #{name} with #{arg.inspect}") if found.nil?
|
18
|
+
found
|
19
|
+
end
|
20
|
+
|
21
|
+
def where(arg)
|
22
|
+
all.select(&filter_by_arg(arg))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def filter_by_arg(arg)
|
28
|
+
lambda do |findable_record|
|
29
|
+
arg.all? do |attribute, value|
|
30
|
+
value = value.to_s if value.is_a? Symbol
|
31
|
+
findable_record.public_send(attribute) == value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
module I18n
|
5
|
+
class << self
|
6
|
+
def t(key, *args)
|
7
|
+
i18n.t(key, *args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_load_path
|
11
|
+
i18n
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def i18n
|
18
|
+
@i18n ||= begin
|
19
|
+
require 'i18n'
|
20
|
+
::I18n.load_path += locale_files
|
21
|
+
::I18n
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def locale_files
|
26
|
+
Dir[File.expand_path('../../../config/locales/*.yml', __FILE__)] -
|
27
|
+
Dir[File.expand_path('../../../config/locales/*.zendesk.yml', __FILE__)]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
class Installation
|
5
|
+
attr_accessor :id, :app_id, :app_name, :requirements, :settings, :enabled, :collapsible, :updated_at, :created_at
|
6
|
+
attr_accessor :plan
|
7
|
+
|
8
|
+
def initialize(options)
|
9
|
+
options.each do |k, v|
|
10
|
+
public_send("#{k}=", v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_json
|
15
|
+
hash = {}
|
16
|
+
instance_variables.each do |var|
|
17
|
+
hash[var.to_s.sub('@', '')] = instance_variable_get var
|
18
|
+
end
|
19
|
+
hash.to_json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'erubis'
|
4
|
+
|
5
|
+
module ZendeskAppsSupport
|
6
|
+
class Installed
|
7
|
+
extend Gem::Deprecate
|
8
|
+
INSTALLED_TEMPLATE = Erubis::Eruby.new(File.read(File.expand_path('../assets/installed.js.erb', __FILE__)))
|
9
|
+
|
10
|
+
def initialize(appsjs, installations = [])
|
11
|
+
@appsjs = appsjs
|
12
|
+
@installations = installations
|
13
|
+
end
|
14
|
+
|
15
|
+
def compile(options = {})
|
16
|
+
INSTALLED_TEMPLATE.result(
|
17
|
+
appsjs: @appsjs,
|
18
|
+
installations: @installations,
|
19
|
+
installation_orders: options.fetch(:installation_orders, {}),
|
20
|
+
rollbar_zaf_access_token: options.fetch(:rollbar_zaf_access_token, '')
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias compile_js compile
|
25
|
+
deprecate :compile_js, :compile, 2017, 1
|
26
|
+
end
|
27
|
+
end
|