envless-sdk 0.0.1
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/CHANGELOG.md +24 -0
- data/README.md +171 -0
- data/lib/envless/sdk/api_error.rb +54 -0
- data/lib/envless/sdk/bodies.rb +49 -0
- data/lib/envless/sdk/client.rb +39 -0
- data/lib/envless/sdk/clock.rb +24 -0
- data/lib/envless/sdk/connection_pool.rb +83 -0
- data/lib/envless/sdk/connector.rb +26 -0
- data/lib/envless/sdk/constants.rb +262 -0
- data/lib/envless/sdk/crypto/cipher.rb +58 -0
- data/lib/envless/sdk/crypto/codec.rb +23 -0
- data/lib/envless/sdk/crypto/envelope.rb +41 -0
- data/lib/envless/sdk/crypto/keys.rb +42 -0
- data/lib/envless/sdk/crypto/passphrase.rb +38 -0
- data/lib/envless/sdk/crypto/passphrase_rules.rb +42 -0
- data/lib/envless/sdk/crypto/values.rb +31 -0
- data/lib/envless/sdk/crypto/workspace_key.rb +40 -0
- data/lib/envless/sdk/crypto_messages.rb +31 -0
- data/lib/envless/sdk/default_client.rb +55 -0
- data/lib/envless/sdk/defaults.rb +32 -0
- data/lib/envless/sdk/envelope.rb +48 -0
- data/lib/envless/sdk/environment.rb +42 -0
- data/lib/envless/sdk/errors.rb +23 -0
- data/lib/envless/sdk/exchange.rb +27 -0
- data/lib/envless/sdk/helpers.rb +49 -0
- data/lib/envless/sdk/http.rb +46 -0
- data/lib/envless/sdk/listing.rb +54 -0
- data/lib/envless/sdk/messages.rb +43 -0
- data/lib/envless/sdk/net_http_adapter.rb +84 -0
- data/lib/envless/sdk/numbers.rb +44 -0
- data/lib/envless/sdk/options.rb +56 -0
- data/lib/envless/sdk/pagination.rb +31 -0
- data/lib/envless/sdk/paths.rb +70 -0
- data/lib/envless/sdk/received.rb +28 -0
- data/lib/envless/sdk/redirects.rb +56 -0
- data/lib/envless/sdk/resource.rb +50 -0
- data/lib/envless/sdk/resources/environments.rb +61 -0
- data/lib/envless/sdk/resources/invites.rb +28 -0
- data/lib/envless/sdk/resources/keys.rb +36 -0
- data/lib/envless/sdk/resources/me.rb +11 -0
- data/lib/envless/sdk/resources/members.rb +36 -0
- data/lib/envless/sdk/resources/product_access.rb +30 -0
- data/lib/envless/sdk/resources/products.rb +62 -0
- data/lib/envless/sdk/resources/projects.rb +42 -0
- data/lib/envless/sdk/resources/roles.rb +40 -0
- data/lib/envless/sdk/resources/variable_changes.rb +57 -0
- data/lib/envless/sdk/resources/variables.rb +49 -0
- data/lib/envless/sdk/resources/versions.rb +60 -0
- data/lib/envless/sdk/resources/webhook_deliveries.rb +33 -0
- data/lib/envless/sdk/resources/webhooks.rb +44 -0
- data/lib/envless/sdk/resources/workspace.rb +26 -0
- data/lib/envless/sdk/resources/workspace_domain.rb +31 -0
- data/lib/envless/sdk/resources/workspaces.rb +24 -0
- data/lib/envless/sdk/results.rb +43 -0
- data/lib/envless/sdk/retry_policy.rb +36 -0
- data/lib/envless/sdk/rotation/entry_rotator.rb +61 -0
- data/lib/envless/sdk/rotation/key_ring.rb +34 -0
- data/lib/envless/sdk/rotation/ledger.rb +36 -0
- data/lib/envless/sdk/rotation/runner.rb +45 -0
- data/lib/envless/sdk/rotation/variable_rotator.rb +38 -0
- data/lib/envless/sdk/text.rb +71 -0
- data/lib/envless/sdk/transport.rb +62 -0
- data/lib/envless/sdk/update_notice.rb +66 -0
- data/lib/envless/sdk/urls.rb +70 -0
- data/lib/envless/sdk/variable_names.rb +55 -0
- data/lib/envless/sdk/version.rb +5 -0
- data/lib/envless/sdk/webhooks/headers.rb +49 -0
- data/lib/envless/sdk/webhooks/verify.rb +58 -0
- data/lib/envless/sdk/wire.rb +77 -0
- data/lib/envless/sdk.rb +77 -0
- data/sig/envless/sdk/adapter.rbs +60 -0
- data/sig/envless/sdk/client.rbs +31 -0
- data/sig/envless/sdk/crypto.rbs +92 -0
- data/sig/envless/sdk/errors.rbs +37 -0
- data/sig/envless/sdk/http.rbs +31 -0
- data/sig/envless/sdk/pagination.rbs +81 -0
- data/sig/envless/sdk/results.rbs +62 -0
- data/sig/envless/sdk/rotation.rbs +86 -0
- data/sig/envless/sdk/settings.rbs +81 -0
- data/sig/envless/sdk/stdlib.rbs +8 -0
- data/sig/envless/sdk/text.rbs +52 -0
- data/sig/envless/sdk/transport.rbs +79 -0
- data/sig/envless/sdk/urls.rbs +73 -0
- data/sig/envless/sdk/webhooks.rbs +23 -0
- data/sig/envless/sdk.rbs +36 -0
- data/sig/generated/constants.rbs +57 -0
- data/sig/generated/resources.rbs +209 -0
- data/sig/generated/types.rbs +466 -0
- data/sig/manifest.yaml +3 -0
- metadata +134 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
class Listing < Data
|
|
3
|
+
KEYS: untyped
|
|
4
|
+
MAX_LIMIT: Integer
|
|
5
|
+
|
|
6
|
+
attr_reader limit: Integer?
|
|
7
|
+
attr_reader offset: Integer?
|
|
8
|
+
type text = (String | Symbol)?
|
|
9
|
+
|
|
10
|
+
attr_reader search: text
|
|
11
|
+
attr_reader order: text
|
|
12
|
+
attr_reader product: text
|
|
13
|
+
attr_reader status: text
|
|
14
|
+
|
|
15
|
+
def self.new: (Integer? limit, Integer? offset, text search, text order, text product, text status) -> Listing
|
|
16
|
+
| (limit: Integer?, offset: Integer?, search: text, order: text, product: text, status: text) -> Listing
|
|
17
|
+
|
|
18
|
+
def self.of: (?limit: untyped, ?offset: untyped, ?search: text, ?order: text, ?product: text, ?status: text) -> Listing
|
|
19
|
+
def with: (?limit: Integer?, ?offset: Integer?, ?search: text, ?order: text, ?product: text, ?status: text) -> Listing
|
|
20
|
+
def query: () -> Hash[String, untyped]
|
|
21
|
+
def walk: () -> Listing
|
|
22
|
+
def advance: (Integer count) -> Listing
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
module Pages
|
|
26
|
+
def self?.page_of: (untyped payload, String collection) -> Page[untyped]
|
|
27
|
+
def self?.field: (untyped payload, Symbol key) -> untyped
|
|
28
|
+
def self?.access_page_of: (untyped payload, String collection) -> ProductAccessPage
|
|
29
|
+
def self?.more?: (Page[untyped] page) -> bool
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
module Pagination
|
|
33
|
+
def self?.fetch_page: (Transport transport, String path, String collection, Listing listing, seconds? timeout) -> Page[untyped]
|
|
34
|
+
def self?.iterate: (Transport transport, String path, String collection, Listing listing, seconds? timeout) -> Enumerator[untyped, nil]
|
|
35
|
+
def self?.collect_all: (Transport transport, String path, String collection, Listing listing, seconds? timeout) -> Array[untyped]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
module Bodies
|
|
39
|
+
def self?.merge: (untyped body, Hash[untyped, untyped] fields) -> Hash[String, untyped]
|
|
40
|
+
def self?.hash_of: (untyped body) -> Hash[untyped, untyped]
|
|
41
|
+
def self?.mapping: (untyped value) -> Hash[untyped, untyped]?
|
|
42
|
+
def self?.entries: (untyped values, String name) -> Array[untyped]
|
|
43
|
+
def self?.list: (untyped values, String name) -> Array[untyped]
|
|
44
|
+
def self?.field: (untyped hash, String key) -> untyped
|
|
45
|
+
def self?.field?: (untyped hash, String key) -> bool
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
module VariableNames
|
|
49
|
+
LIMITS: { MIN: Integer, MAX: Integer }
|
|
50
|
+
ERRORS: { REQUIRED: String, TOO_LONG: String, SHAPE: String }
|
|
51
|
+
REFUSAL: { STATUS: Integer, VARIABLE_RESOURCE: String, NAME_FIELD: String }
|
|
52
|
+
|
|
53
|
+
def self?.validation: (untyped name) -> Validation
|
|
54
|
+
def self?.refused: (String error) -> Validation
|
|
55
|
+
def self?.assert: (untyped name) -> void
|
|
56
|
+
def self?.received: (untyped name) -> String
|
|
57
|
+
def self?.assert_input: (untyped body) -> void
|
|
58
|
+
def self?.assert_patch: (untyped patch) -> void
|
|
59
|
+
def self?.assert_inputs: (Array[untyped] items) -> void
|
|
60
|
+
def self?.assert_changes: (untyped changes) -> void
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class Resource
|
|
64
|
+
include Constants
|
|
65
|
+
|
|
66
|
+
@transport: Transport
|
|
67
|
+
|
|
68
|
+
def initialize: (Transport transport) -> void
|
|
69
|
+
def inspect: () -> String
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def request: (String path, ?method: String, ?query: Hash[String, untyped]?, ?body: untyped, ?timeout: seconds?) -> untyped
|
|
74
|
+
def scoped: ((String | Symbol)? product) -> Hash[String, untyped]
|
|
75
|
+
def page: (String path, String collection, Listing listing, seconds? timeout) -> Page[untyped]
|
|
76
|
+
def all: (String path, String collection, Listing listing, seconds? timeout) -> Array[untyped]
|
|
77
|
+
def each_item: (String path, String collection, Listing listing, seconds? timeout) ?{ (untyped) -> void } -> Enumerator[untyped, nil]?
|
|
78
|
+
def body_of: (untyped body, Hash[untyped, untyped] fields) -> Hash[String, untyped]
|
|
79
|
+
def list_of: (untyped values, String name) -> Array[untyped]
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
class Page[T] < Data
|
|
3
|
+
attr_reader items: Array[T]
|
|
4
|
+
attr_reader pagination: pagination_envelope
|
|
5
|
+
|
|
6
|
+
def self.new: [T] (Array[T] items, pagination_envelope pagination) -> Page[T]
|
|
7
|
+
| [T] (items: Array[T], pagination: pagination_envelope) -> Page[T]
|
|
8
|
+
|
|
9
|
+
def has_more?: () -> bool
|
|
10
|
+
def total_count: () -> Integer?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class ProductAccessPage < Data
|
|
14
|
+
attr_reader items: Array[product_access_entry]
|
|
15
|
+
attr_reader pagination: pagination_envelope
|
|
16
|
+
attr_reader is_private: bool
|
|
17
|
+
|
|
18
|
+
def self.new: (Array[product_access_entry] items, pagination_envelope pagination, bool is_private) -> ProductAccessPage
|
|
19
|
+
| (items: Array[product_access_entry], pagination: pagination_envelope, is_private: bool) -> ProductAccessPage
|
|
20
|
+
|
|
21
|
+
def private?: () -> bool
|
|
22
|
+
def has_more?: () -> bool
|
|
23
|
+
def total_count: () -> Integer?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class Validation < Data
|
|
27
|
+
attr_reader valid: bool
|
|
28
|
+
attr_reader error: String?
|
|
29
|
+
|
|
30
|
+
def self.new: (bool valid, String? error) -> Validation
|
|
31
|
+
| (valid: bool, error: String?) -> Validation
|
|
32
|
+
|
|
33
|
+
def valid?: () -> bool
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class RotationIssue < Data
|
|
37
|
+
attr_reader scope: String
|
|
38
|
+
attr_reader id: String
|
|
39
|
+
attr_reader field: String?
|
|
40
|
+
attr_reader reason: String
|
|
41
|
+
|
|
42
|
+
def self.new: (String scope, String id, String? field, String reason) -> RotationIssue
|
|
43
|
+
| (scope: String, id: String, field: String?, reason: String) -> RotationIssue
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class RotationResult < Data
|
|
47
|
+
attr_reader variables: Integer
|
|
48
|
+
attr_reader version_entries: Integer
|
|
49
|
+
attr_reader skipped: Array[RotationIssue]
|
|
50
|
+
attr_reader failures: Array[RotationIssue]
|
|
51
|
+
|
|
52
|
+
def self.new: (Integer variables, Integer version_entries, Array[RotationIssue] skipped, Array[RotationIssue] failures) -> RotationResult
|
|
53
|
+
| (variables: Integer, version_entries: Integer, skipped: Array[RotationIssue], failures: Array[RotationIssue]) -> RotationResult
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class Reply < Data
|
|
57
|
+
attr_reader data: untyped
|
|
58
|
+
|
|
59
|
+
def self.new: (untyped data) -> Reply
|
|
60
|
+
| (data: untyped) -> Reply
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Rotation
|
|
3
|
+
class KeyRing
|
|
4
|
+
@workspace: String
|
|
5
|
+
@current: String
|
|
6
|
+
@following: String
|
|
7
|
+
@opening: Hash[Integer?, WorkspaceKey]
|
|
8
|
+
@sealing: WorkspaceKey?
|
|
9
|
+
|
|
10
|
+
def initialize: (String workspace_unique_id, String current, String following) -> void
|
|
11
|
+
def rotate: (String value) -> String
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def opening_key: (Integer? iterations) -> WorkspaceKey
|
|
16
|
+
def sealing_key: () -> WorkspaceKey
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Ledger
|
|
20
|
+
@skipped: Array[RotationIssue]
|
|
21
|
+
@failures: Array[RotationIssue]
|
|
22
|
+
|
|
23
|
+
def initialize: () -> void
|
|
24
|
+
def rotatable?: (String scope, String id, String field, untyped value) -> bool
|
|
25
|
+
def stranded: (String scope, String id, String field) -> void
|
|
26
|
+
def failed: (String scope, String id, Exception error) -> void
|
|
27
|
+
def result: (Integer variables, Integer version_entries) -> RotationResult
|
|
28
|
+
def self.identifier: (untyped item) -> String
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class VariableRotator
|
|
32
|
+
SCOPE: String
|
|
33
|
+
FIELDS: Array[String]
|
|
34
|
+
|
|
35
|
+
@client: Client
|
|
36
|
+
@ring: KeyRing
|
|
37
|
+
@ledger: Ledger
|
|
38
|
+
@product: String?
|
|
39
|
+
|
|
40
|
+
def initialize: (Client client, KeyRing ring, Ledger ledger, String? product) -> void
|
|
41
|
+
def rotate: (untyped variable) -> Integer
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def rotated: (untyped variable) -> Integer
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class EntryRotator
|
|
49
|
+
SCOPE: String
|
|
50
|
+
FIELDS: untyped
|
|
51
|
+
|
|
52
|
+
@client: Client
|
|
53
|
+
@ring: KeyRing
|
|
54
|
+
@ledger: Ledger
|
|
55
|
+
@scope: [String, String]
|
|
56
|
+
@product: String?
|
|
57
|
+
|
|
58
|
+
def initialize: (Client client, KeyRing ring, Ledger ledger, [String, String] scope, String? product) -> void
|
|
59
|
+
def rotate: (Array[untyped] batch) -> Integer
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def attempt: (untyped entry) -> reencrypt_entry_input?
|
|
64
|
+
def write: (Array[reencrypt_entry_input] rewritten) -> Integer
|
|
65
|
+
def rotated: (untyped entry) -> reencrypt_entry_input?
|
|
66
|
+
def strand: (untyped entry, String id) -> nil
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class Runner
|
|
70
|
+
@client: Client
|
|
71
|
+
@following: String
|
|
72
|
+
@scope: [String, String]
|
|
73
|
+
@product: String?
|
|
74
|
+
@ledger: Ledger
|
|
75
|
+
@variables: VariableRotator
|
|
76
|
+
@entries: EntryRotator
|
|
77
|
+
|
|
78
|
+
def initialize: (client: Client, workspace_unique_id: String, from: String, to: String, project: String, environment: String, ?product: String?) -> void
|
|
79
|
+
def run: () -> RotationResult
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
def totals: (Array[untyped] variables, Array[Array[untyped]] batches) -> [Integer, Integer]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Defaults
|
|
3
|
+
BASE_URL: String
|
|
4
|
+
MAX_RETRIES: Integer
|
|
5
|
+
TIMEOUT: Integer
|
|
6
|
+
USER_AGENT: String
|
|
7
|
+
KEEP_ALIVE_TIMEOUT: Integer
|
|
8
|
+
MAX_IDLE_CONNECTIONS: Integer
|
|
9
|
+
MAX_REDIRECTS: Integer
|
|
10
|
+
MAX_TIMEOUT: Integer
|
|
11
|
+
DEADLINE_GRACE: Float
|
|
12
|
+
MESSAGE_LIMIT: Integer
|
|
13
|
+
REQUEST_ID_HEADER: String
|
|
14
|
+
LOCATION_HEADER: String
|
|
15
|
+
REDACTED: String
|
|
16
|
+
UPDATE_NOTICE_ENV_DISABLE: String
|
|
17
|
+
UPDATE_NOTICE_TIMEOUT: Integer
|
|
18
|
+
UPDATE_NOTICE_PACKAGE: String
|
|
19
|
+
UPDATE_NOTICE_HOST: String
|
|
20
|
+
UPDATE_NOTICE_PATH: String
|
|
21
|
+
UPDATE_NOTICE_COMMAND: String
|
|
22
|
+
UPDATE_NOTICE_CHANGELOG_URL: String
|
|
23
|
+
UPDATE_NOTICE_ICON: String
|
|
24
|
+
NAMESPACES: Array[Symbol]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module Messages
|
|
28
|
+
TOKEN_REQUIRED: String
|
|
29
|
+
TOKEN_TWICE: String
|
|
30
|
+
TOKEN_SHAPE: String
|
|
31
|
+
TOKEN_CHARACTERS: String
|
|
32
|
+
USER_AGENT_SHAPE: String
|
|
33
|
+
BASE_URL_SHAPE: String
|
|
34
|
+
BASE_URL_USERINFO: String
|
|
35
|
+
PATH_SHAPE: String
|
|
36
|
+
SEGMENT_SHAPE: String
|
|
37
|
+
EMPTY_SEGMENT: String
|
|
38
|
+
DOT_SEGMENT: String
|
|
39
|
+
TIMEOUT_SHAPE: String
|
|
40
|
+
RETRIES_SHAPE: String
|
|
41
|
+
PAGING_SHAPE: String
|
|
42
|
+
ADAPTER_SHAPE: String
|
|
43
|
+
METHOD_SHAPE: String
|
|
44
|
+
QUERY_SHAPE: String
|
|
45
|
+
BODY_SHAPE: String
|
|
46
|
+
LIST_SHAPE: String
|
|
47
|
+
JSON_SHAPE: String
|
|
48
|
+
JSON_KEY_SHAPE: String
|
|
49
|
+
JSON_DEPTH: String
|
|
50
|
+
NOT_FINITE: String
|
|
51
|
+
TIMED_OUT: String
|
|
52
|
+
UNREACHABLE: String
|
|
53
|
+
TOO_MANY_REDIRECTS: String
|
|
54
|
+
REDIRECT_SCHEME: String
|
|
55
|
+
NO_RESPONSE: String
|
|
56
|
+
REQUEST_FAILED: String
|
|
57
|
+
HTTP_STATUS: String
|
|
58
|
+
UPDATE_AVAILABLE: String
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
module CryptoMessages
|
|
62
|
+
PASSPHRASE_REQUIRED: String
|
|
63
|
+
WORKSPACE_REQUIRED: String
|
|
64
|
+
PINNED_COST: String
|
|
65
|
+
TOO_SHORT: String
|
|
66
|
+
UNDECRYPTABLE: String
|
|
67
|
+
KEY_LENGTH: String
|
|
68
|
+
KEY_SHAPE: String
|
|
69
|
+
TEXT_SHAPE: String
|
|
70
|
+
UTF8_SHAPE: String
|
|
71
|
+
WEAK_ROTATION: String
|
|
72
|
+
WEBHOOK_MISSING_HEADERS: String
|
|
73
|
+
WEBHOOK_TIMESTAMP_SHAPE: String
|
|
74
|
+
WEBHOOK_OUT_OF_TOLERANCE: String
|
|
75
|
+
WEBHOOK_MISSING_SECRET: String
|
|
76
|
+
WEBHOOK_MISMATCH: String
|
|
77
|
+
WEBHOOK_NOT_JSON: String
|
|
78
|
+
WEBHOOK_PAYLOAD_SHAPE: String
|
|
79
|
+
WEBHOOK_TOLERANCE_SHAPE: String
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
class Net::HTTP
|
|
2
|
+
attr_accessor ignore_eof: bool
|
|
3
|
+
|
|
4
|
+
def open_timeout=: (Float | Integer | nil) -> (Float | Integer | nil) | ...
|
|
5
|
+
def read_timeout=: (Float | Integer | nil) -> (Float | Integer | nil) | ...
|
|
6
|
+
def write_timeout=: (Float | Integer | nil) -> (Float | Integer | nil) | ...
|
|
7
|
+
def request: (Net::HTTPGenericRequest req, ?String? body) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse | ...
|
|
8
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Text
|
|
3
|
+
BYTE_ORDER_MARK: String
|
|
4
|
+
HTTP_WHITESPACE: String
|
|
5
|
+
JS_WHITESPACE: String
|
|
6
|
+
JS_TRIM: Regexp
|
|
7
|
+
HTTP_TRIM: Regexp
|
|
8
|
+
TOKEN: Regexp
|
|
9
|
+
HEADER_VALUE: Regexp
|
|
10
|
+
TRANSCODABLE: Array[Encoding]
|
|
11
|
+
|
|
12
|
+
def self?.utf8: (String text) -> String
|
|
13
|
+
def self?.strict: (untyped text, String name) -> String
|
|
14
|
+
def self?.decode: (String bytes) -> String
|
|
15
|
+
def self?.js_trim: (String text) -> String
|
|
16
|
+
def self?.http_trim: (String text) -> String
|
|
17
|
+
def self?.token?: (String text) -> bool
|
|
18
|
+
def self?.header_value?: (String text) -> bool
|
|
19
|
+
def self?.utf16_units: (String text) -> Array[Integer]
|
|
20
|
+
def self?.utf16_length: (String text) -> Integer
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module Numbers
|
|
24
|
+
DECIMAL: Regexp
|
|
25
|
+
INFINITY: Regexp
|
|
26
|
+
RADIX_DIGITS: Regexp
|
|
27
|
+
RADIXES: Hash[String, Integer]
|
|
28
|
+
|
|
29
|
+
def self?.js_number: (String text) -> Float
|
|
30
|
+
def self?.radix: (String trimmed) -> Float
|
|
31
|
+
def self?.whole: (Integer | Float value) -> (Integer | Float)
|
|
32
|
+
def self?.text: (Integer | Float | Rational value) -> String
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module Wire
|
|
36
|
+
LONE_SURROGATE: Regexp
|
|
37
|
+
SURROGATE_ESCAPE: Regexp
|
|
38
|
+
REPLACEMENT_ESCAPE: String
|
|
39
|
+
ISO_INSTANT: String
|
|
40
|
+
MAX_DEPTH: Integer
|
|
41
|
+
|
|
42
|
+
def self?.encode: (untyped value) -> String
|
|
43
|
+
def self?.ready: (untyped value, ?Integer depth) -> untyped
|
|
44
|
+
def self?.key_text: (untyped key) -> String
|
|
45
|
+
def self?.finite: (Float value) -> Float
|
|
46
|
+
def self?.instant: (untyped value) -> String?
|
|
47
|
+
def self?.structure: (untyped value) -> Hash[untyped, untyped]
|
|
48
|
+
def self?.decode: (String text) -> untyped
|
|
49
|
+
def self?.without_lone_surrogates: (String text) -> String
|
|
50
|
+
def self?.truthy?: (untyped value) -> bool
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Envelope
|
|
3
|
+
type envelope = Hash[Symbol, untyped]
|
|
4
|
+
|
|
5
|
+
def self?.read: (Integer status, String reason, String content) -> envelope
|
|
6
|
+
def self?.fallback: (Integer status, String message) -> envelope
|
|
7
|
+
def self?.success?: (Integer status, envelope envelope) -> bool
|
|
8
|
+
def self?.api_error: (Integer status, Hash[String, String] headers, envelope envelope, Float retry_after) -> ApiError
|
|
9
|
+
def self?.mapping: (untyped value) -> Hash[Symbol, untyped]
|
|
10
|
+
def self?.text: (untyped value) -> String?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module RetryPolicy
|
|
14
|
+
MILLISECONDS: Float
|
|
15
|
+
|
|
16
|
+
def self?.retry_after_of: (String? header) -> Float
|
|
17
|
+
def self?.delay: (Integer status, String verb, Integer attempt, Integer max_retries, Float retry_after) -> Float?
|
|
18
|
+
def self?.settle: (String verb, Integer attempt, Integer max_retries, HttpResponse response) -> (Reply | Float)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module Redirects
|
|
22
|
+
STATUSES: Array[Integer]
|
|
23
|
+
SAFE_METHODS: Array[String]
|
|
24
|
+
BODY_HEADERS: Array[String]
|
|
25
|
+
UNSAFE: Regexp
|
|
26
|
+
|
|
27
|
+
def self?.follow: (_Adapter adapter, HttpRequest request, Float? deadline) -> HttpResponse
|
|
28
|
+
def self?.following: (HttpRequest request, Integer status, String location) -> HttpRequest
|
|
29
|
+
def self?.target_of: (String base, String location) -> String
|
|
30
|
+
def self?.rewritten: (HttpRequest request, Integer status) -> [String, String?, Hash[String, String]]
|
|
31
|
+
def self?.same_origin?: (String left, String right) -> bool
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
module Exchange
|
|
35
|
+
PROGRAMMING_ERRORS: Array[singleton(Exception)]
|
|
36
|
+
|
|
37
|
+
def self?.call: (_Adapter adapter, HttpRequest request, seconds seconds, String base_url) -> HttpResponse
|
|
38
|
+
def self?.reason_of: (Exception error) -> String
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class Transport
|
|
42
|
+
@token: String
|
|
43
|
+
@base_url: String
|
|
44
|
+
@max_retries: Integer
|
|
45
|
+
@timeout: seconds
|
|
46
|
+
@user_agent: String
|
|
47
|
+
@owned: NetHttpAdapter?
|
|
48
|
+
@adapter: _Adapter
|
|
49
|
+
|
|
50
|
+
attr_reader base_url: String
|
|
51
|
+
attr_reader max_retries: Integer
|
|
52
|
+
attr_reader timeout: seconds
|
|
53
|
+
attr_reader user_agent: String
|
|
54
|
+
|
|
55
|
+
def initialize: (token: String, base_url: String, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> void
|
|
56
|
+
def request: (String path, ?method: String | Symbol, ?query: Hash[String | Symbol, untyped]?, ?body: untyped, ?timeout: seconds?) -> untyped
|
|
57
|
+
def close: () -> nil
|
|
58
|
+
def inspect: () -> String
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def headers: (bool with_body) -> Hash[String, String]
|
|
63
|
+
def pause: (Float seconds) -> void
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
module UpdateNotice
|
|
67
|
+
self.@checked: bool
|
|
68
|
+
self.@lock: Thread::Mutex
|
|
69
|
+
|
|
70
|
+
def self.check: () -> nil
|
|
71
|
+
def self.claim: () -> bool
|
|
72
|
+
def self.disabled?: () -> bool
|
|
73
|
+
def self.announce: () -> void
|
|
74
|
+
def self.latest_version: () -> String?
|
|
75
|
+
def self.newer?: (String candidate, String current) -> bool
|
|
76
|
+
def self.parts: (String value) -> Array[Integer]?
|
|
77
|
+
def self.notice: (String latest) -> String
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Urls
|
|
3
|
+
SCHEMES: Array[String]
|
|
4
|
+
TRAILING_SLASHES: Regexp
|
|
5
|
+
|
|
6
|
+
def self?.valid_base_url: (untyped value) -> String
|
|
7
|
+
def self?.usable?: (URI::Generic? uri) -> bool
|
|
8
|
+
def self?.parse: (String text) -> URI::Generic?
|
|
9
|
+
def self?.api_url: (String base_url, untyped path) -> String
|
|
10
|
+
def self?.build_url: (String base_url, String path, ?Hash[String | Symbol, untyped]? query) -> String
|
|
11
|
+
def self?.query_value: (untyped value) -> String
|
|
12
|
+
def self?.form: (String text) -> String
|
|
13
|
+
def self?.origin: (String url) -> [String, String, Integer?]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module Paths
|
|
17
|
+
UNSAFE: Regexp
|
|
18
|
+
DOTS: Regexp
|
|
19
|
+
PATHS: untyped
|
|
20
|
+
SEGMENTS: untyped
|
|
21
|
+
|
|
22
|
+
type segment = String | Symbol | Integer
|
|
23
|
+
|
|
24
|
+
def self?.segment: (untyped value) -> String
|
|
25
|
+
def self?.segment_text: (untyped value) -> String
|
|
26
|
+
def self?.product_path: (segment slug) -> String
|
|
27
|
+
def self?.product_projects_path: (segment slug) -> String
|
|
28
|
+
def self?.product_access_path: (segment slug) -> String
|
|
29
|
+
def self?.product_access_member_path: (segment slug, segment member_id) -> String
|
|
30
|
+
def self?.project_path: (segment slug) -> String
|
|
31
|
+
def self?.environments_path: (segment project) -> String
|
|
32
|
+
def self?.environment_path: (segment project, segment environment) -> String
|
|
33
|
+
def self?.variables_path: (segment project, segment environment) -> String
|
|
34
|
+
def self?.variable_path: (segment project, segment environment, segment name) -> String
|
|
35
|
+
def self?.history_path: (segment project, segment environment, segment name) -> String
|
|
36
|
+
def self?.versions_path: (segment project, segment environment) -> String
|
|
37
|
+
def self?.entries_path: (segment project, segment environment) -> String
|
|
38
|
+
def self?.variable_by_id_path: (segment id) -> String
|
|
39
|
+
def self?.version_by_id_path: (segment id) -> String
|
|
40
|
+
def self?.member_path: (segment id) -> String
|
|
41
|
+
def self?.invite_path: (segment id) -> String
|
|
42
|
+
def self?.role_path: (segment id) -> String
|
|
43
|
+
def self?.key_path: (segment id) -> String
|
|
44
|
+
def self?.webhook_path: (segment id) -> String
|
|
45
|
+
def self?.deliveries_path: (segment id) -> String
|
|
46
|
+
def self?.delivery_path: (segment id, segment delivery_id) -> String
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
module Environment
|
|
50
|
+
def self?.from_environment: (String name) -> String?
|
|
51
|
+
def self?.normalise_endpoint: (String? value) -> String?
|
|
52
|
+
def self?.resolve_token: (untyped token) -> String
|
|
53
|
+
def self?.resolve_base_url: (untyped base_url) -> String
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
module Options
|
|
57
|
+
VERB: Regexp
|
|
58
|
+
|
|
59
|
+
def self?.valid_timeout: (untyped value) -> seconds
|
|
60
|
+
def self?.deadline_of: (seconds seconds) -> seconds?
|
|
61
|
+
def self?.valid_retries: (untyped value) -> Integer
|
|
62
|
+
def self?.user_agent: (untyped value) -> String
|
|
63
|
+
def self?.adapter: (untyped value) -> _Adapter
|
|
64
|
+
def self?.verb: (untyped method) -> String
|
|
65
|
+
def self?.paging: (untyped value, String name) -> Integer?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
module Clock
|
|
69
|
+
def self?.now: () -> Float
|
|
70
|
+
def self?.deadline: (seconds? seconds) -> Float?
|
|
71
|
+
def self?.remaining: (Float? deadline) -> Float?
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Webhooks
|
|
3
|
+
module Headers
|
|
4
|
+
SEPARATOR: Regexp
|
|
5
|
+
|
|
6
|
+
def self?.read: (untyped headers, String name) -> String
|
|
7
|
+
def self?.scan: (untyped headers, String name) -> untyped
|
|
8
|
+
def self?.lookup: (untyped headers, String name) -> untyped
|
|
9
|
+
def self?.candidates: (String provided) -> Array[String]
|
|
10
|
+
def self?.same?: (String expected, String candidate) -> bool
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Verify
|
|
14
|
+
HEADERS: untyped
|
|
15
|
+
MESSAGES: singleton(CryptoMessages)
|
|
16
|
+
|
|
17
|
+
def self?.call: (payload: untyped, headers: untyped, secret: untyped, ?tolerance_seconds: untyped) -> untyped
|
|
18
|
+
def self?.tolerance_of: (untyped value) -> seconds
|
|
19
|
+
def self?.fresh!: (String timestamp, seconds tolerance) -> void
|
|
20
|
+
def self?.parsed: (String body) -> untyped
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/sig/envless/sdk.rbs
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
VERSION: String
|
|
3
|
+
|
|
4
|
+
self.@default_client: Client?
|
|
5
|
+
self.@default_lock: Thread::Mutex
|
|
6
|
+
|
|
7
|
+
def self.new: (?String? token_argument, ?token: String?, ?base_url: (String | URI::Generic)?, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> Client
|
|
8
|
+
def self.create_client: (?String? token_argument, ?token: String?, ?base_url: (String | URI::Generic)?, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> Client
|
|
9
|
+
def self.init: (?String? token_argument, ?token: String?, ?base_url: (String | URI::Generic)?, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> Client
|
|
10
|
+
def self.client: () -> Client
|
|
11
|
+
def self.reset_client: () -> nil
|
|
12
|
+
|
|
13
|
+
def self.encrypt_value: (String plaintext, String passphrase, String workspace_unique_id) -> String
|
|
14
|
+
def self.decrypt_value: (String ciphertext, String passphrase, String workspace_unique_id) -> String
|
|
15
|
+
def self.encrypt_with_key: (WorkspaceKey | String key, String plaintext) -> String
|
|
16
|
+
def self.decrypt_with_key: (WorkspaceKey | String key, String ciphertext) -> String
|
|
17
|
+
def self.derive_workspace_key: (String passphrase, String workspace_unique_id) -> WorkspaceKey
|
|
18
|
+
def self.import_workspace_key: (String key) -> WorkspaceKey
|
|
19
|
+
def self.ciphertext?: (untyped value) -> bool
|
|
20
|
+
def self.passphrase_strength: (untyped passphrase) -> Validation
|
|
21
|
+
def self.variable_name_validation: (untyped name) -> Validation
|
|
22
|
+
def self.verify_webhook_signature: (payload: String, headers: untyped, secret: String, ?tolerance_seconds: seconds?) -> webhook_event[Hash[Symbol, untyped]]
|
|
23
|
+
def self.rotate_workspace_passphrase: (client: Client, workspace_unique_id: String, from: String, to: String, project: String, environment: String, ?product: String?) -> RotationResult
|
|
24
|
+
|
|
25
|
+
type seconds = Integer | Float | Rational
|
|
26
|
+
|
|
27
|
+
interface _Adapter
|
|
28
|
+
def call: (HttpRequest request) -> _Response
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
interface _Response
|
|
32
|
+
def status: () -> (Integer | String)
|
|
33
|
+
def headers: () -> Hash[untyped, untyped]?
|
|
34
|
+
def body: () -> String?
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Envless
|
|
2
|
+
module Constants
|
|
3
|
+
CIPHERTEXT_MESSAGES: { UNSUPPORTED: String }
|
|
4
|
+
CIPHERTEXT_PREFIXES: Array[String]
|
|
5
|
+
COLLECTIONS: { ACCESS: String, EVENTS: String, WORKSPACES: String, PRODUCTS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, HISTORY: String, VERSIONS: String, ENTRIES: String, MEMBERS: String, INVITES: String, ROLES: String, KEYS: String, WEBHOOKS: String, DELIVERIES: String }
|
|
6
|
+
CONTENT_TYPES: { JSON: String }
|
|
7
|
+
CRYPTO: { PBKDF2_ITERATIONS: Integer, PBKDF2_ITERATIONS_MIN: Integer, PBKDF2_ITERATIONS_MAX: Integer, HASH: String, AES_ALGORITHM: String, KDF_ALGORITHM: String, HMAC_ALGORITHM: String, AES_LENGTH: Integer, IV_LENGTH: Integer, SALT_LENGTH: Integer, WORKSPACE_SALT_NAMESPACE: String, CIPHERTEXT_VERSION_PREFIX: String, CIPHERTEXT_VERSION_PREFIX_V2: String }
|
|
8
|
+
EMPTY_PAGINATION: { limit: Integer, offset: Integer, totalCount: Integer, hasMore: bool }
|
|
9
|
+
ENCRYPTION_PARAMETERS: { pbkdf2Iterations: Integer, hash: String, aesAlgorithm: String, kdfAlgorithm: String, aesLength: Integer, ivLength: Integer, saltLength: Integer, saltNamespace: String, ciphertextVersionPrefix: String }
|
|
10
|
+
ENV_KEY_PATTERN: Regexp
|
|
11
|
+
ENV_VARS: { TOKEN: String, BASE_URL: String, PASSPHRASE: String }
|
|
12
|
+
ERROR_CODES: { BODY_INVALID: String, SERVER_ERROR: String }
|
|
13
|
+
HEADER_KEYS: { AUTHORIZATION: String, ACCEPT: String, CONTENT_TYPE: String, USER_AGENT: String, RETRY_AFTER: String }
|
|
14
|
+
HTTP_METHODS: { GET: String, POST: String, PUT: String, PATCH: String, DELETE: String }
|
|
15
|
+
INPUT_LIMITS: { VARIABLE_NAME: { MIN: Integer, MAX: Integer } }
|
|
16
|
+
KEY_SCOPE_LEVELS: { NONE: String, READ: String, WRITE: String }
|
|
17
|
+
KEY_SCOPE_RESOURCES: { WORKSPACE: String, PRODUCTS: String, PRODUCT_ACCESS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, VERSIONS: String, MEMBERS: String, ROLES: String, KEYS: String, WEBHOOKS: String }
|
|
18
|
+
LOCAL_REFUSAL: { STATUS: Integer, VARIABLE_RESOURCE: String, NAME_FIELD: String }
|
|
19
|
+
PAGINATION: { MAX_LIMIT: Integer, DEFAULT_LIMIT: Integer }
|
|
20
|
+
PASSPHRASE_CHARACTER_CLASSES: { LOWERCASE: Regexp, UPPERCASE: Regexp, DIGIT: Regexp, SYMBOL: Regexp }
|
|
21
|
+
PASSPHRASE_STRENGTH: { MIN_LENGTH: Integer, MIN_CHARACTER_CLASSES: Integer, LONG_LENGTH: Integer, LONG_MIN_CHARACTER_CLASSES: Integer, MAX_REPEATED_RUN: Integer, MAX_SEQUENTIAL_RUN: Integer, WEAK_FRAGMENT_COVERAGE: Float }
|
|
22
|
+
PASSPHRASE_STRENGTH_ERRORS: { REQUIRED: String, TOO_SHORT: String, LOW_VARIETY: String, REPEATED: String, SEQUENCE: String, COMMON: String }
|
|
23
|
+
PATHS: { ME: String, WORKSPACE: String, WORKSPACES: String, WORKSPACE_DOMAIN: String, WORKSPACE_DOMAIN_VERIFY: String, PRODUCTS: String, PERMISSIONS: String, ROLES: String, INVITES: String, MEMBERS: String, MEMBERS_ME: String, PROJECTS: String, VARIABLES: String, VERSIONS: String, KEYS: String, WEBHOOKS: String, WEBHOOK_EVENT_TYPES: String }
|
|
24
|
+
QUERY_KEYS: { LIMIT: String, OFFSET: String, SEARCH: String, ORDER: String, PRODUCT: String, STATUS: String }
|
|
25
|
+
REENCRYPT_BATCH_SIZE: Integer
|
|
26
|
+
RETRY: { STATUSES: Array[Integer], METHODS: Array[String], BASE_BACKOFF_MS: Integer, MAX_BACKOFF_MS: Integer }
|
|
27
|
+
ROTATION_FIELDS: { VALUE: String, DEFAULT_VALUE: String }
|
|
28
|
+
ROTATION_MESSAGES: { NOT_CIPHERTEXT: String, DEFAULT_STRANDED: String }
|
|
29
|
+
ROTATION_SCOPES: { VARIABLE: String, VERSION_ENTRY: String }
|
|
30
|
+
SEGMENTS: { ACCESS: String, APPLY: String, BULK: String, DELIVERIES: String, DUPLICATE: String, ENTRIES: String, ENVIRONMENTS: String, EXPOSE: String, HISTORY: String, PROJECTS: String, REDELIVER: String, REENCRYPT: String, RESEND: String, ROLLBACK: String, ROTATE: String, VARIABLES: String, VERSIONS: String }
|
|
31
|
+
VARIABLE_NAME_ERRORS: { REQUIRED: String, TOO_LONG: String, SHAPE: String }
|
|
32
|
+
VARIABLE_TYPES: { STRING: String, NUMBER: String, BOOLEAN: String }
|
|
33
|
+
VARIABLE_VISIBILITY: { SERVER: String, CLIENT: String }
|
|
34
|
+
WEAK_PASSPHRASE_FRAGMENTS: { PASSWORD: String, PASSPHRASE: String, QWERTY: String, ASDFGH: String, ZXCVBN: String, LETMEIN: String, CHANGEME: String, ILOVEYOU: String, TRUSTNO: String, ABC123: String, ENVLESS: String, SECRET123: String, ADMIN123: String, CORRECTHORSE: String }
|
|
35
|
+
WEBHOOK_HEADERS: { ID: String, TIMESTAMP: String, SIGNATURE: String, EVENT: String, DELIVERY: String }
|
|
36
|
+
WEBHOOK_SIGNATURE: { VERSION: String, SEPARATOR: String, TOLERANCE_SECONDS: Integer }
|
|
37
|
+
PAGE_LIMITS: { MAX_LIMIT: Integer, DEFAULT_LIMIT: Integer }
|
|
38
|
+
SCOPE_LEVELS: { NONE: String, READ: String, WRITE: String }
|
|
39
|
+
SCOPE_RESOURCES: { WORKSPACE: String, PRODUCTS: String, PRODUCT_ACCESS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, VERSIONS: String, MEMBERS: String, ROLES: String, KEYS: String, WEBHOOKS: String }
|
|
40
|
+
VARIABLE_TYPE: { STRING: String, NUMBER: String, BOOLEAN: String }
|
|
41
|
+
VARIABLE_VISIBILITY_LEVELS: { SERVER: String, CLIENT: String }
|
|
42
|
+
WEBHOOK_SIGNATURE_HEADERS: { ID: String, TIMESTAMP: String, SIGNATURE: String, EVENT: String, DELIVERY: String }
|
|
43
|
+
BASE64_NON_ALPHABET_PATTERN: Regexp
|
|
44
|
+
ENDPOINT_SCHEME_PATTERN: Regexp
|
|
45
|
+
LOCAL_HOSTS: Array[String]
|
|
46
|
+
RETRYABLE_METHODS: Set[String]
|
|
47
|
+
RETRYABLE_STATUSES: Set[Integer]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
ENCRYPTION_PARAMETERS: { pbkdf2Iterations: Integer, hash: String, aesAlgorithm: String, kdfAlgorithm: String, aesLength: Integer, ivLength: Integer, saltLength: Integer, saltNamespace: String, ciphertextVersionPrefix: String }
|
|
51
|
+
PAGE_LIMITS: { MAX_LIMIT: Integer, DEFAULT_LIMIT: Integer }
|
|
52
|
+
SCOPE_LEVELS: { NONE: String, READ: String, WRITE: String }
|
|
53
|
+
SCOPE_RESOURCES: { WORKSPACE: String, PRODUCTS: String, PRODUCT_ACCESS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, VERSIONS: String, MEMBERS: String, ROLES: String, KEYS: String, WEBHOOKS: String }
|
|
54
|
+
VARIABLE_TYPE: { STRING: String, NUMBER: String, BOOLEAN: String }
|
|
55
|
+
VARIABLE_VISIBILITY_LEVELS: { SERVER: String, CLIENT: String }
|
|
56
|
+
WEBHOOK_SIGNATURE_HEADERS: { ID: String, TIMESTAMP: String, SIGNATURE: String, EVENT: String, DELIVERY: String }
|
|
57
|
+
end
|