From 6a2e5d2bb28f4a9b19052a0287b3cd2dad9bce16 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Tue, 9 Jan 2024 16:24:13 -0500 Subject: [PATCH] Rework the `trackedTask` implementation to use a function-based resource. --- pnpm-lock.yaml | 294 ++++++++++----------------- reactiveweb/package.json | 2 +- reactiveweb/src/ember-concurrency.ts | 182 +++++++---------- tests/test-app/package.json | 8 +- 4 files changed, 189 insertions(+), 297 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca01312..f03a1e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,8 +63,8 @@ importers: specifier: ^1.0.3 version: 1.0.3(ember-source@5.5.0) ember-resources: - specifier: ^6.4.2 - version: 6.4.2(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-source@5.5.0) + specifier: '>= 6.4.2' + version: 6.5.1(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-source@5.5.0) devDependencies: '@babel/core': specifier: ^7.23.2 @@ -201,13 +201,13 @@ importers: version: 3.2.1(@glint/template@1.2.1)(ember-source@3.28.12)(webpack@5.89.0) '@embroider/compat': specifier: ^3.2.3 - version: 3.2.3(@embroider/core@3.3.0)(@glint/template@1.2.1) + version: 3.4.3(@embroider/core@3.4.3)(@glint/template@1.2.1) '@embroider/core': specifier: ^3.3.0 - version: 3.3.0(@glint/template@1.2.1) + version: 3.4.3(@glint/template@1.2.1) '@embroider/webpack': specifier: ^3.2.0 - version: 3.2.0(@embroider/core@3.3.0)(webpack@5.89.0) + version: 3.2.1(@embroider/core@3.4.3)(webpack@5.89.0) '@glimmer/component': specifier: ^1.1.2 version: 1.1.2(@babel/core@7.23.7) @@ -246,7 +246,7 @@ importers: version: 0.7.1 ember-auto-import: specifier: ^2.6.3 - version: 2.6.3(@glint/template@1.2.1)(webpack@5.89.0) + version: 2.7.2(@glint/template@1.2.1)(webpack@5.89.0) ember-cli: specifier: ~4.12.1 version: 4.12.2 @@ -396,14 +396,14 @@ importers: specifier: ^3.2.1 version: 3.2.1(@glint/template@1.2.1)(ember-source@5.4.0)(webpack@5.89.0) '@embroider/compat': - specifier: ^3.2.3 - version: 3.2.3(@embroider/core@3.3.0)(@glint/template@1.2.1) + specifier: ^3.4.3 + version: 3.4.3(@embroider/core@3.4.3)(@glint/template@1.2.1) '@embroider/core': - specifier: ^3.3.0 - version: 3.3.0(@glint/template@1.2.1) + specifier: ^3.4.3 + version: 3.4.3(@glint/template@1.2.1) '@embroider/webpack': - specifier: ^3.2.0 - version: 3.2.0(@embroider/core@3.3.0)(webpack@5.89.0) + specifier: ^3.2.1 + version: 3.2.1(@embroider/core@3.4.3)(webpack@5.89.0) '@glimmer/component': specifier: ^1.1.2 version: 1.1.2(@babel/core@7.23.7) @@ -444,8 +444,8 @@ importers: specifier: ^8.2.2 version: 8.2.2 ember-auto-import: - specifier: ^2.6.3 - version: 2.6.3(@glint/template@1.2.1)(webpack@5.89.0) + specifier: ^2.7.2 + version: 2.7.2(@glint/template@1.2.1)(webpack@5.89.0) ember-cli: specifier: ~5.4.0 version: 5.4.0 @@ -677,6 +677,23 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.7): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} engines: {node: '>=6.9.0'} @@ -894,7 +911,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.23.7): @@ -916,7 +933,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): @@ -936,7 +953,7 @@ packages: dependencies: '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) @@ -965,15 +982,6 @@ packages: '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.7): - resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} @@ -1099,6 +1107,15 @@ packages: '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} @@ -1175,7 +1192,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7): @@ -1185,7 +1202,7 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) @@ -1483,7 +1500,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.7): @@ -1494,7 +1511,7 @@ packages: dependencies: '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) @@ -1607,7 +1624,7 @@ packages: dependencies: '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.7) dev: true /@babel/plugin-transform-typescript@7.5.5(@babel/core@7.23.7): @@ -1616,9 +1633,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.7) /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.7): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} @@ -1778,7 +1795,7 @@ packages: resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.1 + regenerator-runtime: 0.14.0 /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} @@ -1938,7 +1955,7 @@ packages: '@simple-dom/interface': 1.4.0 broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 - ember-auto-import: 2.6.3(@glint/template@1.2.1)(webpack@5.89.0) + ember-auto-import: 2.7.2(@glint/template@1.2.1)(webpack@5.89.0) ember-cli-babel: 7.26.11 ember-cli-htmlbars: 6.3.0 ember-source: 3.28.12(@babel/core@7.23.7) @@ -1959,7 +1976,7 @@ packages: '@simple-dom/interface': 1.4.0 broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 - ember-auto-import: 2.6.3(@glint/template@1.2.1)(webpack@5.89.0) + ember-auto-import: 2.7.2(@glint/template@1.2.1)(webpack@5.89.0) ember-cli-babel: 7.26.11 ember-cli-htmlbars: 6.3.0 ember-source: 5.4.0(@babel/core@7.23.7)(@glimmer/component@1.1.2)(@glint/template@1.2.1)(webpack@5.89.0) @@ -2013,26 +2030,26 @@ packages: transitivePeerDependencies: - supports-color - /@embroider/babel-loader-9@3.1.0(@embroider/core@3.3.0)(supports-color@8.1.1)(webpack@5.89.0): - resolution: {integrity: sha512-TEOaOAsci15Zc3qh8kFAt/XpAsKjw/DzS/1+dv7yNGOeEgqImux+RoZ7DkZkVZNeuA0eAonpY79B+B0J17Us5g==} + /@embroider/babel-loader-9@3.1.1(@embroider/core@3.4.3)(supports-color@8.1.1)(webpack@5.89.0): + resolution: {integrity: sha512-8mIDRXvwntYIQc2JFVvGXEppHUJRhw+6aEzHtbCZDr4oOKw55IyY+RHzas3JILRq64owLA+Ox0yu6nkwL1ApRQ==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: - '@embroider/core': ^3.3.0 + '@embroider/core': ^3.4.0 dependencies: '@babel/core': 7.23.7(supports-color@8.1.1) - '@embroider/core': 3.3.0(@glint/template@1.2.1) + '@embroider/core': 3.4.3(@glint/template@1.2.1) babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.89.0) transitivePeerDependencies: - supports-color - webpack dev: true - /@embroider/compat@3.2.3(@embroider/core@3.3.0)(@glint/template@1.2.1): - resolution: {integrity: sha512-sszGNEqi3EiAY6uJesfiCgXwuZwGzdHXmjpiQIoSqJn/kVIRlHi220fGIIX6rJBWW2SAUO6pvTBE8VO89InDWw==} + /@embroider/compat@3.4.3(@embroider/core@3.4.3)(@glint/template@1.2.1): + resolution: {integrity: sha512-b0O0T+QNmpGGDPnrpkwiZ0JI5ltt7O+iQo17cqzFyULnEZA9XCUW94aM4rQa7JT9NOQ1FQbLzV6pTh0vaf80Sg==} engines: {node: 12.* || 14.* || >= 16} hasBin: true peerDependencies: - '@embroider/core': ^3.3.0 + '@embroider/core': ^3.4.3 dependencies: '@babel/code-frame': 7.23.5 '@babel/core': 7.23.7 @@ -2041,8 +2058,8 @@ packages: '@babel/preset-env': 7.23.2(@babel/core@7.23.7) '@babel/runtime': 7.23.8 '@babel/traverse': 7.23.7 - '@embroider/core': 3.3.0(@glint/template@1.2.1) - '@embroider/macros': 1.13.2(@glint/template@1.2.1) + '@embroider/core': 3.4.3(@glint/template@1.2.1) + '@embroider/macros': 1.13.4(@glint/template@1.2.1) '@types/babel__code-frame': 7.0.5 '@types/yargs': 17.0.29 assert-never: 1.2.1 @@ -2084,42 +2101,6 @@ packages: - utf-8-validate dev: true - /@embroider/core@3.3.0(@glint/template@1.2.1): - resolution: {integrity: sha512-QkOLFB3DUuDg6DU7qNAKFNJUyzgmjWNiRLcyrhThYgWeN5h8ilatG3sl5atBN6Jh3wCIJmhjXagafkA82a0abQ==} - engines: {node: 12.* || 14.* || >= 16} - dependencies: - '@babel/core': 7.23.7 - '@babel/parser': 7.23.6 - '@babel/traverse': 7.23.7 - '@embroider/macros': 1.13.2(@glint/template@1.2.1) - '@embroider/shared-internals': 2.5.0 - assert-never: 1.2.1 - babel-plugin-ember-template-compilation: 2.2.0 - broccoli-node-api: 1.7.0 - broccoli-persistent-filter: 3.1.3 - broccoli-plugin: 4.0.7 - broccoli-source: 3.0.1 - debug: 4.3.4(supports-color@9.4.0) - fast-sourcemap-concat: 1.4.0 - filesize: 10.1.0 - fs-extra: 9.1.0 - fs-tree-diff: 2.0.1 - handlebars: 4.7.8 - js-string-escape: 1.0.1 - jsdom: 16.7.0 - lodash: 4.17.21 - resolve: 1.22.8 - resolve-package-path: 4.0.3 - typescript-memoize: 1.1.1 - walk-sync: 3.0.0 - transitivePeerDependencies: - - '@glint/template' - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /@embroider/core@3.4.3(@glint/template@1.2.1): resolution: {integrity: sha512-mTcpB0fDtOdTqfJTznXgDspLjgF11WEvA0/vLo19TkYMQ0X4ZyBFP/wCiqYnXLDOYnnZDXSz0l3Z5PGx/iyt9Q==} engines: {node: 12.* || 14.* || >= 16} @@ -2156,42 +2137,20 @@ packages: - utf-8-validate dev: true - /@embroider/hbs-loader@3.0.2(@embroider/core@3.3.0)(webpack@5.89.0): - resolution: {integrity: sha512-uN0w4rbes0xJUvC8YrhkwoTEbMD5wIMPMWF8+3BnLmHcATSFZ34hEmOGorgBB1lLAkv5Vo7xhBulWGwigEvBUg==} + /@embroider/hbs-loader@3.0.3(@embroider/core@3.4.3)(webpack@5.89.0): + resolution: {integrity: sha512-sI2K3/III1WGGxS+aIf8uW5tgcNiE7APNhThn2ZTwqU47fK20Uz8TJZhst0GfNZFsCsmuQMRUikRJvQU8naSWA==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: - '@embroider/core': ^3.2.0 + '@embroider/core': ^3.4.0 webpack: ^5 peerDependenciesMeta: webpack: optional: true dependencies: - '@embroider/core': 3.3.0(@glint/template@1.2.1) + '@embroider/core': 3.4.3(@glint/template@1.2.1) webpack: 5.89.0 dev: true - /@embroider/macros@1.13.2(@glint/template@1.2.1): - resolution: {integrity: sha512-AUgJ71xG8kjuTx8XB1AQNBiebJuXRfhcHr318dCwnQz9VRXdYSnEEqf38XRvGYIoCvIyn/3c72LrSwzaJqknOA==} - engines: {node: 12.* || 14.* || >= 16} - peerDependencies: - '@glint/template': ^1.0.0 - peerDependenciesMeta: - '@glint/template': - optional: true - dependencies: - '@embroider/shared-internals': 2.5.0 - '@glint/template': 1.2.1 - assert-never: 1.2.1 - babel-import-util: 2.0.1 - ember-cli-babel: 7.26.11 - find-up: 5.0.0 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /@embroider/macros@1.13.4(@glint/template@1.2.1): resolution: {integrity: sha512-A6tXvfwnscx66QO0R3c2dIJwEltfsTL4ihsYjMtgP9ODCCmQlCaRlZDQYw5Drta0ER9Fj3nXntu4naV5Wt5XLA==} engines: {node: 12.* || 14.* || >= 16} @@ -2213,8 +2172,8 @@ packages: transitivePeerDependencies: - supports-color - /@embroider/shared-internals@2.5.0: - resolution: {integrity: sha512-7qzrb7GVIyNqeY0umxoeIvjDC+ay1b+wb2yCVuYTUYrFfLAkLEy9FNI3iWCi3RdQ9OFjgcAxAnwsAiPIMZZ3pQ==} + /@embroider/shared-internals@2.5.1: + resolution: {integrity: sha512-b+TWDBisH1p6HeTbJIO8pgu1WzfTP0ZSAlZBqjXwOyrS0ZxP1qNYRrEX+IxyzIibEFjXBxeLakiejz3DJvZX5A==} engines: {node: 12.* || 14.* || >= 16} dependencies: babel-import-util: 2.0.1 @@ -2228,10 +2187,9 @@ packages: typescript-memoize: 1.1.1 transitivePeerDependencies: - supports-color - dev: true - /@embroider/shared-internals@2.5.0(supports-color@8.1.1): - resolution: {integrity: sha512-7qzrb7GVIyNqeY0umxoeIvjDC+ay1b+wb2yCVuYTUYrFfLAkLEy9FNI3iWCi3RdQ9OFjgcAxAnwsAiPIMZZ3pQ==} + /@embroider/shared-internals@2.5.1(supports-color@8.1.1): + resolution: {integrity: sha512-b+TWDBisH1p6HeTbJIO8pgu1WzfTP0ZSAlZBqjXwOyrS0ZxP1qNYRrEX+IxyzIibEFjXBxeLakiejz3DJvZX5A==} engines: {node: 12.* || 14.* || >= 16} dependencies: babel-import-util: 2.0.1 @@ -2247,37 +2205,21 @@ packages: - supports-color dev: true - /@embroider/shared-internals@2.5.1: - resolution: {integrity: sha512-b+TWDBisH1p6HeTbJIO8pgu1WzfTP0ZSAlZBqjXwOyrS0ZxP1qNYRrEX+IxyzIibEFjXBxeLakiejz3DJvZX5A==} - engines: {node: 12.* || 14.* || >= 16} - dependencies: - babel-import-util: 2.0.1 - debug: 4.3.4(supports-color@9.4.0) - ember-rfc176-data: 0.3.18 - fs-extra: 9.1.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - resolve-package-path: 4.0.3 - semver: 7.5.4 - typescript-memoize: 1.1.1 - transitivePeerDependencies: - - supports-color - - /@embroider/webpack@3.2.0(@embroider/core@3.3.0)(webpack@5.89.0): - resolution: {integrity: sha512-+H2NjbExiZBY1m3bj2WRmd+1WxndcMiITwa7CuUnq84iOSzQ7T7DWuSB3FLkFfkKeO/4x40pHV0QilzD9ldlZQ==} + /@embroider/webpack@3.2.1(@embroider/core@3.4.3)(webpack@5.89.0): + resolution: {integrity: sha512-bTm1CWCK0Jln6XH0rmZv+MrhR3XIpUgsZsN+6KRnP0Yna9YHa1/ix3rBzn3ke/3yapzA5dqdXVjCUN0XDFMp/g==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: - '@embroider/core': ^3.3.0 + '@embroider/core': ^3.4.0 webpack: ^5.0.0 peerDependenciesMeta: webpack: optional: true dependencies: '@babel/core': 7.23.7(supports-color@8.1.1) - '@embroider/babel-loader-9': 3.1.0(@embroider/core@3.3.0)(supports-color@8.1.1)(webpack@5.89.0) - '@embroider/core': 3.3.0(@glint/template@1.2.1) - '@embroider/hbs-loader': 3.0.2(@embroider/core@3.3.0)(webpack@5.89.0) - '@embroider/shared-internals': 2.5.0(supports-color@8.1.1) + '@embroider/babel-loader-9': 3.1.1(@embroider/core@3.4.3)(supports-color@8.1.1)(webpack@5.89.0) + '@embroider/core': 3.4.3(@glint/template@1.2.1) + '@embroider/hbs-loader': 3.0.3(@embroider/core@3.4.3)(webpack@5.89.0) + '@embroider/shared-internals': 2.5.1(supports-color@8.1.1) '@types/supports-color': 8.1.2 assert-never: 1.2.1 babel-loader: 8.3.0(@babel/core@7.23.7)(webpack@5.89.0) @@ -3532,7 +3474,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 4.9.5 @@ -3721,20 +3663,16 @@ packages: resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} dependencies: '@types/eslint': 8.44.6 - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 /@types/eslint@8.44.6: resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 '@types/json-schema': 7.0.14 - /@types/estree@1.0.3: - resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true /@types/express-serve-static-core@4.17.39: resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} @@ -7218,13 +7156,15 @@ packages: - supports-color dev: false - /ember-auto-import@2.6.3(@glint/template@1.2.1): - resolution: {integrity: sha512-uLhrRDJYWCRvQ4JQ1e64XlSrqAKSd6PXaJ9ZsZI6Tlms9T4DtQFxNXasqji2ZRJBVrxEoLCRYX3RTldsQ0vNGQ==} + /ember-auto-import@2.7.2(@glint/template@1.2.1): + resolution: {integrity: sha512-pkWIljmJClYL17YBk8FjO7NrZPQoY9v0b+FooJvaHf/xlDQIBYVP7OaDHbNuNbpj7+wAwSDAnnwxjCoLsmm4cw==} engines: {node: 12.* || 14.* || >= 16} dependencies: '@babel/core': 7.23.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.7) '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7) '@babel/preset-env': 7.23.2(@babel/core@7.23.7) '@embroider/macros': 1.13.4(@glint/template@1.2.1) '@embroider/shared-internals': 2.5.1 @@ -7246,6 +7186,7 @@ packages: js-string-escape: 1.0.1 lodash: 4.17.21 mini-css-extract-plugin: 2.7.6(webpack@5.89.0) + minimatch: 3.1.2 parse5: 6.0.1 resolve: 1.22.8 resolve-package-path: 4.0.3 @@ -7258,13 +7199,15 @@ packages: - supports-color - webpack - /ember-auto-import@2.6.3(@glint/template@1.2.1)(webpack@5.89.0): - resolution: {integrity: sha512-uLhrRDJYWCRvQ4JQ1e64XlSrqAKSd6PXaJ9ZsZI6Tlms9T4DtQFxNXasqji2ZRJBVrxEoLCRYX3RTldsQ0vNGQ==} + /ember-auto-import@2.7.2(@glint/template@1.2.1)(webpack@5.89.0): + resolution: {integrity: sha512-pkWIljmJClYL17YBk8FjO7NrZPQoY9v0b+FooJvaHf/xlDQIBYVP7OaDHbNuNbpj7+wAwSDAnnwxjCoLsmm4cw==} engines: {node: 12.* || 14.* || >= 16} dependencies: '@babel/core': 7.23.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.7) '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7) '@babel/preset-env': 7.23.2(@babel/core@7.23.7) '@embroider/macros': 1.13.4(@glint/template@1.2.1) '@embroider/shared-internals': 2.5.1 @@ -7286,6 +7229,7 @@ packages: js-string-escape: 1.0.1 lodash: 4.17.21 mini-css-extract-plugin: 2.7.6(webpack@5.89.0) + minimatch: 3.1.2 parse5: 6.0.1 resolve: 1.22.8 resolve-package-path: 4.0.3 @@ -8203,8 +8147,8 @@ packages: - supports-color dev: true - /ember-resources@6.4.2(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-source@5.5.0): - resolution: {integrity: sha512-B1OLdSpekdiyk/yfHc+aJF3ovI6rskwJOLzd+iX60RTyicO9Nsjw8LU9XI95uk4AOqO0MbSXogQ/MsN/mIPzOw==} + /ember-resources@6.5.1(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-concurrency@3.1.1)(ember-source@3.28.12): + resolution: {integrity: sha512-8eEdbSE0sioqjpB2CWw/dKF4Ftfe9tbebuSUfMDBmP3xxTIvxTDbvDnbd8A0IbQ0z/iQt6Va+/5cadzvkbMZtg==} peerDependencies: '@ember/test-waiters': ^3.0.0 '@glimmer/component': ^1.1.2 @@ -8227,13 +8171,13 @@ packages: '@glimmer/component': 1.1.2(@babel/core@7.23.7) '@glimmer/tracking': 1.1.2 '@glint/template': 1.2.1 - ember-async-data: 1.0.3(ember-source@5.5.0) - ember-source: 5.5.0(@babel/core@7.23.7)(@glimmer/component@1.1.2)(@glint/template@1.2.1) + ember-async-data: 1.0.3(ember-source@3.28.12) + ember-concurrency: 3.1.1(@babel/core@7.23.7)(ember-source@3.28.12) + ember-source: 3.28.12(@babel/core@7.23.7) transitivePeerDependencies: - supports-color - dev: false - /ember-resources@6.5.1(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-concurrency@3.1.1)(ember-source@3.28.12): + /ember-resources@6.5.1(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-concurrency@3.1.1)(ember-source@5.4.0): resolution: {integrity: sha512-8eEdbSE0sioqjpB2CWw/dKF4Ftfe9tbebuSUfMDBmP3xxTIvxTDbvDnbd8A0IbQ0z/iQt6Va+/5cadzvkbMZtg==} peerDependencies: '@ember/test-waiters': ^3.0.0 @@ -8257,13 +8201,13 @@ packages: '@glimmer/component': 1.1.2(@babel/core@7.23.7) '@glimmer/tracking': 1.1.2 '@glint/template': 1.2.1 - ember-async-data: 1.0.3(ember-source@3.28.12) - ember-concurrency: 3.1.1(@babel/core@7.23.7)(ember-source@3.28.12) - ember-source: 3.28.12(@babel/core@7.23.7) + ember-async-data: 1.0.3(ember-source@5.4.0) + ember-concurrency: 3.1.1(@babel/core@7.23.7)(ember-source@5.4.0) + ember-source: 5.4.0(@babel/core@7.23.7)(@glimmer/component@1.1.2)(@glint/template@1.2.1)(webpack@5.89.0) transitivePeerDependencies: - supports-color - /ember-resources@6.5.1(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-concurrency@3.1.1)(ember-source@5.4.0): + /ember-resources@6.5.1(@ember/test-waiters@3.1.0)(@glimmer/component@1.1.2)(@glimmer/tracking@1.1.2)(@glint/template@1.2.1)(ember-source@5.5.0): resolution: {integrity: sha512-8eEdbSE0sioqjpB2CWw/dKF4Ftfe9tbebuSUfMDBmP3xxTIvxTDbvDnbd8A0IbQ0z/iQt6Va+/5cadzvkbMZtg==} peerDependencies: '@ember/test-waiters': ^3.0.0 @@ -8287,11 +8231,11 @@ packages: '@glimmer/component': 1.1.2(@babel/core@7.23.7) '@glimmer/tracking': 1.1.2 '@glint/template': 1.2.1 - ember-async-data: 1.0.3(ember-source@5.4.0) - ember-concurrency: 3.1.1(@babel/core@7.23.7)(ember-source@5.4.0) - ember-source: 5.4.0(@babel/core@7.23.7)(@glimmer/component@1.1.2)(@glint/template@1.2.1)(webpack@5.89.0) + ember-async-data: 1.0.3(ember-source@5.5.0) + ember-source: 5.5.0(@babel/core@7.23.7)(@glimmer/component@1.1.2)(@glint/template@1.2.1) transitivePeerDependencies: - supports-color + dev: false /ember-rfc176-data@0.3.18: resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==} @@ -8386,7 +8330,7 @@ packages: broccoli-funnel: 3.0.8 broccoli-merge-trees: 4.2.0 chalk: 4.1.2 - ember-auto-import: 2.6.3(@glint/template@1.2.1)(webpack@5.89.0) + ember-auto-import: 2.7.2(@glint/template@1.2.1)(webpack@5.89.0) ember-cli-babel: 7.26.11 ember-cli-get-component-path-option: 1.0.0 ember-cli-is-package-missing: 1.0.0 @@ -8445,7 +8389,7 @@ packages: broccoli-funnel: 3.0.8 broccoli-merge-trees: 4.2.0 chalk: 4.1.2 - ember-auto-import: 2.6.3(@glint/template@1.2.1) + ember-auto-import: 2.7.2(@glint/template@1.2.1) ember-cli-babel: 7.26.11 ember-cli-get-component-path-option: 1.0.0 ember-cli-is-package-missing: 1.0.0 @@ -9375,17 +9319,6 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -10145,9 +10078,9 @@ packages: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.1 glob: 7.2.3 - ignore: 5.3.0 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -10557,11 +10490,6 @@ packages: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - dev: true - /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -13406,8 +13334,8 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} /regenerator-transform@0.10.1: resolution: {integrity: sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==} @@ -13528,7 +13456,7 @@ packages: resolution: {integrity: sha512-G7Hk1Q+UJ5DvlNAoJZObxANkBZGiGdp589rVcTW/tYqJWJ5rwfraSnKSQaETN8Epaytw8J40nS/zC7bcHGv36w==} dependencies: '@babel/core': 7.23.7 - '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.7) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.7) '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) prettier: 2.8.8 transitivePeerDependencies: @@ -15692,7 +15620,7 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.6 - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 diff --git a/reactiveweb/package.json b/reactiveweb/package.json index 75af40d..0b2c4e5 100644 --- a/reactiveweb/package.json +++ b/reactiveweb/package.json @@ -62,7 +62,7 @@ "@embroider/macros": "^1.13.4", "decorator-transforms": "^1.0.3", "ember-async-data": "^1.0.3", - "ember-resources": "^6.4.2" + "ember-resources": ">= 6.4.2" }, "devDependencies": { "@babel/core": "^7.23.2", diff --git a/reactiveweb/src/ember-concurrency.ts b/reactiveweb/src/ember-concurrency.ts index 93d0719..2632a56 100644 --- a/reactiveweb/src/ember-concurrency.ts +++ b/reactiveweb/src/ember-concurrency.ts @@ -1,12 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable ember/no-get */ -import { getValue } from '@glimmer/tracking/primitives/cache'; import { assert } from '@ember/debug'; -import { invokeHelper } from '@ember/helper'; +import { associateDestroyableChild, registerDestructor } from '@ember/destroyable'; import { get } from '@ember/object'; -import { Resource } from 'ember-resources'; +import { resource } from 'ember-resources'; import { DEFAULT_THUNK, normalizeThunk } from './utils.ts'; @@ -55,108 +54,26 @@ export function task< >(context: object, task: LocalTask, thunk?: () => Args) { assert(`Task does not have a perform method. Is it actually a task?`, 'perform' in task); - let target = buildUnproxiedTaskResource(context, task, (thunk || DEFAULT_THUNK) as () => Args); + const state = new State(task); - // TS can't figure out what the proxy is doing - return proxyClass(target as any) as never as TaskInstance; -} + let destroyable = resource(context, () => { + let args = thunk || DEFAULT_THUNK; -export const trackedTask = task; + let positional = normalizeThunk(args).positional; -const TASK_CACHE = new WeakMap(); + state[RUN](positional || []); -function buildUnproxiedTaskResource< - ArgsList extends any[], - Return, - LocalTask extends TaskIsh = TaskIsh, ->(context: object, task: LocalTask, thunk: () => ArgsList) { - type LocalResource = TaskResource; - type Klass = new (...args: unknown[]) => LocalResource; + return state; + }); - let resource: ReturnType; - let klass: Klass; - let existing = TASK_CACHE.get(task); + associateDestroyableChild(destroyable, state); - if (existing) { - klass = existing; - } else { - klass = class AnonymousTaskRunner extends TaskResource { - [TASK] = task; - } as Klass; + registerDestructor(state, () => state[TASK].cancelAll()); - TASK_CACHE.set(task, klass); - } - - return { - get value(): LocalResource { - if (!resource) { - resource = invokeHelper(context, klass, () => { - return normalizeThunk(thunk); - }); - } - - return getValue(resource) as unknown as LocalResource; - }, - }; + return destroyable as unknown as TaskInstance; } -/** - * @private - */ -export function proxyClass< - ArgsList extends any[], - Return, - LocalTask extends TaskIsh, - Instance extends TaskResource = TaskResource< - ArgsList, - Return, - LocalTask - >, ->(target: { value: Instance }) { - /* - * This proxy defaults to returning the underlying data on - * the task runner when '.value' is accessed. - * - * When working with ember-concurrency tasks, users have the expectation - * that they'll be able to inspect the status of the tasks, such as - * `isRunning`, `isFinished`, etc. - * - * To support that, we need to proxy to the `currentTask`. - * - */ - return new Proxy(target, { - get(target, key): unknown { - const taskRunner = target.value; - const instance = taskRunner.currentTask; - - if (typeof key === 'string') { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - get(taskRunner.currentTask, key); - } - - if (key === 'value') { - /** - * getter than falls back to the previous task's value - */ - return taskRunner.value; - } - - /** - * If the key is anything other than value, query on the currentTask - */ - const value = Reflect.get(instance as object, key, instance); - - return typeof value === 'function' ? value.bind(instance) : value; - }, - ownKeys(target): (string | symbol)[] { - return Reflect.ownKeys(target.value); - }, - getOwnPropertyDescriptor(target, key): PropertyDescriptor | undefined { - return Reflect.getOwnPropertyDescriptor(target.value, key); - }, - }) as never as Instance; -} +export const trackedTask = task; export type TaskReturnType = T extends TaskIsh ? Return : unknown; export type TaskArgsType = T extends TaskIsh ? Args : unknown[]; @@ -193,23 +110,74 @@ export interface TaskInstance extends Promise { */ export const TASK = Symbol('TASK'); +const RUN = Symbol('RUN'); + /** * @private */ -export class TaskResource< - Args extends any[], - Return, - LocalTask extends TaskIsh, -> extends Resource<{ - positional: Args; -}> { +export class State> { // Set via useTask declare [TASK]: LocalTask; + + constructor(task: LocalTask) { + this[TASK] = task; + + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + /* + * This proxy defaults to returning the underlying data on + * the task runner when '.value' is accessed. + * + * When working with ember-concurrency tasks, users have the expectation + * that they'll be able to inspect the status of the tasks, such as + * `isRunning`, `isFinished`, etc. + * + * To support that, we need to proxy to the `currentTask`. + * + */ + return new Proxy(self, { + get(target, key): unknown { + const taskRunner = self; + const instance = taskRunner.currentTask; + + if (!instance) { + return; + } + + if (typeof key === 'string') { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + get(taskRunner.currentTask, key); + } + + if (key === 'value') { + /** + * getter than falls back to the previous task's value + */ + return taskRunner.value; + } + + /** + * If the key is anything other than value, query on the currentTask + */ + const value = Reflect.get(instance as object, key, instance); + + return typeof value === 'function' ? value.bind(instance) : value; + }, + // ownKeys(target): (string | symbol)[] { + // return Reflect.ownKeys(target.value); + // }, + // getOwnPropertyDescriptor(target, key): PropertyDescriptor | undefined { + // return Reflect.getOwnPropertyDescriptor(target.value, key); + // }, + }) as never as Instance; + } // Set during setup/update declare currentTask: TaskInstance; declare lastTask: TaskInstance | undefined; - get value() { + get value(): Return | null | undefined { if (this.currentTask?.isFinished && !this.currentTask.isCanceled) { return this.currentTask.value; } @@ -217,15 +185,11 @@ export class TaskResource< return this.lastTask?.value; } - modify(positional: Args) { + [RUN](positional: Args) { if (this.currentTask) { this.lastTask = this.currentTask; } this.currentTask = this[TASK].perform(...positional); } - - teardown() { - this[TASK].cancelAll(); - } } diff --git a/tests/test-app/package.json b/tests/test-app/package.json index ea0bc99..039348a 100644 --- a/tests/test-app/package.json +++ b/tests/test-app/package.json @@ -38,9 +38,9 @@ "@ember/optional-features": "^2.0.0", "@ember/string": "^3.1.1", "@ember/test-helpers": "^3.2.1", - "@embroider/compat": "^3.2.3", - "@embroider/core": "^3.3.0", - "@embroider/webpack": "^3.2.0", + "@embroider/compat": "^3.4.3", + "@embroider/core": "^3.4.3", + "@embroider/webpack": "^3.2.1", "@glimmer/component": "^1.1.2", "@glimmer/tracking": "^1.1.2", "@glint/core": "^1.2.1", @@ -54,7 +54,7 @@ "@typescript-eslint/parser": "^6.9.0", "broccoli-asset-rev": "^3.0.0", "concurrently": "^8.2.2", - "ember-auto-import": "^2.6.3", + "ember-auto-import": "^2.7.2", "ember-cli": "~5.4.0", "ember-cli-app-version": "^6.0.1", "ember-cli-babel": "^8.2.0",