ripple 0.1.1 → 0.2.0

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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +56 -24
  3. package/src/ai.js +292 -0
  4. package/src/compiler/errors.js +26 -0
  5. package/src/compiler/index.js +26 -0
  6. package/src/compiler/phases/1-parse/index.js +543 -0
  7. package/src/compiler/phases/1-parse/style.js +566 -0
  8. package/src/compiler/phases/2-analyze/index.js +509 -0
  9. package/src/compiler/phases/2-analyze/prune.js +572 -0
  10. package/src/compiler/phases/3-transform/index.js +1572 -0
  11. package/src/compiler/phases/3-transform/segments.js +91 -0
  12. package/src/compiler/phases/3-transform/stylesheet.js +372 -0
  13. package/src/compiler/scope.js +421 -0
  14. package/src/compiler/utils.js +552 -0
  15. package/src/constants.js +4 -0
  16. package/src/jsx-runtime.d.ts +94 -0
  17. package/src/jsx-runtime.js +46 -0
  18. package/src/runtime/array.js +215 -0
  19. package/src/runtime/index.js +39 -0
  20. package/src/runtime/internal/client/blocks.js +247 -0
  21. package/src/runtime/internal/client/constants.js +23 -0
  22. package/src/runtime/internal/client/events.js +223 -0
  23. package/src/runtime/internal/client/for.js +388 -0
  24. package/src/runtime/internal/client/if.js +35 -0
  25. package/src/runtime/internal/client/index.js +53 -0
  26. package/src/runtime/internal/client/operations.js +72 -0
  27. package/src/runtime/internal/client/portal.js +33 -0
  28. package/src/runtime/internal/client/render.js +156 -0
  29. package/src/runtime/internal/client/runtime.js +909 -0
  30. package/src/runtime/internal/client/template.js +51 -0
  31. package/src/runtime/internal/client/try.js +139 -0
  32. package/src/runtime/internal/client/utils.js +16 -0
  33. package/src/utils/ast.js +214 -0
  34. package/src/utils/builders.js +733 -0
  35. package/src/utils/patterns.js +23 -0
  36. package/src/utils/sanitize_template_string.js +7 -0
  37. package/test-mappings.js +0 -0
  38. package/types/index.d.ts +2 -0
  39. package/.npmignore +0 -2
  40. package/History.md +0 -3
  41. package/Readme.md +0 -151
  42. package/lib/exec/index.js +0 -60
  43. package/ripple.js +0 -645
@@ -0,0 +1,215 @@
1
+ import { TRACKED_OBJECT } from './internal/client/constants.js';
2
+ import { get, increment, scope, set, tracked } from './internal/client/runtime.js';
3
+
4
+ var symbol_iterator = Symbol.iterator;
5
+
6
+ const introspect_methods = [
7
+ 'entries',
8
+ 'every',
9
+ 'find',
10
+ 'findIndex',
11
+ 'findLast',
12
+ 'findLastIndex',
13
+ 'flat',
14
+ 'flatMap',
15
+ 'forEach',
16
+ 'includes',
17
+ 'indexOf',
18
+ 'join',
19
+ 'keys',
20
+ 'lastIndexOf',
21
+ 'map',
22
+ 'reduce',
23
+ 'reduceRight',
24
+ 'some',
25
+ 'slice',
26
+ 'toLocaleString',
27
+ 'toReversed',
28
+ 'toSorted',
29
+ 'toSpliced',
30
+ 'toString',
31
+ symbol_iterator,
32
+ 'values',
33
+ 'with'
34
+ ];
35
+
36
+ let init = false;
37
+
38
+ class RippleArray extends Array {
39
+ #tracked_elements = [];
40
+ #tracked_index;
41
+
42
+ constructor(...elements) {
43
+ super(...elements);
44
+
45
+ var block = scope();
46
+ var tracked_elements = this.#tracked_elements;
47
+
48
+ for (var i = 0; i < this.length; i++) {
49
+ tracked_elements[i] = tracked(0, block);
50
+ }
51
+ this.#tracked_index = tracked(this.length, block);
52
+
53
+ if (!init) {
54
+ init = true;
55
+ this.#init();
56
+ }
57
+ }
58
+
59
+ #init() {
60
+ var proto = RippleArray.prototype;
61
+ var array_proto = Array.prototype;
62
+
63
+ for (const method of introspect_methods) {
64
+ proto[method] = function (...v) {
65
+ this.$length;
66
+ get_all_elements(this);
67
+ return array_proto[method].apply(this, v);
68
+ };
69
+ }
70
+ }
71
+
72
+ fill() {
73
+ var block = scope();
74
+ var tracked_elements = this.#tracked_elements;
75
+
76
+ super.fill();
77
+ for (var i = 0; i < this.length; i++) {
78
+ increment(tracked_elements[i], block);
79
+ }
80
+ }
81
+
82
+ reverse() {
83
+ var block = scope();
84
+ var tracked_elements = this.#tracked_elements;
85
+
86
+ super.reverse();
87
+ for (var i = 0; i < this.length; i++) {
88
+ increment(tracked_elements[i], block);
89
+ }
90
+ }
91
+
92
+ sort(fn) {
93
+ var block = scope();
94
+ var tracked_elements = this.#tracked_elements;
95
+
96
+ super.sort(fn);
97
+ for (var i = 0; i < this.length; i++) {
98
+ increment(tracked_elements[i], block);
99
+ }
100
+ }
101
+
102
+ unshift(...elements) {
103
+ var block = scope();
104
+ var tracked_elements = this.#tracked_elements;
105
+
106
+ super.unshift(...elements);
107
+ for (var i = 0; i < tracked_elements.length; i++) {
108
+ increment(tracked_elements[i], block);
109
+ }
110
+ tracked_elements.unshift(...elements.map(() => tracked(0, block)));
111
+
112
+ set(this.#tracked_index, this.length, block);
113
+ }
114
+
115
+ shift() {
116
+ var block = scope();
117
+ var tracked_elements = this.#tracked_elements;
118
+
119
+ super.shift();
120
+ for (var i = 0; i < tracked_elements.length; i++) {
121
+ increment(tracked_elements[i], block);
122
+ }
123
+ tracked_elements.shift();
124
+
125
+ set(this.#tracked_index, this.length, block);
126
+ }
127
+
128
+ push(...elements) {
129
+ var block = scope();
130
+ var start_index = this.length;
131
+ var tracked_elements = this.#tracked_elements;
132
+
133
+ super.push(...elements);
134
+
135
+ for (var i = 0; i < elements.length; i++) {
136
+ tracked_elements[start_index + i] = tracked(0, block);
137
+ }
138
+ set(this.#tracked_index, this.length, block);
139
+ }
140
+
141
+ pop() {
142
+ var block = scope();
143
+ var tracked_elements = this.#tracked_elements;
144
+
145
+ super.pop();
146
+ if (tracked_elements.length > 0) {
147
+ increment(tracked_elements[tracked_elements.length - 1], block);
148
+ }
149
+ tracked_elements.pop();
150
+
151
+ set(this.#tracked_index, this.length, block);
152
+ }
153
+
154
+ splice(start, delete_count, ...elements) {
155
+ var block = scope();
156
+ var tracked_elements = this.#tracked_elements;
157
+
158
+ super.splice(start, delete_count, ...elements);
159
+ for (var i = 0; i < tracked_elements.length; i++) {
160
+ increment(tracked_elements[i], block);
161
+ }
162
+ tracked_elements.splice(start, delete_count, ...elements.map(() => tracked(0, block)));
163
+
164
+ set(this.#tracked_index, this.length, block);
165
+ }
166
+
167
+ get [TRACKED_OBJECT]() {
168
+ return this.#tracked_elements;
169
+ }
170
+
171
+ get $length() {
172
+ return get(this.#tracked_index);
173
+ }
174
+
175
+ set $length(length) {
176
+ var block = scope();
177
+ var tracked_elements = this.#tracked_elements;
178
+
179
+ if (length !== this.$length) {
180
+ for (var i = 0; i < tracked_elements.length; i++) {
181
+ increment(tracked_elements[i], block);
182
+ }
183
+ this.length = length;
184
+ tracked_elements.length = length;
185
+
186
+ return true;
187
+ }
188
+ return false;
189
+ }
190
+
191
+ set length(_) {
192
+ throw new Error('Cannot set length on RippleArray, use $length instead');
193
+ }
194
+
195
+ toJSON() {
196
+ this.$length;
197
+ return get_all_elements(this);
198
+ }
199
+ }
200
+
201
+ export function get_all_elements(array) {
202
+ var tracked_elements = array[TRACKED_OBJECT];
203
+ var arr = [];
204
+
205
+ for (var i = 0; i < tracked_elements.length; i++) {
206
+ get(tracked_elements[i]);
207
+ arr.push(array[i]);
208
+ }
209
+
210
+ return arr;
211
+ }
212
+
213
+ export function array(...elements) {
214
+ return new RippleArray(...elements);
215
+ }
@@ -0,0 +1,39 @@
1
+ import { destroy_block, root } from './internal/client/blocks.js';
2
+ import { handle_root_events } from './internal/client/events.js';
3
+ import { init_operations } from './internal/client/operations.js';
4
+ import { active_block } from './internal/client/runtime.js';
5
+ import { create_anchor } from './internal/client/utils.js';
6
+
7
+ // Re-export JSX runtime functions for jsxImportSource: "ripple"
8
+ export { jsx, jsxs, Fragment } from '../jsx-runtime.js';
9
+
10
+ export function mount(component, options) {
11
+ init_operations();
12
+
13
+ const props = options.props || {};
14
+ const target = options.target;
15
+ const anchor = create_anchor();
16
+ target.append(anchor);
17
+
18
+ const cleanup_events = handle_root_events(target);
19
+
20
+ const _root = root(() => {
21
+ component(anchor, props, active_block);
22
+ });
23
+
24
+ return () => {
25
+ cleanup_events();
26
+ destroy_block(_root);
27
+ target.removeChild(anchor_node);
28
+ };
29
+ }
30
+
31
+ export { flush_sync as flushSync, untrack, deferred } from './internal/client/runtime.js';
32
+
33
+ export { array } from './array.js';
34
+
35
+ export { keyed } from './internal/client/for.js';
36
+
37
+ export { user_effect as effect } from './internal/client/blocks.js';
38
+
39
+ export { Portal } from './internal/client/portal.js';
@@ -0,0 +1,247 @@
1
+ import {
2
+ BLOCK_HAS_RUN,
3
+ BRANCH_BLOCK,
4
+ COMPUTED,
5
+ CONTAINS_TEARDOWN,
6
+ DESTROYED,
7
+ EFFECT_BLOCK,
8
+ PAUSED,
9
+ RENDER_BLOCK,
10
+ ROOT_BLOCK,
11
+ TRY_BLOCK
12
+ } from './constants';
13
+ import { next_sibling } from './operations';
14
+ import {
15
+ active_block,
16
+ active_component,
17
+ active_reaction,
18
+ run_block,
19
+ run_teardown,
20
+ schedule_update
21
+ } from './runtime';
22
+ import { suspend } from './try';
23
+
24
+ export function user_effect(fn) {
25
+ if (active_block === null) {
26
+ throw new Error('effect() must be called within an active context, such as a component or effect');
27
+ }
28
+
29
+ var component = active_component;
30
+ if (component !== null && !component.m) {
31
+ var e = (component.e ??= []);
32
+ e.push({
33
+ b: active_block,
34
+ fn,
35
+ r: active_reaction
36
+ });
37
+
38
+ return;
39
+ }
40
+
41
+ return block(EFFECT_BLOCK, fn);
42
+ }
43
+
44
+ export function effect(fn) {
45
+ return block(EFFECT_BLOCK, fn);
46
+ }
47
+
48
+ export function render(fn, flags = 0) {
49
+ return block(RENDER_BLOCK | flags, fn);
50
+ }
51
+
52
+ export function branch(fn, flags = 0) {
53
+ return block(BRANCH_BLOCK | flags, fn);
54
+ }
55
+
56
+ export function async(fn) {
57
+ return block(BRANCH_BLOCK, async () => {
58
+ const unsuspend = suspend();
59
+ await fn();
60
+ unsuspend();
61
+ });
62
+ }
63
+
64
+ export function root(fn) {
65
+ return block(ROOT_BLOCK, fn);
66
+ }
67
+
68
+ export function create_try_block(fn, state) {
69
+ return block(TRY_BLOCK, fn, state);
70
+ }
71
+
72
+ function push_block(block, parent_block) {
73
+ var parent_last = parent_block.last;
74
+ if (parent_last === null) {
75
+ parent_block.last = parent_block.first = block;
76
+ } else {
77
+ parent_last.next = block;
78
+ block.prev = parent_last;
79
+ parent_block.last = block;
80
+ }
81
+ }
82
+
83
+ export function block(flags, fn, state = null) {
84
+ var block = {
85
+ c: active_component,
86
+ d: null,
87
+ first: null,
88
+ f: flags,
89
+ fn,
90
+ last: null,
91
+ next: null,
92
+ p: active_block,
93
+ prev: null,
94
+ s: state,
95
+ t: null
96
+ };
97
+
98
+ if (active_reaction !== null && (active_reaction.f & COMPUTED) !== 0) {
99
+ (active_reaction.blocks ??= []).push(block);
100
+ }
101
+
102
+ if (active_block !== null) {
103
+ push_block(block, active_block);
104
+ }
105
+
106
+ if ((flags & EFFECT_BLOCK) !== 0) {
107
+ schedule_update(block);
108
+ } else {
109
+ run_block(block);
110
+ block.f ^= BLOCK_HAS_RUN;
111
+ }
112
+
113
+ return block;
114
+ }
115
+
116
+ export function destroy_block_children(parent, remove_dom = false) {
117
+ var block = parent.first;
118
+ parent.first = parent.last = null;
119
+
120
+ if ((parent.f & CONTAINS_TEARDOWN) !== 0) {
121
+ while (block !== null) {
122
+ var next = block.next;
123
+ destroy_block(block, remove_dom);
124
+ block = next;
125
+ }
126
+ }
127
+ }
128
+
129
+ export function destroy_non_branch_children(parent, remove_dom = false) {
130
+ var block = parent.first;
131
+
132
+ if (
133
+ (parent.f & CONTAINS_TEARDOWN) === 0 &&
134
+ parent.first !== null &&
135
+ (parent.first.f & BRANCH_BLOCK) === 0
136
+ ) {
137
+ parent.first = parent.last = null;
138
+ } else {
139
+ while (block !== null) {
140
+ var next = block.next;
141
+ if ((block.f & BRANCH_BLOCK) === 0) {
142
+ destroy_block(block, remove_dom);
143
+ }
144
+ block = next;
145
+ }
146
+ }
147
+ }
148
+
149
+ export function unlink_block(block) {
150
+ var parent = block.p;
151
+ var prev = block.prev;
152
+ var next = block.next;
153
+
154
+ if (prev !== null) prev.next = next;
155
+ if (next !== null) next.prev = prev;
156
+
157
+ if (parent !== null) {
158
+ if (parent.first === block) parent.first = next;
159
+ if (parent.last === block) parent.last = prev;
160
+ }
161
+ }
162
+
163
+ export function pause_block(block) {
164
+ if ((block.f & PAUSED) !== 0) {
165
+ return;
166
+ }
167
+ block.f ^= PAUSED;
168
+
169
+ var child = block.first;
170
+
171
+ while (child !== null) {
172
+ var next = child.next;
173
+ pause_block(child);
174
+ child = next;
175
+ }
176
+
177
+ run_teardown(block);
178
+ }
179
+
180
+ export function resume_block(block) {
181
+ if ((block.f & PAUSED) === 0) {
182
+ return;
183
+ }
184
+ block.f ^= PAUSED;
185
+
186
+ if (is_block_dirty(block)) {
187
+ schedule_update(block);
188
+ }
189
+
190
+ var child = block.first;
191
+
192
+ while (child !== null) {
193
+ var next = child.next;
194
+ resume_block(child);
195
+ child = next;
196
+ }
197
+ }
198
+
199
+ export function is_destroyed(target_block) {
200
+ var block = target_block;
201
+
202
+ while (block !== null) {
203
+ var flags = block.f;
204
+
205
+ if ((flags & DESTROYED) !== 0) {
206
+ return true;
207
+ }
208
+ if ((flags & ROOT_BLOCK) !== 0) {
209
+ return false;
210
+ }
211
+ block = block.p;
212
+ }
213
+ return true;
214
+ }
215
+
216
+ export function destroy_block(block, remove_dom = true) {
217
+ block.f ^= DESTROYED;
218
+
219
+ var removed = false;
220
+
221
+ if (remove_dom && (block.f & (BRANCH_BLOCK | ROOT_BLOCK)) !== 0) {
222
+ var node = block.s.start;
223
+ var end = block.s.end;
224
+
225
+ while (node !== null) {
226
+ var next = node === end ? null : next_sibling(node);
227
+
228
+ node.remove();
229
+ node = next;
230
+ }
231
+
232
+ removed = true;
233
+ }
234
+
235
+ destroy_block_children(block, remove_dom && !removed);
236
+
237
+ run_teardown(block);
238
+
239
+ var parent = block.p;
240
+
241
+ // If the parent doesn't have any children, then skip this work altogether
242
+ if (parent !== null && parent.first !== null) {
243
+ unlink_block(block);
244
+ }
245
+
246
+ block.fn = block.s = block.d = block.p = null;
247
+ }
@@ -0,0 +1,23 @@
1
+ export var ROOT_BLOCK = 1 << 1;
2
+ export var RENDER_BLOCK = 1 << 2;
3
+ export var EFFECT_BLOCK = 1 << 3;
4
+ export var BRANCH_BLOCK = 1 << 4;
5
+ export var FOR_BLOCK = 1 << 5;
6
+ export var TRY_BLOCK = 1 << 6;
7
+ export var IF_BLOCK = 1 << 7;
8
+ export var ASYNC_BLOCK = 1 << 8;
9
+ export var COMPAT_BLOCK = 1 << 9;
10
+ export var CONTAINS_UPDATE = 1 << 10;
11
+ export var CONTAINS_TEARDOWN = 1 << 11;
12
+ export var BLOCK_HAS_RUN = 1 << 12;
13
+ export var TRACKED = 1 << 13;
14
+ export var COMPUTED = 1 << 14;
15
+ export var DEFERRED = 1 << 15;
16
+ export var PAUSED = 1 << 16;
17
+ export var DESTROYED = 1 << 17;
18
+
19
+ export var LOGIC_BLOCK = FOR_BLOCK | IF_BLOCK | TRY_BLOCK;
20
+
21
+ export var UNINITIALIZED = Symbol();
22
+ export var TRACKED_OBJECT = Symbol();
23
+ export var COMPUTED_PROPERTY = Symbol();