ripple 0.2.41 → 0.2.43

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.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Ripple is a TypeScript UI framework for the web",
4
4
  "license": "MIT",
5
5
  "author": "Dominic Gannaway",
6
- "version": "0.2.41",
6
+ "version": "0.2.43",
7
7
  "type": "module",
8
8
  "module": "src/runtime/index.js",
9
9
  "main": "src/runtime/index.js",
@@ -413,9 +413,9 @@ function RipplePlugin(config) {
413
413
  }
414
414
  } else {
415
415
  if (open.name.name === 'style') {
416
- // jsx_parseOpeningElementAt can treat a html element selector as an identifier and read it
417
- // In that case, need to backtrack to include it in the css content
418
- const start = this.pos - (this.value?.length ?? 1)
416
+ // jsx_parseOpeningElementAt treats ID selectors (ie. #myid) or type selectors (ie. div) as identifier and read it
417
+ // So backtrack to the end of the <style> tag to make sure everything is included
418
+ const start = open.end;
419
419
  const input = this.input.slice(start);
420
420
  const end = input.indexOf('</style>');
421
421
  const content = input.slice(0, end);
@@ -428,7 +428,7 @@ function RipplePlugin(config) {
428
428
 
429
429
  const newLines = content.match(regex_newline_characters)?.length;
430
430
  if (newLines) {
431
- this.curLine += newLines;
431
+ this.curLine = open.loc.end.line + newLines;
432
432
  this.lineStart = start + content.lastIndexOf('\n') + 1;
433
433
  }
434
434
  this.pos = start + content.length + 1;
@@ -150,40 +150,57 @@ const visitors = {
150
150
  }
151
151
 
152
152
  // Handle array methods that access the array
153
- if (
154
- callee.type === 'MemberExpression' &&
155
- !callee.optional &&
156
- callee.property.type === 'Identifier'
157
- ) {
158
- const name = callee.property.name;
159
- if (
160
- // TODO support the missing array methods
161
- name === 'reduce' ||
162
- name === 'map' ||
163
- name === 'forEach' ||
164
- name === 'join' ||
165
- name === 'includes' ||
166
- name === 'indexOf' ||
167
- name === 'lastIndexOf' ||
168
- name === 'filter' ||
169
- name === 'every' ||
170
- name === 'some' ||
171
- name === 'toSpliced' ||
172
- name === 'toSorted' ||
173
- name === 'toString' ||
174
- name === 'values' ||
175
- name === 'entries'
176
- ) {
153
+ if (callee.type === 'MemberExpression') {
154
+ const property = callee.property;
155
+
156
+ if (property.type === 'Identifier' && !callee.optional) {
157
+ const name = property.name;
158
+ if (
159
+ // TODO support the missing array methods
160
+ name === 'reduce' ||
161
+ name === 'map' ||
162
+ name === 'forEach' ||
163
+ name === 'join' ||
164
+ name === 'includes' ||
165
+ name === 'indexOf' ||
166
+ name === 'lastIndexOf' ||
167
+ name === 'filter' ||
168
+ name === 'every' ||
169
+ name === 'some' ||
170
+ name === 'toSpliced' ||
171
+ name === 'toSorted' ||
172
+ name === 'toString' ||
173
+ name === 'values' ||
174
+ name === 'entries'
175
+ ) {
176
+ return b.call(
177
+ '$.with_scope',
178
+ b.id('__block'),
179
+ b.thunk(
180
+ b.call(
181
+ '$.array_' + name,
182
+ context.visit(callee.object),
183
+ ...node.arguments.map((arg) => context.visit(arg)),
184
+ ),
185
+ ),
186
+ );
187
+ }
188
+ }
189
+
190
+ if (callee.computed) {
177
191
  return b.call(
178
192
  '$.with_scope',
179
193
  b.id('__block'),
180
194
  b.thunk(
181
195
  b.call(
182
- '$.array_' + name,
196
+ '$.call_property',
183
197
  context.visit(callee.object),
198
+ context.visit(property),
199
+ callee.optional ? b.true : undefined,
200
+ node.optional ? b.true : undefined,
184
201
  ...node.arguments.map((arg) => context.visit(arg)),
185
- ),
186
- ),
202
+ )
203
+ )
187
204
  );
188
205
  }
189
206
  }
@@ -199,6 +216,27 @@ const visitors = {
199
216
  );
200
217
  },
201
218
 
219
+ TSTypeAliasDeclaration(_, context) {
220
+ if (!context.state.to_ts) {
221
+ return b.empty;
222
+ }
223
+ context.next();
224
+ },
225
+
226
+ TSInterfaceDeclaration(_, context) {
227
+ if (!context.state.to_ts) {
228
+ return b.empty;
229
+ }
230
+ context.next();
231
+ },
232
+
233
+ TSMappedType(_, context) {
234
+ if (!context.state.to_ts) {
235
+ return b.empty;
236
+ }
237
+ context.next();
238
+ },
239
+
202
240
  NewExpression(node, context) {
203
241
  const callee = node.callee;
204
242
  const parent = context.path.at(-1);
@@ -469,7 +507,11 @@ const visitors = {
469
507
  );
470
508
 
471
509
  if (is_spreading) {
472
- spread_attributes.push(b.prop('init', b.literal(name), attr_value));
510
+ // For spread attributes, store just the actual value, not the full attribute string
511
+ const actual_value = is_boolean_attribute(name) && value === true
512
+ ? b.literal(true)
513
+ : b.literal(value === true ? '' : value);
514
+ spread_attributes.push(b.prop('init', b.literal(name), actual_value));
473
515
  } else {
474
516
  state.template.push(attr_value);
475
517
  }
@@ -959,7 +1001,8 @@ const visitors = {
959
1001
  const left = node.left;
960
1002
 
961
1003
  if (left.type === 'MemberExpression') {
962
- if (left.property.type === 'Identifier' && is_tracked_name(left.property.name)) {
1004
+ // need to capture setting length of array to throw a runtime error
1005
+ if (left.property.type === 'Identifier' && (is_tracked_name(left.property.name) || left.property.name === 'length')) {
963
1006
  if (left.property.name !== '$length') {
964
1007
  return b.call(
965
1008
  '$.set_property',
@@ -1255,6 +1298,11 @@ const visitors = {
1255
1298
  return b.binary(node.operator, context.visit(node.left), context.visit(node.right));
1256
1299
  },
1257
1300
 
1301
+ TemplateLiteral(node, context) {
1302
+ const expressions = node.expressions.map(expr => context.visit(expr));
1303
+ return b.template(node.quasis, expressions);
1304
+ },
1305
+
1258
1306
  RenderFragment(node, context) {
1259
1307
  const identifer = node.expression.callee;
1260
1308