ts_schema 0.1.9 → 0.1.12
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 +4 -4
- data/Rakefile +1 -0
- data/lib/generators/templates/ts_schema.rb +63 -31
- data/lib/tasks/ts_schema_tasks.rake +6 -13
- data/lib/ts_schema/configuration.rb +2 -1
- data/lib/ts_schema/conversion_table.yml +0 -2
- data/lib/ts_schema/railtie.rb +3 -0
- data/lib/ts_schema/schema_generator.rb +54 -30
- data/lib/ts_schema/version.rb +1 -1
- data/lib/ts_schema.rb +11 -2
- metadata +17 -4
- data/lib/generators/generate_generator.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8602c4a7ca10962ac35fd7c64a18d0669ed3f7d1ecdfdf7bc9c29a258bff754a
|
4
|
+
data.tar.gz: 322d779a986f2edf18d53829a6a8669326732be7aa4080567d2f4a1ecb1ebac0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88fd048bbffe0eb93ac910bdcaf456a35e4ded1bf934dab9330d5ad1dba4d57ad3106c07a549a92555f312fe4d713d1b1b4b8c7d29d3909d85a7062df96e6426
|
7
|
+
data.tar.gz: 4c778296ba8de708bf9539bdcd163d79370c0477600d2bdbfd98a0e5c0355d3e02872728452be964922032cc880b3ac92ee270f40269e251734fb48ebfb74bcb
|
data/Rakefile
CHANGED
@@ -1,57 +1,89 @@
|
|
1
|
+
# Default type mappings:
|
2
|
+
#
|
3
|
+
# string: string
|
4
|
+
# text: string
|
5
|
+
# integer: number
|
6
|
+
# enum: number
|
7
|
+
# bigint: number
|
8
|
+
# float: number
|
9
|
+
# decimal: number
|
10
|
+
# json: Record<string, any>
|
11
|
+
# jsonb: Record<string, any>
|
12
|
+
# binary: string
|
13
|
+
# boolean: boolean
|
14
|
+
# date: string
|
15
|
+
# datetime: string
|
16
|
+
# timestamp: string
|
17
|
+
# datetime_with_timezone: string
|
18
|
+
# inet: string
|
19
|
+
# cidr: string
|
20
|
+
# macaddr: string
|
21
|
+
|
1
22
|
TsSchema.setup do |config|
|
2
|
-
#
|
23
|
+
# Case options: camel|snake|pascal
|
24
|
+
#
|
3
25
|
# config.case = :camel
|
4
26
|
|
27
|
+
|
5
28
|
# Customize output path and file name
|
29
|
+
#
|
6
30
|
# config.output = Rails.root.join('app', 'assets', 'javascripts', 'schema.d.ts')
|
7
31
|
|
8
|
-
|
32
|
+
|
33
|
+
# Whether to generate the schema file after running migrations
|
34
|
+
#
|
9
35
|
# config.auto_generate = true
|
10
36
|
|
37
|
+
|
11
38
|
# Add custom type mappings or overrides
|
12
|
-
|
13
|
-
# Default type mappings:
|
14
|
-
#
|
15
|
-
# string: string
|
16
|
-
# text: string
|
17
|
-
# integer: number
|
18
|
-
# enum: number
|
19
|
-
# bigint: number
|
20
|
-
# float: number
|
21
|
-
# decimal: number
|
22
|
-
# json: Record<string, any>
|
23
|
-
# jsonb: Record<string, any>
|
24
|
-
# binary: string
|
25
|
-
# boolean: boolean
|
26
|
-
# date: string
|
27
|
-
# datetime: string
|
28
|
-
# timestamp: string
|
29
|
-
# datetime_with_timezone: string
|
30
|
-
# inet: string
|
31
|
-
# cidr: string
|
32
|
-
# macaddr: string
|
33
|
-
#
|
39
|
+
#
|
34
40
|
# config.custom_types = {
|
35
41
|
#
|
36
42
|
# }
|
37
43
|
|
44
|
+
|
38
45
|
# Default type for unrecognized types
|
46
|
+
#
|
39
47
|
# config.default_type = :string
|
40
48
|
|
41
|
-
|
49
|
+
|
50
|
+
# Whether to generate types for associated models
|
51
|
+
#
|
42
52
|
# config.include_associated = true
|
43
53
|
|
44
|
-
# Additional models to map which don't have a model file
|
45
|
-
# config.additional_models = [
|
46
|
-
#
|
47
|
-
# ]
|
48
54
|
|
49
|
-
#
|
55
|
+
# Parent classes of models to generate (as strings or symbols)
|
56
|
+
# Only classes inheriting from those in this list will have types generated
|
57
|
+
#
|
58
|
+
# config.parent_classes = [
|
59
|
+
# "ApplicationRecord",
|
60
|
+
# ]
|
61
|
+
|
62
|
+
|
63
|
+
# Additional models to generate schema from, such as those added by other gems
|
64
|
+
# which don't have a model file. (as strings or symbols)
|
65
|
+
#
|
66
|
+
# config.additional_models = [
|
67
|
+
#
|
68
|
+
# ]
|
69
|
+
|
70
|
+
|
71
|
+
# Namespace for generated types
|
72
|
+
#
|
50
73
|
# config.namespace = :schema
|
51
74
|
|
52
|
-
|
75
|
+
|
76
|
+
# Output schema as types or interfaces: type|interface
|
77
|
+
#
|
78
|
+
# config.schema_type = :interface
|
79
|
+
|
80
|
+
|
81
|
+
# Indentation options: tab|space
|
82
|
+
#
|
53
83
|
# config.indent = :tab
|
54
84
|
|
85
|
+
|
55
86
|
# If indent is spaces, specify how many
|
87
|
+
#
|
56
88
|
# config.spaces = 2
|
57
89
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require "rake"
|
2
|
+
require "ts_schema"
|
2
3
|
|
3
4
|
namespace :ts_schema do
|
4
5
|
desc "Generates a schema file in the default javascripts location, or the location specified in the ts_config initializer options"
|
5
|
-
task :
|
6
|
+
task generate: :environment do
|
6
7
|
TsSchema.output_file
|
7
8
|
end
|
8
9
|
end
|
@@ -12,19 +13,11 @@ namespace :db do
|
|
12
13
|
TsSchema.output_file if TsSchema.configuration.auto_generate
|
13
14
|
end
|
14
15
|
|
15
|
-
task migrate
|
16
|
-
auto_generate_and_save_file
|
16
|
+
task :migrate do
|
17
|
+
at_exit { auto_generate_and_save_file }
|
17
18
|
end
|
18
19
|
|
19
|
-
task
|
20
|
-
auto_generate_and_save_file
|
21
|
-
end
|
22
|
-
|
23
|
-
task reset: :environment do
|
24
|
-
auto_generate_and_save_file
|
25
|
-
end
|
26
|
-
|
27
|
-
task setup: :environment do
|
28
|
-
auto_generate_and_save_file
|
20
|
+
task :setup do
|
21
|
+
at_exit { auto_generate_and_save_file }
|
29
22
|
end
|
30
23
|
end
|
@@ -11,8 +11,10 @@ module TsSchema
|
|
11
11
|
default_type: :string,
|
12
12
|
include_associated: true,
|
13
13
|
namespace: :schema,
|
14
|
+
schema_type: :interface,
|
14
15
|
indent: :tab,
|
15
16
|
spaces: 2,
|
17
|
+
parent_classes: ["ApplicationRecord"],
|
16
18
|
additional_models: []
|
17
19
|
}
|
18
20
|
|
@@ -37,6 +39,5 @@ module TsSchema
|
|
37
39
|
end
|
38
40
|
self
|
39
41
|
end
|
40
|
-
|
41
42
|
end
|
42
43
|
end
|
@@ -2,7 +2,6 @@ string: string
|
|
2
2
|
text: string
|
3
3
|
integer: number
|
4
4
|
enum: number
|
5
|
-
bigint: number
|
6
5
|
float: number
|
7
6
|
decimal: number
|
8
7
|
json: Record<string, any>
|
@@ -12,7 +11,6 @@ boolean: boolean
|
|
12
11
|
date: string
|
13
12
|
datetime: string
|
14
13
|
timestamp: string
|
15
|
-
datetime_with_timezone: string
|
16
14
|
inet: string
|
17
15
|
cidr: string
|
18
16
|
macaddr: string
|
data/lib/ts_schema/railtie.rb
CHANGED
@@ -2,56 +2,74 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
module TsSchema
|
4
4
|
class SchemaGenerator
|
5
|
-
|
6
|
-
|
7
|
-
@models = ApplicationRecord.send(:subclasses)
|
8
|
-
@models.concat(TsSchema.configuration.additional_models) unless TsSchema.configuration.additional_models.empty?
|
9
|
-
@types = TsSchema.configuration.types.merge(TsSchema.configuration.custom_types || {})
|
10
|
-
end
|
11
|
-
|
12
|
-
def generate
|
13
|
-
generate_typescript
|
14
|
-
end
|
15
|
-
|
16
|
-
def output_file
|
17
|
-
path = TsSchema.configuration.output
|
18
|
-
FileUtils.mkdir_p(File.dirname(path))
|
5
|
+
attr_accessor :config
|
6
|
+
attr_accessor :models
|
19
7
|
|
20
|
-
|
21
|
-
|
8
|
+
def initialize(config = nil)
|
9
|
+
@config = config || TsSchema::Configuration.new
|
10
|
+
@models = []
|
22
11
|
|
23
|
-
|
24
|
-
|
12
|
+
Rails.application.eager_load!
|
13
|
+
@config.parent_classes.each do |parent|
|
14
|
+
@models.concat(get_subclasses(parent.to_s.constantize))
|
15
|
+
end
|
16
|
+
unless @config.additional_models.empty?
|
17
|
+
@models.concat(@config.additional_models.map do |m|
|
18
|
+
m.to_s.constantize
|
19
|
+
end)
|
25
20
|
end
|
21
|
+
@types = @config.types.stringify_keys.merge(@config.custom_types.stringify_keys || {})
|
26
22
|
end
|
27
23
|
|
28
|
-
|
24
|
+
def get_subclasses(model)
|
25
|
+
models = model.send(:subclasses)
|
26
|
+
unless nested_empty?(models)
|
27
|
+
models.concat(models.flat_map do |m|
|
28
|
+
get_subclasses(m)
|
29
|
+
end)
|
30
|
+
end
|
31
|
+
models
|
32
|
+
end
|
29
33
|
|
30
|
-
def
|
34
|
+
def generate
|
31
35
|
type_template = ""
|
36
|
+
|
32
37
|
@models.each do |model|
|
33
38
|
columns = map_column_types(model)
|
34
|
-
columns.concat(map_associations(model)) if
|
39
|
+
columns.concat(map_associations(model)) if @config.include_associated
|
35
40
|
|
36
41
|
type_template += <<~TYPESCRIPT
|
37
|
-
|
42
|
+
#{@config.schema_type} #{model.model_name.param_key.camelize} #{@config.schema_type.to_sym == :type ? "= " : ""}{
|
38
43
|
#{columns.map { |column| "#{indent_as_str}#{column_name_cased(column[:name])}: #{column[:ts_type]};" }.join("\n")}
|
39
44
|
}\n
|
40
45
|
TYPESCRIPT
|
41
46
|
end
|
47
|
+
|
42
48
|
type_template = <<~TPL
|
43
|
-
declare namespace #{
|
49
|
+
declare namespace #{@config.namespace} {
|
44
50
|
#{indent_wrapper(type_template)}
|
45
51
|
}
|
46
52
|
TPL
|
47
53
|
end
|
48
54
|
|
55
|
+
def output_file
|
56
|
+
path = @config.output
|
57
|
+
FileUtils.mkdir_p(File.dirname(path))
|
58
|
+
|
59
|
+
content = generate
|
60
|
+
return if File.exist?(path) && File.read(path) == content
|
61
|
+
|
62
|
+
File.open(path, 'w') do |f|
|
63
|
+
f.write content
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
49
67
|
def map_column_types(model)
|
50
68
|
model.columns.map { |i|
|
51
|
-
type = @types[i.type.to_s] ||
|
69
|
+
type = @types[i.type.to_s] || @config.default_type
|
52
70
|
|
53
71
|
if(enum = model.defined_enums[i.name])
|
54
|
-
type = enum.keys.map { |k| "'#{k}'" }.join("
|
72
|
+
type = enum.keys.map { |k| "'#{k}'" }.join("|")
|
55
73
|
end
|
56
74
|
|
57
75
|
{
|
@@ -78,8 +96,14 @@ module TsSchema
|
|
78
96
|
end
|
79
97
|
end
|
80
98
|
|
99
|
+
private
|
100
|
+
|
101
|
+
def nested_empty?(arr)
|
102
|
+
arr.is_a?(Array) && arr.flatten.empty?
|
103
|
+
end
|
104
|
+
|
81
105
|
def column_name_cased(name)
|
82
|
-
case
|
106
|
+
case @config.case.to_sym
|
83
107
|
when :camel
|
84
108
|
name.camelize(:lower)
|
85
109
|
when :pascal
|
@@ -90,18 +114,18 @@ module TsSchema
|
|
90
114
|
end
|
91
115
|
|
92
116
|
def indent_as_str
|
93
|
-
case
|
117
|
+
case @config.indent.to_sym
|
94
118
|
when :space || :spaces
|
95
|
-
"".rjust(
|
119
|
+
"".rjust(@config.spaces, " ")
|
96
120
|
else
|
97
121
|
"\t"
|
98
122
|
end
|
99
123
|
end
|
100
124
|
|
101
125
|
def indent_wrapper(str)
|
102
|
-
case
|
126
|
+
case @config.indent.to_sym
|
103
127
|
when :space || :spaces
|
104
|
-
str.indent(
|
128
|
+
str.indent(@config.spaces)
|
105
129
|
else
|
106
130
|
str.indent(1, "\t")
|
107
131
|
end
|
data/lib/ts_schema/version.rb
CHANGED
data/lib/ts_schema.rb
CHANGED
@@ -4,6 +4,7 @@ require "ts_schema/railtie"
|
|
4
4
|
require "ts_schema/configuration"
|
5
5
|
require "ts_schema/schema_generator"
|
6
6
|
|
7
|
+
|
7
8
|
module TsSchema
|
8
9
|
class << self
|
9
10
|
def setup(&block)
|
@@ -15,11 +16,19 @@ module TsSchema
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def generate
|
18
|
-
|
19
|
+
if ActiveRecord::Base.connection.migration_context.needs_migration?
|
20
|
+
puts "Aborting: There are pending migrations"
|
21
|
+
else
|
22
|
+
SchemaGenerator.new(@configuration).generate
|
23
|
+
end
|
19
24
|
end
|
20
25
|
|
21
26
|
def output_file
|
22
|
-
|
27
|
+
if ActiveRecord::Base.connection.migration_context.needs_migration?
|
28
|
+
puts "Aborting: There are pending migrations"
|
29
|
+
else
|
30
|
+
SchemaGenerator.new(@configuration).output_file
|
31
|
+
end
|
23
32
|
end
|
24
33
|
end
|
25
34
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ts_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Avram Walden
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 6.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: railties
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4'
|
27
41
|
description: ''
|
28
42
|
email:
|
29
43
|
- aviemet@gmail.com
|
@@ -34,7 +48,6 @@ files:
|
|
34
48
|
- MIT-LICENSE
|
35
49
|
- README.md
|
36
50
|
- Rakefile
|
37
|
-
- lib/generators/generate_generator.rb
|
38
51
|
- lib/generators/install_generator.rb
|
39
52
|
- lib/generators/templates/ts_schema.rb
|
40
53
|
- lib/tasks/ts_schema_tasks.rake
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rails/generators'
|
4
|
-
require 'rails/generators/base'
|
5
|
-
|
6
|
-
module TsSchema
|
7
|
-
module Generators
|
8
|
-
class GenerateGenerator < Rails::Generators::Base
|
9
|
-
|
10
|
-
desc "Generates a schema.d.ts file"
|
11
|
-
|
12
|
-
def generate_schema
|
13
|
-
create_file TsSchema.configuration.output, TsSchema.generate
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|