typescript-merge 7.1.1 → 7.1.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.
@@ -5,7 +5,7 @@ module TypeScript
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = '7.1.1'
8
+ VERSION = '7.1.4'
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -13,6 +13,10 @@ module TypeScript
13
13
  DESTINATION_WINS_ARRAY_POLICY = { surface: 'array', name: 'destination_wins_array' }.freeze
14
14
  BACKEND_REGISTRY = Struct.new(:registered, :mutex).new(false, Mutex.new)
15
15
 
16
+ autoload :NodeWrapper, 'typescript/merge/node_wrapper'
17
+ autoload :FileAnalysis, 'typescript/merge/file_analysis'
18
+ autoload :Provider, 'typescript/merge/provider'
19
+
16
20
  def register_backend!
17
21
  BACKEND_REGISTRY.mutex.synchronize do
18
22
  return if BACKEND_REGISTRY.registered
@@ -21,13 +25,23 @@ module TypeScript
21
25
 
22
26
  grammar_finder = TreeHaver::GrammarFinder.new(:typescript)
23
27
  grammar_finder.register! if grammar_finder.available?
28
+ TreeHaver.register_language(
29
+ :tsx,
30
+ backend_module: TreeHaver::Backends::Tslp,
31
+ backend_type: :tslp,
32
+ gem_name: 'tree_sitter_language_pack'
33
+ )
24
34
 
25
35
  BACKEND_REGISTRY.registered = true
26
36
  end
27
37
  end
28
38
 
29
39
  def type_script_feature_profile
30
- { family: 'typescript', supported_dialects: ['typescript'], supported_policies: [DESTINATION_WINS_ARRAY_POLICY] }
40
+ {
41
+ family: 'typescript',
42
+ supported_dialects: %w[typescript tsx],
43
+ supported_policies: [DESTINATION_WINS_ARRAY_POLICY]
44
+ }
31
45
  end
32
46
 
33
47
  def available_type_script_backends
@@ -66,7 +80,7 @@ module TypeScript
66
80
  diagnostic_backend = TreeHaver.current_backend_id || 'tree-sitter'
67
81
  return unsupported_feature_result("Unsupported TypeScript backend #{diagnostic_backend}.")
68
82
  end
69
- return analyze_type_script_module(source) if dialect == 'typescript'
83
+ return analyze_type_script_module(source, dialect: dialect) if %w[typescript tsx].include?(dialect)
70
84
 
71
85
  { ok: false,
72
86
  diagnostics: [{ severity: 'error', category: 'unsupported_feature', message: "Unsupported TypeScript dialect #{dialect}." }], policies: [] }
@@ -97,6 +111,16 @@ module TypeScript
97
111
  Ast::Merge::OwnerSelection.match_by_path(template, destination)
98
112
  end
99
113
 
114
+ def merge_provider
115
+ @merge_provider ||= Provider.new
116
+ end
117
+
118
+ def register_provider!(replace: false)
119
+ return unless Ast::Merge.respond_to?(:register_provider)
120
+
121
+ Ast::Merge.register_provider(merge_provider, replace: replace)
122
+ end
123
+
100
124
  def merge_type_script(template_source, destination_source, dialect)
101
125
  template = parse_type_script(template_source, dialect)
102
126
  return { ok: false, diagnostics: template[:diagnostics], policies: [] } unless template[:ok]
@@ -125,33 +149,28 @@ module TypeScript
125
149
  policies: [DESTINATION_WINS_ARRAY_POLICY] }
126
150
  end
127
151
 
128
- def analyze_type_script_module(source)
129
- parser = TreeHaver.parser_for(:typescript, backend_type: :tree_sitter)
130
- tree = parser.parse(source)
131
- collect_parse_errors(tree.root_node)
152
+ def analyze_type_script_module(source, dialect: 'typescript')
153
+ analysis = FileAnalysis.new(source, dialect: dialect)
154
+ raise analysis.errors.first unless analysis.errors.empty?
132
155
 
133
156
  imports = []
134
157
  declarations = []
135
- tree.root_node.children.each do |node|
136
- case node.type
137
- when 'import_statement'
138
- import_source = line_anchored_slice(source, node)
158
+ analysis.declarations.each do |wrapper|
159
+ signature = wrapper.signature
160
+ if signature.first == :import
139
161
  imports << {
140
162
  path: "/imports/#{imports.length}",
141
163
  owner_kind: 'import',
142
- match_key: normalize_type_script_import_path(import_source),
143
- text: import_text(source, node)
164
+ match_key: legacy_import_key(signature),
165
+ text: "#{wrapper.source_text}\n"
144
166
  }
145
- when 'export_statement', 'function_declaration', 'class_declaration', 'interface_declaration',
146
- 'lexical_declaration', 'variable_declaration'
147
- name = first_named_descendant_text(source, node, %w[identifier type_identifier])
148
- next unless name
149
-
167
+ else
168
+ name = legacy_declaration_key(signature)
150
169
  declarations << {
151
170
  path: "/declarations/#{name}",
152
171
  owner_kind: 'declaration',
153
172
  match_key: name,
154
- text: declaration_text(source, node)
173
+ text: "#{wrapper.source_text}\n"
155
174
  }
156
175
  end
157
176
  end
@@ -161,7 +180,7 @@ module TypeScript
161
180
  diagnostics: [],
162
181
  analysis: {
163
182
  kind: 'typescript',
164
- dialect: 'typescript',
183
+ dialect: dialect,
165
184
  imports: imports,
166
185
  declarations: declarations,
167
186
  owners: owner_views(imports + declarations)
@@ -173,14 +192,18 @@ module TypeScript
173
192
  end
174
193
  private_class_method :analyze_type_script_module
175
194
 
176
- def collect_parse_errors(node)
177
- raise TreeHaver::NotAvailable, 'TypeScript parse returned no root node' unless node
178
- return unless node.respond_to?(:has_error?) && node.has_error?
195
+ def legacy_declaration_key(signature)
196
+ nested = signature.first == :export_declaration ? signature.fetch(1) : signature
197
+ value = nested.last
198
+ value.is_a?(Array) ? value.join(',') : value
199
+ end
200
+ private_class_method :legacy_declaration_key
179
201
 
180
- raise TreeHaver::NotAvailable,
181
- 'TypeScript parse contains syntax errors'
202
+ def legacy_import_key(signature)
203
+ literal = signature.fetch(1)
204
+ literal.byteslice(1...-1).to_s
182
205
  end
183
- private_class_method :collect_parse_errors
206
+ private_class_method :legacy_import_key
184
207
 
185
208
  def parse_failure_result(error)
186
209
  { ok: false,
@@ -189,23 +212,6 @@ module TypeScript
189
212
  end
190
213
  private_class_method :parse_failure_result
191
214
 
192
- def normalize_type_script_import_path(import_source)
193
- match = import_source.match(/from\s+['"]([^'"]+)['"]/) || import_source.match(/import\s+['"]([^'"]+)['"]/)
194
- match ? match[1] : import_source.sub(/\Aimport\s+/, '').strip
195
- end
196
- private_class_method :normalize_type_script_import_path
197
-
198
- def first_named_descendant_text(source, node, types)
199
- return slice_span(source, node) if types.include?(node.type)
200
-
201
- node.children.each do |child|
202
- value = first_named_descendant_text(source, child, types)
203
- return value if value && !value.empty?
204
- end
205
- nil
206
- end
207
- private_class_method :first_named_descendant_text
208
-
209
215
  def owner_view(item)
210
216
  item.slice(:path, :owner_kind, :match_key)
211
217
  end
@@ -217,28 +223,6 @@ module TypeScript
217
223
  end
218
224
  private_class_method :owner_views
219
225
 
220
- def import_text(source, span)
221
- "#{slice_span(source, span)}\n"
222
- end
223
- private_class_method :import_text
224
-
225
- def declaration_text(source, span)
226
- "#{line_anchored_slice(source, span)}\n"
227
- end
228
- private_class_method :declaration_text
229
-
230
- def slice_span(source, span)
231
- source[span.start_byte...span.end_byte].strip
232
- end
233
- private_class_method :slice_span
234
-
235
- def line_anchored_slice(source, span)
236
- line_start = source.rindex("\n", [span.start_byte - 1, 0].max)
237
- line_start = line_start ? line_start + 1 : 0
238
- source[line_start...span.end_byte].strip
239
- end
240
- private_class_method :line_anchored_slice
241
-
242
226
  def unsupported_feature_result(message)
243
227
  {
244
228
  ok: false,
@@ -251,3 +235,4 @@ module TypeScript
251
235
  end
252
236
 
253
237
  TypeScript::Merge.register_backend!
238
+ TypeScript::Merge.register_provider!
@@ -1,5 +1,51 @@
1
1
  module TypeScript
2
2
  module Merge
3
+ class NodeWrapper
4
+ DECLARATION_TYPES: Array[String]
5
+ NAMED_DECLARATIONS: Hash[String, [Symbol, Array[String]]]
6
+
7
+ attr_reader node: untyped
8
+ attr_reader source: String
9
+ attr_reader leading_comments: Array[untyped]
10
+ attr_reader trailing_comments: Array[untyped]
11
+
12
+ def initialize: (untyped node, source: String, ?leading_comments: Array[untyped]) -> void
13
+ def signature: () -> Array[untyped]
14
+ def membership_signature: () -> Array[untyped]
15
+ def grouped?: () -> bool
16
+ def start_byte: () -> Integer
17
+ def end_byte: () -> Integer
18
+ def start_line: () -> Integer
19
+ def end_line: () -> Integer
20
+ def source_text: () -> String
21
+ def semantic_tree: () -> Array[untyped]
22
+ def attach_trailing_comment!: (untyped comment) -> untyped
23
+ end
24
+
25
+ class FileAnalysis
26
+ attr_reader source: String
27
+ attr_reader root_node: untyped
28
+ attr_reader declarations: Array[NodeWrapper]
29
+ attr_reader errors: Array[StandardError]
30
+ attr_reader backend: Symbol
31
+ attr_reader dialect: Symbol
32
+
33
+ def initialize: (String source, ?dialect: Symbol) -> void
34
+ end
35
+
36
+ class Provider
37
+ def provider_id: () -> String
38
+ def family: () -> String
39
+ def capabilities: () -> Hash[Symbol, untyped]
40
+ def analyze: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
41
+ def diff2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
42
+ def merge2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
43
+ def merge3: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
44
+ end
45
+
46
+ def self.merge_provider: () -> Provider
47
+ def self.register_provider!: (?replace: bool) -> untyped
48
+
3
49
  module Version
4
50
  VERSION: String
5
51
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typescript-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.1
4
+ version: 7.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -43,28 +43,28 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.1.1
46
+ version: 7.1.4
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 7.1.1
53
+ version: 7.1.4
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: tree_haver
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 7.1.1
60
+ version: 7.1.4
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 7.1.1
67
+ version: 7.1.4
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: version_gem
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -91,20 +91,20 @@ dependencies:
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '2.5'
94
+ version: '3.0'
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 2.5.17
97
+ version: 3.0.7
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '2.5'
104
+ version: '3.0'
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: 2.5.17
107
+ version: 3.0.7
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: bundler-audit
110
110
  requirement: !ruby/object:Gem::Requirement
@@ -182,7 +182,7 @@ dependencies:
182
182
  version: '3.2'
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: 3.2.0
185
+ version: 3.2.2
186
186
  type: :development
187
187
  prerelease: false
188
188
  version_requirements: !ruby/object:Gem::Requirement
@@ -192,7 +192,7 @@ dependencies:
192
192
  version: '3.2'
193
193
  - - ">="
194
194
  - !ruby/object:Gem::Version
195
- version: 3.2.0
195
+ version: 3.2.2
196
196
  - !ruby/object:Gem::Dependency
197
197
  name: kettle-test
198
198
  requirement: !ruby/object:Gem::Requirement
@@ -202,7 +202,7 @@ dependencies:
202
202
  version: '2.0'
203
203
  - - ">="
204
204
  - !ruby/object:Gem::Version
205
- version: 2.0.19
205
+ version: 2.0.20
206
206
  type: :development
207
207
  prerelease: false
208
208
  version_requirements: !ruby/object:Gem::Requirement
@@ -212,7 +212,7 @@ dependencies:
212
212
  version: '2.0'
213
213
  - - ">="
214
214
  - !ruby/object:Gem::Version
215
- version: 2.0.19
215
+ version: 2.0.20
216
216
  - !ruby/object:Gem::Dependency
217
217
  name: turbo_tests2
218
218
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +222,7 @@ dependencies:
222
222
  version: '3.2'
223
223
  - - ">="
224
224
  - !ruby/object:Gem::Version
225
- version: 3.2.4
225
+ version: 3.2.6
226
226
  type: :development
227
227
  prerelease: false
228
228
  version_requirements: !ruby/object:Gem::Requirement
@@ -232,7 +232,7 @@ dependencies:
232
232
  version: '3.2'
233
233
  - - ">="
234
234
  - !ruby/object:Gem::Version
235
- version: 3.2.4
235
+ version: 3.2.6
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: ruby-progressbar
238
238
  requirement: !ruby/object:Gem::Requirement
@@ -276,7 +276,7 @@ dependencies:
276
276
  version: '2.0'
277
277
  - - ">="
278
278
  - !ruby/object:Gem::Version
279
- version: 2.0.11
279
+ version: 2.0.12
280
280
  type: :development
281
281
  prerelease: false
282
282
  version_requirements: !ruby/object:Gem::Requirement
@@ -286,7 +286,7 @@ dependencies:
286
286
  version: '2.0'
287
287
  - - ">="
288
288
  - !ruby/object:Gem::Version
289
- version: 2.0.11
289
+ version: 2.0.12
290
290
  description: "☯️ Portable TypeScript module owner analysis and merge behavior for
291
291
  Structured Merge."
292
292
  email:
@@ -299,6 +299,9 @@ files:
299
299
  - README.md
300
300
  - lib/typescript-merge.rb
301
301
  - lib/typescript/merge.rb
302
+ - lib/typescript/merge/file_analysis.rb
303
+ - lib/typescript/merge/node_wrapper.rb
304
+ - lib/typescript/merge/provider.rb
302
305
  - lib/typescript/merge/version.rb
303
306
  - sig/typescript/merge.rbs
304
307
  homepage: https://github.com/structuredmerge/structuredmerge-ruby
@@ -307,10 +310,10 @@ licenses:
307
310
  - PolyForm-Small-Business-1.0.0
308
311
  metadata:
309
312
  homepage_uri: https://structuredmerge.org
310
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.1
311
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.1/CHANGELOG.md
313
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.4
314
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.4/CHANGELOG.md
312
315
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
313
- documentation_uri: https://www.rubydoc.info/gems/typescript-merge/7.1.1
316
+ documentation_uri: https://www.rubydoc.info/gems/typescript-merge/7.1.4
314
317
  funding_uri: https://github.com/sponsors/pboling
315
318
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
316
319
  news_uri: https://www.railsbling.com/tags/typescript-merge
metadata.gz.sig CHANGED
Binary file