@angular-wave/angular.ts 0.0.59 → 0.0.61

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 (123) hide show
  1. package/README.md +3 -0
  2. package/dist/angular-ts.esm.js +2 -2
  3. package/dist/angular-ts.umd.js +2 -2
  4. package/package.json +5 -1
  5. package/src/core/parser/lexer.html +18 -0
  6. package/src/core/parser/lexer.spec.js +300 -0
  7. package/src/core/parser/parse.js +19 -0
  8. package/src/core/parser/parser.js +1 -1
  9. package/src/core/parser/parser.test.js +19 -0
  10. package/src/core/q/q.js +46 -289
  11. package/src/core/q/q.md +229 -0
  12. package/src/core/sanitize/sanitize-uri.js +2 -3
  13. package/src/core/scope/scope.js +18 -8
  14. package/src/directive/if/if.js +6 -1
  15. package/src/filters/limit-to.js +5 -2
  16. package/src/loader.js +1 -5
  17. package/src/router/params/param-type.js +2 -1
  18. package/src/router/state/views.js +3 -0
  19. package/src/router/transition/reject-factory.js +1 -0
  20. package/src/router/url/url-rule.js +1 -1
  21. package/src/router/url/url-service.js +4 -4
  22. package/src/services/http/http.js +7 -5
  23. package/src/services/template-request.js +2 -7
  24. package/src/shared/common.js +1 -1
  25. package/src/shared/utils.js +1 -1
  26. package/src/types.js +9 -1
  27. package/types/core/parser/parse.d.ts +3 -4
  28. package/types/core/parser/parser.d.ts +1 -1
  29. package/types/core/q/q.d.ts +2 -2
  30. package/types/core/sanitize/sanitize-uri.d.ts +4 -5
  31. package/types/core/scope/scope.d.ts +19 -7
  32. package/types/loader.d.ts +0 -4
  33. package/types/router/params/param-type.d.ts +2 -1
  34. package/types/router/state/views.d.ts +2 -0
  35. package/types/router/transition/reject-factory.d.ts +1 -0
  36. package/types/router/url/url-rule.d.ts +0 -1
  37. package/types/router/url/url-service.d.ts +7 -7
  38. package/types/services/template-request.d.ts +4 -9
  39. package/types/types.d.ts +6 -1
  40. package/src/core/parser/parse.test.js +0 -12
  41. package/types-back/README.md +0 -2
  42. package/types-back/angular.d.ts +0 -146
  43. package/types-back/index.d.ts +0 -2126
  44. package/types-back/jqlite.d.ts +0 -374
  45. package/types-back/router/core/common/common.d.ts +0 -416
  46. package/types-back/router/core/common/coreservices.d.ts +0 -77
  47. package/types-back/router/core/common/glob.d.ts +0 -60
  48. package/types-back/router/core/common/hof.d.ts +0 -168
  49. package/types-back/router/core/common/index.d.ts +0 -8
  50. package/types-back/router/core/common/predicates.d.ts +0 -25
  51. package/types-back/router/core/common/queue.d.ts +0 -15
  52. package/types-back/router/core/common/safeConsole.d.ts +0 -5
  53. package/types-back/router/core/common/strings.d.ts +0 -66
  54. package/types-back/router/core/common/trace.d.ts +0 -126
  55. package/types-back/router/core/globals.d.ts +0 -43
  56. package/types-back/router/core/hooks/coreResolvables.d.ts +0 -6
  57. package/types-back/router/core/hooks/ignoredTransition.d.ts +0 -4
  58. package/types-back/router/core/hooks/invalidTransition.d.ts +0 -4
  59. package/types-back/router/core/hooks/lazyLoad.d.ts +0 -17
  60. package/types-back/router/core/hooks/onEnterExitRetain.d.ts +0 -10
  61. package/types-back/router/core/hooks/redirectTo.d.ts +0 -4
  62. package/types-back/router/core/hooks/resolve.d.ts +0 -11
  63. package/types-back/router/core/hooks/updateGlobals.d.ts +0 -4
  64. package/types-back/router/core/hooks/url.d.ts +0 -4
  65. package/types-back/router/core/hooks/views.d.ts +0 -7
  66. package/types-back/router/core/index.d.ts +0 -11
  67. package/types-back/router/core/interface.d.ts +0 -91
  68. package/types-back/router/core/params/index.d.ts +0 -12
  69. package/types-back/router/core/params/interface.d.ts +0 -606
  70. package/types-back/router/core/params/param.d.ts +0 -77
  71. package/types-back/router/core/params/paramType.d.ts +0 -65
  72. package/types-back/router/core/params/paramTypes.d.ts +0 -193
  73. package/types-back/router/core/params/stateParams.d.ts +0 -15
  74. package/types-back/router/core/path/index.d.ts +0 -2
  75. package/types-back/router/core/path/pathNode.d.ts +0 -60
  76. package/types-back/router/core/path/pathUtils.d.ts +0 -105
  77. package/types-back/router/core/resolve/index.d.ts +0 -3
  78. package/types-back/router/core/resolve/interface.d.ts +0 -210
  79. package/types-back/router/core/resolve/resolvable.d.ts +0 -75
  80. package/types-back/router/core/resolve/resolveContext.d.ts +0 -97
  81. package/types-back/router/core/router.d.ts +0 -57
  82. package/types-back/router/core/state/index.d.ts +0 -28
  83. package/types-back/router/core/state/interface.d.ts +0 -732
  84. package/types-back/router/core/state/stateBuilder.d.ts +0 -107
  85. package/types-back/router/core/state/stateMatcher.d.ts +0 -13
  86. package/types-back/router/core/state/stateObject.d.ts +0 -170
  87. package/types-back/router/core/state/stateQueueManager.d.ts +0 -27
  88. package/types-back/router/core/state/stateRegistry.d.ts +0 -138
  89. package/types-back/router/core/state/stateService.d.ts +0 -386
  90. package/types-back/router/core/state/targetState.d.ts +0 -105
  91. package/types-back/router/core/transition/hookBuilder.d.ts +0 -49
  92. package/types-back/router/core/transition/hookRegistry.d.ts +0 -115
  93. package/types-back/router/core/transition/index.d.ts +0 -20
  94. package/types-back/router/core/transition/interface.d.ts +0 -862
  95. package/types-back/router/core/transition/rejectFactory.d.ts +0 -103
  96. package/types-back/router/core/transition/transition.d.ts +0 -575
  97. package/types-back/router/core/transition/transitionEventType.d.ts +0 -26
  98. package/types-back/router/core/transition/transitionHook.d.ts +0 -96
  99. package/types-back/router/core/transition/transitionService.d.ts +0 -253
  100. package/types-back/router/core/url/index.d.ts +0 -8
  101. package/types-back/router/core/url/interface.d.ts +0 -169
  102. package/types-back/router/core/url/urlConfig.d.ts +0 -144
  103. package/types-back/router/core/url/urlMatcher.d.ts +0 -185
  104. package/types-back/router/core/url/urlMatcherFactory.d.ts +0 -56
  105. package/types-back/router/core/url/urlRouter.d.ts +0 -101
  106. package/types-back/router/core/url/urlRule.d.ts +0 -143
  107. package/types-back/router/core/url/urlRules.d.ts +0 -251
  108. package/types-back/router/core/url/urlService.d.ts +0 -205
  109. package/types-back/router/core/view/index.d.ts +0 -2
  110. package/types-back/router/core/view/interface.d.ts +0 -46
  111. package/types-back/router/core/view/view.d.ts +0 -176
  112. package/types-back/router/directives/viewDirective.d.ts +0 -144
  113. package/types-back/router/index.d.ts +0 -17
  114. package/types-back/router/interface.d.ts +0 -500
  115. package/types-back/router/legacy/resolveService.d.ts +0 -47
  116. package/types-back/router/legacy/stateEvents.d.ts +0 -124
  117. package/types-back/router/services.d.ts +0 -15
  118. package/types-back/router/stateFilters.d.ts +0 -10
  119. package/types-back/router/stateProvider.d.ts +0 -258
  120. package/types-back/router/statebuilders/onEnterExitRetain.d.ts +0 -13
  121. package/types-back/router/statebuilders/views.d.ts +0 -53
  122. package/types-back/router/templateFactory.d.ts +0 -104
  123. package/types-back/router/viewScroll.d.ts +0 -9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@angular-wave/angular.ts",
3
3
  "license": "MIT",
4
- "version": "0.0.59",
4
+ "version": "0.0.61",
5
5
  "type": "module",
6
6
  "main": "dist/angular-ts.esm.js",
7
7
  "browser": "dist/angular-ts.umd.js",
@@ -9,6 +9,10 @@
9
9
  "type": "git",
10
10
  "url": "https://github.com/Angular-Wave/angular.ts.git"
11
11
  },
12
+ "keywords": [
13
+ "AngularJS",
14
+ "AngularTS"
15
+ ],
12
16
  "engines": {
13
17
  "node": ">=18.18.2"
14
18
  },
@@ -0,0 +1,18 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>AngularTS Test Runner</title>
6
+
7
+ <link rel="shortcut icon" type="image/png" href="/images/favicon.ico" />
8
+ <link rel="stylesheet" href="/jasmine/jasmine-5.1.2/jasmine.css" />
9
+ <script src="/jasmine/jasmine-5.1.2/jasmine.js"></script>
10
+ <script src="/jasmine/jasmine-5.1.2/jasmine-html.js"></script>
11
+ <script src="/jasmine/jasmine-5.1.2/boot0.js"></script>
12
+ <script src="/jasmine/jasmine-5.1.2/boot1.js"></script>
13
+ <script type="module" src="/src/core/parser/lexer.spec.js"></script>
14
+ </head>
15
+ <body>
16
+ <div id="dummy"></div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,300 @@
1
+ import { Lexer } from "./lexer";
2
+ import { publishExternalAPI } from "../../public";
3
+ import { createInjector } from "../../injector";
4
+
5
+ describe("lexer", () => {
6
+ let $rootScope;
7
+ let $parse;
8
+ let logs = [];
9
+
10
+ beforeEach(() => {
11
+ publishExternalAPI().decorator("$exceptionHandler", function () {
12
+ return (exception, cause) => {
13
+ logs.push(exception);
14
+ console.error(exception, cause);
15
+ };
16
+ });
17
+ let injector = createInjector(["ng"]);
18
+ $parse = injector.get("$parse");
19
+ $rootScope = injector.get("$rootScope");
20
+ });
21
+
22
+ describe("lexer", () => {
23
+ let lex;
24
+
25
+ beforeEach(() => {
26
+ lex = function () {
27
+ const lexer = new Lexer({});
28
+ return lexer.lex.apply(lexer, arguments);
29
+ };
30
+ });
31
+
32
+ it("should only match number chars with isNumber", () => {
33
+ expect(Lexer.prototype.isNumber("0")).toBe(true);
34
+ expect(Lexer.prototype.isNumber("")).toBeFalsy();
35
+ expect(Lexer.prototype.isNumber(" ")).toBeFalsy();
36
+ expect(Lexer.prototype.isNumber(0)).toBeFalsy();
37
+ expect(Lexer.prototype.isNumber(false)).toBeFalsy();
38
+ expect(Lexer.prototype.isNumber(true)).toBeFalsy();
39
+ expect(Lexer.prototype.isNumber(undefined)).toBeFalsy();
40
+ expect(Lexer.prototype.isNumber(null)).toBeFalsy();
41
+ });
42
+
43
+ it("should tokenize a string", () => {
44
+ const tokens = lex("a.bc[22]+1.3|f:'a\\'c':\"d\\\"e\"");
45
+ let i = 0;
46
+ expect(tokens[i].index).toEqual(0);
47
+ expect(tokens[i].text).toEqual("a");
48
+
49
+ i++;
50
+ expect(tokens[i].index).toEqual(1);
51
+ expect(tokens[i].text).toEqual(".");
52
+
53
+ i++;
54
+ expect(tokens[i].index).toEqual(2);
55
+ expect(tokens[i].text).toEqual("bc");
56
+
57
+ i++;
58
+ expect(tokens[i].index).toEqual(4);
59
+ expect(tokens[i].text).toEqual("[");
60
+
61
+ i++;
62
+ expect(tokens[i].index).toEqual(5);
63
+ expect(tokens[i].text).toEqual("22");
64
+ expect(tokens[i].value).toEqual(22);
65
+ expect(tokens[i].constant).toEqual(true);
66
+
67
+ i++;
68
+ expect(tokens[i].index).toEqual(7);
69
+ expect(tokens[i].text).toEqual("]");
70
+
71
+ i++;
72
+ expect(tokens[i].index).toEqual(8);
73
+ expect(tokens[i].text).toEqual("+");
74
+
75
+ i++;
76
+ expect(tokens[i].index).toEqual(9);
77
+ expect(tokens[i].text).toEqual("1.3");
78
+ expect(tokens[i].value).toEqual(1.3);
79
+ expect(tokens[i].constant).toEqual(true);
80
+
81
+ i++;
82
+ expect(tokens[i].index).toEqual(12);
83
+ expect(tokens[i].text).toEqual("|");
84
+
85
+ i++;
86
+ expect(tokens[i].index).toEqual(13);
87
+ expect(tokens[i].text).toEqual("f");
88
+
89
+ i++;
90
+ expect(tokens[i].index).toEqual(14);
91
+ expect(tokens[i].text).toEqual(":");
92
+
93
+ i++;
94
+ expect(tokens[i].index).toEqual(15);
95
+ expect(tokens[i].value).toEqual("a'c");
96
+
97
+ i++;
98
+ expect(tokens[i].index).toEqual(21);
99
+ expect(tokens[i].text).toEqual(":");
100
+
101
+ i++;
102
+ expect(tokens[i].index).toEqual(22);
103
+ expect(tokens[i].value).toEqual('d"e');
104
+ });
105
+
106
+ it("should tokenize identifiers with spaces around dots the same as without spaces", () => {
107
+ function getText(t) {
108
+ return t.text;
109
+ }
110
+ const spaces = lex("foo. bar . baz").map(getText);
111
+ const noSpaces = lex("foo.bar.baz").map(getText);
112
+
113
+ expect(spaces).toEqual(noSpaces);
114
+ });
115
+
116
+ it("should use callback functions to know when an identifier is valid", () => {
117
+ function getText(t) {
118
+ return t.text;
119
+ }
120
+ const isIdentifierStart = jasmine.createSpy("start");
121
+ const isIdentifierContinue = jasmine.createSpy("continue");
122
+ isIdentifierStart.and.returnValue(true);
123
+ const lex = new Lexer({
124
+ isIdentifierStart,
125
+ isIdentifierContinue,
126
+ });
127
+
128
+ isIdentifierContinue.and.returnValue(true);
129
+ let tokens = lex.lex("πΣε").map(getText);
130
+ expect(tokens).toEqual(["πΣε"]);
131
+
132
+ isIdentifierContinue.and.returnValue(false);
133
+ tokens = lex.lex("πΣε").map(getText);
134
+ expect(tokens).toEqual(["π", "Σ", "ε"]);
135
+ });
136
+
137
+ it("should send the unicode characters and code points", () => {
138
+ function getText(t) {
139
+ return t.text;
140
+ }
141
+ const isIdentifierStart = jasmine.createSpy("start");
142
+ const isIdentifierContinue = jasmine.createSpy("continue");
143
+ isIdentifierStart.and.returnValue(true);
144
+ isIdentifierContinue.and.returnValue(true);
145
+ const lex = new Lexer({
146
+ isIdentifierStart,
147
+ isIdentifierContinue,
148
+ });
149
+ const tokens = lex.lex("\uD801\uDC37\uD852\uDF62\uDBFF\uDFFF");
150
+ expect(isIdentifierStart).toHaveBeenCalledTimes(1);
151
+ expect(isIdentifierStart.calls.argsFor(0)).toEqual([
152
+ "\uD801\uDC37",
153
+ 0x10437,
154
+ ]);
155
+ expect(isIdentifierContinue).toHaveBeenCalledTimes(2);
156
+ expect(isIdentifierContinue.calls.argsFor(0)).toEqual([
157
+ "\uD852\uDF62",
158
+ 0x24b62,
159
+ ]);
160
+ expect(isIdentifierContinue.calls.argsFor(1)).toEqual([
161
+ "\uDBFF\uDFFF",
162
+ 0x10ffff,
163
+ ]);
164
+ });
165
+
166
+ it("should tokenize undefined", () => {
167
+ const tokens = lex("undefined");
168
+ const i = 0;
169
+ expect(tokens[i].index).toEqual(0);
170
+ expect(tokens[i].text).toEqual("undefined");
171
+ });
172
+
173
+ it("should tokenize quoted string", () => {
174
+ const str = "['\\'', \"\\\"\"]";
175
+ const tokens = lex(str);
176
+
177
+ expect(tokens[1].index).toEqual(1);
178
+ expect(tokens[1].value).toEqual("'");
179
+
180
+ expect(tokens[3].index).toEqual(7);
181
+ expect(tokens[3].value).toEqual('"');
182
+ });
183
+
184
+ it("should tokenize escaped quoted string", () => {
185
+ const str = '"\\"\\n\\f\\r\\t\\v\\u00A0"';
186
+ const tokens = lex(str);
187
+
188
+ expect(tokens[0].value).toEqual('"\n\f\r\t\v\u00A0');
189
+ });
190
+
191
+ it("should tokenize unicode", () => {
192
+ const tokens = lex('"\\u00A0"');
193
+ expect(tokens.length).toEqual(1);
194
+ expect(tokens[0].value).toEqual("\u00a0");
195
+ });
196
+
197
+ it("should ignore whitespace", () => {
198
+ const tokens = lex("a \t \n \r b");
199
+ expect(tokens[0].text).toEqual("a");
200
+ expect(tokens[1].text).toEqual("b");
201
+ });
202
+
203
+ it("should tokenize relation and equality", () => {
204
+ const tokens = lex("! == != < > <= >= === !==");
205
+ expect(tokens[0].text).toEqual("!");
206
+ expect(tokens[1].text).toEqual("==");
207
+ expect(tokens[2].text).toEqual("!=");
208
+ expect(tokens[3].text).toEqual("<");
209
+ expect(tokens[4].text).toEqual(">");
210
+ expect(tokens[5].text).toEqual("<=");
211
+ expect(tokens[6].text).toEqual(">=");
212
+ expect(tokens[7].text).toEqual("===");
213
+ expect(tokens[8].text).toEqual("!==");
214
+ });
215
+
216
+ it("should tokenize logical and ternary", () => {
217
+ const tokens = lex("&& || ? :");
218
+ expect(tokens[0].text).toEqual("&&");
219
+ expect(tokens[1].text).toEqual("||");
220
+ expect(tokens[2].text).toEqual("?");
221
+ expect(tokens[3].text).toEqual(":");
222
+ });
223
+
224
+ it("should tokenize statements", () => {
225
+ const tokens = lex("a;b;");
226
+ expect(tokens[0].text).toEqual("a");
227
+ expect(tokens[1].text).toEqual(";");
228
+ expect(tokens[2].text).toEqual("b");
229
+ expect(tokens[3].text).toEqual(";");
230
+ });
231
+
232
+ it("should tokenize function invocation", () => {
233
+ const tokens = lex("a()");
234
+ expect(tokens.map((t) => t.text)).toEqual(["a", "(", ")"]);
235
+ });
236
+
237
+ it("should tokenize method invocation", () => {
238
+ const tokens = lex("a.b.c (d) - e.f()");
239
+ expect(tokens.map((t) => t.text)).toEqual([
240
+ "a",
241
+ ".",
242
+ "b",
243
+ ".",
244
+ "c",
245
+ "(",
246
+ "d",
247
+ ")",
248
+ "-",
249
+ "e",
250
+ ".",
251
+ "f",
252
+ "(",
253
+ ")",
254
+ ]);
255
+ });
256
+
257
+ it("should tokenize number", () => {
258
+ const tokens = lex("0.5");
259
+ expect(tokens[0].value).toEqual(0.5);
260
+ });
261
+
262
+ it("should tokenize negative number", () => {
263
+ let value = $rootScope.$eval("-0.5");
264
+ expect(value).toEqual(-0.5);
265
+
266
+ value = $rootScope.$eval("{a:-0.5}");
267
+ expect(value).toEqual({ a: -0.5 });
268
+ });
269
+
270
+ it("should tokenize number with exponent", () => {
271
+ let tokens = lex("0.5E-10");
272
+ expect(tokens[0].value).toEqual(0.5e-10);
273
+ expect($rootScope.$eval("0.5E-10")).toEqual(0.5e-10);
274
+
275
+ tokens = lex("0.5E+10");
276
+ expect(tokens[0].value).toEqual(0.5e10);
277
+ });
278
+
279
+ it("should throws exception for invalid exponent", () => {
280
+ expect(() => {
281
+ lex("0.5E-");
282
+ }).toThrowError(/lexerr/);
283
+
284
+ expect(() => {
285
+ lex("0.5E-A");
286
+ }).toThrowError(/lexerr/);
287
+ });
288
+
289
+ it("should tokenize number starting with a dot", () => {
290
+ const tokens = lex(".5");
291
+ expect(tokens[0].value).toEqual(0.5);
292
+ });
293
+
294
+ it("should throw error on invalid unicode", () => {
295
+ expect(() => {
296
+ lex("'\\u1''bla'");
297
+ }).toThrowError(/lexerr/);
298
+ });
299
+ });
300
+ });
@@ -9,6 +9,7 @@ import { Parser } from "./parser";
9
9
  * @property {boolean} constant - Indicates if the expression is constant.
10
10
  * @property {boolean} isPure
11
11
  * @property {boolean} oneTime
12
+ * @property {function(import('../scope/scope').Scope, import('../scope/scope').WatchListener, boolean, CompiledExpression, string | ((scope: import('../scope/scope').Scope) => any)): any} $$watchDelegate
12
13
  * @property {any[]} inputs
13
14
  * @property {function(any, any): any} assign - Assigns a value to a context. If value is not provided,
14
15
  */
@@ -69,6 +70,11 @@ export function $ParseProvider() {
69
70
 
70
71
  this.$get = [
71
72
  "$filter",
73
+ /**
74
+ *
75
+ * @param {(any) => any} $filter
76
+ * @returns {ParseService}
77
+ */
72
78
  function ($filter) {
73
79
  /** @type {import("./lexer").LexerOptions} */
74
80
  var $lexerOptions = {
@@ -193,6 +199,11 @@ export function constantWatchDelegate(
193
199
  return unwatch;
194
200
  }
195
201
 
202
+ /**
203
+ *
204
+ * @param {CompiledExpression} parsedExpression
205
+ * @returns {CompiledExpression}
206
+ */
196
207
  function addWatchDelegate(parsedExpression) {
197
208
  if (parsedExpression.constant) {
198
209
  parsedExpression.$$watchDelegate = constantWatchDelegate;
@@ -205,6 +216,14 @@ function addWatchDelegate(parsedExpression) {
205
216
  return parsedExpression;
206
217
  }
207
218
 
219
+ /**
220
+ *
221
+ * @param {import('../scope/scope').Scope} scope
222
+ * @param {import('../scope/scope').WatchListener} listener
223
+ * @param {*} objectEquality
224
+ * @param {CompiledExpression} parsedExpression
225
+ * @returns
226
+ */
208
227
  function inputsWatchDelegate(
209
228
  scope,
210
229
  listener,
@@ -28,7 +28,7 @@ export class Parser {
28
28
  /**
29
29
  *
30
30
  * @param {string} exp - Expression to be parsed
31
- * @returns
31
+ * @returns {import("./parse").CompiledExpression}
32
32
  */
33
33
  parse(exp) {
34
34
  const { ast, oneTime } = this.getAst(exp);
@@ -0,0 +1,19 @@
1
+ import { test, expect } from "@playwright/test";
2
+
3
+ test("lexer unit tests contain no errors", async ({ page }) => {
4
+ await page.goto("src/core/parser/lexer.html");
5
+ await page.content();
6
+ await page.waitForTimeout(100);
7
+ await expect(page.locator(".jasmine-overall-result")).toHaveText(
8
+ /0 failures/,
9
+ );
10
+ });
11
+
12
+ test("parser unit tests contain no errors", async ({ page }) => {
13
+ await page.goto("src/core/parser/parse.html");
14
+ await page.content();
15
+ await page.waitForTimeout(100);
16
+ await expect(page.locator(".jasmine-overall-result")).toHaveText(
17
+ /0 failures/,
18
+ );
19
+ });