The error texts you can meet while writing and running scripts are grouped here by where they appear. Search for a part of the text you see. In the texts, a word in angle brackets such as <module> stands for something that changes: <module> is the path of a file inside Asterobot, such as library/my-first-script/1.0.0/index.js, <type> a message's name, <field> a field's name.
| Where you see it | What it looks like | Section |
|---|---|---|
| At the top of the bot's page | The behavior stopped with an error, with the full text, Copy and Dismiss | The script stopped |
| A toast after Play, Run, a load or a version switch | Couldn't start the behavior, Couldn't run the package, Couldn't load the selection or Couldn't switch version, without a reason | When a package doesn't load |
| Package settings, on the bot's Settings tab, and the Add a bot dialog | Couldn't read this package's settings, with the reason | When a package doesn't load, and Declarations |
| Inside the script | A rejected promise, or an error thrown by a call, that your code can catch | Errors a script can catch |
| The bot's Console tab | A warning or error line, while the script keeps running | Console lines |
| Toasts on Package settings | Couldn't apply the settings, Couldn't start the action, or an action's name followed by failed |
Saving settings and running actions |
| Under the package's manifest, after saving it | The reason, or Couldn't save the manifest | Saving the manifest |
The script stopped
The behavior stopped with an error appears at the top of the bot's page when a script that had loaded stops because of an error, while starting or later. In Bot Manager, the bot's Behavior column says Failed. The game connection stays open. Fix the cause, then start the script again with Play, or with Run in the editor.
The beginning of the text says where the script was:
| The text starts with | The error happened |
|---|---|
evaluate behavior module "<module>": |
In the top-level code of the modules, as the script started |
read declarations of "<module>": |
While Asterobot read the parameters and actions exports. See Declarations. |
initialize behavior module "<module>": |
In the entry function, before it finished |
Game traffic handler failed: |
In a handler registered with on() or onTraffic() |
evaluate protocol handler selector: |
In a selector function passed to on() |
evaluate protocol wait selector: |
In a selector function passed to wait() |
parameters.onChange handler <number>: |
In a handler registered with onChange() |
unhandled Promise rejection: |
Anywhere: a promise rejected and nothing caught it |
drain JavaScript Promise jobs: |
In code that resumed after an await |
What follows is the error itself:
Promise rejected:and the reason, when a promise the start was waiting for rejected.- An error thrown by your code: its type and message, such as
TypeError:and the message. For an error thrown synchronously,atfollows, with the function's name and, in parentheses, the file, the line and the column. - A message from one of Asterobot's functions, as listed in Errors a script can catch.
For example, a script that sends token instead of ticketKey while starting gets:
initialize behavior module "library/my-first-script/1.0.0/index.js": Promise rejected: IdentificationRequest.token: unknown protobuf field
These texts can appear after one of the beginnings above, or on their own:
| Text | Cause | Fix |
|---|---|---|
behavior module "<module>" has no unambiguous default export |
index.js has no default export |
Add export default async function behavior(launch) |
behavior module "<module>" default export is not callable |
The default export isn't a function | Export a function |
behavior module "<module>" default export must be async and return a Promise |
The default export returned something other than a promise | Make it an async function |
dynamic import() is not supported by this Asterobot runtime |
The script called import() as a function |
Use an import statement at the top of the file |
JavaScript execution deadline exceeded |
Code ran for more than 250 ms without an await |
Split the work into parts separated by an await, such as await sleep(0). See Limits. |
behavior event-loop queue overflow |
More than 64 events piled up while the script was busy | Keep handlers short, and move slow work out of them |
unhandled Promise rejection: <reason> |
A promise rejected with nothing to catch it: an await outside try/catch in an async handler or interceptor, or a promise started without await |
Wrap the await in try/catch, or add .catch() |
Game session closed: <reason> |
The game connection closed while the script was running | Connect the bot again, then play the script |
behavior requested Game disconnect |
The script called disconnect() |
Nothing, if that was intended |
A script stopped with Stop shows no alert.
When a package doesn't load
When a script can't even be loaded, it never runs, and nothing reaches the Problems alert. The toast is all you get, without the reason: Couldn't start the behavior after Play, Couldn't run the package after Run, Couldn't load the selection after a load from the bot's menu, Couldn't switch version after changing the version.
To see the reason, open the bot's Settings tab. Asterobot loads a package the same way to read its settings, so for the bot's package, Package settings shows Couldn't read this package's settings with the text. The package's settings in the Add a bot dialog show it too. For a syntax error, the editor's error badge usually points at the line as well.
When the reason comes from the package's code, the text there starts with <package>@<version>: read declarations:.
Syntax and imports
| Text | Cause | Fix |
|---|---|---|
parse module "<module>": <details> |
That file has a syntax error | Fix the syntax. Check the editor's error badge. |
resolve "<specifier>" imported by "<module>": package "<package>" has no locked dependency for "<specifier>" |
An import names a package that isn't among the package's dependencies, or is misspelled | Fix the name, or add the dependency. See Dependencies. |
resolve "<specifier>" imported by "<module>": module "<module>" imported by "<module>" is not installed |
A relative import names a file the package doesn't have | Fix the path. Relative imports need the whole file name, extension included, such as ./helper.js. |
resolve "<specifier>" imported by "<module>": relative import "<specifier>" escapes package root "<root>" |
A ../ goes above the package's own folder |
Import only files of the package, or of a dependency by its name |
resolve "<specifier>" imported by "<module>": built-in module "<specifier>" is not registered |
The asterobot: module doesn't exist, which is the case for every asterobot:extension/ module today |
Import one of the nine built-in modules. See Extension modules. |
resolve "<specifier>" imported by "<module>": package "<package>": no installed version of "<name>" satisfies "<version>" |
An import such as "name@^2.0.0" asks for a version the script's packages don't include |
Lock a matching version in the dependencies |
resolve "<specifier>" imported by "<module>": package "<package>": specifier "<specifier>" has an invalid version "<version>": <details> |
The part after @ in the import isn't latest, a version or a version range |
Fix the version |
resolve "<specifier>" imported by "<module>": absolute module specifier "<specifier>" is forbidden |
An import starts with / |
Use a relative path or a package name |
resolve "<specifier>" imported by "<module>": module specifier "<specifier>" contains a backslash |
An import path uses \ |
Use / |
reachable module count exceeds limit 256 |
The script loads more than 256 modules | See Limits |
reachable module source exceeds limit of 4194304 bytes |
The script's modules weigh more than 4 MiB together | See Limits |
module graph depth <depth> exceeds limit 64 at "<module>" |
Imports chain more than 64 modules deep | See Limits |
Packages and dependencies
These texts start with resolve package <name>@<version>:, naming the package being loaded. A problem in one of its dependencies adds dependency "<name>" locked to version "<version>": before the reason, once per level.
| Text | Cause | Fix |
|---|---|---|
read package <name>@<version> sources: <details> |
Asterobot couldn't read that package's files, for example because that version isn't installed | Install the package or the dependency at that version |
package <name>@<version> is not installed: parse asterobot.json: <details> |
The package's asterobot.json isn't valid JSON |
Fix the file. See The manifest. |
package "<name>@<version>": package "<name>" requires asterobot <range>, running <version> |
The package's compatibleVersion doesn't include the Asterobot version you run |
Update Asterobot, or change compatibleVersion. See Compatibility. |
package "<name>@<version>": package "<name>" has an invalid compatibleVersion constraint "<range>": <details> |
compatibleVersion isn't a valid version range |
Fix it, such as >=1.5.0 <2.0.0 |
package "<name>@<version>": package source integrity mismatch |
The files of a package installed from the marketplace no longer match the checksum recorded at install | Install that version again |
package "<name>@<version>": empty package permission |
permissions in asterobot.json has an empty entry |
Remove it |
package "<name>@<version>": duplicate package permission "<permission>" |
permissions lists the same permission twice |
Remove the duplicate |
package "<name>@<version>": entry module "index.js" is missing |
The package has no index.js at its root |
Add it. See Package layout. |
package "<name>@<version>": package contains no modules |
The package has no .js or .mjs file |
Add index.js |
package "<name>@<version>" dependency "<specifier>" targets package named "<name>" version "<version>" |
A dependency whose name ends with @ and a version is locked to another version |
Make the version in the name and the locked version the same |
package <name>@<version> has an invalid name: <details> |
The package's name breaks the naming rules | See Names and versions |
Messages about downloading or installing packages from the marketplace are covered in Package errors.
Errors a script can catch
The functions of the built-in modules report problems in two ways. Most return a promise that rejects, which await turns into an error a try/catch can catch. A few throw at once, as noted below.
String(error) gives the texts of this section as they are written here, with two exceptions: an error of type TypeError gives TypeError: followed by the text, and the errors thrown by record(), findPath() and packages.info(), and the errors move() rejects with, give GoError: followed by the text.
An error your code doesn't catch stops the script, with one of the texts in The script stopped.
Messages and timers
| Text | Returned by | Cause | Fix |
|---|---|---|---|
protocol type must be a non-empty semantic message name |
send(), request() |
The message name is missing, empty or not a string | Pass the name as a string |
semantic protobuf message is not mapped: <type> |
send(), request() |
Asterobot has no message with that name | Check the name in the Dofus protocol reference |
protocol options must be an object |
send(), request(), wait() |
The options aren't an object, such as a bare number | Pass { timeout: 5000 } |
unknown protocol option "<name>" |
send(), request(), wait() |
The options have a key other than timeout and to |
Fix the key |
timeout/milliseconds must be a finite positive Number |
send(), request(), wait(), sleep() |
A timeout that isn't a number above 0, or a sleep() duration that's negative or not a number |
Pass a number of milliseconds |
timeout/milliseconds is too large |
send(), request(), wait(), sleep() |
A duration too big to be one | Pass a smaller number |
send option "to" must be "server" or "client" |
send() |
to isn't a string |
Use "server" or "client" |
unknown send target "<value>": expected "server" or "client" |
send() |
to is another string |
Use "server" or "client" |
protocol selector cannot be empty |
wait(); thrown by on(), intercept() |
The selector is "" |
Pass a name, "*" or a function |
protocol selector must be a semantic type, '*', or predicate |
wait(); thrown by on(), intercept() |
The selector is neither a string nor a function | Pass a name, "*" or a function |
protocol.on handler must be callable, protocol.onTraffic handler must be callable, protocol.intercept handler must be callable |
Thrown as a TypeError |
The handler isn't a function | Pass a function |
maximum behavior handlers reached |
Thrown as a TypeError by on(), onTraffic(), intercept(), onChange() |
256 handlers of that kind are registered | Remove handlers you no longer need with off() or offChange() |
protocol wait timed out |
wait() |
Nothing matched before the timeout | Check the selector, or wait longer |
context deadline exceeded |
request() |
No response came back before the timeout. Most Dofus requests never get one. | Use send() and then wait() for the event the game sends |
mitm relay refuses to identify: this Game session was already authenticated by the real DOFUS client |
request() |
The script sent IdentificationRequest on a MITM bot |
Identify only when launch.reason === "initial" |
behavior resource limit exceeded: maximum pending operations reached |
send(), request(), table(), find(), search(), query(), move() |
32 operations are pending | Await operations before starting more |
behavior resource limit exceeded: maximum waits reached |
wait() |
128 waits are open | Give every wait() a timeout |
behavior resource limit exceeded: maximum timers reached |
sleep() |
128 sleeps are pending | Await sleeps instead of starting many at once |
On a MITM bot, send() of an IdentificationRequest to the server doesn't reject: see Console lines.
Payload errors
send() and request() reject with these texts when a payload doesn't fit its message. An interceptor's { payload } gives the same texts on the bot's console, after build replacement payload for <type>:.
Each text starts with the path of the field: the message's name, then the field names separated by dots, with [<index>] for an item of a list and ["<key>"] for a value of a map.
| Text | Cause | Fix |
|---|---|---|
<type>: expected an object |
The payload is missing, null or undefined |
Pass {} for a message without fields |
<path>: expected an object, got <type> |
The payload, or a nested message, isn't an object | Pass an object |
<path>.<field>: unknown protobuf field |
The message has no such field | Check the field names in the Dofus protocol reference |
IdentificationRequest.token: unknown protobuf field |
The script copies an old example that sends token and lang |
Send ticketKey and languageCode, as in Identify and run |
<path>: fields "<name>" and "<name>" address the same protobuf field |
The same field is given under both spellings, such as ticketKey and ticket_key |
Keep one |
<path>: oneof <group> selects both "<field>" and "<field>" |
Two alternatives of the same group are set | Set only one |
<path>.<field>: explicit undefined is not a protobuf value |
A field is set to undefined |
Leave the field out |
<path>.<field>: null is only valid for a message field |
A field that isn't a nested message is set to null |
Leave the field out |
<path>: expected an array |
A list field got something other than an array | Pass an array |
<path>: invalid array length |
The value passed for a list has an unusable length |
Pass a real array |
<path>: expected a plain object map |
A map field got something other than an object | Pass an object |
<path>: invalid boolean map key "<key>", and the same with int32, uint32, int64 or uint64 |
A map key can't be read as the map's key type | Use keys such as "true" or "12" |
<path>: expected boolean |
A boolean field got another type | Pass true or false |
<path>: expected string |
A string field got another type | Pass a string |
<path>: expected Uint8Array or ArrayBuffer |
A bytes field got another type | Pass a Uint8Array |
<path>: expected integral Number |
A 32-bit integer field got a fraction or something that isn't a number | Pass a whole number |
<path>: Number is outside int32 range |
The number doesn't fit a signed 32-bit integer | Pass a smaller number |
<path>: expected integral Number in uint32 range |
An unsigned 32-bit field got a fraction, a negative number or something too big | Pass a whole number from 0 to 4294967295 |
<path>: expected signed 64-bit BigInt or decimal string |
A 64-bit integer field got a number too big to be exact, a fraction, a string that isn't digits, or another type | Pass a BigInt, such as 123456789012n |
<path>: expected unsigned 64-bit BigInt or decimal string |
The same, for an unsigned field, or a negative value | Pass a positive BigInt |
<path>: expected Number |
A floating point field got something that isn't a number | Pass a number |
<path>: unknown enum symbol "<name>" |
The enum has no value with that name | Check the value names in the Dofus protocol reference |
<path>: expected enum symbol or number |
An enum field got neither a name nor a whole number | Pass the value's name as a string |
Game data
| Text | Returned by | Cause | Fix |
|---|---|---|---|
gamedata.text key must be a string or integer |
Thrown as a TypeError by text() |
The key is a fraction, a number outside the 32-bit range, a BigInt, undefined or an object |
Check the value before passing it |
gamedata.record table must be a non-empty string |
Thrown as a TypeError by record() |
The table name is missing or empty | Pass the table's name |
gamedata.record id must be an integer |
Thrown as a TypeError by record() |
The id isn't a whole number, is too big, or is a BigInt or a string | Pass a regular whole number |
datacenter: no such table: "<table>" |
Thrown by record(); table(), find(), search() |
This game version has no table with that name | Check the table's name in the Game page's game data |
gamedata.table name must be a non-empty string |
table() |
The name is missing or empty | Pass the table's name |
gamedata.find table must be a non-empty string |
find() |
The name is missing or empty | Pass the table's name |
gamedata.find filter must be a non-empty object |
find() |
The filter is missing, empty, an array or not an object | Pass { column: value } |
datacenter: no such column: table "<table>" has no column "<column>" |
find() |
A filter column doesn't exist in that table | Fix the column's name |
gamedata.search query must be a non-empty string |
search() |
The query is missing or empty | Pass a name |
gamedata.search options.table must be a string |
search() |
options.table isn't a string |
Pass the table's name as a string |
datacenter: no text for this language: "<language>" |
search() |
The game data has no names in the script's language | Extract the game data again, or check session.language |
gamedata.query sql must be a non-empty string |
query() |
The SQL is missing or empty | Pass the SQL as a string |
gamedata.query params must be an array |
query() |
params isn't an array |
Pass an array, such as [31] |
datacenter: empty query |
query() |
The SQL holds only spaces | Pass a statement |
datacenter: query is <size> bytes, over the 65536 byte limit |
query() |
The SQL text is too long | Shorten the query |
datacenter: followed by the database's message |
query() |
The SQL is wrong, names a table or column that doesn't exist, or writes, in which case the message mentions attempt to write a readonly database |
Fix the query. Try it in the SQL tab. |
Pathfinding
| Text | Returned by | Cause | Fix |
|---|---|---|---|
pathfinding.findPath mapId must be an integer Number, BigInt or decimal string |
Thrown as a TypeError by findPath() |
The map id is a fraction, a number above Number.MAX_SAFE_INTEGER, a string that isn't digits, or another type |
Pass currentMap().mapId, or the id as a BigInt |
pathfinding.findPath from must be an integer cell id, and the same with to |
Thrown as a TypeError by findPath() |
The cell isn't a whole number, or is a BigInt or a string | Pass a cell id from 0 to 559 |
pathfinding.findPath options must be an object |
Thrown as a TypeError by findPath() |
The options are neither an object, null nor undefined |
Pass an object, or nothing |
pathfinding.findPath options has no property "<name>" |
Thrown as a TypeError by findPath() |
The options have a key other than occupied, cautious and disableDiagonals |
Fix the key |
pathfinding.findPath options.occupied must be an array of cell ids |
Thrown as a TypeError by findPath() |
occupied isn't an array |
Pass an array of cell ids |
pathfinding.findPath options.occupied[<index>] must be an integer cell id |
Thrown as a TypeError by findPath() |
That item isn't a whole number | Pass cell ids only |
pathfinding.findPath options.cautious must be a boolean, and the same with disableDiagonals |
Thrown as a TypeError by findPath() |
The option isn't a boolean | Pass true or false |
pathfinding.findPath: map <mapId>, cell <from> to cell <to>: pathfinding: not a map cell, cell ids go from 0 to 559: <cell> |
Thrown as a TypeError by findPath() |
from or to is outside 0 to 559. For a cell of occupied, the text ends with occupied cell <cell>. |
Pass cell ids from 0 to 559 |
failed to load map <mapId> for pathfinding: datacenter: no such record: maps/<mapId> |
Thrown by findPath() |
The bot's game version has no map with that id | Check the map id |
failed to open the datacenter: followed by the reason |
Thrown by findPath() |
Asterobot can't read the game data of the bot's game version | Extract the game data |
pathfinding.cellToPoint cell must be an integer cell id, pathfinding.distance a must be an integer cell id and the same with b, pathfinding.direction from must be an integer cell id and the same with to |
Thrown as a TypeError by cellToPoint(), distance(), direction() |
The cell isn't a whole number, or is a BigInt or a string | Pass a cell id from 0 to 559 |
pathfinding: not a map cell, cell ids go from 0 to 559, after pathfinding.cellToPoint cell:, pathfinding.distance cells: or pathfinding.direction cells: |
Thrown as a TypeError by cellToPoint(), distance(), direction() |
A cell is outside 0 to 559 | Pass cell ids from 0 to 559 |
pathfinding.pointToCell x and y must be integers |
Thrown as a TypeError by pointToCell() |
x or y isn't a whole number |
Pass whole numbers |
Movement
| Text | Returned by | Cause | Fix |
|---|---|---|---|
movement.move cell must be an integer cell id |
move(), as a TypeError |
The cell isn't a whole number, or is a BigInt or a string | Pass a cell id from 0 to 559 |
movement.move cell: pathfinding: not a map cell, cell ids go from 0 to 559 |
move(), as a TypeError |
The cell is outside 0 to 559 | Pass a cell id from 0 to 559 |
movement.move options must be an object |
move(), as a TypeError |
The options are neither an object, null nor undefined |
Pass an object, or nothing |
movement.move options has no property "<name>" |
move(), as a TypeError |
The options have a key other than cautious and timeout |
Fix the key |
movement.move options.cautious must be a boolean |
move(), as a TypeError |
cautious isn't a boolean |
Pass true or false |
movement.move options.timeout: timeout/milliseconds must be a finite positive Number |
move(), as a TypeError |
timeout isn't a number above 0 |
Pass a number of milliseconds |
move: the bot isn't connected to a game server |
move() |
The bot has no game connection | Connect the bot first |
move: the character is already walking; await the move in progress first |
move() |
Another walk of the bot is under way, from a script or from Asteroboard | Await each move() before starting the next |
move: the character is still walking |
move() |
The character hasn't finished a walk it didn't ask for, such as one the player started on a MITM bot | Wait for that walk to end |
move: the character's map and cell aren't known yet |
move() |
Asterobot hasn't seen the character's map yet, or where the map places the character | Wait until the character is on a loaded map |
move: the game has no path from cell <cell> to cell <cell> |
move() |
The Dofus client itself would find no route | Pick another cell |
move: the server didn't grant the walk in time |
move() |
No MapMovementEvent granted the walk within the timeout, which is also how a refused walk ends |
Check the cell, or give the server longer with timeout |
move: another walk of the character started before this one ended |
move() |
Another walk of the character started first, or the walk was cancelled | Nothing to fix in the call |
move: the server didn't acknowledge the end of the walk in time |
move() |
No MapMovementConfirmResponse came within the walk's time plus the timeout |
Give the server longer with timeout |
move: the game session closed during the walk |
move() |
The game connection closed before the walk ended | Connect the bot again |
asterobot:movement describes each case.
Packages and settings
| Text | Returned by | Cause | Fix |
|---|---|---|---|
packages.info requires a module or package name |
Thrown as a TypeError by packages.info() |
The name is missing, empty or not a string | Pass a package name |
package "<name>" is not installed |
Thrown by packages.info() |
No package of the running script has that name, asterobot:parameters included |
Check the name. See asterobot:runtime. |
package "<name>" is ambiguous across <count> locked versions |
Thrown by packages.info() |
The dependencies lock several versions of that package | Nothing to fix in the call: the name can't pick one |
parameters.onChange handler must be callable |
Thrown as a TypeError by onChange() |
The handler isn't a function | Pass a function |
'Set' on a dynamic object returned false |
Thrown as a TypeError by assigning to a property of values |
values is read-only |
Don't assign to values |
Could not delete property "<name>" of a dynamic object |
Thrown as a TypeError by deleting a property of values |
values is read-only |
Don't delete from values |
While the script stops
A call made while the script is stopping rejects, or throws, with the reason the script is stopping, and the promises still pending when it stops reject with that reason too. After Stop, the reason is behavior runtime closed. There's nothing to fix: the script is ending.
Console lines
These lines appear on the bot's Console tab. The script keeps running.
| Line | Level | Cause | Fix |
|---|---|---|---|
Refused to forward a message that would re-authenticate a relayed session |
Warning | On a MITM bot, the script sent IdentificationRequest to the server. Asterobot didn't forward it, and send() resolved anyway. |
Identify only when launch.reason === "initial", as in Identify and run |
interceptor failed: <error> |
Error | An interceptor threw, or ran for more than 250 ms | Fix the handler, and keep it quick |
interceptor selector failed: <error> |
Error | An interceptor's selector function threw | Fix the selector |
build replacement payload for <type>: <error> |
Error | An interceptor returned a { payload } that doesn't fit the message. <error> is one of the payload errors. |
Fix the payload |
re-encode <type>: <error> |
Error | Asterobot couldn't rebuild the message with the new fields | Return { payload } with the same message's fields |
cannot replace the payload of <wire name>: this build has no name for it, so there is nothing to build a replacement from - use { raw } instead |
Error | An interceptor returned { payload } for a message without a readable name |
Return { raw }, or leave that message alone |
A line is written for each message on which an interceptor fails. When several interceptors fail on the same message, only the first failure is written, and the tenth if there are that many, ending with (10 times). An async interceptor whose promise rejects doesn't write a line here: it stops the script with unhandled Promise rejection: <error>.
Saving settings and running actions
These appear as toasts on Package settings, on the bot's Settings tab.
| Toast | Text under it | Cause | Fix |
|---|---|---|---|
| Couldn't apply the settings | <name>: <reason> |
A value doesn't fit its declaration. The reasons are listed in Declarations. Nothing from the form is saved. | Correct the value, then Apply again |
| Couldn't apply the settings | package "<package>" declares no parameter "<name>" |
The form holds a setting the package doesn't declare any more | Click Refresh, then apply again |
| Couldn't apply the settings | package "<package>" is not part of this bot's behavior |
The bot's package changed since the form was loaded | Click Refresh |
| Couldn't start the action | <argument>: <reason> |
An argument doesn't fit its declaration | Correct the value in the dialog |
| Couldn't start the action | the running behavior declares no action "<action>" on package "<package>" |
The running script doesn't declare that action, for example because you added it in the editor without starting the script again | Start the script again |
| Couldn't start the action | no behavior is running on this bot |
The script isn't running | Play the script first |
| Couldn't start the action | behavior event-loop queue overflow |
The script has 32 operations pending | Try again in a moment |
The action's name followed by failed |
The error the action's run threw, or its promise's rejection reason |
The action failed. The script keeps running. | Fix run |
When the declarations themselves can't be read, Package settings shows Couldn't read this package's settings instead of the form: Declarations lists those texts.
Saving the manifest
When you save a package's asterobot.json from Asteroboard and Asterobot refuses it, the reason shows under the manifest, or Couldn't save the manifest when there's none. Dependencies explains how to declare them.
The first four texts below come after invalid package manifest:. The last three are checked first, for dependencies that have no URL, and come on their own.
| Text | Cause | Fix |
|---|---|---|
empty dependency specifier |
A dependency has no name | Name the dependency |
dependency "<specifier>": version embedded in its own specifier: not a valid exact version: <details> |
The version written after @ in the dependency's name isn't one exact version |
Write an exact version, such as name@1.2.0 |
dependency "<specifier>": version "<version>" conflicts with the version already in its own specifier |
The dependency's name holds one version and its version field another | Make them the same, or remove one |
dependency "<specifier>": invalid version "<version>": <details> |
The version isn't latest, a version or a version range |
Fix the version |
dependency "<specifier>" locks version "<version>" in its specifier but declares "<version>" |
The version in the name and the declared version differ | Make them the same |
dependency "<specifier>" needs an exact version |
A dependency without a URL has no exact version | Give an exact version |
dependency "<specifier>" needs <name>@<version> installed, or a URL to fetch it from |
A dependency without a URL isn't installed at that version | Install it, or give its asterobot.net URL |
Aucun avis à afficher.