├── .babelrc ├── .eslintrc ├── .github ├── FUNDING.yml └── workflows │ └── build_and_deploy.yml ├── .gitignore ├── .prettierignore ├── LICENSE ├── README.md ├── jest.config.json ├── package.json ├── pnpm-lock.yaml ├── src ├── fake-backend │ ├── fake-backend.js │ ├── films.json │ ├── people.json │ └── planets.json ├── fetchWithCache.js └── react-mf-api.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env", "@babel/preset-react"], 3 | "plugins": [] 4 | } 5 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["react-important-stuff", "plugin:prettier/recommended"], 3 | "parser": "babel-eslint" 4 | } 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: ["joeldenning"] 4 | patreon: singlespa 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/build_and_deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build, Test, Release 2 | 3 | on: 4 | push: 5 | branches: main 6 | pull_request: 7 | branches: "*" 8 | 9 | jobs: 10 | build_test: 11 | name: Build and Test 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout Repo 16 | uses: actions/checkout@v4 17 | - name: Install Pnpm 18 | uses: pnpm/action-setup@v4 19 | - name: Setup Node.js 20 | uses: actions/setup-node@v4 21 | with: 22 | node-version: 22 23 | cache: pnpm 24 | - name: Install dependencies 25 | run: pnpm install --frozen-lockfile 26 | 27 | - name: Test 28 | run: | 29 | pnpm run lint 30 | pnpm run check-format 31 | pnpm run test 32 | 33 | - name: Build 34 | run: pnpm run build 35 | 36 | - name: Store artifact 37 | uses: actions/upload-artifact@v4 38 | with: 39 | name: dist 40 | path: dist 41 | 42 | release: 43 | name: Release 44 | needs: build_test 45 | runs-on: ubuntu-latest 46 | if: ${{ github.ref == 'refs/heads/main' }} 47 | permissions: 48 | contents: "read" 49 | id-token: "write" 50 | 51 | steps: 52 | - name: Download build artifact 53 | uses: actions/download-artifact@v4 54 | with: 55 | name: dist 56 | 57 | - name: Authenticate with GCP 58 | uses: "google-github-actions/auth@v2" 59 | with: 60 | project_id: neural-passkey-248222 61 | workload_identity_provider: "projects/654158993889/locations/global/workloadIdentityPools/github/providers/my-repo" 62 | service_account: github-workload-identity-feder@neural-passkey-248222.iam.gserviceaccount.com 63 | 64 | - name: Upload Static Files to CDN 65 | uses: "google-github-actions/upload-cloud-storage@v2" 66 | with: 67 | path: . 68 | destination: react.microfrontends.app/${{ github.event.repository.name }}/${{ github.run_id }} 69 | 70 | - name: Update Import Map 71 | uses: single-spa/action-deploy-to-import-map-deployer@v1 72 | with: 73 | host: ${{ secrets.DEPLOYER_HOST }} 74 | username: ${{ secrets.DEPLOYER_USERNAME }} 75 | password: ${{ secrets.DEPLOYER_PASSWORD }} 76 | environment-name: react 77 | service-name: "@react-mf/${{ github.event.repository.name }}" 78 | service-url: "https://react.microfrontends.app/${{ github.event.repository.name }}/${{ github.run_id }}/react-mf-${{ github.event.repository.name }}.js" 79 | service-integrity-file-path: react-mf-${{ github.event.repository.name }}.js 80 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .prettierignore 3 | yarn.lock 4 | package-lock.json 5 | LICENSE 6 | coverage 7 | pnpm-lock.yaml -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 react-microfrontends 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Microfrontends api 2 | 3 | An in-browser javascript module for communication with the API 4 | 5 | ## What is this? 6 | 7 | This is an example microfrontend repo demonstrating how to use [single-spa](https://single-spa.js.org). You can see the code running at https://react.microfrontends.app. 8 | 9 | ## How does it work? 10 | 11 | [Full article](https://single-spa.js.org/docs/recommended-setup) 12 | 13 | This repository is a javascript project that creates a javascript bundle that is an in-browser javascript module (explanation on [youtube](https://www.youtube.com/watch?v=Jxqiu6pdMSU&list=PLLUD8RtHvsAOhtHnyGx57EYXoaNsxGrTU&index=2) / [bilibili](https://www.bilibili.com/video/av83498486/)). The currently deployed version of the in-browser module can be seen at https://react.microfrontends.app/importmap.json. 14 | 15 | This project uses [React](https://reactjs.org) and was created with the [create-single-spa](https://single-spa.js.org/docs/create-single-spa) CLI. It uses webpack and babel. 16 | 17 | Whenever a pull request is merged to master, [CircleCI builds and deploys the project](https://circleci.com/gh/react-microfrontends/api). The ["workflows" view](https://circleci.com/gh/react-microfrontends/workflows) (pictured below) can be seen if you are logged into CircleCI. Deployments for this in-browser module are completely independent of deployments for any other module. 18 | 19 | ![image](https://user-images.githubusercontent.com/5524384/75210801-5ba02700-573f-11ea-8064-46af165cba0a.png) 20 | 21 | ## Local development 22 | 23 | [Full documentation](https://single-spa.js.org/docs/recommended-setup#local-development) 24 | 25 | Tutorial video: [youtube](https://www.youtube.com/watch?v=vjjcuIxqIzY&list=PLLUD8RtHvsAOhtHnyGx57EYXoaNsxGrTU&index=4) / [bilibili](https://www.bilibili.com/video/av83617789/) 26 | 27 | There are two ways to do local development. It is preferred to do one module at a time, whenever possible. 28 | 29 | ### One module at a time 30 | 31 | ```sh 32 | cd api 33 | pnpm install 34 | pnpm start -- --https --port 9001 35 | ``` 36 | 37 | Go to https://localhost:9001/react-mf-api.js and verify that you are able to load the file without any SSL problems. To solve SSL problems, see [these instructions](https://improveandrepeat.com/2016/09/allowing-self-signed-certificates-on-localhost-with-chrome-and-firefox/). 38 | 39 | Now, go to https://react.microfrontends.app. In the browser console, run the following: 40 | 41 | ```js 42 | localStorage.setItem("devtools", true); 43 | ``` 44 | 45 | Refresh the page. Click on the tan / beige rectangle: 46 | 47 | ![image](https://user-images.githubusercontent.com/5524384/75211359-e46b9280-5740-11ea-80bb-974846df414b.png) 48 | 49 | Set an [import map override](https://github.com/joeldenning/import-map-overrides/) to `9001`. 50 | 51 | ![image](https://user-images.githubusercontent.com/5524384/75211553-7e333f80-5741-11ea-97d6-d3d86ffd1826.png) 52 | 53 | Refresh the page. Your local code for this module will now be running on https://react.microfrontends.app. You may make changes locally and refresh the page to see them. 54 | 55 | ### All modules together 56 | 57 | Run the root-config project locally: 58 | 59 | ``` 60 | cd root-config 61 | pnpm install 62 | pnpm start 63 | ``` 64 | 65 | Now follow the steps above for "One module at a time" for each of the modules you wish to work on. 66 | 67 | ## Adapting for your organization 68 | 69 | Feel free to fork and modify any files you would like when doing a proof of concept for your organization. When it's time to actually create / adapt your organization's projects, consider using [create-single-spa](https://single-spa.js.org/docs/create-single-spa) instead of forking this repository. 70 | -------------------------------------------------------------------------------- /jest.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "transform": { 3 | "^.+\\.tsx?$": "babel-jest" 4 | }, 5 | "moduleNameMapper": { 6 | "\\.(css)$": "identity-obj-proxy" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "start": "webpack serve", 4 | "build": "webpack --mode=production", 5 | "analyze": "webpack --mode=production --env analyze", 6 | "lint": "eslint src", 7 | "format": "prettier --write .", 8 | "check-format": "prettier --check .", 9 | "test": "jest --passWithNoTests", 10 | "watch-tests": "jest --watch", 11 | "coverage": "jest --coverage" 12 | }, 13 | "husky": { 14 | "hooks": { 15 | "pre-commit": "pretty-quick --staged && concurrently yarn:test yarn:lint" 16 | } 17 | }, 18 | "devDependencies": { 19 | "@babel/core": "^7.12.10", 20 | "@babel/preset-env": "^7.12.11", 21 | "@babel/preset-react": "^7.12.10", 22 | "@testing-library/react": "^11.2.3", 23 | "@types/jest": "^26.0.20", 24 | "babel-eslint": "^11.0.0-beta.2", 25 | "babel-jest": "^26.6.3", 26 | "babel-loader": "^8.0.6", 27 | "concurrently": "^5.0.1", 28 | "eslint": "^7.18.0", 29 | "eslint-config-prettier": "^7.1.0", 30 | "eslint-config-react-important-stuff": "^3.0.0", 31 | "eslint-plugin-prettier": "^3.3.1", 32 | "husky": "^4.3.8", 33 | "identity-obj-proxy": "^3.0.0", 34 | "jest": "^26.6.3", 35 | "jest-cli": "^26.6.3", 36 | "prettier": "^2.2.1", 37 | "pretty-quick": "^3.1.0", 38 | "rxjs": "^6.5.3", 39 | "webpack": "^5.15.0", 40 | "webpack-cli": "^4.3.1", 41 | "webpack-config-single-spa-react": "^7.0.0", 42 | "webpack-dev-server": "^4.0.0-beta.0", 43 | "webpack-merge": "^5.7.3" 44 | }, 45 | "dependencies": { 46 | "react": "^19.0.0", 47 | "react-dom": "^19.0.0" 48 | }, 49 | "packageManager": "pnpm@9.11.0" 50 | } 51 | -------------------------------------------------------------------------------- /src/fake-backend/fake-backend.js: -------------------------------------------------------------------------------- 1 | import people from "./people.json"; 2 | import planets from "./planets.json"; 3 | import films from "./films.json"; 4 | 5 | export function fakeAPIFetch(options) { 6 | if (options.url.includes("people")) { 7 | return handleFakeRequestForPeople(options.url); 8 | } else if (options.url.includes("planets")) { 9 | return handleFakeRequestForPlanets(options.url); 10 | } else if (options.url.includes("films")) { 11 | return handleFakeRequestForFilms(options.url); 12 | } 13 | return Promise.resolve({}); 14 | } 15 | 16 | function handleFakeRequestForPeople(url) { 17 | if (url.includes("page")) { 18 | return handleListRequest(url, people, modifyPerson); 19 | } else { 20 | return handleIndividualRequest(url, people, modifyPerson); 21 | } 22 | } 23 | 24 | function handleFakeRequestForPlanets(url) { 25 | if (url.includes("page")) { 26 | return handleListRequest(url, planets, modifyPlanet); 27 | } else { 28 | return handleIndividualRequest(url, planets, modifyPlanet); 29 | } 30 | } 31 | 32 | function handleFakeRequestForFilms(url) { 33 | if (url.includes("page")) { 34 | return handleListRequest(url, films); 35 | } else { 36 | return handleIndividualRequest(url, films); 37 | } 38 | } 39 | 40 | function getFilmsThatMatchId(id, key) { 41 | return films.reduce((matchingFilms, film) => { 42 | const array = film.fields[key]; 43 | if (array && array.includes && array.includes(parseInt(id))) { 44 | matchingFilms.push(`${film.pk}`); 45 | } 46 | return matchingFilms; 47 | }, []); 48 | } 49 | 50 | function getPeopleThatMatchPlanet(planetId) { 51 | return people.reduce((acc, person) => { 52 | if (person.fields.homeworld === parseInt(planetId)) { 53 | acc.push(`${person.pk}`); 54 | } 55 | return acc; 56 | }, []); 57 | } 58 | 59 | function modifyPerson(person) { 60 | const films = getFilmsThatMatchId(person.id, "characters"); 61 | return { 62 | ...person, 63 | homeworld: `${person.homeworld}`, 64 | films, 65 | }; 66 | } 67 | 68 | function modifyPlanet(planet) { 69 | const films = getFilmsThatMatchId(planet.id, "planets"); 70 | const residents = getPeopleThatMatchPlanet(planet.id); 71 | return { 72 | ...planet, 73 | films, 74 | residents, 75 | }; 76 | } 77 | 78 | function getIndividualThing(id, list) { 79 | return list[id - 1]; // right now the lists are ordered so that index === id - 1 80 | } 81 | 82 | function handleIndividualRequest(url, list, modifierFn) { 83 | const regex = /[0-9+]/; 84 | const match = regex.exec(url); 85 | const id = match.length === 1 ? parseInt(match) : 1; 86 | const thing = getIndividualThing(id, list); 87 | const base = { id: `${thing.pk}`, ...thing.fields }; 88 | let response; 89 | if (modifierFn) { 90 | response = modifierFn(base); 91 | } else { 92 | response = base; 93 | } 94 | return fakeNetwork(response); 95 | } 96 | 97 | function handleListRequest(url, list, modifierFn) { 98 | const regex = /[0-9+]/; 99 | const match = regex.exec(url); 100 | const pageNum = match.length === 1 ? parseInt(match) : 1; 101 | const pageSize = 10; 102 | const startingIndex = pageSize * (pageNum - 1); 103 | const endingIndex = pageSize * pageNum; 104 | const next = endingIndex < list.length; 105 | return fakeNetwork({ 106 | results: list 107 | .slice(pageSize * (pageNum - 1), pageSize * pageNum) 108 | .map((listItem) => { 109 | const standardModifications = turnObjectIntoFakeApiResponse(listItem); 110 | if (modifierFn) { 111 | return modifierFn(standardModifications); 112 | } else { 113 | return standardModifications; 114 | } 115 | }), 116 | next, 117 | }); 118 | } 119 | 120 | function turnObjectIntoFakeApiResponse(obj) { 121 | return { 122 | ...obj.fields, 123 | id: `${obj.pk}`, 124 | url: `${obj.model.split(".")[1]}/${obj.pk}`, 125 | }; 126 | } 127 | 128 | function wrapWithData(response) { 129 | return { results: response }; 130 | } 131 | 132 | function fakeNetwork(response, delay = 100) { 133 | return new Promise((res, rej) => { 134 | setTimeout(() => { 135 | res(response); 136 | }, delay); 137 | }); 138 | } 139 | -------------------------------------------------------------------------------- /src/fake-backend/films.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "fields": { 4 | "starships": [2, 3, 5, 9, 10, 11, 12, 13], 5 | "edited": "2014-12-20T19:49:45.256Z", 6 | "vehicles": [4, 6, 7, 8], 7 | "planets": [1, 2, 3], 8 | "producer": "Gary Kurtz, Rick McCallum", 9 | "title": "A New Hope", 10 | "created": "2014-12-10T14:23:31.880Z", 11 | "episode_id": 4, 12 | "director": "George Lucas", 13 | "release_date": "1977-05-25", 14 | "opening_crawl": "It is a period of civil war.\r\nRebel spaceships, striking\r\nfrom a hidden base, have won\r\ntheir first victory against\r\nthe evil Galactic Empire.\r\n\r\nDuring the battle, Rebel\r\nspies managed to steal secret\r\nplans to the Empire's\r\nultimate weapon, the DEATH\r\nSTAR, an armored space\r\nstation with enough power\r\nto destroy an entire planet.\r\n\r\nPursued by the Empire's\r\nsinister agents, Princess\r\nLeia races home aboard her\r\nstarship, custodian of the\r\nstolen plans that can save her\r\npeople and restore\r\nfreedom to the galaxy....", 15 | "characters": [ 16 | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 81 17 | ], 18 | "species": [1, 2, 3, 4, 5] 19 | }, 20 | "model": "resources.film", 21 | "pk": 1 22 | }, 23 | { 24 | "fields": { 25 | "starships": [3, 10, 11, 12, 15, 17, 21, 22, 23], 26 | "edited": "2014-12-15T13:07:53.386Z", 27 | "vehicles": [8, 14, 16, 18, 19, 20], 28 | "planets": [4, 5, 6, 27], 29 | "producer": "Gary Kurtz, Rick McCallum", 30 | "title": "The Empire Strikes Back", 31 | "created": "2014-12-12T11:26:24.656Z", 32 | "episode_id": 5, 33 | "director": "Irvin Kershner", 34 | "release_date": "1980-05-17", 35 | "opening_crawl": "It is a dark time for the\r\nRebellion. Although the Death\r\nStar has been destroyed,\r\nImperial troops have driven the\r\nRebel forces from their hidden\r\nbase and pursued them across\r\nthe galaxy.\r\n\r\nEvading the dreaded Imperial\r\nStarfleet, a group of freedom\r\nfighters led by Luke Skywalker\r\nhas established a new secret\r\nbase on the remote ice world\r\nof Hoth.\r\n\r\nThe evil lord Darth Vader,\r\nobsessed with finding young\r\nSkywalker, has dispatched\r\nthousands of remote probes into\r\nthe far reaches of space....", 36 | "characters": [1, 2, 3, 4, 5, 10, 13, 14, 18, 20, 21, 22, 23, 24, 25, 26], 37 | "species": [1, 2, 3, 6, 7] 38 | }, 39 | "model": "resources.film", 40 | "pk": 2 41 | }, 42 | { 43 | "fields": { 44 | "starships": [2, 3, 10, 11, 12, 15, 17, 22, 23, 27, 28, 29], 45 | "edited": "2014-12-20T09:48:37.462Z", 46 | "vehicles": [8, 16, 18, 19, 24, 25, 26, 30], 47 | "planets": [1, 5, 7, 8, 9], 48 | "producer": "Howard G. Kazanjian, George Lucas, Rick McCallum", 49 | "title": "Return of the Jedi", 50 | "created": "2014-12-18T10:39:33.255Z", 51 | "episode_id": 6, 52 | "director": "Richard Marquand", 53 | "release_date": "1983-05-25", 54 | "opening_crawl": "Luke Skywalker has returned to\r\nhis home planet of Tatooine in\r\nan attempt to rescue his\r\nfriend Han Solo from the\r\nclutches of the vile gangster\r\nJabba the Hutt.\r\n\r\nLittle does Luke know that the\r\nGALACTIC EMPIRE has secretly\r\nbegun construction on a new\r\narmored space station even\r\nmore powerful than the first\r\ndreaded Death Star.\r\n\r\nWhen completed, this ultimate\r\nweapon will spell certain doom\r\nfor the small band of rebels\r\nstruggling to restore freedom\r\nto the galaxy...", 55 | "characters": [ 56 | 1, 2, 3, 4, 5, 10, 13, 14, 16, 18, 20, 21, 22, 25, 27, 28, 29, 30, 31, 57 | 45 58 | ], 59 | "species": [1, 2, 3, 5, 6, 8, 9, 10, 15] 60 | }, 61 | "model": "resources.film", 62 | "pk": 3 63 | }, 64 | { 65 | "fields": { 66 | "starships": [31, 32, 39, 40, 41], 67 | "edited": "2014-12-20T10:54:07.216Z", 68 | "vehicles": [33, 34, 35, 36, 37, 38, 42], 69 | "planets": [1, 8, 9], 70 | "producer": "Rick McCallum", 71 | "title": "The Phantom Menace", 72 | "created": "2014-12-19T16:52:55.740Z", 73 | "episode_id": 1, 74 | "director": "George Lucas", 75 | "release_date": "1999-05-19", 76 | "opening_crawl": "Turmoil has engulfed the\r\nGalactic Republic. The taxation\r\nof trade routes to outlying star\r\nsystems is in dispute.\r\n\r\nHoping to resolve the matter\r\nwith a blockade of deadly\r\nbattleships, the greedy Trade\r\nFederation has stopped all\r\nshipping to the small planet\r\nof Naboo.\r\n\r\nWhile the Congress of the\r\nRepublic endlessly debates\r\nthis alarming chain of events,\r\nthe Supreme Chancellor has\r\nsecretly dispatched two Jedi\r\nKnights, the guardians of\r\npeace and justice in the\r\ngalaxy, to settle the conflict....", 77 | "characters": [ 78 | 2, 3, 10, 11, 16, 20, 21, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 79 | 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 80 | ], 81 | "species": [ 82 | 1, 2, 6, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 83 | 27 84 | ] 85 | }, 86 | "model": "resources.film", 87 | "pk": 4 88 | }, 89 | { 90 | "fields": { 91 | "starships": [21, 32, 39, 43, 47, 48, 49, 52, 58], 92 | "edited": "2014-12-20T20:18:48.516Z", 93 | "vehicles": [4, 44, 45, 46, 50, 51, 53, 54, 55, 56, 57], 94 | "planets": [1, 8, 9, 10, 11], 95 | "producer": "Rick McCallum", 96 | "title": "Attack of the Clones", 97 | "created": "2014-12-20T10:57:57.886Z", 98 | "episode_id": 2, 99 | "director": "George Lucas", 100 | "release_date": "2002-05-16", 101 | "opening_crawl": "There is unrest in the Galactic\r\nSenate. Several thousand solar\r\nsystems have declared their\r\nintentions to leave the Republic.\r\n\r\nThis separatist movement,\r\nunder the leadership of the\r\nmysterious Count Dooku, has\r\nmade it difficult for the limited\r\nnumber of Jedi Knights to maintain \r\npeace and order in the galaxy.\r\n\r\nSenator Amidala, the former\r\nQueen of Naboo, is returning\r\nto the Galactic Senate to vote\r\non the critical issue of creating\r\nan ARMY OF THE REPUBLIC\r\nto assist the overwhelmed\r\nJedi....", 102 | "characters": [ 103 | 2, 3, 6, 7, 10, 11, 20, 21, 22, 33, 35, 36, 40, 43, 46, 51, 52, 53, 58, 104 | 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 105 | 77, 78, 82 106 | ], 107 | "species": [1, 2, 6, 12, 13, 15, 28, 29, 30, 31, 32, 33, 34, 35] 108 | }, 109 | "model": "resources.film", 110 | "pk": 5 111 | }, 112 | { 113 | "fields": { 114 | "starships": [2, 32, 48, 59, 61, 63, 64, 65, 66, 68, 74, 75], 115 | "edited": "2014-12-20T20:47:52.073Z", 116 | "vehicles": [33, 50, 53, 56, 60, 62, 67, 69, 70, 71, 72, 73, 76], 117 | "planets": [1, 2, 5, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19], 118 | "producer": "Rick McCallum", 119 | "title": "Revenge of the Sith", 120 | "created": "2014-12-20T18:49:38.403Z", 121 | "episode_id": 3, 122 | "director": "George Lucas", 123 | "release_date": "2005-05-19", 124 | "opening_crawl": "War! The Republic is crumbling\r\nunder attacks by the ruthless\r\nSith Lord, Count Dooku.\r\nThere are heroes on both sides.\r\nEvil is everywhere.\r\n\r\nIn a stunning move, the\r\nfiendish droid leader, General\r\nGrievous, has swept into the\r\nRepublic capital and kidnapped\r\nChancellor Palpatine, leader of\r\nthe Galactic Senate.\r\n\r\nAs the Separatist Droid Army\r\nattempts to flee the besieged\r\ncapital with their valuable\r\nhostage, two Jedi Knights lead a\r\ndesperate mission to rescue the\r\ncaptive Chancellor....", 125 | "characters": [ 126 | 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 20, 21, 33, 35, 46, 51, 52, 53, 54, 127 | 55, 56, 58, 63, 64, 67, 68, 75, 78, 79, 80, 81, 82, 83 128 | ], 129 | "species": [ 130 | 1, 2, 3, 6, 15, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 131 | 37 132 | ] 133 | }, 134 | "model": "resources.film", 135 | "pk": 6 136 | } 137 | ] 138 | -------------------------------------------------------------------------------- /src/fake-backend/people.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "fields": { 4 | "edited": "2014-12-20T21:17:56.891Z", 5 | "name": "Luke Skywalker", 6 | "created": "2014-12-09T13:50:51.644Z", 7 | "gender": "male", 8 | "skin_color": "fair", 9 | "hair_color": "blond", 10 | "height": "172", 11 | "eye_color": "blue", 12 | "mass": "77", 13 | "homeworld": 1, 14 | "birth_year": "19BBY" 15 | }, 16 | "model": "resources.people", 17 | "pk": 1 18 | }, 19 | { 20 | "fields": { 21 | "edited": "2014-12-20T21:17:50.309Z", 22 | "name": "C-3PO", 23 | "created": "2014-12-10T15:10:51.357Z", 24 | "gender": "n/a", 25 | "skin_color": "gold", 26 | "hair_color": "n/a", 27 | "height": "167", 28 | "eye_color": "yellow", 29 | "mass": "75", 30 | "homeworld": 1, 31 | "birth_year": "112BBY" 32 | }, 33 | "model": "resources.people", 34 | "pk": 2 35 | }, 36 | { 37 | "fields": { 38 | "edited": "2014-12-20T21:17:50.311Z", 39 | "name": "R2-D2", 40 | "created": "2014-12-10T15:11:50.376Z", 41 | "gender": "n/a", 42 | "skin_color": "white, blue", 43 | "hair_color": "n/a", 44 | "height": "96", 45 | "eye_color": "red", 46 | "mass": "32", 47 | "homeworld": 8, 48 | "birth_year": "33BBY" 49 | }, 50 | "model": "resources.people", 51 | "pk": 3 52 | }, 53 | { 54 | "fields": { 55 | "edited": "2014-12-20T21:17:50.313Z", 56 | "name": "Darth Vader", 57 | "created": "2014-12-10T15:18:20.704Z", 58 | "gender": "male", 59 | "skin_color": "white", 60 | "hair_color": "none", 61 | "height": "202", 62 | "eye_color": "yellow", 63 | "mass": "136", 64 | "homeworld": 1, 65 | "birth_year": "41.9BBY" 66 | }, 67 | "model": "resources.people", 68 | "pk": 4 69 | }, 70 | { 71 | "fields": { 72 | "edited": "2014-12-20T21:17:50.315Z", 73 | "name": "Leia Organa", 74 | "created": "2014-12-10T15:20:09.791Z", 75 | "gender": "female", 76 | "skin_color": "light", 77 | "hair_color": "brown", 78 | "height": "150", 79 | "eye_color": "brown", 80 | "mass": "49", 81 | "homeworld": 2, 82 | "birth_year": "19BBY" 83 | }, 84 | "model": "resources.people", 85 | "pk": 5 86 | }, 87 | { 88 | "fields": { 89 | "edited": "2014-12-20T21:17:50.317Z", 90 | "name": "Owen Lars", 91 | "created": "2014-12-10T15:52:14.024Z", 92 | "gender": "male", 93 | "skin_color": "light", 94 | "hair_color": "brown, grey", 95 | "height": "178", 96 | "eye_color": "blue", 97 | "mass": "120", 98 | "homeworld": 1, 99 | "birth_year": "52BBY" 100 | }, 101 | "model": "resources.people", 102 | "pk": 6 103 | }, 104 | { 105 | "fields": { 106 | "edited": "2014-12-20T21:17:50.319Z", 107 | "name": "Beru Whitesun lars", 108 | "created": "2014-12-10T15:53:41.121Z", 109 | "gender": "female", 110 | "skin_color": "light", 111 | "hair_color": "brown", 112 | "height": "165", 113 | "eye_color": "blue", 114 | "mass": "75", 115 | "homeworld": 1, 116 | "birth_year": "47BBY" 117 | }, 118 | "model": "resources.people", 119 | "pk": 7 120 | }, 121 | { 122 | "fields": { 123 | "edited": "2014-12-20T21:17:50.321Z", 124 | "name": "R5-D4", 125 | "created": "2014-12-10T15:57:50.959Z", 126 | "gender": "n/a", 127 | "skin_color": "white, red", 128 | "hair_color": "n/a", 129 | "height": "97", 130 | "eye_color": "red", 131 | "mass": "32", 132 | "homeworld": 1, 133 | "birth_year": "unknown" 134 | }, 135 | "model": "resources.people", 136 | "pk": 8 137 | }, 138 | { 139 | "fields": { 140 | "edited": "2014-12-20T21:17:50.323Z", 141 | "name": "Biggs Darklighter", 142 | "created": "2014-12-10T15:59:50.509Z", 143 | "gender": "male", 144 | "skin_color": "light", 145 | "hair_color": "black", 146 | "height": "183", 147 | "eye_color": "brown", 148 | "mass": "84", 149 | "homeworld": 1, 150 | "birth_year": "24BBY" 151 | }, 152 | "model": "resources.people", 153 | "pk": 9 154 | }, 155 | { 156 | "fields": { 157 | "edited": "2014-12-20T21:17:50.325Z", 158 | "name": "Obi-Wan Kenobi", 159 | "created": "2014-12-10T16:16:29.192Z", 160 | "gender": "male", 161 | "skin_color": "fair", 162 | "hair_color": "auburn, white", 163 | "height": "182", 164 | "eye_color": "blue-gray", 165 | "mass": "77", 166 | "homeworld": 20, 167 | "birth_year": "57BBY" 168 | }, 169 | "model": "resources.people", 170 | "pk": 10 171 | }, 172 | { 173 | "fields": { 174 | "edited": "2014-12-20T21:17:50.327Z", 175 | "name": "Anakin Skywalker", 176 | "created": "2014-12-10T16:20:44.310Z", 177 | "gender": "male", 178 | "skin_color": "fair", 179 | "hair_color": "blond", 180 | "height": "188", 181 | "eye_color": "blue", 182 | "mass": "84", 183 | "homeworld": 1, 184 | "birth_year": "41.9BBY" 185 | }, 186 | "model": "resources.people", 187 | "pk": 11 188 | }, 189 | { 190 | "fields": { 191 | "edited": "2014-12-20T21:17:50.330Z", 192 | "name": "Wilhuff Tarkin", 193 | "created": "2014-12-10T16:26:56.138Z", 194 | "gender": "male", 195 | "skin_color": "fair", 196 | "hair_color": "auburn, grey", 197 | "height": "180", 198 | "eye_color": "blue", 199 | "mass": "unknown", 200 | "homeworld": 21, 201 | "birth_year": "64BBY" 202 | }, 203 | "model": "resources.people", 204 | "pk": 12 205 | }, 206 | { 207 | "fields": { 208 | "edited": "2014-12-20T21:17:50.332Z", 209 | "name": "Chewbacca", 210 | "created": "2014-12-10T16:42:45.066Z", 211 | "gender": "male", 212 | "skin_color": "unknown", 213 | "hair_color": "brown", 214 | "height": "228", 215 | "eye_color": "blue", 216 | "mass": "112", 217 | "homeworld": 14, 218 | "birth_year": "200BBY" 219 | }, 220 | "model": "resources.people", 221 | "pk": 13 222 | }, 223 | { 224 | "fields": { 225 | "edited": "2014-12-20T21:17:50.334Z", 226 | "name": "Han Solo", 227 | "created": "2014-12-10T16:49:14.582Z", 228 | "gender": "male", 229 | "skin_color": "fair", 230 | "hair_color": "brown", 231 | "height": "180", 232 | "eye_color": "brown", 233 | "mass": "80", 234 | "homeworld": 22, 235 | "birth_year": "29BBY" 236 | }, 237 | "model": "resources.people", 238 | "pk": 14 239 | }, 240 | { 241 | "fields": { 242 | "edited": "2014-12-20T21:17:50.336Z", 243 | "name": "Greedo", 244 | "created": "2014-12-10T17:03:30.334Z", 245 | "gender": "male", 246 | "skin_color": "green", 247 | "hair_color": "n/a", 248 | "height": "173", 249 | "eye_color": "black", 250 | "mass": "74", 251 | "homeworld": 23, 252 | "birth_year": "44BBY" 253 | }, 254 | "model": "resources.people", 255 | "pk": 15 256 | }, 257 | { 258 | "fields": { 259 | "edited": "2014-12-20T21:17:50.338Z", 260 | "name": "Jabba Desilijic Tiure", 261 | "created": "2014-12-10T17:11:31.638Z", 262 | "gender": "hermaphrodite", 263 | "skin_color": "green-tan, brown", 264 | "hair_color": "n/a", 265 | "height": "175", 266 | "eye_color": "orange", 267 | "mass": "1,358", 268 | "homeworld": 24, 269 | "birth_year": "600BBY" 270 | }, 271 | "model": "resources.people", 272 | "pk": 16 273 | }, 274 | { 275 | "fields": { 276 | "edited": "2014-12-20T21:17:50.341Z", 277 | "name": "Wedge Antilles", 278 | "created": "2014-12-12T11:08:06.469Z", 279 | "gender": "male", 280 | "skin_color": "fair", 281 | "hair_color": "brown", 282 | "height": "170", 283 | "eye_color": "hazel", 284 | "mass": "77", 285 | "homeworld": 22, 286 | "birth_year": "21BBY" 287 | }, 288 | "model": "resources.people", 289 | "pk": 18 290 | }, 291 | { 292 | "fields": { 293 | "edited": "2014-12-20T21:17:50.343Z", 294 | "name": "Jek Tono Porkins", 295 | "created": "2014-12-12T11:16:56.569Z", 296 | "gender": "male", 297 | "skin_color": "fair", 298 | "hair_color": "brown", 299 | "height": "180", 300 | "eye_color": "blue", 301 | "mass": "110", 302 | "homeworld": 26, 303 | "birth_year": "unknown" 304 | }, 305 | "model": "resources.people", 306 | "pk": 19 307 | }, 308 | { 309 | "fields": { 310 | "edited": "2014-12-20T21:17:50.345Z", 311 | "name": "Yoda", 312 | "created": "2014-12-15T12:26:01.042Z", 313 | "gender": "male", 314 | "skin_color": "green", 315 | "hair_color": "white", 316 | "height": "66", 317 | "eye_color": "brown", 318 | "mass": "17", 319 | "homeworld": 28, 320 | "birth_year": "896BBY" 321 | }, 322 | "model": "resources.people", 323 | "pk": 20 324 | }, 325 | { 326 | "fields": { 327 | "edited": "2014-12-20T21:17:50.347Z", 328 | "name": "Palpatine", 329 | "created": "2014-12-15T12:48:05.971Z", 330 | "gender": "male", 331 | "skin_color": "pale", 332 | "hair_color": "grey", 333 | "height": "170", 334 | "eye_color": "yellow", 335 | "mass": "75", 336 | "homeworld": 8, 337 | "birth_year": "82BBY" 338 | }, 339 | "model": "resources.people", 340 | "pk": 21 341 | }, 342 | { 343 | "fields": { 344 | "edited": "2014-12-20T21:17:50.349Z", 345 | "name": "Boba Fett", 346 | "created": "2014-12-15T12:49:32.457Z", 347 | "gender": "male", 348 | "skin_color": "fair", 349 | "hair_color": "black", 350 | "height": "183", 351 | "eye_color": "brown", 352 | "mass": "78.2", 353 | "homeworld": 10, 354 | "birth_year": "31.5BBY" 355 | }, 356 | "model": "resources.people", 357 | "pk": 22 358 | }, 359 | { 360 | "fields": { 361 | "edited": "2014-12-20T21:17:50.351Z", 362 | "name": "IG-88", 363 | "created": "2014-12-15T12:51:10.076Z", 364 | "gender": "none", 365 | "skin_color": "metal", 366 | "hair_color": "none", 367 | "height": "200", 368 | "eye_color": "red", 369 | "mass": "140", 370 | "homeworld": 28, 371 | "birth_year": "15BBY" 372 | }, 373 | "model": "resources.people", 374 | "pk": 23 375 | }, 376 | { 377 | "fields": { 378 | "edited": "2014-12-20T21:17:50.355Z", 379 | "name": "Bossk", 380 | "created": "2014-12-15T12:53:49.297Z", 381 | "gender": "male", 382 | "skin_color": "green", 383 | "hair_color": "none", 384 | "height": "190", 385 | "eye_color": "red", 386 | "mass": "113", 387 | "homeworld": 29, 388 | "birth_year": "53BBY" 389 | }, 390 | "model": "resources.people", 391 | "pk": 24 392 | }, 393 | { 394 | "fields": { 395 | "edited": "2014-12-20T21:17:50.357Z", 396 | "name": "Lando Calrissian", 397 | "created": "2014-12-15T12:56:32.683Z", 398 | "gender": "male", 399 | "skin_color": "dark", 400 | "hair_color": "black", 401 | "height": "177", 402 | "eye_color": "brown", 403 | "mass": "79", 404 | "homeworld": 30, 405 | "birth_year": "31BBY" 406 | }, 407 | "model": "resources.people", 408 | "pk": 25 409 | }, 410 | { 411 | "fields": { 412 | "edited": "2014-12-20T21:17:50.359Z", 413 | "name": "Lobot", 414 | "created": "2014-12-15T13:01:57.178Z", 415 | "gender": "male", 416 | "skin_color": "light", 417 | "hair_color": "none", 418 | "height": "175", 419 | "eye_color": "blue", 420 | "mass": "79", 421 | "homeworld": 6, 422 | "birth_year": "37BBY" 423 | }, 424 | "model": "resources.people", 425 | "pk": 26 426 | }, 427 | { 428 | "fields": { 429 | "edited": "2014-12-20T21:17:50.362Z", 430 | "name": "Ackbar", 431 | "created": "2014-12-18T11:07:50.584Z", 432 | "gender": "male", 433 | "skin_color": "brown mottle", 434 | "hair_color": "none", 435 | "height": "180", 436 | "eye_color": "orange", 437 | "mass": "83", 438 | "homeworld": 31, 439 | "birth_year": "41BBY" 440 | }, 441 | "model": "resources.people", 442 | "pk": 27 443 | }, 444 | { 445 | "fields": { 446 | "edited": "2014-12-20T21:17:50.364Z", 447 | "name": "Mon Mothma", 448 | "created": "2014-12-18T11:12:38.895Z", 449 | "gender": "female", 450 | "skin_color": "fair", 451 | "hair_color": "auburn", 452 | "height": "150", 453 | "eye_color": "blue", 454 | "mass": "unknown", 455 | "homeworld": 32, 456 | "birth_year": "48BBY" 457 | }, 458 | "model": "resources.people", 459 | "pk": 28 460 | }, 461 | { 462 | "fields": { 463 | "edited": "2014-12-20T21:17:50.367Z", 464 | "name": "Arvel Crynyd", 465 | "created": "2014-12-18T11:16:33.020Z", 466 | "gender": "male", 467 | "skin_color": "fair", 468 | "hair_color": "brown", 469 | "height": "unknown", 470 | "eye_color": "brown", 471 | "mass": "unknown", 472 | "homeworld": 28, 473 | "birth_year": "unknown" 474 | }, 475 | "model": "resources.people", 476 | "pk": 29 477 | }, 478 | { 479 | "fields": { 480 | "edited": "2014-12-20T21:17:50.369Z", 481 | "name": "Wicket Systri Warrick", 482 | "created": "2014-12-18T11:21:58.954Z", 483 | "gender": "male", 484 | "skin_color": "brown", 485 | "hair_color": "brown", 486 | "height": "88", 487 | "eye_color": "brown", 488 | "mass": "20", 489 | "homeworld": 7, 490 | "birth_year": "8BBY" 491 | }, 492 | "model": "resources.people", 493 | "pk": 30 494 | }, 495 | { 496 | "fields": { 497 | "edited": "2014-12-20T21:17:50.371Z", 498 | "name": "Nien Nunb", 499 | "created": "2014-12-18T11:26:18.541Z", 500 | "gender": "male", 501 | "skin_color": "grey", 502 | "hair_color": "none", 503 | "height": "160", 504 | "eye_color": "black", 505 | "mass": "68", 506 | "homeworld": 33, 507 | "birth_year": "unknown" 508 | }, 509 | "model": "resources.people", 510 | "pk": 31 511 | }, 512 | { 513 | "fields": { 514 | "edited": "2014-12-20T21:17:50.375Z", 515 | "name": "Qui-Gon Jinn", 516 | "created": "2014-12-19T16:54:53.618Z", 517 | "gender": "male", 518 | "skin_color": "fair", 519 | "hair_color": "brown", 520 | "height": "193", 521 | "eye_color": "blue", 522 | "mass": "89", 523 | "homeworld": 28, 524 | "birth_year": "92BBY" 525 | }, 526 | "model": "resources.people", 527 | "pk": 32 528 | }, 529 | { 530 | "fields": { 531 | "edited": "2014-12-20T21:17:50.377Z", 532 | "name": "Nute Gunray", 533 | "created": "2014-12-19T17:05:57.357Z", 534 | "gender": "male", 535 | "skin_color": "mottled green", 536 | "hair_color": "none", 537 | "height": "191", 538 | "eye_color": "red", 539 | "mass": "90", 540 | "homeworld": 18, 541 | "birth_year": "unknown" 542 | }, 543 | "model": "resources.people", 544 | "pk": 33 545 | }, 546 | { 547 | "fields": { 548 | "edited": "2014-12-20T21:17:50.379Z", 549 | "name": "Finis Valorum", 550 | "created": "2014-12-19T17:21:45.915Z", 551 | "gender": "male", 552 | "skin_color": "fair", 553 | "hair_color": "blond", 554 | "height": "170", 555 | "eye_color": "blue", 556 | "mass": "unknown", 557 | "homeworld": 9, 558 | "birth_year": "91BBY" 559 | }, 560 | "model": "resources.people", 561 | "pk": 34 562 | }, 563 | { 564 | "fields": { 565 | "edited": "2014-12-20T21:17:50.381Z", 566 | "name": "Padm\u00e9 Amidala", 567 | "created": "2014-12-19T17:28:26.926Z", 568 | "gender": "female", 569 | "skin_color": "light", 570 | "hair_color": "brown", 571 | "height": "185", 572 | "eye_color": "brown", 573 | "mass": "45", 574 | "homeworld": 8, 575 | "birth_year": "46BBY" 576 | }, 577 | "model": "resources.people", 578 | "pk": 35 579 | }, 580 | { 581 | "fields": { 582 | "edited": "2014-12-20T21:17:50.383Z", 583 | "name": "Jar Jar Binks", 584 | "created": "2014-12-19T17:29:32.489Z", 585 | "gender": "male", 586 | "skin_color": "orange", 587 | "hair_color": "none", 588 | "height": "196", 589 | "eye_color": "orange", 590 | "mass": "66", 591 | "homeworld": 8, 592 | "birth_year": "52BBY" 593 | }, 594 | "model": "resources.people", 595 | "pk": 36 596 | }, 597 | { 598 | "fields": { 599 | "edited": "2014-12-20T21:17:50.385Z", 600 | "name": "Roos Tarpals", 601 | "created": "2014-12-19T17:32:56.741Z", 602 | "gender": "male", 603 | "skin_color": "grey", 604 | "hair_color": "none", 605 | "height": "224", 606 | "eye_color": "orange", 607 | "mass": "82", 608 | "homeworld": 8, 609 | "birth_year": "unknown" 610 | }, 611 | "model": "resources.people", 612 | "pk": 37 613 | }, 614 | { 615 | "fields": { 616 | "edited": "2014-12-20T21:17:50.388Z", 617 | "name": "Rugor Nass", 618 | "created": "2014-12-19T17:33:38.909Z", 619 | "gender": "male", 620 | "skin_color": "green", 621 | "hair_color": "none", 622 | "height": "206", 623 | "eye_color": "orange", 624 | "mass": "unknown", 625 | "homeworld": 8, 626 | "birth_year": "unknown" 627 | }, 628 | "model": "resources.people", 629 | "pk": 38 630 | }, 631 | { 632 | "fields": { 633 | "edited": "2014-12-20T21:17:50.392Z", 634 | "name": "Ric Oli\u00e9", 635 | "created": "2014-12-19T17:45:01.522Z", 636 | "gender": "male", 637 | "skin_color": "fair", 638 | "hair_color": "brown", 639 | "height": "183", 640 | "eye_color": "blue", 641 | "mass": "unknown", 642 | "homeworld": 8, 643 | "birth_year": "unknown" 644 | }, 645 | "model": "resources.people", 646 | "pk": 39 647 | }, 648 | { 649 | "fields": { 650 | "edited": "2014-12-20T21:17:50.395Z", 651 | "name": "Watto", 652 | "created": "2014-12-19T17:48:54.647Z", 653 | "gender": "male", 654 | "skin_color": "blue, grey", 655 | "hair_color": "black", 656 | "height": "137", 657 | "eye_color": "yellow", 658 | "mass": "unknown", 659 | "homeworld": 34, 660 | "birth_year": "unknown" 661 | }, 662 | "model": "resources.people", 663 | "pk": 40 664 | }, 665 | { 666 | "fields": { 667 | "edited": "2014-12-20T21:17:50.397Z", 668 | "name": "Sebulba", 669 | "created": "2014-12-19T17:53:02.586Z", 670 | "gender": "male", 671 | "skin_color": "grey, red", 672 | "hair_color": "none", 673 | "height": "112", 674 | "eye_color": "orange", 675 | "mass": "40", 676 | "homeworld": 35, 677 | "birth_year": "unknown" 678 | }, 679 | "model": "resources.people", 680 | "pk": 41 681 | }, 682 | { 683 | "fields": { 684 | "edited": "2014-12-20T21:17:50.399Z", 685 | "name": "Quarsh Panaka", 686 | "created": "2014-12-19T17:55:43.348Z", 687 | "gender": "male", 688 | "skin_color": "dark", 689 | "hair_color": "black", 690 | "height": "183", 691 | "eye_color": "brown", 692 | "mass": "unknown", 693 | "homeworld": 8, 694 | "birth_year": "62BBY" 695 | }, 696 | "model": "resources.people", 697 | "pk": 42 698 | }, 699 | { 700 | "fields": { 701 | "edited": "2014-12-20T21:17:50.401Z", 702 | "name": "Shmi Skywalker", 703 | "created": "2014-12-19T17:57:41.191Z", 704 | "gender": "female", 705 | "skin_color": "fair", 706 | "hair_color": "black", 707 | "height": "163", 708 | "eye_color": "brown", 709 | "mass": "unknown", 710 | "homeworld": 1, 711 | "birth_year": "72BBY" 712 | }, 713 | "model": "resources.people", 714 | "pk": 43 715 | }, 716 | { 717 | "fields": { 718 | "edited": "2014-12-20T21:17:50.403Z", 719 | "name": "Darth Maul", 720 | "created": "2014-12-19T18:00:41.929Z", 721 | "gender": "male", 722 | "skin_color": "red", 723 | "hair_color": "none", 724 | "height": "175", 725 | "eye_color": "yellow", 726 | "mass": "80", 727 | "homeworld": 36, 728 | "birth_year": "54BBY" 729 | }, 730 | "model": "resources.people", 731 | "pk": 44 732 | }, 733 | { 734 | "fields": { 735 | "edited": "2014-12-20T21:17:50.407Z", 736 | "name": "Bib Fortuna", 737 | "created": "2014-12-20T09:47:02.512Z", 738 | "gender": "male", 739 | "skin_color": "pale", 740 | "hair_color": "none", 741 | "height": "180", 742 | "eye_color": "pink", 743 | "mass": "unknown", 744 | "homeworld": 37, 745 | "birth_year": "unknown" 746 | }, 747 | "model": "resources.people", 748 | "pk": 45 749 | }, 750 | { 751 | "fields": { 752 | "edited": "2014-12-20T21:17:50.409Z", 753 | "name": "Ayla Secura", 754 | "created": "2014-12-20T09:48:01.172Z", 755 | "gender": "female", 756 | "skin_color": "blue", 757 | "hair_color": "none", 758 | "height": "178", 759 | "eye_color": "hazel", 760 | "mass": "55", 761 | "homeworld": 37, 762 | "birth_year": "48BBY" 763 | }, 764 | "model": "resources.people", 765 | "pk": 46 766 | }, 767 | { 768 | "fields": { 769 | "edited": "2014-12-20T21:17:50.410Z", 770 | "name": "Ratts Tyerel", 771 | "created": "2014-12-20T09:53:15.086Z", 772 | "gender": "male", 773 | "skin_color": "grey, blue", 774 | "hair_color": "none", 775 | "height": "79", 776 | "eye_color": "unknown", 777 | "mass": "15", 778 | "homeworld": 38, 779 | "birth_year": "unknown" 780 | }, 781 | "model": "resources.people", 782 | "pk": 47 783 | }, 784 | { 785 | "fields": { 786 | "edited": "2014-12-20T21:17:50.414Z", 787 | "name": "Dud Bolt", 788 | "created": "2014-12-20T09:57:31.858Z", 789 | "gender": "male", 790 | "skin_color": "blue, grey", 791 | "hair_color": "none", 792 | "height": "94", 793 | "eye_color": "yellow", 794 | "mass": "45", 795 | "homeworld": 39, 796 | "birth_year": "unknown" 797 | }, 798 | "model": "resources.people", 799 | "pk": 48 800 | }, 801 | { 802 | "fields": { 803 | "edited": "2014-12-20T21:17:50.416Z", 804 | "name": "Gasgano", 805 | "created": "2014-12-20T10:02:12.223Z", 806 | "gender": "male", 807 | "skin_color": "white, blue", 808 | "hair_color": "none", 809 | "height": "122", 810 | "eye_color": "black", 811 | "mass": "unknown", 812 | "homeworld": 40, 813 | "birth_year": "unknown" 814 | }, 815 | "model": "resources.people", 816 | "pk": 49 817 | }, 818 | { 819 | "fields": { 820 | "edited": "2014-12-20T21:17:50.417Z", 821 | "name": "Ben Quadinaros", 822 | "created": "2014-12-20T10:08:33.777Z", 823 | "gender": "male", 824 | "skin_color": "grey, green, yellow", 825 | "hair_color": "none", 826 | "height": "163", 827 | "eye_color": "orange", 828 | "mass": "65", 829 | "homeworld": 41, 830 | "birth_year": "unknown" 831 | }, 832 | "model": "resources.people", 833 | "pk": 50 834 | }, 835 | { 836 | "fields": { 837 | "edited": "2014-12-20T21:17:50.420Z", 838 | "name": "Mace Windu", 839 | "created": "2014-12-20T10:12:30.846Z", 840 | "gender": "male", 841 | "skin_color": "dark", 842 | "hair_color": "none", 843 | "height": "188", 844 | "eye_color": "brown", 845 | "mass": "84", 846 | "homeworld": 42, 847 | "birth_year": "72BBY" 848 | }, 849 | "model": "resources.people", 850 | "pk": 51 851 | }, 852 | { 853 | "fields": { 854 | "edited": "2014-12-20T21:17:50.422Z", 855 | "name": "Ki-Adi-Mundi", 856 | "created": "2014-12-20T10:15:32.293Z", 857 | "gender": "male", 858 | "skin_color": "pale", 859 | "hair_color": "white", 860 | "height": "198", 861 | "eye_color": "yellow", 862 | "mass": "82", 863 | "homeworld": 43, 864 | "birth_year": "92BBY" 865 | }, 866 | "model": "resources.people", 867 | "pk": 52 868 | }, 869 | { 870 | "fields": { 871 | "edited": "2014-12-20T21:17:50.424Z", 872 | "name": "Kit Fisto", 873 | "created": "2014-12-20T10:18:57.202Z", 874 | "gender": "male", 875 | "skin_color": "green", 876 | "hair_color": "none", 877 | "height": "196", 878 | "eye_color": "black", 879 | "mass": "87", 880 | "homeworld": 44, 881 | "birth_year": "unknown" 882 | }, 883 | "model": "resources.people", 884 | "pk": 53 885 | }, 886 | { 887 | "fields": { 888 | "edited": "2014-12-20T21:17:50.427Z", 889 | "name": "Eeth Koth", 890 | "created": "2014-12-20T10:26:47.902Z", 891 | "gender": "male", 892 | "skin_color": "brown", 893 | "hair_color": "black", 894 | "height": "171", 895 | "eye_color": "brown", 896 | "mass": "unknown", 897 | "homeworld": 45, 898 | "birth_year": "unknown" 899 | }, 900 | "model": "resources.people", 901 | "pk": 54 902 | }, 903 | { 904 | "fields": { 905 | "edited": "2014-12-20T21:17:50.432Z", 906 | "name": "Adi Gallia", 907 | "created": "2014-12-20T10:29:11.661Z", 908 | "gender": "female", 909 | "skin_color": "dark", 910 | "hair_color": "none", 911 | "height": "184", 912 | "eye_color": "blue", 913 | "mass": "50", 914 | "homeworld": 9, 915 | "birth_year": "unknown" 916 | }, 917 | "model": "resources.people", 918 | "pk": 55 919 | }, 920 | { 921 | "fields": { 922 | "edited": "2014-12-20T21:17:50.434Z", 923 | "name": "Saesee Tiin", 924 | "created": "2014-12-20T10:32:11.669Z", 925 | "gender": "male", 926 | "skin_color": "pale", 927 | "hair_color": "none", 928 | "height": "188", 929 | "eye_color": "orange", 930 | "mass": "unknown", 931 | "homeworld": 47, 932 | "birth_year": "unknown" 933 | }, 934 | "model": "resources.people", 935 | "pk": 56 936 | }, 937 | { 938 | "fields": { 939 | "edited": "2014-12-20T21:17:50.437Z", 940 | "name": "Yarael Poof", 941 | "created": "2014-12-20T10:34:48.725Z", 942 | "gender": "male", 943 | "skin_color": "white", 944 | "hair_color": "none", 945 | "height": "264", 946 | "eye_color": "yellow", 947 | "mass": "unknown", 948 | "homeworld": 48, 949 | "birth_year": "unknown" 950 | }, 951 | "model": "resources.people", 952 | "pk": 57 953 | }, 954 | { 955 | "fields": { 956 | "edited": "2014-12-20T21:17:50.439Z", 957 | "name": "Plo Koon", 958 | "created": "2014-12-20T10:49:19.859Z", 959 | "gender": "male", 960 | "skin_color": "orange", 961 | "hair_color": "none", 962 | "height": "188", 963 | "eye_color": "black", 964 | "mass": "80", 965 | "homeworld": 49, 966 | "birth_year": "22BBY" 967 | }, 968 | "model": "resources.people", 969 | "pk": 58 970 | }, 971 | { 972 | "fields": { 973 | "edited": "2014-12-20T21:17:50.442Z", 974 | "name": "Mas Amedda", 975 | "created": "2014-12-20T10:53:26.457Z", 976 | "gender": "male", 977 | "skin_color": "blue", 978 | "hair_color": "none", 979 | "height": "196", 980 | "eye_color": "blue", 981 | "mass": "unknown", 982 | "homeworld": 50, 983 | "birth_year": "unknown" 984 | }, 985 | "model": "resources.people", 986 | "pk": 59 987 | }, 988 | { 989 | "fields": { 990 | "edited": "2014-12-20T21:17:50.445Z", 991 | "name": "Gregar Typho", 992 | "created": "2014-12-20T11:10:10.381Z", 993 | "gender": "male", 994 | "skin_color": "dark", 995 | "hair_color": "black", 996 | "height": "185", 997 | "eye_color": "brown", 998 | "mass": "85", 999 | "homeworld": 8, 1000 | "birth_year": "unknown" 1001 | }, 1002 | "model": "resources.people", 1003 | "pk": 60 1004 | }, 1005 | { 1006 | "fields": { 1007 | "edited": "2014-12-20T21:17:50.449Z", 1008 | "name": "Cord\u00e9", 1009 | "created": "2014-12-20T11:11:39.630Z", 1010 | "gender": "female", 1011 | "skin_color": "light", 1012 | "hair_color": "brown", 1013 | "height": "157", 1014 | "eye_color": "brown", 1015 | "mass": "unknown", 1016 | "homeworld": 8, 1017 | "birth_year": "unknown" 1018 | }, 1019 | "model": "resources.people", 1020 | "pk": 61 1021 | }, 1022 | { 1023 | "fields": { 1024 | "edited": "2014-12-20T21:17:50.451Z", 1025 | "name": "Cliegg Lars", 1026 | "created": "2014-12-20T15:59:03.958Z", 1027 | "gender": "male", 1028 | "skin_color": "fair", 1029 | "hair_color": "brown", 1030 | "height": "183", 1031 | "eye_color": "blue", 1032 | "mass": "unknown", 1033 | "homeworld": 1, 1034 | "birth_year": "82BBY" 1035 | }, 1036 | "model": "resources.people", 1037 | "pk": 62 1038 | }, 1039 | { 1040 | "fields": { 1041 | "edited": "2014-12-20T21:17:50.453Z", 1042 | "name": "Poggle the Lesser", 1043 | "created": "2014-12-20T16:40:43.977Z", 1044 | "gender": "male", 1045 | "skin_color": "green", 1046 | "hair_color": "none", 1047 | "height": "183", 1048 | "eye_color": "yellow", 1049 | "mass": "80", 1050 | "homeworld": 11, 1051 | "birth_year": "unknown" 1052 | }, 1053 | "model": "resources.people", 1054 | "pk": 63 1055 | }, 1056 | { 1057 | "fields": { 1058 | "edited": "2014-12-20T21:17:50.455Z", 1059 | "name": "Luminara Unduli", 1060 | "created": "2014-12-20T16:45:53.668Z", 1061 | "gender": "female", 1062 | "skin_color": "yellow", 1063 | "hair_color": "black", 1064 | "height": "170", 1065 | "eye_color": "blue", 1066 | "mass": "56.2", 1067 | "homeworld": 51, 1068 | "birth_year": "58BBY" 1069 | }, 1070 | "model": "resources.people", 1071 | "pk": 64 1072 | }, 1073 | { 1074 | "fields": { 1075 | "edited": "2014-12-20T21:17:50.457Z", 1076 | "name": "Barriss Offee", 1077 | "created": "2014-12-20T16:46:40.440Z", 1078 | "gender": "female", 1079 | "skin_color": "yellow", 1080 | "hair_color": "black", 1081 | "height": "166", 1082 | "eye_color": "blue", 1083 | "mass": "50", 1084 | "homeworld": 51, 1085 | "birth_year": "40BBY" 1086 | }, 1087 | "model": "resources.people", 1088 | "pk": 65 1089 | }, 1090 | { 1091 | "fields": { 1092 | "edited": "2014-12-20T21:17:50.460Z", 1093 | "name": "Dorm\u00e9", 1094 | "created": "2014-12-20T16:49:14.640Z", 1095 | "gender": "female", 1096 | "skin_color": "light", 1097 | "hair_color": "brown", 1098 | "height": "165", 1099 | "eye_color": "brown", 1100 | "mass": "unknown", 1101 | "homeworld": 8, 1102 | "birth_year": "unknown" 1103 | }, 1104 | "model": "resources.people", 1105 | "pk": 66 1106 | }, 1107 | { 1108 | "fields": { 1109 | "edited": "2014-12-20T21:17:50.462Z", 1110 | "name": "Dooku", 1111 | "created": "2014-12-20T16:52:14.726Z", 1112 | "gender": "male", 1113 | "skin_color": "fair", 1114 | "hair_color": "white", 1115 | "height": "193", 1116 | "eye_color": "brown", 1117 | "mass": "80", 1118 | "homeworld": 52, 1119 | "birth_year": "102BBY" 1120 | }, 1121 | "model": "resources.people", 1122 | "pk": 67 1123 | }, 1124 | { 1125 | "fields": { 1126 | "edited": "2014-12-20T21:17:50.463Z", 1127 | "name": "Bail Prestor Organa", 1128 | "created": "2014-12-20T16:53:08.575Z", 1129 | "gender": "male", 1130 | "skin_color": "tan", 1131 | "hair_color": "black", 1132 | "height": "191", 1133 | "eye_color": "brown", 1134 | "mass": "unknown", 1135 | "homeworld": 2, 1136 | "birth_year": "67BBY" 1137 | }, 1138 | "model": "resources.people", 1139 | "pk": 68 1140 | }, 1141 | { 1142 | "fields": { 1143 | "edited": "2014-12-20T21:17:50.465Z", 1144 | "name": "Jango Fett", 1145 | "created": "2014-12-20T16:54:41.620Z", 1146 | "gender": "male", 1147 | "skin_color": "tan", 1148 | "hair_color": "black", 1149 | "height": "183", 1150 | "eye_color": "brown", 1151 | "mass": "79", 1152 | "homeworld": 53, 1153 | "birth_year": "66BBY" 1154 | }, 1155 | "model": "resources.people", 1156 | "pk": 69 1157 | }, 1158 | { 1159 | "fields": { 1160 | "edited": "2014-12-20T21:17:50.468Z", 1161 | "name": "Zam Wesell", 1162 | "created": "2014-12-20T16:57:44.471Z", 1163 | "gender": "female", 1164 | "skin_color": "fair, green, yellow", 1165 | "hair_color": "blonde", 1166 | "height": "168", 1167 | "eye_color": "yellow", 1168 | "mass": "55", 1169 | "homeworld": 54, 1170 | "birth_year": "unknown" 1171 | }, 1172 | "model": "resources.people", 1173 | "pk": 70 1174 | }, 1175 | { 1176 | "fields": { 1177 | "edited": "2014-12-20T21:17:50.470Z", 1178 | "name": "Dexter Jettster", 1179 | "created": "2014-12-20T17:28:27.248Z", 1180 | "gender": "male", 1181 | "skin_color": "brown", 1182 | "hair_color": "none", 1183 | "height": "198", 1184 | "eye_color": "yellow", 1185 | "mass": "102", 1186 | "homeworld": 55, 1187 | "birth_year": "unknown" 1188 | }, 1189 | "model": "resources.people", 1190 | "pk": 71 1191 | }, 1192 | { 1193 | "fields": { 1194 | "edited": "2014-12-20T21:17:50.473Z", 1195 | "name": "Lama Su", 1196 | "created": "2014-12-20T17:30:50.416Z", 1197 | "gender": "male", 1198 | "skin_color": "grey", 1199 | "hair_color": "none", 1200 | "height": "229", 1201 | "eye_color": "black", 1202 | "mass": "88", 1203 | "homeworld": 10, 1204 | "birth_year": "unknown" 1205 | }, 1206 | "model": "resources.people", 1207 | "pk": 72 1208 | }, 1209 | { 1210 | "fields": { 1211 | "edited": "2014-12-20T21:17:50.474Z", 1212 | "name": "Taun We", 1213 | "created": "2014-12-20T17:31:21.195Z", 1214 | "gender": "female", 1215 | "skin_color": "grey", 1216 | "hair_color": "none", 1217 | "height": "213", 1218 | "eye_color": "black", 1219 | "mass": "unknown", 1220 | "homeworld": 10, 1221 | "birth_year": "unknown" 1222 | }, 1223 | "model": "resources.people", 1224 | "pk": 73 1225 | }, 1226 | { 1227 | "fields": { 1228 | "edited": "2014-12-20T21:17:50.476Z", 1229 | "name": "Jocasta Nu", 1230 | "created": "2014-12-20T17:32:51.996Z", 1231 | "gender": "female", 1232 | "skin_color": "fair", 1233 | "hair_color": "white", 1234 | "height": "167", 1235 | "eye_color": "blue", 1236 | "mass": "unknown", 1237 | "homeworld": 9, 1238 | "birth_year": "unknown" 1239 | }, 1240 | "model": "resources.people", 1241 | "pk": 74 1242 | }, 1243 | { 1244 | "fields": { 1245 | "edited": "2014-12-20T21:17:50.478Z", 1246 | "name": "R4-P17", 1247 | "created": "2014-12-20T17:43:36.409Z", 1248 | "gender": "female", 1249 | "skin_color": "silver, red", 1250 | "hair_color": "none", 1251 | "height": "96", 1252 | "eye_color": "red, blue", 1253 | "mass": "unknown", 1254 | "homeworld": 28, 1255 | "birth_year": "unknown" 1256 | }, 1257 | "model": "resources.people", 1258 | "pk": 75 1259 | }, 1260 | { 1261 | "fields": { 1262 | "edited": "2014-12-20T21:17:50.481Z", 1263 | "name": "Wat Tambor", 1264 | "created": "2014-12-20T17:53:52.607Z", 1265 | "gender": "male", 1266 | "skin_color": "green, grey", 1267 | "hair_color": "none", 1268 | "height": "193", 1269 | "eye_color": "unknown", 1270 | "mass": "48", 1271 | "homeworld": 56, 1272 | "birth_year": "unknown" 1273 | }, 1274 | "model": "resources.people", 1275 | "pk": 76 1276 | }, 1277 | { 1278 | "fields": { 1279 | "edited": "2014-12-20T21:17:50.484Z", 1280 | "name": "San Hill", 1281 | "created": "2014-12-20T17:58:17.049Z", 1282 | "gender": "male", 1283 | "skin_color": "grey", 1284 | "hair_color": "none", 1285 | "height": "191", 1286 | "eye_color": "gold", 1287 | "mass": "unknown", 1288 | "homeworld": 57, 1289 | "birth_year": "unknown" 1290 | }, 1291 | "model": "resources.people", 1292 | "pk": 77 1293 | }, 1294 | { 1295 | "fields": { 1296 | "edited": "2014-12-20T21:17:50.486Z", 1297 | "name": "Shaak Ti", 1298 | "created": "2014-12-20T18:44:01.103Z", 1299 | "gender": "female", 1300 | "skin_color": "red, blue, white", 1301 | "hair_color": "none", 1302 | "height": "178", 1303 | "eye_color": "black", 1304 | "mass": "57", 1305 | "homeworld": 58, 1306 | "birth_year": "unknown" 1307 | }, 1308 | "model": "resources.people", 1309 | "pk": 78 1310 | }, 1311 | { 1312 | "fields": { 1313 | "edited": "2014-12-20T21:17:50.488Z", 1314 | "name": "Grievous", 1315 | "created": "2014-12-20T19:43:53.348Z", 1316 | "gender": "male", 1317 | "skin_color": "brown, white", 1318 | "hair_color": "none", 1319 | "height": "216", 1320 | "eye_color": "green, yellow", 1321 | "mass": "159", 1322 | "homeworld": 59, 1323 | "birth_year": "unknown" 1324 | }, 1325 | "model": "resources.people", 1326 | "pk": 79 1327 | }, 1328 | { 1329 | "fields": { 1330 | "edited": "2014-12-20T21:17:50.491Z", 1331 | "name": "Tarfful", 1332 | "created": "2014-12-20T19:46:34.209Z", 1333 | "gender": "male", 1334 | "skin_color": "brown", 1335 | "hair_color": "brown", 1336 | "height": "234", 1337 | "eye_color": "blue", 1338 | "mass": "136", 1339 | "homeworld": 14, 1340 | "birth_year": "unknown" 1341 | }, 1342 | "model": "resources.people", 1343 | "pk": 80 1344 | }, 1345 | { 1346 | "fields": { 1347 | "edited": "2014-12-20T21:17:50.493Z", 1348 | "name": "Raymus Antilles", 1349 | "created": "2014-12-20T19:49:35.583Z", 1350 | "gender": "male", 1351 | "skin_color": "light", 1352 | "hair_color": "brown", 1353 | "height": "188", 1354 | "eye_color": "brown", 1355 | "mass": "79", 1356 | "homeworld": 2, 1357 | "birth_year": "unknown" 1358 | }, 1359 | "model": "resources.people", 1360 | "pk": 81 1361 | }, 1362 | { 1363 | "fields": { 1364 | "edited": "2014-12-20T21:17:50.496Z", 1365 | "name": "Sly Moore", 1366 | "created": "2014-12-20T20:18:37.619Z", 1367 | "gender": "female", 1368 | "skin_color": "pale", 1369 | "hair_color": "none", 1370 | "height": "178", 1371 | "eye_color": "white", 1372 | "mass": "48", 1373 | "homeworld": 60, 1374 | "birth_year": "unknown" 1375 | }, 1376 | "model": "resources.people", 1377 | "pk": 82 1378 | }, 1379 | { 1380 | "fields": { 1381 | "edited": "2014-12-20T21:17:50.498Z", 1382 | "name": "Tion Medon", 1383 | "created": "2014-12-20T20:35:04.260Z", 1384 | "gender": "male", 1385 | "skin_color": "grey", 1386 | "hair_color": "none", 1387 | "height": "206", 1388 | "eye_color": "black", 1389 | "mass": "80", 1390 | "homeworld": 12, 1391 | "birth_year": "unknown" 1392 | }, 1393 | "model": "resources.people", 1394 | "pk": 83 1395 | } 1396 | ] 1397 | -------------------------------------------------------------------------------- /src/fake-backend/planets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "fields": { 4 | "edited": "2014-12-20T20:58:18.411Z", 5 | "climate": "arid", 6 | "surface_water": "1", 7 | "name": "Tatooine", 8 | "diameter": "10465", 9 | "rotation_period": "23", 10 | "created": "2014-12-09T13:50:49.641Z", 11 | "terrain": "desert", 12 | "gravity": "1 standard", 13 | "orbital_period": "304", 14 | "population": "200000" 15 | }, 16 | "model": "resources.planet", 17 | "pk": 1 18 | }, 19 | { 20 | "fields": { 21 | "edited": "2014-12-20T20:58:18.420Z", 22 | "climate": "temperate", 23 | "surface_water": "40", 24 | "name": "Alderaan", 25 | "diameter": "12500", 26 | "rotation_period": "24", 27 | "created": "2014-12-10T11:35:48.479Z", 28 | "terrain": "grasslands, mountains", 29 | "gravity": "1 standard", 30 | "orbital_period": "364", 31 | "population": "2000000000" 32 | }, 33 | "model": "resources.planet", 34 | "pk": 2 35 | }, 36 | { 37 | "fields": { 38 | "edited": "2014-12-20T20:58:18.421Z", 39 | "climate": "temperate, tropical", 40 | "surface_water": "8", 41 | "name": "Yavin IV", 42 | "diameter": "10200", 43 | "rotation_period": "24", 44 | "created": "2014-12-10T11:37:19.144Z", 45 | "terrain": "jungle, rainforests", 46 | "gravity": "1 standard", 47 | "orbital_period": "4818", 48 | "population": "1000" 49 | }, 50 | "model": "resources.planet", 51 | "pk": 3 52 | }, 53 | { 54 | "fields": { 55 | "edited": "2014-12-20T20:58:18.423Z", 56 | "climate": "frozen", 57 | "surface_water": "100", 58 | "name": "Hoth", 59 | "diameter": "7200", 60 | "rotation_period": "23", 61 | "created": "2014-12-10T11:39:13.934Z", 62 | "terrain": "tundra, ice caves, mountain ranges", 63 | "gravity": "1.1 standard", 64 | "orbital_period": "549", 65 | "population": "unknown" 66 | }, 67 | "model": "resources.planet", 68 | "pk": 4 69 | }, 70 | { 71 | "fields": { 72 | "edited": "2014-12-20T20:58:18.425Z", 73 | "climate": "murky", 74 | "surface_water": "8", 75 | "name": "Dagobah", 76 | "diameter": "8900", 77 | "rotation_period": "23", 78 | "created": "2014-12-10T11:42:22.590Z", 79 | "terrain": "swamp, jungles", 80 | "gravity": "N/A", 81 | "orbital_period": "341", 82 | "population": "unknown" 83 | }, 84 | "model": "resources.planet", 85 | "pk": 5 86 | }, 87 | { 88 | "fields": { 89 | "edited": "2014-12-20T20:58:18.427Z", 90 | "climate": "temperate", 91 | "surface_water": "0", 92 | "name": "Bespin", 93 | "diameter": "118000", 94 | "rotation_period": "12", 95 | "created": "2014-12-10T11:43:55.240Z", 96 | "terrain": "gas giant", 97 | "gravity": "1.5 (surface), 1 standard (Cloud City)", 98 | "orbital_period": "5110", 99 | "population": "6000000" 100 | }, 101 | "model": "resources.planet", 102 | "pk": 6 103 | }, 104 | { 105 | "fields": { 106 | "edited": "2014-12-20T20:58:18.429Z", 107 | "climate": "temperate", 108 | "surface_water": "8", 109 | "name": "Endor", 110 | "diameter": "4900", 111 | "rotation_period": "18", 112 | "created": "2014-12-10T11:50:29.349Z", 113 | "terrain": "forests, mountains, lakes", 114 | "gravity": "0.85 standard", 115 | "orbital_period": "402", 116 | "population": "30000000" 117 | }, 118 | "model": "resources.planet", 119 | "pk": 7 120 | }, 121 | { 122 | "fields": { 123 | "edited": "2014-12-20T20:58:18.430Z", 124 | "climate": "temperate", 125 | "surface_water": "12", 126 | "name": "Naboo", 127 | "diameter": "12120", 128 | "rotation_period": "26", 129 | "created": "2014-12-10T11:52:31.066Z", 130 | "terrain": "grassy hills, swamps, forests, mountains", 131 | "gravity": "1 standard", 132 | "orbital_period": "312", 133 | "population": "4500000000" 134 | }, 135 | "model": "resources.planet", 136 | "pk": 8 137 | }, 138 | { 139 | "fields": { 140 | "edited": "2014-12-20T20:58:18.432Z", 141 | "climate": "temperate", 142 | "surface_water": "unknown", 143 | "name": "Coruscant", 144 | "diameter": "12240", 145 | "rotation_period": "24", 146 | "created": "2014-12-10T11:54:13.921Z", 147 | "terrain": "cityscape, mountains", 148 | "gravity": "1 standard", 149 | "orbital_period": "368", 150 | "population": "1000000000000" 151 | }, 152 | "model": "resources.planet", 153 | "pk": 9 154 | }, 155 | { 156 | "fields": { 157 | "edited": "2014-12-20T20:58:18.434Z", 158 | "climate": "temperate", 159 | "surface_water": "100", 160 | "name": "Kamino", 161 | "diameter": "19720", 162 | "rotation_period": "27", 163 | "created": "2014-12-10T12:45:06.577Z", 164 | "terrain": "ocean", 165 | "gravity": "1 standard", 166 | "orbital_period": "463", 167 | "population": "1000000000" 168 | }, 169 | "model": "resources.planet", 170 | "pk": 10 171 | }, 172 | { 173 | "fields": { 174 | "edited": "2014-12-20T20:58:18.437Z", 175 | "climate": "temperate, arid", 176 | "surface_water": "5", 177 | "name": "Geonosis", 178 | "diameter": "11370", 179 | "rotation_period": "30", 180 | "created": "2014-12-10T12:47:22.350Z", 181 | "terrain": "rock, desert, mountain, barren", 182 | "gravity": "0.9 standard", 183 | "orbital_period": "256", 184 | "population": "100000000000" 185 | }, 186 | "model": "resources.planet", 187 | "pk": 11 188 | }, 189 | { 190 | "fields": { 191 | "edited": "2014-12-20T20:58:18.439Z", 192 | "climate": "temperate, arid, windy", 193 | "surface_water": "0.9", 194 | "name": "Utapau", 195 | "diameter": "12900", 196 | "rotation_period": "27", 197 | "created": "2014-12-10T12:49:01.491Z", 198 | "terrain": "scrublands, savanna, canyons, sinkholes", 199 | "gravity": "1 standard", 200 | "orbital_period": "351", 201 | "population": "95000000" 202 | }, 203 | "model": "resources.planet", 204 | "pk": 12 205 | }, 206 | { 207 | "fields": { 208 | "edited": "2014-12-20T20:58:18.440Z", 209 | "climate": "hot", 210 | "surface_water": "0", 211 | "name": "Mustafar", 212 | "diameter": "4200", 213 | "rotation_period": "36", 214 | "created": "2014-12-10T12:50:16.526Z", 215 | "terrain": "volcanoes, lava rivers, mountains, caves", 216 | "gravity": "1 standard", 217 | "orbital_period": "412", 218 | "population": "20000" 219 | }, 220 | "model": "resources.planet", 221 | "pk": 13 222 | }, 223 | { 224 | "fields": { 225 | "edited": "2014-12-20T20:58:18.442Z", 226 | "climate": "tropical", 227 | "surface_water": "60", 228 | "name": "Kashyyyk", 229 | "diameter": "12765", 230 | "rotation_period": "26", 231 | "created": "2014-12-10T13:32:00.124Z", 232 | "terrain": "jungle, forests, lakes, rivers", 233 | "gravity": "1 standard", 234 | "orbital_period": "381", 235 | "population": "45000000" 236 | }, 237 | "model": "resources.planet", 238 | "pk": 14 239 | }, 240 | { 241 | "fields": { 242 | "edited": "2014-12-20T20:58:18.444Z", 243 | "climate": "artificial temperate ", 244 | "surface_water": "0", 245 | "name": "Polis Massa", 246 | "diameter": "0", 247 | "rotation_period": "24", 248 | "created": "2014-12-10T13:33:46.405Z", 249 | "terrain": "airless asteroid", 250 | "gravity": "0.56 standard", 251 | "orbital_period": "590", 252 | "population": "1000000" 253 | }, 254 | "model": "resources.planet", 255 | "pk": 15 256 | }, 257 | { 258 | "fields": { 259 | "edited": "2014-12-20T20:58:18.446Z", 260 | "climate": "frigid", 261 | "surface_water": "unknown", 262 | "name": "Mygeeto", 263 | "diameter": "10088", 264 | "rotation_period": "12", 265 | "created": "2014-12-10T13:43:39.139Z", 266 | "terrain": "glaciers, mountains, ice canyons", 267 | "gravity": "1 standard", 268 | "orbital_period": "167", 269 | "population": "19000000" 270 | }, 271 | "model": "resources.planet", 272 | "pk": 16 273 | }, 274 | { 275 | "fields": { 276 | "edited": "2014-12-20T20:58:18.447Z", 277 | "climate": "hot, humid", 278 | "surface_water": "unknown", 279 | "name": "Felucia", 280 | "diameter": "9100", 281 | "rotation_period": "34", 282 | "created": "2014-12-10T13:44:50.397Z", 283 | "terrain": "fungus forests", 284 | "gravity": "0.75 standard", 285 | "orbital_period": "231", 286 | "population": "8500000" 287 | }, 288 | "model": "resources.planet", 289 | "pk": 17 290 | }, 291 | { 292 | "fields": { 293 | "edited": "2014-12-20T20:58:18.449Z", 294 | "climate": "temperate, moist", 295 | "surface_water": "unknown", 296 | "name": "Cato Neimoidia", 297 | "diameter": "0", 298 | "rotation_period": "25", 299 | "created": "2014-12-10T13:46:28.704Z", 300 | "terrain": "mountains, fields, forests, rock arches", 301 | "gravity": "1 standard", 302 | "orbital_period": "278", 303 | "population": "10000000" 304 | }, 305 | "model": "resources.planet", 306 | "pk": 18 307 | }, 308 | { 309 | "fields": { 310 | "edited": "2014-12-20T20:58:18.450Z", 311 | "climate": "hot", 312 | "surface_water": "unknown", 313 | "name": "Saleucami", 314 | "diameter": "14920", 315 | "rotation_period": "26", 316 | "created": "2014-12-10T13:47:46.874Z", 317 | "terrain": "caves, desert, mountains, volcanoes", 318 | "gravity": "unknown", 319 | "orbital_period": "392", 320 | "population": "1400000000" 321 | }, 322 | "model": "resources.planet", 323 | "pk": 19 324 | }, 325 | { 326 | "fields": { 327 | "edited": "2014-12-20T20:58:18.452Z", 328 | "climate": "temperate", 329 | "surface_water": "unknown", 330 | "name": "Stewjon", 331 | "diameter": "0", 332 | "rotation_period": "unknown", 333 | "created": "2014-12-10T16:16:26.566Z", 334 | "terrain": "grass", 335 | "gravity": "1 standard", 336 | "orbital_period": "unknown", 337 | "population": "unknown" 338 | }, 339 | "model": "resources.planet", 340 | "pk": 20 341 | }, 342 | { 343 | "fields": { 344 | "edited": "2014-12-20T20:58:18.454Z", 345 | "climate": "polluted", 346 | "surface_water": "unknown", 347 | "name": "Eriadu", 348 | "diameter": "13490", 349 | "rotation_period": "24", 350 | "created": "2014-12-10T16:26:54.384Z", 351 | "terrain": "cityscape", 352 | "gravity": "1 standard", 353 | "orbital_period": "360", 354 | "population": "22000000000" 355 | }, 356 | "model": "resources.planet", 357 | "pk": 21 358 | }, 359 | { 360 | "fields": { 361 | "edited": "2014-12-20T20:58:18.456Z", 362 | "climate": "temperate", 363 | "surface_water": "70", 364 | "name": "Corellia", 365 | "diameter": "11000", 366 | "rotation_period": "25", 367 | "created": "2014-12-10T16:49:12.453Z", 368 | "terrain": "plains, urban, hills, forests", 369 | "gravity": "1 standard", 370 | "orbital_period": "329", 371 | "population": "3000000000" 372 | }, 373 | "model": "resources.planet", 374 | "pk": 22 375 | }, 376 | { 377 | "fields": { 378 | "edited": "2014-12-20T20:58:18.458Z", 379 | "climate": "hot", 380 | "surface_water": "60", 381 | "name": "Rodia", 382 | "diameter": "7549", 383 | "rotation_period": "29", 384 | "created": "2014-12-10T17:03:28.110Z", 385 | "terrain": "jungles, oceans, urban, swamps", 386 | "gravity": "1 standard", 387 | "orbital_period": "305", 388 | "population": "1300000000" 389 | }, 390 | "model": "resources.planet", 391 | "pk": 23 392 | }, 393 | { 394 | "fields": { 395 | "edited": "2014-12-20T20:58:18.460Z", 396 | "climate": "temperate", 397 | "surface_water": "unknown", 398 | "name": "Nal Hutta", 399 | "diameter": "12150", 400 | "rotation_period": "87", 401 | "created": "2014-12-10T17:11:29.452Z", 402 | "terrain": "urban, oceans, swamps, bogs", 403 | "gravity": "1 standard", 404 | "orbital_period": "413", 405 | "population": "7000000000" 406 | }, 407 | "model": "resources.planet", 408 | "pk": 24 409 | }, 410 | { 411 | "fields": { 412 | "edited": "2014-12-20T20:58:18.461Z", 413 | "climate": "temperate", 414 | "surface_water": "unknown", 415 | "name": "Dantooine", 416 | "diameter": "9830", 417 | "rotation_period": "25", 418 | "created": "2014-12-10T17:23:29.896Z", 419 | "terrain": "oceans, savannas, mountains, grasslands", 420 | "gravity": "1 standard", 421 | "orbital_period": "378", 422 | "population": "1000" 423 | }, 424 | "model": "resources.planet", 425 | "pk": 25 426 | }, 427 | { 428 | "fields": { 429 | "edited": "2014-12-20T20:58:18.463Z", 430 | "climate": "temperate", 431 | "surface_water": "98", 432 | "name": "Bestine IV", 433 | "diameter": "6400", 434 | "rotation_period": "26", 435 | "created": "2014-12-12T11:16:55.078Z", 436 | "terrain": "rocky islands, oceans", 437 | "gravity": "unknown", 438 | "orbital_period": "680", 439 | "population": "62000000" 440 | }, 441 | "model": "resources.planet", 442 | "pk": 26 443 | }, 444 | { 445 | "fields": { 446 | "edited": "2014-12-20T20:58:18.464Z", 447 | "climate": "temperate", 448 | "surface_water": "10", 449 | "name": "Ord Mantell", 450 | "diameter": "14050", 451 | "rotation_period": "26", 452 | "created": "2014-12-15T12:23:41.661Z", 453 | "terrain": "plains, seas, mesas", 454 | "gravity": "1 standard", 455 | "orbital_period": "334", 456 | "population": "4000000000" 457 | }, 458 | "model": "resources.planet", 459 | "pk": 27 460 | }, 461 | { 462 | "fields": { 463 | "edited": "2014-12-20T20:58:18.466Z", 464 | "climate": "unknown", 465 | "surface_water": "unknown", 466 | "name": "unknown", 467 | "diameter": "0", 468 | "rotation_period": "0", 469 | "created": "2014-12-15T12:25:59.569Z", 470 | "terrain": "unknown", 471 | "gravity": "unknown", 472 | "orbital_period": "0", 473 | "population": "unknown" 474 | }, 475 | "model": "resources.planet", 476 | "pk": 28 477 | }, 478 | { 479 | "fields": { 480 | "edited": "2014-12-20T20:58:18.468Z", 481 | "climate": "arid", 482 | "surface_water": "unknown", 483 | "name": "Trandosha", 484 | "diameter": "0", 485 | "rotation_period": "25", 486 | "created": "2014-12-15T12:53:47.695Z", 487 | "terrain": "mountains, seas, grasslands, deserts", 488 | "gravity": "0.62 standard", 489 | "orbital_period": "371", 490 | "population": "42000000" 491 | }, 492 | "model": "resources.planet", 493 | "pk": 29 494 | }, 495 | { 496 | "fields": { 497 | "edited": "2014-12-20T20:58:18.469Z", 498 | "climate": "arid", 499 | "surface_water": "unknown", 500 | "name": "Socorro", 501 | "diameter": "0", 502 | "rotation_period": "20", 503 | "created": "2014-12-15T12:56:31.121Z", 504 | "terrain": "deserts, mountains", 505 | "gravity": "1 standard", 506 | "orbital_period": "326", 507 | "population": "300000000" 508 | }, 509 | "model": "resources.planet", 510 | "pk": 30 511 | }, 512 | { 513 | "fields": { 514 | "edited": "2014-12-20T20:58:18.471Z", 515 | "climate": "temperate", 516 | "surface_water": "100", 517 | "name": "Mon Cala", 518 | "diameter": "11030", 519 | "rotation_period": "21", 520 | "created": "2014-12-18T11:07:01.792Z", 521 | "terrain": "oceans, reefs, islands", 522 | "gravity": "1", 523 | "orbital_period": "398", 524 | "population": "27000000000" 525 | }, 526 | "model": "resources.planet", 527 | "pk": 31 528 | }, 529 | { 530 | "fields": { 531 | "edited": "2014-12-20T20:58:18.472Z", 532 | "climate": "temperate", 533 | "surface_water": "40", 534 | "name": "Chandrila", 535 | "diameter": "13500", 536 | "rotation_period": "20", 537 | "created": "2014-12-18T11:11:51.872Z", 538 | "terrain": "plains, forests", 539 | "gravity": "1", 540 | "orbital_period": "368", 541 | "population": "1200000000" 542 | }, 543 | "model": "resources.planet", 544 | "pk": 32 545 | }, 546 | { 547 | "fields": { 548 | "edited": "2014-12-20T20:58:18.474Z", 549 | "climate": "superheated", 550 | "surface_water": "5", 551 | "name": "Sullust", 552 | "diameter": "12780", 553 | "rotation_period": "20", 554 | "created": "2014-12-18T11:25:40.243Z", 555 | "terrain": "mountains, volcanoes, rocky deserts", 556 | "gravity": "1", 557 | "orbital_period": "263", 558 | "population": "18500000000" 559 | }, 560 | "model": "resources.planet", 561 | "pk": 33 562 | }, 563 | { 564 | "fields": { 565 | "edited": "2014-12-20T20:58:18.476Z", 566 | "climate": "temperate", 567 | "surface_water": "unknown", 568 | "name": "Toydaria", 569 | "diameter": "7900", 570 | "rotation_period": "21", 571 | "created": "2014-12-19T17:47:54.403Z", 572 | "terrain": "swamps, lakes", 573 | "gravity": "1", 574 | "orbital_period": "184", 575 | "population": "11000000" 576 | }, 577 | "model": "resources.planet", 578 | "pk": 34 579 | }, 580 | { 581 | "fields": { 582 | "edited": "2014-12-20T20:58:18.478Z", 583 | "climate": "arid, temperate, tropical", 584 | "surface_water": "unknown", 585 | "name": "Malastare", 586 | "diameter": "18880", 587 | "rotation_period": "26", 588 | "created": "2014-12-19T17:52:13.106Z", 589 | "terrain": "swamps, deserts, jungles, mountains", 590 | "gravity": "1.56", 591 | "orbital_period": "201", 592 | "population": "2000000000" 593 | }, 594 | "model": "resources.planet", 595 | "pk": 35 596 | }, 597 | { 598 | "fields": { 599 | "edited": "2014-12-20T20:58:18.480Z", 600 | "climate": "temperate", 601 | "surface_water": "unknown", 602 | "name": "Dathomir", 603 | "diameter": "10480", 604 | "rotation_period": "24", 605 | "created": "2014-12-19T18:00:40.142Z", 606 | "terrain": "forests, deserts, savannas", 607 | "gravity": "0.9", 608 | "orbital_period": "491", 609 | "population": "5200" 610 | }, 611 | "model": "resources.planet", 612 | "pk": 36 613 | }, 614 | { 615 | "fields": { 616 | "edited": "2014-12-20T20:58:18.481Z", 617 | "climate": "temperate, arid, subartic", 618 | "surface_water": "5", 619 | "name": "Ryloth", 620 | "diameter": "10600", 621 | "rotation_period": "30", 622 | "created": "2014-12-20T09:46:25.740Z", 623 | "terrain": "mountains, valleys, deserts, tundra", 624 | "gravity": "1", 625 | "orbital_period": "305", 626 | "population": "1500000000" 627 | }, 628 | "model": "resources.planet", 629 | "pk": 37 630 | }, 631 | { 632 | "fields": { 633 | "edited": "2014-12-20T20:58:18.483Z", 634 | "climate": "unknown", 635 | "surface_water": "unknown", 636 | "name": "Aleen Minor", 637 | "diameter": "unknown", 638 | "rotation_period": "unknown", 639 | "created": "2014-12-20T09:52:23.452Z", 640 | "terrain": "unknown", 641 | "gravity": "unknown", 642 | "orbital_period": "unknown", 643 | "population": "unknown" 644 | }, 645 | "model": "resources.planet", 646 | "pk": 38 647 | }, 648 | { 649 | "fields": { 650 | "edited": "2014-12-20T20:58:18.485Z", 651 | "climate": "temperate, artic", 652 | "surface_water": "unknown", 653 | "name": "Vulpter", 654 | "diameter": "14900", 655 | "rotation_period": "22", 656 | "created": "2014-12-20T09:56:58.874Z", 657 | "terrain": "urban, barren", 658 | "gravity": "1", 659 | "orbital_period": "391", 660 | "population": "421000000" 661 | }, 662 | "model": "resources.planet", 663 | "pk": 39 664 | }, 665 | { 666 | "fields": { 667 | "edited": "2014-12-20T20:58:18.487Z", 668 | "climate": "unknown", 669 | "surface_water": "unknown", 670 | "name": "Troiken", 671 | "diameter": "unknown", 672 | "rotation_period": "unknown", 673 | "created": "2014-12-20T10:01:37.395Z", 674 | "terrain": "desert, tundra, rainforests, mountains", 675 | "gravity": "unknown", 676 | "orbital_period": "unknown", 677 | "population": "unknown" 678 | }, 679 | "model": "resources.planet", 680 | "pk": 40 681 | }, 682 | { 683 | "fields": { 684 | "edited": "2014-12-20T20:58:18.489Z", 685 | "climate": "unknown", 686 | "surface_water": "unknown", 687 | "name": "Tund", 688 | "diameter": "12190", 689 | "rotation_period": "48", 690 | "created": "2014-12-20T10:07:29.578Z", 691 | "terrain": "barren, ash", 692 | "gravity": "unknown", 693 | "orbital_period": "1770", 694 | "population": "0" 695 | }, 696 | "model": "resources.planet", 697 | "pk": 41 698 | }, 699 | { 700 | "fields": { 701 | "edited": "2014-12-20T20:58:18.491Z", 702 | "climate": "temperate", 703 | "surface_water": "unknown", 704 | "name": "Haruun Kal", 705 | "diameter": "10120", 706 | "rotation_period": "25", 707 | "created": "2014-12-20T10:12:28.980Z", 708 | "terrain": "toxic cloudsea, plateaus, volcanoes", 709 | "gravity": "0.98", 710 | "orbital_period": "383", 711 | "population": "705300" 712 | }, 713 | "model": "resources.planet", 714 | "pk": 42 715 | }, 716 | { 717 | "fields": { 718 | "edited": "2014-12-20T20:58:18.493Z", 719 | "climate": "temperate", 720 | "surface_water": "20", 721 | "name": "Cerea", 722 | "diameter": "unknown", 723 | "rotation_period": "27", 724 | "created": "2014-12-20T10:14:48.178Z", 725 | "terrain": "verdant", 726 | "gravity": "1", 727 | "orbital_period": "386", 728 | "population": "450000000" 729 | }, 730 | "model": "resources.planet", 731 | "pk": 43 732 | }, 733 | { 734 | "fields": { 735 | "edited": "2014-12-20T20:58:18.495Z", 736 | "climate": "tropical, temperate", 737 | "surface_water": "80", 738 | "name": "Glee Anselm", 739 | "diameter": "15600", 740 | "rotation_period": "33", 741 | "created": "2014-12-20T10:18:26.110Z", 742 | "terrain": "lakes, islands, swamps, seas", 743 | "gravity": "1", 744 | "orbital_period": "206", 745 | "population": "500000000" 746 | }, 747 | "model": "resources.planet", 748 | "pk": 44 749 | }, 750 | { 751 | "fields": { 752 | "edited": "2014-12-20T20:58:18.497Z", 753 | "climate": "unknown", 754 | "surface_water": "unknown", 755 | "name": "Iridonia", 756 | "diameter": "unknown", 757 | "rotation_period": "29", 758 | "created": "2014-12-20T10:26:05.788Z", 759 | "terrain": "rocky canyons, acid pools", 760 | "gravity": "unknown", 761 | "orbital_period": "413", 762 | "population": "unknown" 763 | }, 764 | "model": "resources.planet", 765 | "pk": 45 766 | }, 767 | { 768 | "fields": { 769 | "edited": "2014-12-20T20:58:18.498Z", 770 | "climate": "unknown", 771 | "surface_water": "unknown", 772 | "name": "Tholoth", 773 | "diameter": "unknown", 774 | "rotation_period": "unknown", 775 | "created": "2014-12-20T10:28:31.117Z", 776 | "terrain": "unknown", 777 | "gravity": "unknown", 778 | "orbital_period": "unknown", 779 | "population": "unknown" 780 | }, 781 | "model": "resources.planet", 782 | "pk": 46 783 | }, 784 | { 785 | "fields": { 786 | "edited": "2014-12-20T20:58:18.500Z", 787 | "climate": "arid, rocky, windy", 788 | "surface_water": "unknown", 789 | "name": "Iktotch", 790 | "diameter": "unknown", 791 | "rotation_period": "22", 792 | "created": "2014-12-20T10:31:32.413Z", 793 | "terrain": "rocky", 794 | "gravity": "1", 795 | "orbital_period": "481", 796 | "population": "unknown" 797 | }, 798 | "model": "resources.planet", 799 | "pk": 47 800 | }, 801 | { 802 | "fields": { 803 | "edited": "2014-12-20T20:58:18.502Z", 804 | "climate": "unknown", 805 | "surface_water": "unknown", 806 | "name": "Quermia", 807 | "diameter": "unknown", 808 | "rotation_period": "unknown", 809 | "created": "2014-12-20T10:34:08.249Z", 810 | "terrain": "unknown", 811 | "gravity": "unknown", 812 | "orbital_period": "unknown", 813 | "population": "unknown" 814 | }, 815 | "model": "resources.planet", 816 | "pk": 48 817 | }, 818 | { 819 | "fields": { 820 | "edited": "2014-12-20T20:58:18.504Z", 821 | "climate": "temperate", 822 | "surface_water": "unknown", 823 | "name": "Dorin", 824 | "diameter": "13400", 825 | "rotation_period": "22", 826 | "created": "2014-12-20T10:48:36.141Z", 827 | "terrain": "unknown", 828 | "gravity": "1", 829 | "orbital_period": "409", 830 | "population": "unknown" 831 | }, 832 | "model": "resources.planet", 833 | "pk": 49 834 | }, 835 | { 836 | "fields": { 837 | "edited": "2014-12-20T20:58:18.506Z", 838 | "climate": "temperate", 839 | "surface_water": "unknown", 840 | "name": "Champala", 841 | "diameter": "unknown", 842 | "rotation_period": "27", 843 | "created": "2014-12-20T10:52:51.524Z", 844 | "terrain": "oceans, rainforests, plateaus", 845 | "gravity": "1", 846 | "orbital_period": "318", 847 | "population": "3500000000" 848 | }, 849 | "model": "resources.planet", 850 | "pk": 50 851 | }, 852 | { 853 | "fields": { 854 | "edited": "2014-12-20T20:58:18.508Z", 855 | "climate": "unknown", 856 | "surface_water": "unknown", 857 | "name": "Mirial", 858 | "diameter": "unknown", 859 | "rotation_period": "unknown", 860 | "created": "2014-12-20T16:44:46.318Z", 861 | "terrain": "deserts", 862 | "gravity": "unknown", 863 | "orbital_period": "unknown", 864 | "population": "unknown" 865 | }, 866 | "model": "resources.planet", 867 | "pk": 51 868 | }, 869 | { 870 | "fields": { 871 | "edited": "2014-12-20T20:58:18.510Z", 872 | "climate": "unknown", 873 | "surface_water": "unknown", 874 | "name": "Serenno", 875 | "diameter": "unknown", 876 | "rotation_period": "unknown", 877 | "created": "2014-12-20T16:52:13.357Z", 878 | "terrain": "rainforests, rivers, mountains", 879 | "gravity": "unknown", 880 | "orbital_period": "unknown", 881 | "population": "unknown" 882 | }, 883 | "model": "resources.planet", 884 | "pk": 52 885 | }, 886 | { 887 | "fields": { 888 | "edited": "2014-12-20T20:58:18.512Z", 889 | "climate": "unknown", 890 | "surface_water": "unknown", 891 | "name": "Concord Dawn", 892 | "diameter": "unknown", 893 | "rotation_period": "unknown", 894 | "created": "2014-12-20T16:54:39.909Z", 895 | "terrain": "jungles, forests, deserts", 896 | "gravity": "unknown", 897 | "orbital_period": "unknown", 898 | "population": "unknown" 899 | }, 900 | "model": "resources.planet", 901 | "pk": 53 902 | }, 903 | { 904 | "fields": { 905 | "edited": "2014-12-20T20:58:18.514Z", 906 | "climate": "unknown", 907 | "surface_water": "unknown", 908 | "name": "Zolan", 909 | "diameter": "unknown", 910 | "rotation_period": "unknown", 911 | "created": "2014-12-20T16:56:37.250Z", 912 | "terrain": "unknown", 913 | "gravity": "unknown", 914 | "orbital_period": "unknown", 915 | "population": "unknown" 916 | }, 917 | "model": "resources.planet", 918 | "pk": 54 919 | }, 920 | { 921 | "fields": { 922 | "edited": "2014-12-20T20:58:18.516Z", 923 | "climate": "frigid", 924 | "surface_water": "100", 925 | "name": "Ojom", 926 | "diameter": "unknown", 927 | "rotation_period": "unknown", 928 | "created": "2014-12-20T17:27:41.286Z", 929 | "terrain": "oceans, glaciers", 930 | "gravity": "unknown", 931 | "orbital_period": "unknown", 932 | "population": "500000000" 933 | }, 934 | "model": "resources.planet", 935 | "pk": 55 936 | }, 937 | { 938 | "fields": { 939 | "edited": "2014-12-20T20:58:18.517Z", 940 | "climate": "temperate", 941 | "surface_water": "unknown", 942 | "name": "Skako", 943 | "diameter": "unknown", 944 | "rotation_period": "27", 945 | "created": "2014-12-20T17:50:47.864Z", 946 | "terrain": "urban, vines", 947 | "gravity": "1", 948 | "orbital_period": "384", 949 | "population": "500000000000" 950 | }, 951 | "model": "resources.planet", 952 | "pk": 56 953 | }, 954 | { 955 | "fields": { 956 | "edited": "2014-12-20T20:58:18.519Z", 957 | "climate": "temperate", 958 | "surface_water": "25", 959 | "name": "Muunilinst", 960 | "diameter": "13800", 961 | "rotation_period": "28", 962 | "created": "2014-12-20T17:57:47.420Z", 963 | "terrain": "plains, forests, hills, mountains", 964 | "gravity": "1", 965 | "orbital_period": "412", 966 | "population": "5000000000" 967 | }, 968 | "model": "resources.planet", 969 | "pk": 57 970 | }, 971 | { 972 | "fields": { 973 | "edited": "2014-12-20T20:58:18.521Z", 974 | "climate": "temperate", 975 | "surface_water": "unknown", 976 | "name": "Shili", 977 | "diameter": "unknown", 978 | "rotation_period": "unknown", 979 | "created": "2014-12-20T18:43:14.049Z", 980 | "terrain": "cities, savannahs, seas, plains", 981 | "gravity": "1", 982 | "orbital_period": "unknown", 983 | "population": "unknown" 984 | }, 985 | "model": "resources.planet", 986 | "pk": 58 987 | }, 988 | { 989 | "fields": { 990 | "edited": "2014-12-20T20:58:18.523Z", 991 | "climate": "arid, temperate, tropical", 992 | "surface_water": "unknown", 993 | "name": "Kalee", 994 | "diameter": "13850", 995 | "rotation_period": "23", 996 | "created": "2014-12-20T19:43:51.278Z", 997 | "terrain": "rainforests, cliffs, canyons, seas", 998 | "gravity": "1", 999 | "orbital_period": "378", 1000 | "population": "4000000000" 1001 | }, 1002 | "model": "resources.planet", 1003 | "pk": 59 1004 | }, 1005 | { 1006 | "fields": { 1007 | "edited": "2014-12-20T20:58:18.525Z", 1008 | "climate": "unknown", 1009 | "surface_water": "unknown", 1010 | "name": "Umbara", 1011 | "diameter": "unknown", 1012 | "rotation_period": "unknown", 1013 | "created": "2014-12-20T20:18:36.256Z", 1014 | "terrain": "unknown", 1015 | "gravity": "unknown", 1016 | "orbital_period": "unknown", 1017 | "population": "unknown" 1018 | }, 1019 | "model": "resources.planet", 1020 | "pk": 60 1021 | } 1022 | ] 1023 | -------------------------------------------------------------------------------- /src/fetchWithCache.js: -------------------------------------------------------------------------------- 1 | import { tap, from } from "rxjs"; 2 | import { fakeAPIFetch } from "./fake-backend/fake-backend.js"; 3 | 4 | /* assuming you were hitting an actual api you'd do something like this 5 | * because we're not actually hitting an API now that swapi is down https://github.com/phalt/swapi/issues/147 6 | * we're going to fake it instead of using axios 7 | */ 8 | // const baseURL = "https://swapi.co/api/"; 9 | // 10 | // const axiosInstance = axios.create({ 11 | // baseURL, 12 | // timeout: 20000 13 | // }); 14 | 15 | const tenMin = 1000 /* ms */ * 60 /* sec */ * 10; 16 | 17 | export function fetchWithCache(url, axiosOptions) { 18 | const options = { ...axiosOptions, ...{ method: "get" }, ...{ url } }; 19 | if (cache[url] != undefined) { 20 | const diff = Date.now() - cache[url].lastPulled; 21 | if (diff < tenMin) { 22 | return from( 23 | Promise.resolve().then(() => { 24 | return cache[url].value; 25 | }) 26 | ); 27 | } 28 | } 29 | return from(fakeAPIFetch(options)).pipe( 30 | tap((response) => { 31 | cache[options.url] = { 32 | lastPulled: Date.now(), 33 | value: response, 34 | }; 35 | if (response.results && Array.isArray(response.results)) { 36 | response.results.forEach((item) => { 37 | if (item.url) { 38 | cache[item.url] = { 39 | lastPulled: Date.now(), 40 | value: item, 41 | }; 42 | } 43 | }); 44 | } 45 | }) 46 | ); 47 | } 48 | 49 | const cache = {}; 50 | -------------------------------------------------------------------------------- /src/react-mf-api.js: -------------------------------------------------------------------------------- 1 | export { fetchWithCache } from "./fetchWithCache.js"; 2 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const singleSpaDefaults = require("webpack-config-single-spa-react"); 3 | 4 | module.exports = (webpackConfigEnv) => { 5 | const defaultConfig = singleSpaDefaults({ 6 | orgName: "react-mf", 7 | projectName: "api", 8 | webpackConfigEnv, 9 | }); 10 | 11 | return merge(defaultConfig, { 12 | // modify the webpack config however you'd like to by adding to this object 13 | externals: [/^rxjs\/?.*$/], 14 | }); 15 | }; 16 | --------------------------------------------------------------------------------