By Developers, For Developers
PDF Pg | Paper Pg | Type | Description | Fixed on | Comments |
---|---|---|---|---|---|
85 | TYPO | in the Meal query, usage of inHand field, but result show field onRye. At the end of page 85 | 2017-10-05 | ||
129 | TYPO | Ecto changset instead of Ecto changeset Top of page, callback approach paragraph | 2017-10-05 | ||
66 | SUGGEST | “For completeness we provide a fallthrough match. It returns nil, which denotes that the value doesn’t belong to a member type of the union.” That match doesn’t appear in the code nor in the accompanying code. It is confusing. Is this added by default by the macro or the authors didn’t update the code? | 2017-11-10 | ||
98 | TYPO | Just before setting up subscriptions title Let’s get started be covering some important background about subscriptions replace be -> by | 2017-10-05 | ||
108 | TYPO | enter the following in the right side panel maybe it meant enter the following in the left side panel | 2017-10-05 | ||
24 | ERROR | The current version of Phoenix 1.3 mix tasks start with ‘phx’ instead of the ‘phoenix’, as is used in the instructions for starting the application. | 2017-10-05 | ||
9 | TYPO | The last line of the page: The “and” between “absinthe_phoenix” and “adds” looks like it’s not suppose to be there. | 2017-10-05 | ||
117 | TYPO | In page 177 The other case in the code in the page 176 is _ -> [] | 2017-11-10 | ||
130 | TYPO | Absinthe.run(“{ search(term: \\”Rueben\\“) { name } }”, PlateSlateWeb.Schema) Should be Absinthe.run(“{ search(matching: \\”Rueben\\“) { name } }”, PlateSlateWeb.Schema) | 2017-10-05 | ||
115 | TYPO | The main difference is that we’re now doing something more dyanmic dyanmic -> dynamic | 2017-10-05 | ||
133 | SUGGEST | First make sure you’re up to date with the code and seeds for this The chapter’s code has 6 different code folders. One might expect that the chapters seeds are complete from 1-start. Suggestion: 1. Put the complete new migration in 07-chp.middleware/1-start or S | 2017-11-22 | ||
139 | SUGGEST | There’s a very useful package called :comeonin_ecto_password that we’re going to It would be nice to say few words how to install that package. | 2017-11-10 | ||
142 | TYPO | which is useful for whent the api client which is useful for when the api client | 2017-10-05 | ||
28 | SUGGEST | It’d be great to show the menu_items_test source… though I’m pretty sure it’s what I expect, I’m reading in a coffee shop and can’t go look to make sure. | 2017-10-05 | ||
33 | TYPO | 4th graf says “term” where the code said “name”. | 2017-10-05 | ||
108 | ERROR | The paragraph about subscription mentions the topic macro which does not exist anymore. | 2017-11-10 | ||
131 | SUGGEST | First sentence, last paragraph: “The middleware/3 call back is run on every field for an object…” I believe “callback” should replace “call back.” Nice work on the book guys! | 2017-10-05 | ||
131 | ERROR | Last sentence, second paragraph: “If no loading happens, the middleware/3 callback is run.” I believe that it should say the callback is not run. Thanks! | 2017-10-05 | ||
33 | TYPO | “By declaring our inputs up front Absinthe has a bounded set of input to work with and can thus give us atom an atom keyed map to work with as arguments, unlike Phoenix controller action params.” “atom an atom” should be “an atom” | 2017-10-05 | ||
151 | TYPO | “This makes sense of course, because aren’t doing anything in our tests to setup a context that might permit the creation of menu items.” “because aren’t doing anything” should be “because we aren’t doing anything” | 2017-10-05 | ||
73 | TYPO | The top of p73 mentions “removing the now-excessive fragment usage”, but the snippet that follows (04-chp.flexibility/3-interfaces/test/plate_slate_web/schema/query/search_test.exs) still contains the two “… on” fragment references. I think you meant to remove those; sure enough, when remove those lines from the test query, the test still passes. | 2017-11-10 | ||
91 | TYPO | Not sure whether you’re intending to show all new code, but the text at the bottom of p91 mentions the :menu_item_result object type, but the snippet doesn’t show it. If I look at the downloaded code, it’s there (in 05-chp.mutations/5-errorobjects/lib/plate_slate_web/schema/menu_types.ex) (I noticed this because I got curious about how, in p93’s middle snippet, “errors { key message }” would be interpreted as a list of error_items, vs a single error - make sense now that I’ve seen the :menu_item_result declaration.) | 2017-11-10 | ||
138 | TYPO | Since you’re distinguishing employees and customers, maybe the example token in the API response example should be “EMPLOYEE-TOKEN-HERE” instead of “CUSTOMER-TOKEN-HERE”? | 2017-11-10 | ||
41 | TYPO | “give us atom an atom ” should be “give us an atom” | 2017-10-05 | ||
70 | TYPO | This: If you’re even curious about the GraphQL type that’s being returned, s/even/ever | 2017-10-05 | ||
79 | SUGGEST | In the mutations chapter, you say something along the lines of “Thankfully Ecto already pulls in the decimal package”. | 2017-11-21 | ||
1 | ERROR | This is more an Ecto issue than anything else. You are always using utc_datetime as type in your schema when you deal with dates which is good but you need to explicitly tell Ecto to use this type as well for the timestamps macros. In your schema by using: @timestamps_opts [type: :utc_datetime] | 2017-11-21 | ||
143 | SUGGEST | PlateSlateWeb.Authentication is mentioned in the text and used in the accounts resolver (08-chp.auth/2-login/lib/plate_slate_web/resolvers/accounts.ex) and corresponding test. However, it is not shown or fully described and the reader is not instructed to create it. | 2017-11-21 | ||
24 | TYPO | Current text reads “Because the User type has fields and represents a complex value, GraphQL refers to as an object type, whereas Int and String are simple values ” I think it should read “GraphQL refers to it as an object type” | 2017-11-09 | ||
66 | TYPO | “Now that we have both a valid and invalid test working correctly, let’s talk about how users might use this query in the real world” I think this would best read | 2017-11-09 | ||
5 | TYPO | There are typos in the example JSON response: - Missing comma after the “name” field. | 2017-11-09 | ||
117 | TYPO | “As we you learned in the previous chapter, its important to keep your business logic inside your context modules” I can’t make sense of this, seems it should be “As you learned in the previous chapter…” | 2017-11-10 | ||
66 | TYPO | menu items for a list of categories were requested, for example, this would like execute a database query per category (an example of the infamous “N+1” Should be menu items for a list of categories were requested, for example, this would execute a database query per category (an example of the infamous “N+1” | 2017-11-10 | ||
165 | TYPO | The code sample uses {:finish, path} as the option argument (in two places), but both the paragraphs below it refer to :end. | 2017-11-09 | ||
114 | TYPO | Bottom of page. Last paragraph. “Notably, we want use this ” <- should be “to use this” | 2017-11-10 | ||
157 | ERROR | resolve fn _, %{context: %{current_user: current_user}}} do should be resolve fn _, %{context: %{current_user: current_user}} -> (it has an extra closing brace ( should be }} not }}} ) and it should be -> instead of “do”) | 2017-11-09 | ||
19 | ERROR | On this page, you say: “ add an :id field and a :name field to our :menu_item object.“ But it appears you’re also adding a description field too. | 2017-11-09 | ||
27 | SUGGEST | You show how to add documentation with @desc but do not include further screenshots from Graphiql. I think you should include these screenshots to really drive home the point about adding a description. | 2017-11-21 | ||
35 | ERROR | At the end of this page you say that the test works… before you even run it. “It works!” Should be after the test has run | 2017-11-09 | ||
60 | TYPO | first paragraph under Importing Types, “singe” should be “single” | 2017-11-21 | ||
62 | SUGGEST | Bottom of this page. Where you have the object menu_queries, I am not sure where you’re suggesting this could go. | 2017-11-21 | ||
157 | ERROR | It appears that there’s code missing to get the viewer union working. Comparing code with 09-chp.performance the viewer query is also missing. | 2017-11-21 | ||
65 | SUGGEST | Bottom of this page, items_for_category takes 3 arguments when previous examples have taken only two. I think the reason for the difference should be explained here and maybe some of the resolver code shown too. | 2017-11-21 | ||
66 | ERROR | “For completeness we provide a fall- through match. It returns nil, which denotes that the value doesn’t belong to a member type of the union.” No you don’t! This code is missing. | 2017-11-21 | ||
79 | ERROR | There is an extra end at the end of the code block at the top of this page | 2017-11-21 | ||
117 | TYPO | The document shows When it should read | 2017-11-21 | ||
130 | SUGGEST | iex(1)> Absinthe.run(“{ search(matching: \\”Rueben\\“) { name } }”, PlateSlateWeb.Schema) Exceeds page margins. Is this intentional? | 2017-11-21 | ||
134 | TYPO | menuItem(filter: “Thai Salad”) { should be menuItems(filter: “Thai Salad”) { | 2017-11-21 | ||
134 | ERROR | menuItem(filter: “Thai Salad”) { should be | 2017-11-21 | ||
6 | TYPO | In the third bullet you’ve got an extraneous “and”. You presumably wanted “When information about friends is returned, where will it be in the result?”. | 2017-11-26 | ||
157 | ERROR | resolve_type fn Should be according to the accompanying code from the link in the snippet and the resolve_type doc in hexdocs | 2017-12-03 | ||
175 | TYPO | “we just set a flag to flase within the our context” => “flase” should be “false” | 2017-12-03 | ||
108 | TYPO | Code: “config fn_args, _info - > {:ok,topic:”*“} end” | 2017-12-03 | ||
182 | TYPO | The last sentence on the page: “While it’s useful to be able to run specific code for plug and sockets, what would be useful is a” => a part of this sentence is missing | 2017-12-03 | ||
9 | TYPO | I think function add_filter should be private. Ex: `defp add_filter(filters, :date, date) do` and `defp add_filter(filters, key, value) do` otherwise they would be like controller actions, wouldn’t be? | 2017-12-03 | ||
160 | ERROR | The viewer query at the end of chapter 8 isn’t producing correct results (tested with latest source from chapter 8). I can’t compare it with source from beyond chapter 8 since the whole viewer setup is absent. Running: Response: | 2018-01-22 | ||
145 | ERROR | token = PlateSlateWeb.Authentication.sign(%{ and the test in page 146 assert {:ok, %{type: “employee”,id: user.id,}} == PlateSlateWeb.Authentication.verify(token) but then in page 150 defp get_user(%{id: id, role: role}) do which doesn’t match. Should be either “type” or “role” | 2018-01-22 | ||
155 | SUGGEST | The text regarding the code listing in the bottom of the page 155 and beginning of the page 156 doesn’t mention that this is new code. Actually the code listing is available since “2-login” check point in the accompanying code but it is never mentioned in the book before. | 2018-01-22 | ||
157 | SUGGEST | :any which permits any user to view the page whether they’re a customer or We don’t view any pages with GraphQL. Instead maybe it would be better to be :any which permits any user to perform the operation whether they’re a customer or This is also the terminology the GraphQL documentation uses [1][2] [1] graphql.org/learn/queries/ | 2017-12-03 | ||
175 | TYPO | In this case, we just set a flag to flase within the our context. In this case, we just set a flag to false within our context. | 2017-12-03 | ||
181 | SUGGEST | It would be nice to add installation instructions or at least a link where dataloader package can be found. A link is provided for facebook’s dataloader but just a mention about absinthe-graphql organization in Github for the elixir package. | 2018-01-22 | ||
166 | ERROR | On pg. 166 I am finding the following code is not matched ``` Changing this to will match ``` | 2018-01-22 | ||
173 | TYPO | “Absinthe is going to to call ” | 2018-01-22 | ||
106 | SUGGEST | In chapter 3, at the end of “Marking Arguments as Non Null” it is suggested to put the field category as non_null, but in the next chapter “Creating Your Own Scalar Types”, the source code does not have that change and when you get to the first test , an error is generated by not specifying a category. I know that we must work with the code of each chapter, but some hint/warning that it will no longer be used or it’s just a tip, or adding the category in the tests would be nice. | 2018-01-22 | ||
196 | TYPO | “The mode: INTERNAL bit isn’t a strange new syntax; this is just an suite should be “suit”. | 2018-01-22 | ||
102 | TYPO | in the listing at the begging of the page the line |> cast_embed(:items) is not marked as new. | 2018-01-22 | ||
67 | SUGGEST | def search(, %{matching: term},) do The function PlateSlate.Menu.search/1 is not defined anywhere in the book. Not previously or later. This is difficult for the reader who follows through the project as he has to suspect and search in the accompanying code to find the definition of that function and the search_ecto/2 function. | 2018-01-22 | ||
117 | ERROR | What about the other case that shows up in the trigger topic function: , -> [] The other case of trigger function in page 116 is trigger [:ready_order, :complete_order], topic: fn | 2018-01-22 | ||
117 | ERROR | The ready_order resolver will return %{order: %Order{id: “2”, …}}, Technically the resolver returns {:ok, %{order: %Order{id: 2, …}}} I guess the first element of the tuple is omitted for the sake of the discussion. The id is depicted as binary but it is actually an integer. Later in the text is described how it should be transformed with to_string as it is an integer | 2018-01-22 | ||
132 | TYPO | when the default behaviour doesn’t suite the data you’re working I think it should be suit | 2018-01-22 | ||
108 | TYPO | Line 3: could it be that there is a missing word - maybe “to add a subscription …” | 2018-01-22 | ||
193 | SUGGEST | Grammar of this sentence seems off: Maybe “grabbing its dataloader” | 2018-03-01 | ||
225 | ERROR | I believe this sentence is misleading since the basic javascript file is served by Express not Phoenix. “We’ll start with a basic, single file JavaScript application that’s served directly by Phoenix, ” | 2018-03-01 | ||
188 | TYPO | SQL is written with a lower-case l instead of L “When we run that function we can see that a single SQl query runs to grab all the items we’d queued up so far.” | 2018-03-01 | ||
163 | ERROR | resolve &Resolvers.Menu.list_items/3 Until now the resolver was resolve &Resolvers.Menu.menu_items/3 | 2018-03-01 | ||
63 | ERROR | By mistake I wrote the previous erratum as in page 163. It is actually in page 63. resolve &Resolvers.Menu.list_items/3 Until now the resolver was resolve &Resolvers.Menu.menu_items/3 | 2018-03-01 | ||
67 | TYPO | Since the resolved value for the :search_value type will be Ecto schema structs maybe it should be :search_result | 2018-03-01 | ||
84 | SUGGEST | { Why not put the whole mutation there ? mutation ($menuItem: MenuItemInput!) { | 2018-03-01 | ||
99 | SUGGEST | This is not about the book but for the accompanying code. The function PlateSlateWeb.UserSocket.connect/2 is since chapter 2 def connect(_params, socket) do and it works. In this chapter’s (6) code it is def connect(_params, socket) do but this change is not mentioned in the book. | 2018-03-01 | ||
118 | TYPO | For example suppose :read_order For example suppose :ready_order | 2018-03-01 | ||
135 | ERROR | In the bottom of the page the reader is instructed to copy/paste the listing but it is missing the aliases and creation of the sides category. Plus the sides variable is undefined. Need to add the lines in the beginning of the listing alias PlateSlate.{Menu, Repo} | 2018-03-01 | ||
135 | ERROR | I can’t edit my previous erratum. The proper lines for the listing in page 135 should probably be alias PlateSlate.{Menu, Repo} _thai_salad = | 2018-03-01 | ||
144 | ERROR | mix ecto.gen.migration AddCustomerToOrders but the file name in the listing that follows is The module name remains AddCustomerToOrders though | 2018-03-01 | ||
144 | ERROR | The second listing on the page is for the migration. The same as the first listing on the page It should be the listing for | 2018-03-01 | ||
145 | SUGGEST | foo.com and bar.com are both registered domains. Wouldn’t be better to use | 2018-03-01 | ||
160 | ERROR | def place_order(_, ,{context: context}) do This line is also changed but it is not marked as changed. | 2018-03-01 | ||
171 | TYPO | for a bunch of menu item | 2018-03-01 | ||
179 | TYPO | so let’s give it a look as a way to get out feet wet. | 2018-03-01 | ||
187 | SUGGEST | Then in our Menu item context we’re going to define a Dataloader source: Then in our Menu context we’re going to define a Dataloader source: | 2018-03-01 | ||
190 | TYPO | Return once more to the :category field and let’s put dataloader to work: Return once more to the :category field resolver and let’s put dataloader to work: | 2018-03-01 | ||
190 | ERROR | In the second listing need to insert import Absinthe.Resolution.Helpers, only: [on_load: 2] | 2018-03-01 | ||
190 | TYPO | which we’re importing from Absinthe which we’re importing from Absinthe.Resolution.Helpers | 2018-03-01 | ||
213 | SUGGEST | In the second listing, the new code for the link maybe should be marked. 10-chp.serverui/4-login/lib/plate_slate_web/templates/layout/app.html.eex | 2018-03-01 | ||
216 | TYPO | On the :orders field the resolver: option is an anonymous function, On the :orders field the resolve: option is a captured(?) function, | 2018-03-01 | ||
59? | SUGGEST | In chapter three, in this listing: /code/03-chp.userinput/2-matchinginline/lib/plate_slate_web/schema.ex It is critical that the reader include the “import Ecto.Query”, but this is not called out in the text. For the reader following along and attempting to build from scratch this might cause a bit of confusion as to why the code is not compiling. | 2018-03-01 | ||
226 | SUGGEST | Maybe it would be better to state explicitly that the “plate-slate-basic-ui” should not be contained in the PlateSlate project folder. | 2018-03-01 | ||
42 | TYPO | In the code snippet, 03-chp.userinput/4-ordering/lib/plate_slate/menu/menu.ex, the argument to ‘^order’ should not be ‘:name’. Probably it is ‘order’. I have not tested the code though… | 2019-05-28 | The book code is correct. The interpolated value would result in `order: {:asc, :name} or {:desc, :name} which is what we want. | |
142 | ERROR | The second example on this page is meant to be refering to `lib/plate_slate/ordering/order.ex` where the :customer_id is added to the cast list, however the example that is there is a repeat of the first example on the page (the snippet of the migration changes for adding the customer_id field to the :orders table). In the source code for this chapter, the change is indeed there; it’s just the example in the book is wrong. | 2019-05-28 | ||
245 | ERROR | The example command of `get-graphql-schema …localhost:4000/graphql > ./schema.graphql` at the very bottom of this page uses an incorrect URL. The URL should be localhost:4000/api/graphql (the /api/ prefix was forgotten, it seems). | 2019-05-28 | ||
247 | ERROR | Cannot compile the graphql schema with relay-compiler as described on this page. Even the book source code fails with same error I’m getting: Writing js | |||
177 | TYPO | “which will import from the Absinthe.Resolution.Helpers module” >> “which we’ll import …” | 2019-05-21 | ||
179 | SUGGEST | “The first makes sure we can hook into individual fields when they need to use Dataloader” This sentence references Dataloader before it’s been introduced. | 2019-05-21 | ||
238 | SUGGEST | "We’ll cover two of them: Apollo Client and Relay. At the current time, there are two major client-side JavaScript frameworks that developers use to build user interfaces on top of GraphQL: Relay and the Apollo GraphQL platform." This seems redundant? The prior sentence should probably be removed. | 2019-05-28 | This will be fixed in the next edition, thanks! | |
125 | ERROR | Text suggests that Absinthe.run will be used to test a mutation, but the code pushes the mutation over the socket. Text: The next thing we do is run a mutation to place an order. You could actually push this document over the socket as well; sockets support all the different operation types. For the purposes of this test case, though, doing an explicit Absinthe.run call is handy because it helps make it clear that the trigger process that’s happening isn’t tied to the socket process specifically. Code: 06-chp.subscriptions/4-publish/test/plate_slate_web/schema/subscription/new_order_test.exs ref = push_doc socket, @mutation, variables: %{“input” => order_input} | 2019-05-28 | Good catch, this will be fixed in a future addition, thanks! | |
32 | 18 | ERROR | At the first command in the book (feel really annoyed): Absinthe.Schema.lookup_type(PlateSlateWeb.Schema, “MenuItem”) Compilation error in file lib/plate_slate_web/schema.ex (Absinthe.Schema.Error) Invalid schema: Elixir 1.7.1 (compiled with Erlang/OTP 21) | 2019-05-21 | |
30 | 16 | ERROR | Compilation error in file lib/plate_slate_web/schema.ex (Absinthe.Schema.Error) Invalid schema: If you are using elixir 1.7 update the deps to {:absinthe, “~> 1.4.13”}. | 2019-05-21 | |
56 | ERROR | Running the first test fails because of some characters that are changed: 1) test menuItems field returns menu items (PlateSlateWeb.Schema.Query.MenuItemsTest) Finished in 0.06 seconds | 2019-05-28 | This looks like an encoding issue with your editor. Make sure you're running in UTF8 mode. All Elixir code expects UTF8. | |
113 | ERROR | Contrary to the explanations (“For the purposes of this test case, though, doing an explicit Absinthe.run call is handy because it helps make it clear that the trigger process that’s happening isn’t tied to the socket process specifically”), the code uses the socket : | 2019-05-28 | ||
185 | ERROR | The book says that running loader |> Dataloader.get(Menu, Menu.Item, 2) would return nil but instead I get this: iex(9)> loader |> Dataloader.get(Menu, Menu.Item, 2) (Dataloader.GetError) “Unable to find batch {:queryable, #PID<0.2133.0>, PlateSlate.Menu.Item, :one, :id, %{}}” | 2019-05-28 | This happens if using a later version of Dataloader than the one specified in the book mix.lock. | |
197 | TYPO | Within the code example, the graphql query as well as the body of the index function should use camelCase (at least … wasn’t that the convention)? | 2019-05-28 | When using Absinthe.Phoenix.Controller you generally want to use `snake_case so that the values come back in a form more normally usable within Elixir. Absinthe allows you to use query transformers to support different casing conventions. | |
204 | ERROR | The Phoenix.Controller.redirect function does not halt the connection which causes the following error Request: GET /admin/items (exit) an exception was raised: adding `|> halt()` to the pipeline does prevent that exception from happening | 2019-05-28 | This seems like an error in your code, Phoenix.Controller source code definitely shows that redirect halts the connection. | |
191 | TYPO | The description about the dataloader/2 has some typo. 1) 2) | 2019-05-21 | Fixed, thanks! | |
142 | TYPO | I think this page has an accidental repetition of the code block from “08-chp.auth/1-start/priv/repo/migrations/20170828180804_add_customer_to_orders.exs”, where the second appearance should actually be something different indicating how to add the association field of customer_id to the order schema. The text says: > The column we’ve added to the orders table needs a corresponding line in the But then the code block is a repeat of the one above which shows creating the migration. I’m guessing the intended line should be something like belongs_to :customer, PlateSlate.Accounts.User | 2019-05-28 | ||
16 | ERROR | This is more for the benefit of people reading this page than an error in the printing. To compile the project with the versions in the source: Set your .tool-versions to: Then, run: | 2019-05-21 | ||
25 | ERROR | Missing the actual query that the reader should type here. Thus, I recommend the following: replace: Start by typing your query into the text area to the top left. with: Start by typing the following query into the text area to the top left: { Then move the corresponding diagram after the above query in order to give the reader the result of executing it. | |||
36 | ERROR |
assert %{ assert message == “Argument \\”matching\\" has invalid value 123." $ mix test test/plate_slate_web/schema/query/menu_items_test.exs 1) test menuItems field returns errors when using a bad value (PlateSlateWeb.Schema.Query.MenuItemsTest) Finished in 0.2 seconds | 2019-05-28 | This happened because you upgraded absinthe_plug which has slightly different behaviour with respect to status codes. Using the version specified in the book lock file will ensure that the book code works. | |
69 | ERROR | The query should be { | |||
89 | TYPO | The last paragraph mentions format_error/1. This function is not used here, as the paragraph suggests. It is used on page 93. | |||
16 | SUGGEST | Make this stuff work with the latest Phoenix (1.4.x) and Elixir (1.9.x)… I’ll help if you want. |