ts_schema 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/Gemfile +10 -0
  4. data/Gemfile.lock +160 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +35 -0
  7. data/Rakefile +3 -0
  8. data/bin/test +5 -0
  9. data/lib/generators/install_generator.rb +21 -0
  10. data/lib/generators/templates/ts_schema.rb +30 -0
  11. data/lib/tasks/ts_schema_tasks.rake +24 -0
  12. data/lib/ts_schema/configuration.rb +41 -0
  13. data/lib/ts_schema/conversion_table.yml +18 -0
  14. data/lib/ts_schema/railtie.rb +4 -0
  15. data/lib/ts_schema/schema_generator.rb +110 -0
  16. data/lib/ts_schema/version.rb +3 -0
  17. data/lib/ts_schema.rb +21 -0
  18. data/test/dummy/Rakefile +6 -0
  19. data/test/dummy/app/assets/images/.keep +0 -0
  20. data/test/dummy/app/assets/javascripts/schema.d.ts +71 -0
  21. data/test/dummy/app/assets/stylesheets/application.css +1 -0
  22. data/test/dummy/app/controllers/application_controller.rb +2 -0
  23. data/test/dummy/app/controllers/concerns/.keep +0 -0
  24. data/test/dummy/app/frontend/types/schema.d.ts +71 -0
  25. data/test/dummy/app/helpers/application_helper.rb +2 -0
  26. data/test/dummy/app/jobs/application_job.rb +7 -0
  27. data/test/dummy/app/models/application_record.rb +3 -0
  28. data/test/dummy/app/models/concerns/.keep +0 -0
  29. data/test/dummy/app/models/example.rb +15 -0
  30. data/test/dummy/app/models/five.rb +3 -0
  31. data/test/dummy/app/models/four.rb +4 -0
  32. data/test/dummy/app/models/one.rb +4 -0
  33. data/test/dummy/app/models/three.rb +4 -0
  34. data/test/dummy/app/models/two.rb +3 -0
  35. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  36. data/test/dummy/bin/rails +4 -0
  37. data/test/dummy/bin/rake +4 -0
  38. data/test/dummy/bin/setup +33 -0
  39. data/test/dummy/config/application.rb +41 -0
  40. data/test/dummy/config/boot.rb +5 -0
  41. data/test/dummy/config/database.yml +86 -0
  42. data/test/dummy/config/environment.rb +5 -0
  43. data/test/dummy/config/environments/development.rb +63 -0
  44. data/test/dummy/config/environments/production.rb +76 -0
  45. data/test/dummy/config/environments/test.rb +53 -0
  46. data/test/dummy/config/initializers/config/initializers/ts_schema.rb +30 -0
  47. data/test/dummy/config/initializers/content_security_policy.rb +26 -0
  48. data/test/dummy/config/initializers/filter_parameter_logging.rb +8 -0
  49. data/test/dummy/config/initializers/inflections.rb +16 -0
  50. data/test/dummy/config/initializers/permissions_policy.rb +11 -0
  51. data/test/dummy/config/locales/en.yml +33 -0
  52. data/test/dummy/config/puma.rb +43 -0
  53. data/test/dummy/config/routes.rb +6 -0
  54. data/test/dummy/config/storage.yml +34 -0
  55. data/test/dummy/config.ru +6 -0
  56. data/test/dummy/db/migrate/20220401195333_create_examples.rb +23 -0
  57. data/test/dummy/db/migrate/20220402131712_create_ones.rb +9 -0
  58. data/test/dummy/db/migrate/20220402131955_create_twos.rb +9 -0
  59. data/test/dummy/db/migrate/20220402132415_create_threes.rb +7 -0
  60. data/test/dummy/db/migrate/20220402132543_create_fours.rb +10 -0
  61. data/test/dummy/db/migrate/20220402132906_create_fives.rb +12 -0
  62. data/test/dummy/db/schema.rb +81 -0
  63. data/test/dummy/lib/assets/.keep +0 -0
  64. data/test/dummy/log/.keep +0 -0
  65. data/test/dummy/public/404.html +67 -0
  66. data/test/dummy/public/422.html +67 -0
  67. data/test/dummy/public/500.html +66 -0
  68. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  69. data/test/dummy/public/apple-touch-icon.png +0 -0
  70. data/test/dummy/public/favicon.ico +0 -0
  71. data/test/install_generator_test.rb +13 -0
  72. data/test/test_helper.rb +18 -0
  73. data/test/tmp/config/initializers/ts_schema.rb +30 -0
  74. data/test/ts_schema_test.rb +26 -0
  75. data/ts_schema.gemspec +20 -0
  76. metadata +139 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 96932379344d1d2f349abd58ab8bdae2fb1f13f5d4d8ca4df3493c128c368570
4
+ data.tar.gz: 55df2424b71f2ea51974599412edda16699050eb1c0a59f6e3e2f13b30a8ead3
5
+ SHA512:
6
+ metadata.gz: 00a7114be00a9aaf267910349fbdff03f2923c4fd318f564e2a950e0c4efe0b00324fe860099f5b2e9d3f87b68d526bc42d69f91108262af0331a27451279d08
7
+ data.tar.gz: 20b24ef08c0fac099b6accc8e722b8878dc47ebf6a55cb848cca54de779b661ec4ed9f0fb29c98c0844fe69a82ec10b72551778c0bcc6df4fad4a60775caa4f1
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /doc/
3
+ /log/*.log
4
+ /pkg/
5
+ /tmp/
6
+ /test/dummy/log/*.log
7
+ /test/dummy/storage/
8
+ /test/dummy/tmp/
9
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ # Specify your gem's dependencies in ts_schema.gemspec.
5
+ gemspec
6
+
7
+ gem "pg"
8
+
9
+ # Start debugger with binding.b [https://github.com/ruby/debug]
10
+ # gem "debug", ">= 1.0.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,160 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ts_schema (0.1.0)
5
+ rails (>= 7.0.2.3)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (7.0.2.3)
11
+ actionpack (= 7.0.2.3)
12
+ activesupport (= 7.0.2.3)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (7.0.2.3)
16
+ actionpack (= 7.0.2.3)
17
+ activejob (= 7.0.2.3)
18
+ activerecord (= 7.0.2.3)
19
+ activestorage (= 7.0.2.3)
20
+ activesupport (= 7.0.2.3)
21
+ mail (>= 2.7.1)
22
+ net-imap
23
+ net-pop
24
+ net-smtp
25
+ actionmailer (7.0.2.3)
26
+ actionpack (= 7.0.2.3)
27
+ actionview (= 7.0.2.3)
28
+ activejob (= 7.0.2.3)
29
+ activesupport (= 7.0.2.3)
30
+ mail (~> 2.5, >= 2.5.4)
31
+ net-imap
32
+ net-pop
33
+ net-smtp
34
+ rails-dom-testing (~> 2.0)
35
+ actionpack (7.0.2.3)
36
+ actionview (= 7.0.2.3)
37
+ activesupport (= 7.0.2.3)
38
+ rack (~> 2.0, >= 2.2.0)
39
+ rack-test (>= 0.6.3)
40
+ rails-dom-testing (~> 2.0)
41
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
42
+ actiontext (7.0.2.3)
43
+ actionpack (= 7.0.2.3)
44
+ activerecord (= 7.0.2.3)
45
+ activestorage (= 7.0.2.3)
46
+ activesupport (= 7.0.2.3)
47
+ globalid (>= 0.6.0)
48
+ nokogiri (>= 1.8.5)
49
+ actionview (7.0.2.3)
50
+ activesupport (= 7.0.2.3)
51
+ builder (~> 3.1)
52
+ erubi (~> 1.4)
53
+ rails-dom-testing (~> 2.0)
54
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
55
+ activejob (7.0.2.3)
56
+ activesupport (= 7.0.2.3)
57
+ globalid (>= 0.3.6)
58
+ activemodel (7.0.2.3)
59
+ activesupport (= 7.0.2.3)
60
+ activerecord (7.0.2.3)
61
+ activemodel (= 7.0.2.3)
62
+ activesupport (= 7.0.2.3)
63
+ activestorage (7.0.2.3)
64
+ actionpack (= 7.0.2.3)
65
+ activejob (= 7.0.2.3)
66
+ activerecord (= 7.0.2.3)
67
+ activesupport (= 7.0.2.3)
68
+ marcel (~> 1.0)
69
+ mini_mime (>= 1.1.0)
70
+ activesupport (7.0.2.3)
71
+ concurrent-ruby (~> 1.0, >= 1.0.2)
72
+ i18n (>= 1.6, < 2)
73
+ minitest (>= 5.1)
74
+ tzinfo (~> 2.0)
75
+ builder (3.2.4)
76
+ concurrent-ruby (1.1.10)
77
+ crass (1.0.6)
78
+ digest (3.1.0)
79
+ erubi (1.10.0)
80
+ globalid (1.0.0)
81
+ activesupport (>= 5.0)
82
+ i18n (1.10.0)
83
+ concurrent-ruby (~> 1.0)
84
+ loofah (2.15.0)
85
+ crass (~> 1.0.2)
86
+ nokogiri (>= 1.5.9)
87
+ mail (2.7.1)
88
+ mini_mime (>= 0.1.1)
89
+ marcel (1.0.2)
90
+ method_source (1.0.0)
91
+ mini_mime (1.1.2)
92
+ minitest (5.15.0)
93
+ net-imap (0.2.3)
94
+ digest
95
+ net-protocol
96
+ strscan
97
+ net-pop (0.1.1)
98
+ digest
99
+ net-protocol
100
+ timeout
101
+ net-protocol (0.1.3)
102
+ timeout
103
+ net-smtp (0.3.1)
104
+ digest
105
+ net-protocol
106
+ timeout
107
+ nio4r (2.5.8)
108
+ nokogiri (1.13.3-x86_64-linux)
109
+ racc (~> 1.4)
110
+ pg (1.3.5)
111
+ racc (1.6.0)
112
+ rack (2.2.3)
113
+ rack-test (1.1.0)
114
+ rack (>= 1.0, < 3)
115
+ rails (7.0.2.3)
116
+ actioncable (= 7.0.2.3)
117
+ actionmailbox (= 7.0.2.3)
118
+ actionmailer (= 7.0.2.3)
119
+ actionpack (= 7.0.2.3)
120
+ actiontext (= 7.0.2.3)
121
+ actionview (= 7.0.2.3)
122
+ activejob (= 7.0.2.3)
123
+ activemodel (= 7.0.2.3)
124
+ activerecord (= 7.0.2.3)
125
+ activestorage (= 7.0.2.3)
126
+ activesupport (= 7.0.2.3)
127
+ bundler (>= 1.15.0)
128
+ railties (= 7.0.2.3)
129
+ rails-dom-testing (2.0.3)
130
+ activesupport (>= 4.2.0)
131
+ nokogiri (>= 1.6)
132
+ rails-html-sanitizer (1.4.2)
133
+ loofah (~> 2.3)
134
+ railties (7.0.2.3)
135
+ actionpack (= 7.0.2.3)
136
+ activesupport (= 7.0.2.3)
137
+ method_source
138
+ rake (>= 12.2)
139
+ thor (~> 1.0)
140
+ zeitwerk (~> 2.5)
141
+ rake (13.0.6)
142
+ strscan (3.0.1)
143
+ thor (1.2.1)
144
+ timeout (0.2.0)
145
+ tzinfo (2.0.4)
146
+ concurrent-ruby (~> 1.0)
147
+ websocket-driver (0.7.5)
148
+ websocket-extensions (>= 0.1.0)
149
+ websocket-extensions (0.1.5)
150
+ zeitwerk (2.5.4)
151
+
152
+ PLATFORMS
153
+ x86_64-linux
154
+
155
+ DEPENDENCIES
156
+ pg
157
+ ts_schema!
158
+
159
+ BUNDLED WITH
160
+ 2.2.32
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2022 Avram Walden
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # TsSchema
2
+
3
+ Uses ActiveRecord to generate a schema.d.ts file for use in typescript frontends.
4
+
5
+ ## Installation
6
+
7
+ ```ruby
8
+ bundle add "ts_schema"
9
+ ```
10
+
11
+ Then generate the initializer file:
12
+
13
+ ```ruby
14
+ rails generate ts_schema:install
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ All options with their defaults are in the config file.
20
+
21
+ By default, every migration, rollback, reset or setup task will auto generate a new schema file, replacing the existing one. You can disable this behavior in the config file.
22
+
23
+ You can manually generate the schema file by running:
24
+
25
+ ```ruby
26
+ rails ts_schema:generate
27
+ ```
28
+
29
+ ## Gotchas
30
+
31
+ Apparantly, sometimes ActiveRecord's inflections will alter the class name. For instance, with a class named `Five`; `"Fives".singularize` returns "Fife", which is not the classname. In the case where Rails alters the classname for an association, you must explicitly define it on the association in the model using `class_name`. Example: `has_many :fives, class_name: "Five"`.
32
+
33
+ ## License
34
+
35
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/setup"
2
+
3
+ require "bundler/gem_tasks"
data/bin/test ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path("../test", __dir__)
3
+
4
+ require "bundler/setup"
5
+ require "rails/plugin/test"
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+
5
+ module TsSchema
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ source_root File.expand_path("../templates", __FILE__)
9
+
10
+ desc "Creates ts_schmea.rb in config/initializers with default options."
11
+
12
+ def copy_initializer
13
+ template "ts_schema.rb", "config/initializers/ts_schema.rb"
14
+ end
15
+
16
+ # def show_readme
17
+ # readme "README" if behavior == :invoke
18
+ # end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ TsSchema.setup do |config|
2
+ # Options: camel|snake|pascal
3
+ # config.case = :camel
4
+
5
+ # Customize output path and file name
6
+ # config.output = Rails.root.join('app', 'assets', 'javascripts', 'schema.d.ts')
7
+
8
+ # Whether to generate the schema file on migrations and rollbacks
9
+ # config.auto_generate = true
10
+
11
+ # Add custom type mappings or overrides
12
+ # config.custom_types = {
13
+ #
14
+ # }
15
+
16
+ # Default type for unrecognized types
17
+ # config.default_type = :string
18
+
19
+ # Whether to generate types for associations
20
+ # config.include_associated = true
21
+
22
+ # Namespace
23
+ # config.namespace = :schema
24
+
25
+ # Options: tab|space
26
+ # config.indent = :tab
27
+
28
+ # If indent is spaces, specify how many
29
+ # config.spaces = 2
30
+ end
@@ -0,0 +1,24 @@
1
+ namespace :ts_schema do
2
+ desc "Generates a schema file in the default javascripts location, or the location specified in the ts_config initializer options"
3
+ task :generate do
4
+ TsSchema.generate
5
+ end
6
+ end
7
+
8
+ namespace :db do
9
+ task migrate: :environment do
10
+ TsSchema.generate if TsSchema.configuration.auto_generate
11
+ end
12
+
13
+ task rollback: :environment do
14
+ TsSchema.generate if TsSchema.configuration.auto_generate
15
+ end
16
+
17
+ task reset: :environment do
18
+ TsSchema.generate if TsSchema.configuration.auto_generate
19
+ end
20
+
21
+ task setup: :environment do
22
+ TsSchema.generate if TsSchema.configuration.auto_generate
23
+ end
24
+ end
@@ -0,0 +1,41 @@
1
+ require "pathname"
2
+
3
+ module TsSchema
4
+ class Configuration
5
+ DEFAULTS = {
6
+ case: :camel,
7
+ output: -> { Rails.root.join('app', 'assets', 'javascripts', 'schema.d.ts') },
8
+ auto_generate: true,
9
+ types: ->{ YAML.load_file(File.expand_path(__dir__) + '/conversion_table.yml').to_h },
10
+ custom_types: {},
11
+ default_type: :string,
12
+ include_associated: true,
13
+ namespace: :schema,
14
+ indent: :tab,
15
+ spaces: 2,
16
+ }
17
+
18
+ attr_accessor(*DEFAULTS.keys)
19
+
20
+ def initialize(attributes = nil)
21
+ assign(DEFAULTS)
22
+ return unless attributes
23
+ assign(attributes)
24
+ end
25
+
26
+ def assign(attributes = nil, &block)
27
+ if !attributes && !block
28
+ raise "Provide attributes or block"
29
+ end
30
+ tap(&block) if block
31
+ if attributes
32
+ attributes.each do |attribute, value|
33
+ value = value.call if value.is_a?(Proc)
34
+ send(:"#{attribute}=", value)
35
+ end
36
+ end
37
+ self
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ string: string
2
+ text: string
3
+ integer: number
4
+ enum: number
5
+ bigint: number
6
+ float: number
7
+ decimal: number
8
+ json: Record<string, any>
9
+ jsonb: Record<string, any>
10
+ binary: string
11
+ boolean: boolean
12
+ date: string
13
+ datetime: string
14
+ timestamp: string
15
+ datetime_with_timezone: :string
16
+ inet: string
17
+ cidr: string
18
+ macaddr: string
@@ -0,0 +1,4 @@
1
+ module TsSchema
2
+ class Railtie < ::Rails::Railtie
3
+ end
4
+ end
@@ -0,0 +1,110 @@
1
+ require 'fileutils'
2
+
3
+ module TsSchema
4
+ class SchemaGenerator
5
+ def initialize
6
+ Rails.application.eager_load!
7
+ @models = ApplicationRecord.send(:subclasses)
8
+ @types = TsSchema.configuration.types.merge(TsSchema.configuration.custom_types || {})
9
+ end
10
+
11
+ def generate
12
+ ts = generate_typescript
13
+ output_file(ts)
14
+ end
15
+
16
+ private
17
+
18
+ def generate_typescript
19
+ type_template = ""
20
+ @models.each do |model|
21
+ columns = map_column_types(model)
22
+ columns.concat(map_associations(model)) if TsSchema.configuration.include_associated
23
+
24
+ type_template += <<~TYPESCRIPT
25
+ interface #{model.model_name.name} {
26
+ #{columns.map { |column| "#{indent_as_str}#{column_name_cased(column[:name])}: #{column[:ts_type]};" }.join("\n")}
27
+ }\n
28
+ TYPESCRIPT
29
+ end
30
+ type_template = <<~TPL
31
+ declare namespace #{TsSchema.configuration.namespace} {
32
+ #{indent_wrapper(type_template)}
33
+ }
34
+ TPL
35
+ end
36
+
37
+ def map_column_types(model)
38
+ model.columns.map { |i|
39
+ type = @types[i.type.to_s] || TsSchema.configuration.default_type
40
+
41
+ if(enum = model.defined_enums[i.name])
42
+ type = enum.keys.map { |k| "'#{k}'" }.join(" | ")
43
+ end
44
+
45
+ {
46
+ name: "#{i.name}#{"?" if i.null }",
47
+ ts_type: "#{type}#{" | null" if i.null}"
48
+ }
49
+ }
50
+ end
51
+
52
+ def map_associations(model)
53
+ model.reflect_on_all_associations.reject(&:polymorphic?).map do |association|
54
+ case
55
+ when association.has_one? || association.belongs_to?
56
+ {
57
+ name: "#{association.name}?",
58
+ ts_type: association.class_name
59
+ }
60
+ when association.collection?
61
+ {
62
+ name: "#{association.name}?",
63
+ ts_type: "#{association.class_name}[]"
64
+ }
65
+ end
66
+ end
67
+ end
68
+
69
+ def column_name_cased(name)
70
+ case TsSchema.configuration.case.to_sym
71
+ when :camel
72
+ name.camelize(:lower)
73
+ when :pascal
74
+ name.camelize
75
+ else
76
+ name
77
+ end
78
+ end
79
+
80
+ def output_file(content)
81
+ path = TsSchema.configuration.output
82
+ FileUtils.mkdir_p(File.dirname(path))
83
+
84
+ return if File.exist?(path) && File.read(path) == content
85
+
86
+ File.open(path, 'w') do |f|
87
+ f.write content
88
+ end
89
+ end
90
+
91
+ def indent_as_str
92
+ case TsSchema.configuration.indent.to_sym
93
+ when :space || :spaces
94
+ "".rjust(TsSchema.configuration.spaces, " ")
95
+ else
96
+ "\t"
97
+ end
98
+ end
99
+
100
+ def indent_wrapper(str)
101
+ case TsSchema.configuration.indent.to_sym
102
+ when :space || :spaces
103
+ str.indent(TsSchema.configuration.spaces)
104
+ else
105
+ str.indent(1, "\t")
106
+ end
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,3 @@
1
+ module TsSchema
2
+ VERSION = "0.1.1"
3
+ end
data/lib/ts_schema.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "ts_schema/version"
2
+ require "ts_schema/railtie"
3
+
4
+ require "ts_schema/configuration"
5
+ require "ts_schema/schema_generator"
6
+
7
+ module TsSchema
8
+ class << self
9
+ def setup(&block)
10
+ configuration.assign(&block)
11
+ end
12
+
13
+ def configuration
14
+ @configuration ||= Configuration.new
15
+ end
16
+
17
+ def generate
18
+ SchemaGenerator.new.generate
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative "config/application"
5
+
6
+ Rails.application.load_tasks
File without changes
@@ -0,0 +1,71 @@
1
+ declare namespace schema {
2
+ interface Example {
3
+ id: number;
4
+ colString: string;
5
+ colText: string;
6
+ colInteger: number;
7
+ colEnum: 'zero' | 'one' | 'two';
8
+ colBigint: number;
9
+ colFloat: number;
10
+ colDecimal: number;
11
+ colJson?: Record<string, any> | null;
12
+ colJsonb?: Record<string, any> | null;
13
+ colBinary?: string | null;
14
+ colBoolean?: boolean | null;
15
+ colDate?: string | null;
16
+ colDatetime?: string | null;
17
+ colTimestamp?: string | null;
18
+ colInet?: string | null;
19
+ colCidr?: string | null;
20
+ colMacaddr?: string | null;
21
+ one?: One;
22
+ two?: Two;
23
+ fours?: Four[];
24
+ threes?: Three[];
25
+ fives?: Five[];
26
+ }
27
+
28
+ interface Five {
29
+ id: number;
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ examples?: Example[];
33
+ }
34
+
35
+ interface Four {
36
+ id: number;
37
+ exampleId: number;
38
+ threeId: number;
39
+ createdAt: string;
40
+ updatedAt: string;
41
+ example?: Example;
42
+ three?: Three;
43
+ }
44
+
45
+ interface One {
46
+ id: number;
47
+ exampleId: number;
48
+ createdAt: string;
49
+ updatedAt: string;
50
+ example?: Example;
51
+ two?: Two;
52
+ }
53
+
54
+ interface Three {
55
+ id: number;
56
+ createdAt: string;
57
+ updatedAt: string;
58
+ fours?: Four[];
59
+ examples?: Example[];
60
+ }
61
+
62
+ interface Two {
63
+ id: number;
64
+ exampleId: number;
65
+ createdAt: string;
66
+ updatedAt: string;
67
+ example?: Example;
68
+ }
69
+
70
+
71
+ }
@@ -0,0 +1 @@
1
+ /* Application styles */
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
File without changes