diff --git a/.github/workflows/push-dist.yml b/.github/workflows/push-dist.yml new file mode 100644 index 00000000..7ab48ef2 --- /dev/null +++ b/.github/workflows/push-dist.yml @@ -0,0 +1,24 @@ + +name: Push dist + +on: + push: + branches: + - main + - master + +jobs: + push-dist: + name: Push dist + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + - uses: NullVoxPopuli/action-setup-pnpm@v2.3.1 + - uses: kategengler/put-built-npm-package-contents-on-branch@v2.0.0 + with: + branch: dist + token: ${{ secrets.GITHUB_TOKEN }} + working-directory: ember-infinity \ No newline at end of file diff --git a/ember-infinity/src/components/infinity-loader.hbs b/ember-infinity/src/components/infinity-loader.hbs index 8a3b3b9a..30cc6864 100644 --- a/ember-infinity/src/components/infinity-loader.hbs +++ b/ember-infinity/src/components/infinity-loader.hbs @@ -9,6 +9,7 @@ ' reached-infinity' }}" data-test-infinity-loader + ...attributes > {{#if (has-block)}} {{yield this.infinityModelContent}} diff --git a/ember-infinity/src/lib/infinity-model.js b/ember-infinity/src/lib/infinity-model.js index e6822f73..92a72975 100644 --- a/ember-infinity/src/lib/infinity-model.js +++ b/ember-infinity/src/lib/infinity-model.js @@ -65,6 +65,35 @@ export default class InfinityModel extends DEFAULTS(addEvented(ArrayProxy)) { return objectAssign(pageParams, this.extraParams); } + /** + * This hook is useful when you have the need to initialize the infinity model + * with some data. For example, if you want to load the first page of data using ember-fastboot shoebox + * you can do something like this: + * + * onRequestNextPage (infinityModel, modelName, params) { + * if (this.afterRehydration) { + this.set('afterRehydration', false) + this.set('preContent.meta', this.meta) + return Promise.resolve(this.preContent); + * } + * + * return infinityModel.store[infinityModel.storeFindMethod]( + * modelName, + * params + * ) + * } + * + * Where `this.content` is the data you want to initialize the infinity model with, + * previously stored in the shoebox, deserialized and pushed to the store, peeked in this case. + * With this, you can avoid the first request to the server because we already have the data. + * + * @method onRequestNextPage + * @param {Ember.ArrayProxy} infinityModel (self) + * @param {String} modelName + * @param {Object} params + * @return {Ember.RSVP.Promise} A Promise that resolves the new objects + */ + /** abstract after-model hook, can be overridden in subclasses Used to keep shape for optimization diff --git a/ember-infinity/src/services/infinity.js b/ember-infinity/src/services/infinity.js index 48c6bffa..4f1be255 100644 --- a/ember-infinity/src/services/infinity.js +++ b/ember-infinity/src/services/infinity.js @@ -304,6 +304,24 @@ export default class Infinity extends Service { infinityModelForParamsCheck ); + // preContent, content, and meta are OPTIONAL, These allow to initialize + // the infinity model with a pre-existing array of objects, the best use case + // so far would be the data on a shoebox, coming from ember-fastBoot. This way, we + // avoid having a second request to the server, and we also maintain the logic + // of the infinity model, the current content, the meta, which makes requesting + // the next page, or the previous page, or any other action, CONSISTENT. + + const preContent = A(paramsCheck( + 'preContent', + options, + infinityModelForParamsCheck + )) || A() + const meta = paramsCheck( + 'meta', + options, + infinityModelForParamsCheck + ) || {} + // create identifier for use in storing unique cached infinity model let identifier = stringifyObjectValues(options); @@ -316,6 +334,8 @@ export default class Infinity extends Service { delete options.infinityCache; delete options.store; delete options.storeFindMethod; + delete options.preContent; + delete options.meta; const initParams = { container: getOwner(this), @@ -331,6 +351,8 @@ export default class Infinity extends Service { store, storeFindMethod, content: A(), + preContent, + meta }; for (let key in initParams) { @@ -493,6 +515,14 @@ export default class Infinity extends Service { const modelName = infinityModel._infinityModelName; const params = infinityModel.buildParams(increment); + if (infinityModel.onRequestNextPage) { + return infinityModel.onRequestNextPage( + infinityModel, + modelName, + params + ); + } + return infinityModel.store[infinityModel.storeFindMethod]( modelName, params diff --git a/package.json b/package.json index 92b881f4..e24726c3 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,5 @@ }, "engines": { "node": ">= 18" - }, - "pnpm": { - "patchedDependencies": { - "github-changelog@1.0.1": "patches/github-changelog@1.0.1.patch" - } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 666db17a..d5ee7ec8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,18 +4,13 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -patchedDependencies: - github-changelog@1.0.1: - hash: y3j3vkmlaqwbvrcmso25eso67i - path: patches/github-changelog@1.0.1.patch - importers: .: devDependencies: release-plan: specifier: ^0.9.0 - version: 0.9.0 + version: 0.9.0(encoding@0.1.13) ember-infinity: dependencies: @@ -8775,11 +8770,11 @@ snapshots: '@octokit/auth-token@3.0.4': {} - '@octokit/core@4.2.4': + '@octokit/core@4.2.4(encoding@0.1.13)': dependencies: '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 + '@octokit/graphql': 5.0.6(encoding@0.1.13) + '@octokit/request': 6.2.8(encoding@0.1.13) '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 before-after-hook: 2.2.3 @@ -8793,9 +8788,9 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - '@octokit/graphql@5.0.6': + '@octokit/graphql@5.0.6(encoding@0.1.13)': dependencies: - '@octokit/request': 6.2.8 + '@octokit/request': 6.2.8(encoding@0.1.13) '@octokit/types': 9.3.2 universal-user-agent: 6.0.1 transitivePeerDependencies: @@ -8803,19 +8798,19 @@ snapshots: '@octokit/openapi-types@18.1.1': {} - '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4)': + '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.4 + '@octokit/core': 4.2.4(encoding@0.1.13) '@octokit/tsconfig': 1.0.2 '@octokit/types': 9.3.2 - '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4)': + '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.4 + '@octokit/core': 4.2.4(encoding@0.1.13) - '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4)': + '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.4 + '@octokit/core': 4.2.4(encoding@0.1.13) '@octokit/types': 10.0.0 '@octokit/request-error@3.0.3': @@ -8824,23 +8819,23 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@6.2.8': + '@octokit/request@6.2.8(encoding@0.1.13)': dependencies: '@octokit/endpoint': 7.0.6 '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/rest@19.0.13': + '@octokit/rest@19.0.13(encoding@0.1.13)': dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + '@octokit/core': 4.2.4(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4(encoding@0.1.13)) transitivePeerDependencies: - encoding @@ -9481,7 +9476,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -10778,6 +10773,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.3.4(supports-color@9.4.0): dependencies: ms: 2.1.2 @@ -12558,7 +12557,7 @@ snapshots: git-repo-info@2.1.1: {} - github-changelog@1.0.1(patch_hash=y3j3vkmlaqwbvrcmso25eso67i): + github-changelog@1.0.1: dependencies: '@manypkg/get-packages': 2.2.1 chalk: 4.1.2 @@ -12872,7 +12871,7 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -12887,7 +12886,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -13851,6 +13850,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + node-int64@0.4.0: {} node-notifier@10.0.1: @@ -14509,11 +14514,11 @@ snapshots: dependencies: jsesc: 0.5.0 - release-plan@0.9.0: + release-plan@0.9.0(encoding@0.1.13): dependencies: '@manypkg/get-packages': 2.2.1 '@npmcli/package-json': 5.1.0 - '@octokit/rest': 19.0.13 + '@octokit/rest': 19.0.13(encoding@0.1.13) '@types/fs-extra': 9.0.13 '@types/js-yaml': 4.0.9 '@types/semver': 7.5.8 @@ -14523,7 +14528,7 @@ snapshots: cli-highlight: 2.1.11 execa: 4.1.0 fs-extra: 10.1.0 - github-changelog: 1.0.1(patch_hash=y3j3vkmlaqwbvrcmso25eso67i) + github-changelog: 1.0.1 js-yaml: 4.1.0 latest-version: 5.1.0 parse-github-repo-url: 1.4.1 @@ -14957,7 +14962,7 @@ snapshots: socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4 socks: 2.8.3 transitivePeerDependencies: - supports-color