swcombine.js 0.0.11 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +5 -17
- package/README.md +668 -97
- package/dist/index.d.ts +5 -522
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +23 -0
- package/dist/src/auth/index.d.ts +8 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/oauth-manager.d.ts +168 -0
- package/dist/src/auth/oauth-manager.d.ts.map +1 -0
- package/dist/src/auth/oauth.d.ts +101 -0
- package/dist/src/auth/oauth.d.ts.map +1 -0
- package/dist/src/auth/scopes.d.ts +61 -0
- package/dist/src/auth/scopes.d.ts.map +1 -0
- package/dist/src/auth/types.d.ts +118 -0
- package/dist/src/auth/types.d.ts.map +1 -0
- package/dist/src/client/base-resource.d.ts +33 -0
- package/dist/src/client/base-resource.d.ts.map +1 -0
- package/dist/src/client/client.d.ts +85 -0
- package/dist/src/client/client.d.ts.map +1 -0
- package/dist/src/client/errors.d.ts +63 -0
- package/dist/src/client/errors.d.ts.map +1 -0
- package/dist/src/client/http-client.d.ts +35 -0
- package/dist/src/client/http-client.d.ts.map +1 -0
- package/dist/src/client/index.d.ts +15 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/rate-limit.d.ts +12 -0
- package/dist/src/client/rate-limit.d.ts.map +1 -0
- package/dist/src/client/resources/api.d.ts +42 -0
- package/dist/src/client/resources/api.d.ts.map +1 -0
- package/dist/src/client/resources/character.d.ts +98 -0
- package/dist/src/client/resources/character.d.ts.map +1 -0
- package/dist/src/client/resources/faction.d.ts +70 -0
- package/dist/src/client/resources/faction.d.ts.map +1 -0
- package/dist/src/client/resources/index.d.ts +8 -0
- package/dist/src/client/resources/index.d.ts.map +1 -0
- package/dist/src/client/resources/inventory.d.ts +205 -0
- package/dist/src/client/resources/inventory.d.ts.map +1 -0
- package/dist/src/client/types.d.ts +78 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +6 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/timestamp.d.ts +188 -0
- package/dist/src/utils/timestamp.d.ts.map +1 -0
- package/dist/src/utils/types.d.ts +42 -0
- package/dist/src/utils/types.d.ts.map +1 -0
- package/package.json +35 -55
- package/dist/index.cjs.js +0 -772
- package/dist/index.esm.js +0 -772
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/auth/scopes.ts", "../src/auth/oauth.ts", "../src/auth/oauth-manager.ts", "../src/client/errors.ts", "../src/client/rate-limit.ts", "../src/client/http-client.ts", "../src/client/base-resource.ts", "../src/client/resources/api.ts", "../src/client/resources/character.ts", "../src/client/resources/faction.ts", "../src/client/resources/inventory.ts", "../src/client/client.ts", "../src/utils/timestamp.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * OAuth scopes for SWC Combine API\n *\n * Scopes define what permissions your application has access to.\n * Many scopes inherit from others, granting all permissions of their parent scopes.\n */\n\n/**\n * All available OAuth scope keys as string literals\n */\nexport type ScopeKey =\n // Character scopes\n | \"character_auth\"\n | \"character_read\"\n | \"character_stats\"\n | \"character_privileges\"\n | \"character_skills\"\n | \"character_credits\"\n | \"character_credits_write\"\n | \"character_force\"\n | \"character_location\"\n | \"character_events\"\n | \"character_all\"\n // Message scopes\n | \"messages_read\"\n | \"messages_send\"\n | \"messages_delete\"\n | \"messages_all\"\n // Personal inventory overview\n | \"personal_inv_overview\"\n // Personal ships\n | \"personal_inv_ships_read\"\n | \"personal_inv_ships_rename\"\n | \"personal_inv_ships_assign\"\n | \"personal_inv_ships_makeover\"\n | \"personal_inv_ships_tags_read\"\n | \"personal_inv_ships_tags_write\"\n | \"personal_inv_ships_all\"\n // Personal vehicles\n | \"personal_inv_vehicles_read\"\n | \"personal_inv_vehicles_rename\"\n | \"personal_inv_vehicles_assign\"\n | \"personal_inv_vehicles_makeover\"\n | \"personal_inv_vehicles_tags_read\"\n | \"personal_inv_vehicles_tags_write\"\n | \"personal_inv_vehicles_all\"\n // Personal stations\n | \"personal_inv_stations_read\"\n | \"personal_inv_stations_rename\"\n | \"personal_inv_stations_assign\"\n | \"personal_inv_stations_makeover\"\n | \"personal_inv_stations_tags_read\"\n | \"personal_inv_stations_tags_write\"\n | \"personal_inv_stations_all\"\n // Personal cities\n | \"personal_inv_cities_read\"\n | \"personal_inv_cities_rename\"\n | \"personal_inv_cities_assign\"\n | \"personal_inv_cities_makeover\"\n | \"personal_inv_cities_tags_read\"\n | \"personal_inv_cities_tags_write\"\n | \"personal_inv_cities_all\"\n // Personal facilities\n | \"personal_inv_facilities_read\"\n | \"personal_inv_facilities_rename\"\n | \"personal_inv_facilities_assign\"\n | \"personal_inv_facilities_makeover\"\n | \"personal_inv_facilities_tags_read\"\n | \"personal_inv_facilities_tags_write\"\n | \"personal_inv_facilities_all\"\n // Personal planets\n | \"personal_inv_planets_read\"\n | \"personal_inv_planets_assign\"\n | \"personal_inv_planets_tags_read\"\n | \"personal_inv_planets_tags_write\"\n | \"personal_inv_planets_all\"\n // Personal items\n | \"personal_inv_items_read\"\n | \"personal_inv_items_rename\"\n | \"personal_inv_items_assign\"\n | \"personal_inv_items_makeover\"\n | \"personal_inv_items_tags_read\"\n | \"personal_inv_items_tags_write\"\n | \"personal_inv_items_all\"\n // Personal NPCs\n | \"personal_inv_npcs_read\"\n | \"personal_inv_npcs_assign\"\n | \"personal_inv_npcs_makeover\"\n | \"personal_inv_npcs_tags_read\"\n | \"personal_inv_npcs_tags_write\"\n | \"personal_inv_npcs_all\"\n // Personal droids\n | \"personal_inv_droids_read\"\n | \"personal_inv_droids_rename\"\n | \"personal_inv_droids_assign\"\n | \"personal_inv_droids_makeover\"\n | \"personal_inv_droids_tags_read\"\n | \"personal_inv_droids_tags_write\"\n | \"personal_inv_droids_all\"\n // Personal materials\n | \"personal_inv_materials_read\"\n | \"personal_inv_materials_rename\"\n | \"personal_inv_materials_makeover\"\n | \"personal_inv_materials_tags_read\"\n | \"personal_inv_materials_tags_write\"\n | \"personal_inv_materials_all\"\n // Personal creatures\n | \"personal_inv_creatures_read\"\n | \"personal_inv_creatures_rename\"\n | \"personal_inv_creatures_assign\"\n | \"personal_inv_creatures_makeover\"\n | \"personal_inv_creatures_tags_read\"\n | \"personal_inv_creatures_tags_write\"\n | \"personal_inv_creatures_all\"\n // Faction inventory overview\n | \"faction_inv_overview\"\n // Faction ships\n | \"faction_inv_ships_read\"\n | \"faction_inv_ships_rename\"\n | \"faction_inv_ships_assign\"\n | \"faction_inv_ships_makeover\"\n | \"faction_inv_ships_tags_read\"\n | \"faction_inv_ships_tags_write\"\n | \"faction_inv_ships_all\"\n // Faction vehicles\n | \"faction_inv_vehicles_read\"\n | \"faction_inv_vehicles_rename\"\n | \"faction_inv_vehicles_assign\"\n | \"faction_inv_vehicles_makeover\"\n | \"faction_inv_vehicles_tags_read\"\n | \"faction_inv_vehicles_tags_write\"\n | \"faction_inv_vehicles_all\"\n // Faction stations\n | \"faction_inv_stations_read\"\n | \"faction_inv_stations_rename\"\n | \"faction_inv_stations_assign\"\n | \"faction_inv_stations_makeover\"\n | \"faction_inv_stations_tags_read\"\n | \"faction_inv_stations_tags_write\"\n | \"faction_inv_stations_all\"\n // Faction cities\n | \"faction_inv_cities_read\"\n | \"faction_inv_cities_rename\"\n | \"faction_inv_cities_assign\"\n | \"faction_inv_cities_makeover\"\n | \"faction_inv_cities_tags_read\"\n | \"faction_inv_cities_tags_write\"\n | \"faction_inv_cities_all\"\n // Faction facilities\n | \"faction_inv_facilities_read\"\n | \"faction_inv_facilities_rename\"\n | \"faction_inv_facilities_assign\"\n | \"faction_inv_facilities_makeover\"\n | \"faction_inv_facilities_tags_read\"\n | \"faction_inv_facilities_tags_write\"\n | \"faction_inv_facilities_all\"\n // Faction planets\n | \"faction_inv_planets_read\"\n | \"faction_inv_planets_assign\"\n | \"faction_inv_planets_tags_read\"\n | \"faction_inv_planets_tags_write\"\n | \"faction_inv_planets_all\"\n // Faction items\n | \"faction_inv_items_read\"\n | \"faction_inv_items_rename\"\n | \"faction_inv_items_assign\"\n | \"faction_inv_items_makeover\"\n | \"faction_inv_items_tags_read\"\n | \"faction_inv_items_tags_write\"\n | \"faction_inv_items_all\"\n // Faction NPCs\n | \"faction_inv_npcs_read\"\n | \"faction_inv_npcs_assign\"\n | \"faction_inv_npcs_makeover\"\n | \"faction_inv_npcs_tags_read\"\n | \"faction_inv_npcs_tags_write\"\n | \"faction_inv_npcs_all\"\n // Faction droids\n | \"faction_inv_droids_read\"\n | \"faction_inv_droids_rename\"\n | \"faction_inv_droids_assign\"\n | \"faction_inv_droids_makeover\"\n | \"faction_inv_droids_tags_read\"\n | \"faction_inv_droids_tags_write\"\n | \"faction_inv_droids_all\"\n // Faction materials\n | \"faction_inv_materials_read\"\n | \"faction_inv_materials_rename\"\n | \"faction_inv_materials_makeover\"\n | \"faction_inv_materials_tags_read\"\n | \"faction_inv_materials_tags_write\"\n | \"faction_inv_materials_all\"\n // Faction creatures\n | \"faction_inv_creatures_read\"\n | \"faction_inv_creatures_rename\"\n | \"faction_inv_creatures_assign\"\n | \"faction_inv_creatures_makeover\"\n | \"faction_inv_creatures_tags_read\"\n | \"faction_inv_creatures_tags_write\"\n | \"faction_inv_creatures_all\"\n // Faction scopes\n | \"faction_read\"\n | \"faction_members\"\n | \"faction_stocks\"\n | \"faction_credits_read\"\n | \"faction_credits_write\"\n | \"faction_budgets_read\"\n | \"faction_budgets_write\"\n | \"faction_datacards_read\"\n | \"faction_datacards_write\"\n | \"faction_all\";\n\n/**\n * Scope information\n */\nexport interface Scope {\n /** Scope name */\n name: ScopeKey;\n /** Human-readable description of what this scope allows */\n description: string;\n /** Scopes that this scope inherits from */\n inherits: ScopeKey[];\n}\n\n/**\n * Record of all available scopes with their metadata\n *\n * @example\n * ```typescript\n * const scope = Scopes['character_read'];\n * console.log(scope.description); // \"Read basic character information...\"\n * console.log(scope.inherits); // []\n * ```\n */\nexport const Scopes: Record<ScopeKey, Scope> = {\n character_auth: {\n name: \"character_auth\",\n description:\n \"Solely provides the character name and ID for use by clients who want to verify a character's identity\",\n inherits: [],\n },\n character_read: {\n name: \"character_read\",\n description:\n \"Read basic character information. If your profile is private, this will return unique ID, handle, and image. If your profile is not private, this will also return your race, gender, last login, description, and biography.\",\n inherits: [],\n },\n character_stats: {\n name: \"character_stats\",\n description: \"Read information about the character's HP and XP\",\n inherits: [\"character_read\"],\n },\n character_privileges: {\n name: \"character_privileges\",\n description: \"Read character privileges\",\n inherits: [\"character_read\"],\n },\n character_skills: {\n name: \"character_skills\",\n description: \"Read character skills\",\n inherits: [\"character_read\"],\n },\n character_credits: {\n name: \"character_credits\",\n description: \"Read character credit information\",\n inherits: [\"character_read\"],\n },\n character_credits_write: {\n name: \"character_credits_write\",\n description: \"Transfer character credits\",\n inherits: [\"character_credits\", \"character_read\"],\n },\n character_force: {\n name: \"character_force\",\n description:\n \"Read character force-related information. If you are Force-aware, this will return Master or Student where applicable, as well as FP, FXP, regen rate, and Force Meter.\",\n inherits: [\"character_read\"],\n },\n character_location: {\n name: \"character_location\",\n description: \"Read your location in-game\",\n inherits: [\"character_read\"],\n },\n character_events: {\n name: \"character_events\",\n description: \"Read the characters' events\",\n inherits: [\"character_read\"],\n },\n character_all: {\n name: \"character_all\",\n description: \"Access all character information\",\n inherits: [\n \"character_credits_write\",\n \"character_events\",\n \"character_location\",\n \"character_force\",\n \"character_skills\",\n \"character_privileges\",\n \"character_stats\",\n \"character_credits\",\n \"character_read\",\n ],\n },\n messages_read: {\n name: \"messages_read\",\n description: \"Read messages sent to or by the character\",\n inherits: [\"character_read\"],\n },\n messages_send: {\n name: \"messages_send\",\n description: \"Send messages to or from the character\",\n inherits: [\"messages_read\", \"character_read\"],\n },\n messages_delete: {\n name: \"messages_delete\",\n description: \"Delete messages to or from the character\",\n inherits: [\"messages_read\", \"character_read\"],\n },\n messages_all: {\n name: \"messages_all\",\n description: \"Read, send and delete messages to or from the character\",\n inherits: [\"messages_send\", \"messages_delete\", \"messages_read\", \"character_read\"],\n },\n personal_inv_overview: {\n name: \"personal_inv_overview\",\n description: \"Read basic information about your inventories\",\n inherits: [],\n },\n personal_inv_ships_read: {\n name: \"personal_inv_ships_read\",\n description: \"Read basic information about your ships\",\n inherits: [\"personal_inv_ships_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_ships_rename: {\n name: \"personal_inv_ships_rename\",\n description: \"Rename your ships\",\n inherits: [\n \"personal_inv_ships_read\",\n \"personal_inv_ships_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_ships_assign: {\n name: \"personal_inv_ships_assign\",\n description: \"Assign your ships\",\n inherits: [\n \"personal_inv_ships_read\",\n \"personal_inv_ships_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_ships_makeover: {\n name: \"personal_inv_ships_makeover\",\n description: \"Make over your ships\",\n inherits: [\n \"personal_inv_ships_read\",\n \"personal_inv_ships_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_ships_tags_read: {\n name: \"personal_inv_ships_tags_read\",\n description: \"Read the tags assigned to your ships\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_ships_tags_write: {\n name: \"personal_inv_ships_tags_write\",\n description: \"Modify the tags assigned to your ships\",\n inherits: [\n \"personal_inv_ships_assign\",\n \"personal_inv_ships_read\",\n \"personal_inv_ships_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_ships_all: {\n name: \"personal_inv_ships_all\",\n description: \"Access and change anything in your ship inventory\",\n inherits: [\n \"personal_inv_ships_tags_write\",\n \"personal_inv_ships_makeover\",\n \"personal_inv_ships_rename\",\n \"personal_inv_ships_assign\",\n \"personal_inv_ships_read\",\n \"personal_inv_ships_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_vehicles_read: {\n name: \"personal_inv_vehicles_read\",\n description: \"Read basic information about your vehicles\",\n inherits: [\"personal_inv_vehicles_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_vehicles_rename: {\n name: \"personal_inv_vehicles_rename\",\n description: \"Rename your vehicles\",\n inherits: [\n \"personal_inv_vehicles_read\",\n \"personal_inv_vehicles_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_vehicles_assign: {\n name: \"personal_inv_vehicles_assign\",\n description: \"Assign your vehicles\",\n inherits: [\n \"personal_inv_vehicles_read\",\n \"personal_inv_vehicles_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_vehicles_makeover: {\n name: \"personal_inv_vehicles_makeover\",\n description: \"Make over your vehicles\",\n inherits: [\n \"personal_inv_vehicles_read\",\n \"personal_inv_vehicles_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_vehicles_tags_read: {\n name: \"personal_inv_vehicles_tags_read\",\n description: \"Read the tags assigned to your vehicles\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_vehicles_tags_write: {\n name: \"personal_inv_vehicles_tags_write\",\n description: \"Modify the tags assigned to your vehicles\",\n inherits: [\n \"personal_inv_vehicles_assign\",\n \"personal_inv_vehicles_read\",\n \"personal_inv_vehicles_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_vehicles_all: {\n name: \"personal_inv_vehicles_all\",\n description: \"Access and change anything in your vehicle inventory\",\n inherits: [\n \"personal_inv_vehicles_tags_write\",\n \"personal_inv_vehicles_makeover\",\n \"personal_inv_vehicles_rename\",\n \"personal_inv_vehicles_assign\",\n \"personal_inv_vehicles_read\",\n \"personal_inv_vehicles_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_stations_read: {\n name: \"personal_inv_stations_read\",\n description: \"Read basic information about your space stations\",\n inherits: [\"personal_inv_stations_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_stations_rename: {\n name: \"personal_inv_stations_rename\",\n description: \"Rename your space stations\",\n inherits: [\n \"personal_inv_stations_read\",\n \"personal_inv_stations_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_stations_assign: {\n name: \"personal_inv_stations_assign\",\n description: \"Assign your space stations\",\n inherits: [\n \"personal_inv_stations_read\",\n \"personal_inv_stations_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_stations_makeover: {\n name: \"personal_inv_stations_makeover\",\n description: \"Make over your space stations\",\n inherits: [\n \"personal_inv_stations_read\",\n \"personal_inv_stations_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_stations_tags_read: {\n name: \"personal_inv_stations_tags_read\",\n description: \"Read the tags assigned to your space stations\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_stations_tags_write: {\n name: \"personal_inv_stations_tags_write\",\n description: \"Modify the tags assigned to your space stations\",\n inherits: [\n \"personal_inv_stations_assign\",\n \"personal_inv_stations_read\",\n \"personal_inv_stations_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_stations_all: {\n name: \"personal_inv_stations_all\",\n description: \"Access and change anything in your space station inventory\",\n inherits: [\n \"personal_inv_stations_tags_write\",\n \"personal_inv_stations_makeover\",\n \"personal_inv_stations_rename\",\n \"personal_inv_stations_assign\",\n \"personal_inv_stations_read\",\n \"personal_inv_stations_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_cities_read: {\n name: \"personal_inv_cities_read\",\n description: \"Read basic information about your cities\",\n inherits: [\"personal_inv_cities_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_cities_rename: {\n name: \"personal_inv_cities_rename\",\n description: \"Rename your cities\",\n inherits: [\n \"personal_inv_cities_read\",\n \"personal_inv_cities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_cities_assign: {\n name: \"personal_inv_cities_assign\",\n description: \"Assign your cities\",\n inherits: [\n \"personal_inv_cities_read\",\n \"personal_inv_cities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_cities_makeover: {\n name: \"personal_inv_cities_makeover\",\n description: \"Make over your cities\",\n inherits: [\n \"personal_inv_cities_read\",\n \"personal_inv_cities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_cities_tags_read: {\n name: \"personal_inv_cities_tags_read\",\n description: \"Read the tags assigned to your cities\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_cities_tags_write: {\n name: \"personal_inv_cities_tags_write\",\n description: \"Modify the tags assigned to your cities\",\n inherits: [\n \"personal_inv_cities_assign\",\n \"personal_inv_cities_read\",\n \"personal_inv_cities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_cities_all: {\n name: \"personal_inv_cities_all\",\n description: \"Access and change anything in your city inventory\",\n inherits: [\n \"personal_inv_cities_tags_write\",\n \"personal_inv_cities_makeover\",\n \"personal_inv_cities_rename\",\n \"personal_inv_cities_assign\",\n \"personal_inv_cities_read\",\n \"personal_inv_cities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_facilities_read: {\n name: \"personal_inv_facilities_read\",\n description: \"Read basic information about your facilities\",\n inherits: [\"personal_inv_facilities_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_facilities_rename: {\n name: \"personal_inv_facilities_rename\",\n description: \"Rename your facilities\",\n inherits: [\n \"personal_inv_facilities_read\",\n \"personal_inv_facilities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_facilities_assign: {\n name: \"personal_inv_facilities_assign\",\n description: \"Assign your facilities\",\n inherits: [\n \"personal_inv_facilities_read\",\n \"personal_inv_facilities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_facilities_makeover: {\n name: \"personal_inv_facilities_makeover\",\n description: \"Make over your facilities\",\n inherits: [\n \"personal_inv_facilities_read\",\n \"personal_inv_facilities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_facilities_tags_read: {\n name: \"personal_inv_facilities_tags_read\",\n description: \"Read the tags assigned to your facilities\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_facilities_tags_write: {\n name: \"personal_inv_facilities_tags_write\",\n description: \"Modify the tags assigned to your facilities\",\n inherits: [\n \"personal_inv_facilities_assign\",\n \"personal_inv_facilities_read\",\n \"personal_inv_facilities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_facilities_all: {\n name: \"personal_inv_facilities_all\",\n description: \"Access and change anything in your facility inventory\",\n inherits: [\n \"personal_inv_facilities_tags_write\",\n \"personal_inv_facilities_makeover\",\n \"personal_inv_facilities_rename\",\n \"personal_inv_facilities_assign\",\n \"personal_inv_facilities_read\",\n \"personal_inv_facilities_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_planets_read: {\n name: \"personal_inv_planets_read\",\n description: \"Read basic information about your planets\",\n inherits: [\"personal_inv_planets_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_planets_assign: {\n name: \"personal_inv_planets_assign\",\n description: \"Assign your planets\",\n inherits: [\n \"personal_inv_planets_read\",\n \"personal_inv_planets_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_planets_tags_read: {\n name: \"personal_inv_planets_tags_read\",\n description: \"Read the tags assigned to your planets\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_planets_tags_write: {\n name: \"personal_inv_planets_tags_write\",\n description: \"Modify the tags assigned to your planets\",\n inherits: [\n \"personal_inv_planets_assign\",\n \"personal_inv_planets_read\",\n \"personal_inv_planets_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_planets_all: {\n name: \"personal_inv_planets_all\",\n description: \"Access and change anything in your planet inventory\",\n inherits: [\n \"personal_inv_planets_tags_write\",\n \"personal_inv_planets_assign\",\n \"personal_inv_planets_read\",\n \"personal_inv_planets_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_items_read: {\n name: \"personal_inv_items_read\",\n description: \"Read basic information about your items\",\n inherits: [\"personal_inv_items_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_items_rename: {\n name: \"personal_inv_items_rename\",\n description: \"Rename your items\",\n inherits: [\n \"personal_inv_items_read\",\n \"personal_inv_items_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_items_assign: {\n name: \"personal_inv_items_assign\",\n description: \"Assign your items\",\n inherits: [\n \"personal_inv_items_read\",\n \"personal_inv_items_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_items_makeover: {\n name: \"personal_inv_items_makeover\",\n description: \"Make over your items\",\n inherits: [\n \"personal_inv_items_read\",\n \"personal_inv_items_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_items_tags_read: {\n name: \"personal_inv_items_tags_read\",\n description: \"Read the tags assigned to your items\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_items_tags_write: {\n name: \"personal_inv_items_tags_write\",\n description: \"Modify the tags assigned to your items\",\n inherits: [\n \"personal_inv_items_assign\",\n \"personal_inv_items_read\",\n \"personal_inv_items_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_items_all: {\n name: \"personal_inv_items_all\",\n description: \"Access and change anything in your item inventory\",\n inherits: [\n \"personal_inv_items_tags_write\",\n \"personal_inv_items_makeover\",\n \"personal_inv_items_rename\",\n \"personal_inv_items_assign\",\n \"personal_inv_items_read\",\n \"personal_inv_items_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_npcs_read: {\n name: \"personal_inv_npcs_read\",\n description: \"Read basic information about your NPCs\",\n inherits: [\"personal_inv_npcs_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_npcs_assign: {\n name: \"personal_inv_npcs_assign\",\n description: \"Assign your NPCs\",\n inherits: [\n \"personal_inv_npcs_read\",\n \"personal_inv_npcs_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_npcs_makeover: {\n name: \"personal_inv_npcs_makeover\",\n description: \"Make over your NPCs\",\n inherits: [\n \"personal_inv_npcs_read\",\n \"personal_inv_npcs_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_npcs_tags_read: {\n name: \"personal_inv_npcs_tags_read\",\n description: \"Read the tags assigned to your NPCs\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_npcs_tags_write: {\n name: \"personal_inv_npcs_tags_write\",\n description: \"Modify the tags assigned to your NPCs\",\n inherits: [\n \"personal_inv_npcs_assign\",\n \"personal_inv_npcs_read\",\n \"personal_inv_npcs_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_npcs_all: {\n name: \"personal_inv_npcs_all\",\n description: \"Access and change anything in your NPC inventory\",\n inherits: [\n \"personal_inv_npcs_tags_write\",\n \"personal_inv_npcs_makeover\",\n \"personal_inv_npcs_assign\",\n \"personal_inv_npcs_read\",\n \"personal_inv_npcs_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_droids_read: {\n name: \"personal_inv_droids_read\",\n description: \"Read basic information about your droids\",\n inherits: [\"personal_inv_droids_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_droids_rename: {\n name: \"personal_inv_droids_rename\",\n description: \"Rename your droids\",\n inherits: [\n \"personal_inv_droids_read\",\n \"personal_inv_droids_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_droids_assign: {\n name: \"personal_inv_droids_assign\",\n description: \"Assign your droids\",\n inherits: [\n \"personal_inv_droids_read\",\n \"personal_inv_droids_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_droids_makeover: {\n name: \"personal_inv_droids_makeover\",\n description: \"Make over your droids\",\n inherits: [\n \"personal_inv_droids_read\",\n \"personal_inv_droids_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_droids_tags_read: {\n name: \"personal_inv_droids_tags_read\",\n description: \"Read the tags assigned to your droids\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_droids_tags_write: {\n name: \"personal_inv_droids_tags_write\",\n description: \"Modify the tags assigned to your droids\",\n inherits: [\n \"personal_inv_droids_assign\",\n \"personal_inv_droids_read\",\n \"personal_inv_droids_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_droids_all: {\n name: \"personal_inv_droids_all\",\n description: \"Access and change anything in your droid inventory\",\n inherits: [\n \"personal_inv_droids_tags_write\",\n \"personal_inv_droids_makeover\",\n \"personal_inv_droids_rename\",\n \"personal_inv_droids_assign\",\n \"personal_inv_droids_read\",\n \"personal_inv_droids_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_materials_read: {\n name: \"personal_inv_materials_read\",\n description: \"Read basic information about your materials\",\n inherits: [\"personal_inv_materials_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_materials_rename: {\n name: \"personal_inv_materials_rename\",\n description: \"Rename your materials\",\n inherits: [\n \"personal_inv_materials_read\",\n \"personal_inv_materials_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_materials_makeover: {\n name: \"personal_inv_materials_makeover\",\n description: \"Make over your materials\",\n inherits: [\n \"personal_inv_materials_read\",\n \"personal_inv_materials_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_materials_tags_read: {\n name: \"personal_inv_materials_tags_read\",\n description: \"Read the tags assigned to your materials\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_materials_tags_write: {\n name: \"personal_inv_materials_tags_write\",\n description: \"Modify the tags assigned to your materials\",\n inherits: [\n \"personal_inv_materials_read\",\n \"personal_inv_materials_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_materials_all: {\n name: \"personal_inv_materials_all\",\n description: \"Access and change anything in your material inventory\",\n inherits: [\n \"personal_inv_materials_tags_write\",\n \"personal_inv_materials_makeover\",\n \"personal_inv_materials_rename\",\n \"personal_inv_materials_read\",\n \"personal_inv_materials_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_creatures_read: {\n name: \"personal_inv_creatures_read\",\n description: \"Read basic information about your creatures\",\n inherits: [\"personal_inv_creatures_tags_read\", \"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_creatures_rename: {\n name: \"personal_inv_creatures_rename\",\n description: \"Rename your creatures\",\n inherits: [\n \"personal_inv_creatures_read\",\n \"personal_inv_creatures_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_creatures_assign: {\n name: \"personal_inv_creatures_assign\",\n description: \"Assign your creatures\",\n inherits: [\n \"personal_inv_creatures_read\",\n \"personal_inv_creatures_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_creatures_makeover: {\n name: \"personal_inv_creatures_makeover\",\n description: \"Make over your creatures\",\n inherits: [\n \"personal_inv_creatures_read\",\n \"personal_inv_creatures_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_creatures_tags_read: {\n name: \"personal_inv_creatures_tags_read\",\n description: \"Read the tags assigned to your creatures\",\n inherits: [\"personal_inv_overview\", \"character_read\"],\n },\n personal_inv_creatures_tags_write: {\n name: \"personal_inv_creatures_tags_write\",\n description: \"Modify the tags assigned to your creatures\",\n inherits: [\n \"personal_inv_creatures_assign\",\n \"personal_inv_creatures_read\",\n \"personal_inv_creatures_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n personal_inv_creatures_all: {\n name: \"personal_inv_creatures_all\",\n description: \"Access and change anything in your creature inventory\",\n inherits: [\n \"personal_inv_creatures_tags_write\",\n \"personal_inv_creatures_makeover\",\n \"personal_inv_creatures_rename\",\n \"personal_inv_creatures_assign\",\n \"personal_inv_creatures_read\",\n \"personal_inv_creatures_tags_read\",\n \"personal_inv_overview\",\n \"character_read\",\n ],\n },\n faction_inv_overview: {\n name: \"faction_inv_overview\",\n description: \"Read basic information about your faction's inventories\",\n inherits: [],\n },\n faction_inv_ships_read: {\n name: \"faction_inv_ships_read\",\n description: \"Read basic information about your faction's ships\",\n inherits: [\"faction_inv_ships_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_ships_rename: {\n name: \"faction_inv_ships_rename\",\n description: \"Rename your faction's ships\",\n inherits: [\n \"faction_inv_ships_read\",\n \"faction_inv_ships_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_ships_assign: {\n name: \"faction_inv_ships_assign\",\n description: \"Assign your faction's ships\",\n inherits: [\n \"faction_inv_ships_read\",\n \"faction_inv_ships_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_ships_makeover: {\n name: \"faction_inv_ships_makeover\",\n description: \"Make over your faction's ships\",\n inherits: [\n \"faction_inv_ships_read\",\n \"faction_inv_ships_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_ships_tags_read: {\n name: \"faction_inv_ships_tags_read\",\n description: \"Read the tags assigned to your faction's ships\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_ships_tags_write: {\n name: \"faction_inv_ships_tags_write\",\n description: \"Modify the tags assigned to your faction's ships\",\n inherits: [\n \"faction_inv_ships_assign\",\n \"faction_inv_ships_read\",\n \"faction_inv_ships_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_ships_all: {\n name: \"faction_inv_ships_all\",\n description: \"Access and change anything in your faction's ship inventory\",\n inherits: [\n \"faction_inv_ships_tags_write\",\n \"faction_inv_ships_makeover\",\n \"faction_inv_ships_rename\",\n \"faction_inv_ships_assign\",\n \"faction_inv_ships_read\",\n \"faction_inv_ships_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_vehicles_read: {\n name: \"faction_inv_vehicles_read\",\n description: \"Read basic information about your faction's vehicles\",\n inherits: [\"faction_inv_vehicles_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_vehicles_rename: {\n name: \"faction_inv_vehicles_rename\",\n description: \"Rename your faction's vehicles\",\n inherits: [\n \"faction_inv_vehicles_read\",\n \"faction_inv_vehicles_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_vehicles_assign: {\n name: \"faction_inv_vehicles_assign\",\n description: \"Assign your faction's vehicles\",\n inherits: [\n \"faction_inv_vehicles_read\",\n \"faction_inv_vehicles_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_vehicles_makeover: {\n name: \"faction_inv_vehicles_makeover\",\n description: \"Make over your faction's vehicles\",\n inherits: [\n \"faction_inv_vehicles_read\",\n \"faction_inv_vehicles_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_vehicles_tags_read: {\n name: \"faction_inv_vehicles_tags_read\",\n description: \"Read the tags assigned to your faction's vehicles\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_vehicles_tags_write: {\n name: \"faction_inv_vehicles_tags_write\",\n description: \"Modify the tags assigned to your faction's vehicles\",\n inherits: [\n \"faction_inv_vehicles_assign\",\n \"faction_inv_vehicles_read\",\n \"faction_inv_vehicles_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_vehicles_all: {\n name: \"faction_inv_vehicles_all\",\n description: \"Access and change anything in your faction's vehicle inventory\",\n inherits: [\n \"faction_inv_vehicles_tags_write\",\n \"faction_inv_vehicles_makeover\",\n \"faction_inv_vehicles_rename\",\n \"faction_inv_vehicles_assign\",\n \"faction_inv_vehicles_read\",\n \"faction_inv_vehicles_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_stations_read: {\n name: \"faction_inv_stations_read\",\n description: \"Read basic information about your faction's space stations\",\n inherits: [\"faction_inv_stations_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_stations_rename: {\n name: \"faction_inv_stations_rename\",\n description: \"Rename your faction's space stations\",\n inherits: [\n \"faction_inv_stations_read\",\n \"faction_inv_stations_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_stations_assign: {\n name: \"faction_inv_stations_assign\",\n description: \"Assign your faction's space stations\",\n inherits: [\n \"faction_inv_stations_read\",\n \"faction_inv_stations_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_stations_makeover: {\n name: \"faction_inv_stations_makeover\",\n description: \"Make over your faction's space stations\",\n inherits: [\n \"faction_inv_stations_read\",\n \"faction_inv_stations_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_stations_tags_read: {\n name: \"faction_inv_stations_tags_read\",\n description: \"Read the tags assigned to your faction's space stations\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_stations_tags_write: {\n name: \"faction_inv_stations_tags_write\",\n description: \"Modify the tags assigned to your faction's space stations\",\n inherits: [\n \"faction_inv_stations_assign\",\n \"faction_inv_stations_read\",\n \"faction_inv_stations_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_stations_all: {\n name: \"faction_inv_stations_all\",\n description: \"Access and change anything in your faction's space station inventory\",\n inherits: [\n \"faction_inv_stations_tags_write\",\n \"faction_inv_stations_makeover\",\n \"faction_inv_stations_rename\",\n \"faction_inv_stations_assign\",\n \"faction_inv_stations_read\",\n \"faction_inv_stations_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_cities_read: {\n name: \"faction_inv_cities_read\",\n description: \"Read basic information about your faction's cities\",\n inherits: [\"faction_inv_cities_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_cities_rename: {\n name: \"faction_inv_cities_rename\",\n description: \"Rename your faction's cities\",\n inherits: [\n \"faction_inv_cities_read\",\n \"faction_inv_cities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_cities_assign: {\n name: \"faction_inv_cities_assign\",\n description: \"Assign your faction's cities\",\n inherits: [\n \"faction_inv_cities_read\",\n \"faction_inv_cities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_cities_makeover: {\n name: \"faction_inv_cities_makeover\",\n description: \"Make over your faction's cities\",\n inherits: [\n \"faction_inv_cities_read\",\n \"faction_inv_cities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_cities_tags_read: {\n name: \"faction_inv_cities_tags_read\",\n description: \"Read the tags assigned to your faction's cities\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_cities_tags_write: {\n name: \"faction_inv_cities_tags_write\",\n description: \"Modify the tags assigned to your faction's cities\",\n inherits: [\n \"faction_inv_cities_assign\",\n \"faction_inv_cities_read\",\n \"faction_inv_cities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_cities_all: {\n name: \"faction_inv_cities_all\",\n description: \"Access and change anything in your faction's city inventory\",\n inherits: [\n \"faction_inv_cities_tags_write\",\n \"faction_inv_cities_makeover\",\n \"faction_inv_cities_rename\",\n \"faction_inv_cities_assign\",\n \"faction_inv_cities_read\",\n \"faction_inv_cities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_facilities_read: {\n name: \"faction_inv_facilities_read\",\n description: \"Read basic information about your faction's facilities\",\n inherits: [\"faction_inv_facilities_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_facilities_rename: {\n name: \"faction_inv_facilities_rename\",\n description: \"Rename your faction's facilities\",\n inherits: [\n \"faction_inv_facilities_read\",\n \"faction_inv_facilities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_facilities_assign: {\n name: \"faction_inv_facilities_assign\",\n description: \"Assign your faction's facilities\",\n inherits: [\n \"faction_inv_facilities_read\",\n \"faction_inv_facilities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_facilities_makeover: {\n name: \"faction_inv_facilities_makeover\",\n description: \"Make over your faction's facilities\",\n inherits: [\n \"faction_inv_facilities_read\",\n \"faction_inv_facilities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_facilities_tags_read: {\n name: \"faction_inv_facilities_tags_read\",\n description: \"Read the tags assigned to your faction's facilities\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_facilities_tags_write: {\n name: \"faction_inv_facilities_tags_write\",\n description: \"Modify the tags assigned to your faction's facilities\",\n inherits: [\n \"faction_inv_facilities_assign\",\n \"faction_inv_facilities_read\",\n \"faction_inv_facilities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_facilities_all: {\n name: \"faction_inv_facilities_all\",\n description: \"Access and change anything in your faction's facility inventory\",\n inherits: [\n \"faction_inv_facilities_tags_write\",\n \"faction_inv_facilities_makeover\",\n \"faction_inv_facilities_rename\",\n \"faction_inv_facilities_assign\",\n \"faction_inv_facilities_read\",\n \"faction_inv_facilities_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_planets_read: {\n name: \"faction_inv_planets_read\",\n description: \"Read basic information about your faction's planets\",\n inherits: [\"faction_inv_planets_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_planets_assign: {\n name: \"faction_inv_planets_assign\",\n description: \"Assign your faction's planets\",\n inherits: [\n \"faction_inv_planets_read\",\n \"faction_inv_planets_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_planets_tags_read: {\n name: \"faction_inv_planets_tags_read\",\n description: \"Read the tags assigned to your faction's planets\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_planets_tags_write: {\n name: \"faction_inv_planets_tags_write\",\n description: \"Modify the tags assigned to your faction's planets\",\n inherits: [\n \"faction_inv_planets_assign\",\n \"faction_inv_planets_read\",\n \"faction_inv_planets_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_planets_all: {\n name: \"faction_inv_planets_all\",\n description: \"Access and change anything in your faction's planet inventory\",\n inherits: [\n \"faction_inv_planets_tags_write\",\n \"faction_inv_planets_assign\",\n \"faction_inv_planets_read\",\n \"faction_inv_planets_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_items_read: {\n name: \"faction_inv_items_read\",\n description: \"Read basic information about your faction's items\",\n inherits: [\"faction_inv_items_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_items_rename: {\n name: \"faction_inv_items_rename\",\n description: \"Rename your faction's items\",\n inherits: [\n \"faction_inv_items_read\",\n \"faction_inv_items_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_items_assign: {\n name: \"faction_inv_items_assign\",\n description: \"Assign your faction's items\",\n inherits: [\n \"faction_inv_items_read\",\n \"faction_inv_items_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_items_makeover: {\n name: \"faction_inv_items_makeover\",\n description: \"Make over your faction's items\",\n inherits: [\n \"faction_inv_items_read\",\n \"faction_inv_items_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_items_tags_read: {\n name: \"faction_inv_items_tags_read\",\n description: \"Read the tags assigned to your faction's items\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_items_tags_write: {\n name: \"faction_inv_items_tags_write\",\n description: \"Modify the tags assigned to your faction's items\",\n inherits: [\n \"faction_inv_items_assign\",\n \"faction_inv_items_read\",\n \"faction_inv_items_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_items_all: {\n name: \"faction_inv_items_all\",\n description: \"Access and change anything in your faction's item inventory\",\n inherits: [\n \"faction_inv_items_tags_write\",\n \"faction_inv_items_makeover\",\n \"faction_inv_items_rename\",\n \"faction_inv_items_assign\",\n \"faction_inv_items_read\",\n \"faction_inv_items_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_npcs_read: {\n name: \"faction_inv_npcs_read\",\n description: \"Read basic information about your faction's NPCs\",\n inherits: [\"faction_inv_npcs_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_npcs_assign: {\n name: \"faction_inv_npcs_assign\",\n description: \"Assign your faction's NPCs\",\n inherits: [\n \"faction_inv_npcs_read\",\n \"faction_inv_npcs_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_npcs_makeover: {\n name: \"faction_inv_npcs_makeover\",\n description: \"Make over your faction's NPCs\",\n inherits: [\n \"faction_inv_npcs_read\",\n \"faction_inv_npcs_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_npcs_tags_read: {\n name: \"faction_inv_npcs_tags_read\",\n description: \"Read the tags assigned to your faction's NPCs\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_npcs_tags_write: {\n name: \"faction_inv_npcs_tags_write\",\n description: \"Modify the tags assigned to your faction's NPCs\",\n inherits: [\n \"faction_inv_npcs_assign\",\n \"faction_inv_npcs_read\",\n \"faction_inv_npcs_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_npcs_all: {\n name: \"faction_inv_npcs_all\",\n description: \"Access and change anything in your faction's NPC inventory\",\n inherits: [\n \"faction_inv_npcs_tags_write\",\n \"faction_inv_npcs_makeover\",\n \"faction_inv_npcs_assign\",\n \"faction_inv_npcs_read\",\n \"faction_inv_npcs_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_droids_read: {\n name: \"faction_inv_droids_read\",\n description: \"Read basic information about your faction's droids\",\n inherits: [\"faction_inv_droids_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_droids_rename: {\n name: \"faction_inv_droids_rename\",\n description: \"Rename your faction's droids\",\n inherits: [\n \"faction_inv_droids_read\",\n \"faction_inv_droids_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_droids_assign: {\n name: \"faction_inv_droids_assign\",\n description: \"Assign your faction's droids\",\n inherits: [\n \"faction_inv_droids_read\",\n \"faction_inv_droids_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_droids_makeover: {\n name: \"faction_inv_droids_makeover\",\n description: \"Make over your faction's droids\",\n inherits: [\n \"faction_inv_droids_read\",\n \"faction_inv_droids_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_droids_tags_read: {\n name: \"faction_inv_droids_tags_read\",\n description: \"Read the tags assigned to your faction's droids\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_droids_tags_write: {\n name: \"faction_inv_droids_tags_write\",\n description: \"Modify the tags assigned to your faction's droids\",\n inherits: [\n \"faction_inv_droids_assign\",\n \"faction_inv_droids_read\",\n \"faction_inv_droids_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_droids_all: {\n name: \"faction_inv_droids_all\",\n description: \"Access and change anything in your faction's droid inventory\",\n inherits: [\n \"faction_inv_droids_tags_write\",\n \"faction_inv_droids_makeover\",\n \"faction_inv_droids_rename\",\n \"faction_inv_droids_assign\",\n \"faction_inv_droids_read\",\n \"faction_inv_droids_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_materials_read: {\n name: \"faction_inv_materials_read\",\n description: \"Read basic information about your faction's materials\",\n inherits: [\"faction_inv_materials_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_materials_rename: {\n name: \"faction_inv_materials_rename\",\n description: \"Rename your faction's materials\",\n inherits: [\n \"faction_inv_materials_read\",\n \"faction_inv_materials_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_materials_makeover: {\n name: \"faction_inv_materials_makeover\",\n description: \"Make over your faction's materials\",\n inherits: [\n \"faction_inv_materials_read\",\n \"faction_inv_materials_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_materials_tags_read: {\n name: \"faction_inv_materials_tags_read\",\n description: \"Read the tags assigned to your faction's materials\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_materials_tags_write: {\n name: \"faction_inv_materials_tags_write\",\n description: \"Modify the tags assigned to your faction's materials\",\n inherits: [\n \"faction_inv_materials_read\",\n \"faction_inv_materials_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_materials_all: {\n name: \"faction_inv_materials_all\",\n description: \"Access and change anything in your faction's material inventory\",\n inherits: [\n \"faction_inv_materials_tags_write\",\n \"faction_inv_materials_makeover\",\n \"faction_inv_materials_rename\",\n \"faction_inv_materials_read\",\n \"faction_inv_materials_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_creatures_read: {\n name: \"faction_inv_creatures_read\",\n description: \"Read basic information about your faction's creatures\",\n inherits: [\"faction_inv_creatures_tags_read\", \"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_creatures_rename: {\n name: \"faction_inv_creatures_rename\",\n description: \"Rename your faction's creatures\",\n inherits: [\n \"faction_inv_creatures_read\",\n \"faction_inv_creatures_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_creatures_assign: {\n name: \"faction_inv_creatures_assign\",\n description: \"Assign your faction's creatures\",\n inherits: [\n \"faction_inv_creatures_read\",\n \"faction_inv_creatures_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_creatures_makeover: {\n name: \"faction_inv_creatures_makeover\",\n description: \"Make over your faction's creatures\",\n inherits: [\n \"faction_inv_creatures_read\",\n \"faction_inv_creatures_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_creatures_tags_read: {\n name: \"faction_inv_creatures_tags_read\",\n description: \"Read the tags assigned to your faction's creatures\",\n inherits: [\"faction_inv_overview\", \"faction_read\"],\n },\n faction_inv_creatures_tags_write: {\n name: \"faction_inv_creatures_tags_write\",\n description: \"Modify the tags assigned to your faction's creatures\",\n inherits: [\n \"faction_inv_creatures_assign\",\n \"faction_inv_creatures_read\",\n \"faction_inv_creatures_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_inv_creatures_all: {\n name: \"faction_inv_creatures_all\",\n description: \"Access and change anything in your faction's creature inventory\",\n inherits: [\n \"faction_inv_creatures_tags_write\",\n \"faction_inv_creatures_makeover\",\n \"faction_inv_creatures_rename\",\n \"faction_inv_creatures_assign\",\n \"faction_inv_creatures_read\",\n \"faction_inv_creatures_tags_read\",\n \"faction_inv_overview\",\n \"faction_read\",\n ],\n },\n faction_read: {\n name: \"faction_read\",\n description: \"Read basic information about your faction\",\n inherits: [\"character_read\"],\n },\n faction_members: {\n name: \"faction_members\",\n description: \"See your faction's members list\",\n inherits: [\"faction_read\", \"character_read\"],\n },\n faction_stocks: {\n name: \"faction_stocks\",\n description: \"See the stocks your faction owns\",\n inherits: [\"faction_read\", \"character_read\"],\n },\n faction_credits_read: {\n name: \"faction_credits_read\",\n description: \"See how many credits your faction owns\",\n inherits: [\"faction_read\", \"character_read\"],\n },\n faction_credits_write: {\n name: \"faction_credits_write\",\n description: \"Transfer credits on behalf of your faction\",\n inherits: [\n \"faction_budgets_read\",\n \"faction_credits_read\",\n \"faction_read\",\n \"character_read\",\n ],\n },\n faction_budgets_read: {\n name: \"faction_budgets_read\",\n description: \"See your faction's budgets\",\n inherits: [\"faction_read\", \"character_read\"],\n },\n faction_budgets_write: {\n name: \"faction_budgets_write\",\n description: \"Change your faction's budgets\",\n inherits: [\n \"faction_budgets_read\",\n \"faction_credits_read\",\n \"faction_read\",\n \"character_read\",\n ],\n },\n faction_datacards_read: {\n name: \"faction_datacards_read\",\n description: \"See your faction's datacard assignments\",\n inherits: [\"faction_read\", \"character_read\"],\n },\n faction_datacards_write: {\n name: \"faction_datacards_write\",\n description: \"Assign or revoke your faction's datacard assignments\",\n inherits: [\n \"faction_datacards_read\",\n \"faction_budgets_read\",\n \"faction_credits_read\",\n \"faction_read\",\n \"character_read\",\n ],\n },\n faction_all: {\n name: \"faction_all\",\n description: \"Access and change anything in your faction\",\n inherits: [\n \"faction_budgets_write\",\n \"faction_credits_write\",\n \"faction_stocks\",\n \"faction_members\",\n \"faction_datacards_write\",\n \"faction_datacards_read\",\n \"faction_budgets_read\",\n \"faction_credits_read\",\n \"faction_read\",\n \"character_read\",\n ],\n },\n};\n\n/**\n * Array of all scope keys for iteration\n */\nexport const ALL_SCOPE_KEYS: ScopeKey[] = Object.keys(Scopes) as ScopeKey[];\n\n/**\n * Check if a string is a valid scope key\n */\nexport function isValidScope(scope: string): scope is ScopeKey {\n return scope in Scopes;\n}\n\n/**\n * Convert an array of ScopeKeys to a space-delimited string for OAuth\n *\n * @example\n * ```typescript\n * const scopeString = scopesToString(['character_read', 'faction_members']);\n * // Returns: \"character_read faction_members\"\n * ```\n */\nexport function scopesToString(scopes: ScopeKey[]): string {\n return scopes.join(\" \");\n}\n\n/**\n * Parse a space-delimited scope string into an array of ScopeKeys\n *\n * @example\n * ```typescript\n * const scopes = scopesFromString(\"character_read faction_members\");\n * // Returns: ['character_read', 'faction_members']\n * ```\n */\nexport function scopesFromString(scopeString: string): ScopeKey[] {\n return scopeString\n .split(\" \")\n .filter((s) => s.trim() && isValidScope(s)) as ScopeKey[];\n}\n",
|
|
6
|
+
"/**\n * OAuth 2.0 implementation for SWC Combine API\n *\n * Key quirks:\n * - Uses \"Authorization: OAuth TOKEN\" instead of \"Bearer\"\n * - Refresh tokens only returned on first exchange with access_type=offline\n * - Consent is persisted after initial grant\n */\n\nimport type {\n AuthorizationUrlParams,\n TokenExchangeParams,\n TokenRefreshParams,\n TokenResponse,\n OAuthError,\n TokenRevokeParams,\n} from \"./types.ts\";\nimport { scopesToString } from \"./scopes.ts\";\n\n/** Base URL for OAuth endpoints */\nconst OAUTH_BASE_URL = \"https://www.swcombine.com/ws/oauth2\";\n\n/**\n * SWC Combine OAuth error\n */\nexport class SWCOAuthError extends Error {\n constructor(\n message: string,\n public code: string,\n public description?: string\n ) {\n super(message);\n this.name = \"SWCOAuthError\";\n }\n\n static fromResponse(error: OAuthError): SWCOAuthError {\n return new SWCOAuthError(\n error.error_description || error.error,\n error.error,\n error.error_description\n );\n }\n}\n\n/**\n * Generate the OAuth authorization URL\n *\n * @param params - Authorization URL parameters\n * @returns The complete authorization URL to redirect users to\n *\n * @example\n * ```ts\n * const url = generateAuthorizationUrl({\n * clientId: \"your-client-id\",\n * redirectUri: \"https://example.com/callback\",\n * scopes: [ScopeKey.CharacterRead, ScopeKey.FactionMembers],\n * state: \"random-state-string\",\n * accessType: \"offline\", // To get refresh token\n * });\n *\n * // Redirect user to this URL\n * window.location.href = url;\n * ```\n */\nexport function generateAuthorizationUrl(\n params: AuthorizationUrlParams\n): string {\n const url = new URL(`${OAUTH_BASE_URL}/auth/`);\n\n // Required parameters\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", params.clientId);\n url.searchParams.set(\"redirect_uri\", params.redirectUri);\n url.searchParams.set(\"scope\", scopesToString(params.scopes));\n\n // Optional parameters\n if (params.state) {\n url.searchParams.set(\"state\", params.state);\n }\n\n if (params.accessType) {\n url.searchParams.set(\"access_type\", params.accessType);\n }\n\n if (params.renewPreviouslyGranted) {\n url.searchParams.set(\"renew_previously_granted\", \"yes\");\n }\n\n return url.toString();\n}\n\n/**\n * Exchange authorization code for access token\n *\n * @param params - Token exchange parameters\n * @returns Token response with access_token and optional refresh_token\n * @throws {SWCOAuthError} If the exchange fails\n *\n * @example\n * ```ts\n * // After user is redirected back with code\n * const tokens = await exchangeCodeForToken({\n * code: \"authorization-code-from-callback\",\n * clientId: \"your-client-id\",\n * clientSecret: \"your-client-secret\",\n * redirectUri: \"https://example.com/callback\",\n * });\n *\n * console.log(tokens.access_token);\n * if (tokens.refresh_token) {\n * // Store refresh token securely for future use\n * }\n * ```\n */\nexport async function exchangeCodeForToken(\n params: TokenExchangeParams\n): Promise<TokenResponse> {\n const body = new URLSearchParams({\n code: params.code,\n client_id: params.clientId,\n client_secret: params.clientSecret,\n redirect_uri: params.redirectUri,\n grant_type: \"authorization_code\",\n });\n\n const response = await fetch(`${OAUTH_BASE_URL}/token/`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n\n const data = (await response.json()) as any;\n\n if (!response.ok || \"error\" in data) {\n throw SWCOAuthError.fromResponse(data as OAuthError);\n }\n\n return data as TokenResponse;\n}\n\n/**\n * Refresh an access token using a refresh token\n *\n * @param params - Token refresh parameters\n * @returns New token response with fresh access_token\n * @throws {SWCOAuthError} If the refresh fails\n *\n * @example\n * ```ts\n * const newTokens = await refreshAccessToken({\n * refreshToken: \"stored-refresh-token\",\n * clientId: \"your-client-id\",\n * clientSecret: \"your-client-secret\",\n * });\n *\n * console.log(newTokens.access_token);\n * // Note: refresh_token is NOT included in response\n * ```\n */\nexport async function refreshAccessToken(\n params: TokenRefreshParams\n): Promise<TokenResponse> {\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: params.refreshToken,\n client_id: params.clientId,\n client_secret: params.clientSecret,\n });\n\n const response = await fetch(`${OAUTH_BASE_URL}/token/`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n\n const data = (await response.json()) as any;\n\n if (!response.ok || \"error\" in data) {\n throw SWCOAuthError.fromResponse(data as OAuthError);\n }\n\n return data as TokenResponse;\n}\n\n/**\n * Revoke a token (typically a refresh token)\n *\n * @param params - Token revocation parameters\n * @throws {SWCOAuthError} If the revocation fails\n *\n * @example\n * ```ts\n * await revokeToken({\n * token: \"refresh-token-to-revoke\",\n * clientId: \"your-client-id\",\n * });\n *\n * console.log(\"Token revoked successfully\");\n * ```\n */\nexport async function revokeToken(params: TokenRevokeParams): Promise<void> {\n const url = new URL(`${OAUTH_BASE_URL}/revoke`);\n url.searchParams.set(\"token\", params.token);\n url.searchParams.set(\"client_id\", params.clientId);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n });\n\n if (!response.ok) {\n const data = await response.json();\n throw SWCOAuthError.fromResponse(data as OAuthError);\n }\n}\n",
|
|
7
|
+
"/**\n * OAuth Manager for handling complete OAuth flow with token management\n */\n\nimport {\n generateAuthorizationUrl,\n exchangeCodeForToken,\n refreshAccessToken,\n revokeToken,\n SWCOAuthError,\n} from \"./oauth.ts\";\nimport type {\n OAuthConfig,\n StoredTokens,\n AuthorizationUrlParams,\n TokenResponse,\n} from \"./types.ts\";\n\n/**\n * Token storage interface - implement this to persist tokens\n */\nexport interface TokenStorage {\n /** Get stored tokens */\n get(): Promise<StoredTokens | null> | StoredTokens | null;\n /** Store tokens */\n set(tokens: StoredTokens): Promise<void> | void;\n /** Clear stored tokens */\n clear(): Promise<void> | void;\n}\n\n/**\n * In-memory token storage (not persistent across restarts)\n */\nexport class MemoryTokenStorage implements TokenStorage {\n private tokens: StoredTokens | null = null;\n\n get(): StoredTokens | null {\n return this.tokens;\n }\n\n set(tokens: StoredTokens): void {\n this.tokens = tokens;\n }\n\n clear(): void {\n this.tokens = null;\n }\n}\n\n/**\n * OAuth Manager - handles complete OAuth flow with automatic token refresh\n *\n * Can be used in two modes:\n * 1. Full mode (with storage): Complete OAuth flow with token persistence\n * 2. Utility mode (without storage): Generate auth URLs and manually refresh tokens\n *\n * @example Full mode with storage\n * ```ts\n * const oauth = new OAuthManager(\n * {\n * clientId: \"your-client-id\",\n * clientSecret: \"your-client-secret\",\n * redirectUri: \"https://example.com/callback\",\n * defaultScopes: [ScopeKey.CharacterRead, ScopeKey.FactionMembers],\n * },\n * storage // TokenStorage instance\n * );\n *\n * // 1. Generate authorization URL\n * const authUrl = oauth.getAuthorizationUrl({\n * state: \"random-state\",\n * accessType: \"offline\", // Get refresh token\n * });\n *\n * // 2. After user authorizes and returns with code\n * await oauth.handleCallback(\"authorization-code\");\n *\n * // 3. Get valid access token (auto-refreshes if needed)\n * const token = await oauth.getAccessToken();\n *\n * // 4. Use token in API calls\n * // ...\n *\n * // 5. Revoke when done\n * await oauth.revoke();\n * ```\n *\n * @example Utility mode without storage\n * ```ts\n * const oauth = new OAuthManager({\n * clientId: \"your-client-id\",\n * clientSecret: \"your-client-secret\",\n * redirectUri: \"https://example.com/callback\",\n * });\n *\n * // Generate auth URL\n * const authUrl = oauth.getAuthorizationUrl({ scopes: [...] });\n *\n * // Manually refresh a token\n * const tokens = await oauth.refreshAccessToken(refreshToken);\n * ```\n */\nexport class OAuthManager {\n private config: OAuthConfig;\n private storage: TokenStorage | null;\n\n constructor(config: OAuthConfig, storage?: TokenStorage) {\n this.config = config;\n this.storage = storage ?? null;\n }\n\n /**\n * Generate authorization URL to redirect users to\n *\n * @param options - Optional parameters (scopes, state, accessType, etc.)\n * @returns Authorization URL\n */\n getAuthorizationUrl(\n options?: Partial<Omit<AuthorizationUrlParams, \"clientId\" | \"redirectUri\">>\n ): string {\n const scopes = options?.scopes || this.config.defaultScopes || [];\n\n return generateAuthorizationUrl({\n clientId: this.config.clientId,\n redirectUri: this.config.redirectUri,\n scopes,\n ...options,\n });\n }\n\n /**\n * Handle OAuth callback by exchanging code for tokens\n *\n * Requires storage to be configured.\n *\n * @param code - Authorization code from callback\n * @returns Token response\n * @throws {SWCOAuthError} If storage is not configured\n */\n async handleCallback(code: string): Promise<TokenResponse> {\n this.requireStorage(\"handleCallback\");\n\n const tokens = await exchangeCodeForToken({\n code,\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n redirectUri: this.config.redirectUri,\n });\n\n // Store tokens\n await this.storeTokens(tokens);\n\n return tokens;\n }\n\n /**\n * Get a valid access token, automatically refreshing if expired\n *\n * Requires storage to be configured.\n *\n * @returns Current access token\n * @throws {SWCOAuthError} If storage is not configured, no tokens are stored, or refresh fails\n */\n async getAccessToken(): Promise<string> {\n this.requireStorage(\"getAccessToken\");\n\n const stored = await this.storage!.get();\n\n if (!stored) {\n throw new SWCOAuthError(\n \"No tokens stored. Please authenticate first.\",\n \"no_tokens\"\n );\n }\n\n // Check if token is expired or will expire in next 60 seconds\n const isExpired = stored.expiresAt <= Date.now() + 60_000;\n\n if (isExpired) {\n if (!stored.refreshToken) {\n throw new SWCOAuthError(\n \"Access token expired and no refresh token available\",\n \"token_expired\"\n );\n }\n\n // Refresh the token\n const newTokens = await refreshAccessToken({\n refreshToken: stored.refreshToken,\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n });\n\n // Store new tokens (keep the refresh token)\n await this.storeTokens(newTokens, stored.refreshToken);\n\n return newTokens.access_token;\n }\n\n return stored.accessToken;\n }\n\n /**\n * Manually refresh an access token using a refresh token\n *\n * This is a utility method that doesn't require storage. Useful for\n * manually managing tokens or refreshing tokens obtained elsewhere.\n *\n * @param refreshToken - The refresh token to use\n * @returns New token response with fresh access token\n * @throws {SWCOAuthError} If refresh fails\n */\n async refreshAccessToken(refreshToken: string): Promise<TokenResponse> {\n return await refreshAccessToken({\n refreshToken,\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n });\n }\n\n /**\n * Check if user is authenticated (has valid or refreshable tokens)\n *\n * Requires storage to be configured.\n *\n * @throws {SWCOAuthError} If storage is not configured\n */\n async isAuthenticated(): Promise<boolean> {\n this.requireStorage(\"isAuthenticated\");\n\n const stored = await this.storage!.get();\n if (!stored) return false;\n\n // If we have a refresh token, we can always get a new access token\n if (stored.refreshToken) return true;\n\n // Otherwise, check if current token is still valid\n return stored.expiresAt > Date.now();\n }\n\n /**\n * Get stored tokens (if any)\n *\n * Requires storage to be configured.\n *\n * @throws {SWCOAuthError} If storage is not configured\n */\n async getStoredTokens(): Promise<StoredTokens | null> {\n this.requireStorage(\"getStoredTokens\");\n return await this.storage!.get();\n }\n\n /**\n * Manually set tokens (useful for restoring from external storage)\n *\n * Requires storage to be configured.\n *\n * @throws {SWCOAuthError} If storage is not configured\n */\n async setTokens(tokens: StoredTokens): Promise<void> {\n this.requireStorage(\"setTokens\");\n await this.storage!.set(tokens);\n }\n\n /**\n * Revoke the current refresh token and clear stored tokens\n *\n * Requires storage to be configured.\n *\n * @throws {SWCOAuthError} If storage is not configured\n */\n async revoke(): Promise<void> {\n this.requireStorage(\"revoke\");\n\n const stored = await this.storage!.get();\n\n if (stored?.refreshToken) {\n try {\n await revokeToken({\n token: stored.refreshToken,\n clientId: this.config.clientId,\n });\n } catch (error) {\n // Ignore errors during revocation, still clear local tokens\n console.warn(\"Failed to revoke token:\", error);\n }\n }\n\n await this.storage!.clear();\n }\n\n /**\n * Clear stored tokens without revoking them\n *\n * Requires storage to be configured.\n *\n * @throws {SWCOAuthError} If storage is not configured\n */\n async logout(): Promise<void> {\n this.requireStorage(\"logout\");\n await this.storage!.clear();\n }\n\n /**\n * Store tokens with expiration calculation\n */\n private async storeTokens(\n tokens: TokenResponse,\n existingRefreshToken?: string\n ): Promise<void> {\n const stored: StoredTokens = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token || existingRefreshToken,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n };\n\n await this.storage!.set(stored);\n }\n\n /**\n * Check if storage is configured and throw error if not\n */\n private requireStorage(methodName: string): void {\n if (!this.storage) {\n throw new SWCOAuthError(\n `${methodName}() requires storage to be configured. ` +\n `Pass a TokenStorage instance to the OAuthManager constructor.`,\n \"storage_required\"\n );\n }\n }\n}\n",
|
|
8
|
+
"/**\n * Error classes for SWC API client\n */\n\nimport type { RateLimitInfo } from \"./types.ts\";\n\n/**\n * Base error class for all SWC client errors\n */\nexport class SWCError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error,\n ) {\n super(message);\n this.name = \"SWCError\";\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Network-level errors (fetch failures, timeouts, etc.)\n */\nexport class NetworkError extends SWCError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"NetworkError\";\n }\n}\n\n/**\n * Base class for API errors (4xx, 5xx status codes)\n */\nexport class APIError extends SWCError {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly response?: any,\n ) {\n super(message);\n this.name = \"APIError\";\n }\n}\n\n/**\n * Authentication error (401 Unauthorized)\n */\nexport class AuthenticationError extends APIError {\n constructor(message: string, response?: any) {\n super(message, 401, response);\n this.name = \"AuthenticationError\";\n }\n}\n\n/**\n * Authorization error (403 Forbidden)\n */\nexport class AuthorizationError extends APIError {\n constructor(message: string, response?: any) {\n super(message, 403, response);\n this.name = \"AuthorizationError\";\n }\n}\n\n/**\n * Validation error (400 Bad Request)\n */\nexport class ValidationError extends APIError {\n constructor(message: string, response?: any) {\n super(message, 400, response);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Rate limit error (429 Too Many Requests)\n */\nexport class RateLimitError extends APIError {\n constructor(\n message: string,\n public readonly rateLimit: RateLimitInfo,\n response?: any,\n ) {\n super(message, 429, response);\n this.name = \"RateLimitError\";\n }\n}\n\n/**\n * Resource not found error (404 Not Found)\n */\nexport class NotFoundError extends APIError {\n constructor(message: string, response?: any) {\n super(message, 404, response);\n this.name = \"NotFoundError\";\n }\n}\n\n/**\n * Server error (5xx status codes)\n */\nexport class ServerError extends APIError {\n constructor(message: string, statusCode: number, response?: any) {\n super(message, statusCode, response);\n this.name = \"ServerError\";\n }\n}\n",
|
|
9
|
+
"/**\n * Rate limit parsing and tracking utilities\n */\n\nimport type { RateLimitInfo } from \"./types.ts\";\n\n/**\n * Common rate limit header names\n * SWC API may use X-RateLimit-* or X-Rate-Limit-* format\n */\nconst RATE_LIMIT_HEADERS = {\n limit: [\"x-ratelimit-limit\", \"x-rate-limit-limit\"],\n remaining: [\"x-ratelimit-remaining\", \"x-rate-limit-remaining\"],\n reset: [\"x-ratelimit-reset\", \"x-rate-limit-reset\"],\n resetAfter: [\"x-ratelimit-reset-after\", \"x-rate-limit-reset-after\"],\n};\n\n/**\n * Parse rate limit information from response headers\n *\n * @param headers - Response headers from fetch\n * @returns RateLimitInfo object or null if headers not present\n */\nexport function parseRateLimitHeaders(\n headers: Headers,\n): RateLimitInfo | null {\n // Try to find limit header\n const limit = findHeader(headers, RATE_LIMIT_HEADERS.limit);\n if (!limit) {\n return null; // No rate limit headers present\n }\n\n const remaining = findHeader(headers, RATE_LIMIT_HEADERS.remaining);\n const reset = findHeader(headers, RATE_LIMIT_HEADERS.reset);\n const resetAfter = findHeader(headers, RATE_LIMIT_HEADERS.resetAfter);\n\n // Parse values\n const limitNum = parseInt(limit, 10);\n const remainingNum = remaining ? parseInt(remaining, 10) : 0;\n\n // Parse reset timestamp\n let resetDate: Date;\n if (reset) {\n // Could be Unix timestamp or ISO date\n const resetNum = parseInt(reset, 10);\n if (!isNaN(resetNum)) {\n // Unix timestamp (seconds since epoch)\n resetDate = new Date(resetNum * 1000);\n } else {\n // Try parsing as ISO date\n resetDate = new Date(reset);\n }\n } else if (resetAfter) {\n // Calculate reset from resetAfter seconds\n const resetAfterNum = parseInt(resetAfter, 10);\n resetDate = new Date(Date.now() + resetAfterNum * 1000);\n } else {\n // No reset info, default to 1 hour from now\n resetDate = new Date(Date.now() + 3600 * 1000);\n }\n\n const resetAfterNum = resetAfter ? parseInt(resetAfter, 10) : undefined;\n\n return {\n limit: limitNum,\n remaining: remainingNum,\n reset: resetDate,\n resetAfter: resetAfterNum,\n };\n}\n\n/**\n * Find first matching header from a list of possible names\n */\nfunction findHeader(headers: Headers, names: string[]): string | null {\n for (const name of names) {\n const value = headers.get(name);\n if (value !== null) {\n return value;\n }\n }\n return null;\n}\n",
|
|
10
|
+
"/**\n * Low-level HTTP client for making authenticated API requests\n */\n\nimport type { OAuthManager } from \"../auth/oauth-manager.ts\";\nimport type { RequestConfig, RequestOptions, SWCResponse } from \"./types.ts\";\nimport {\n APIError,\n AuthenticationError,\n AuthorizationError,\n NetworkError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n} from \"./errors.ts\";\nimport { parseRateLimitHeaders } from \"./rate-limit.ts\";\n\nexport class HttpClient {\n constructor(\n private readonly auth: OAuthManager | string,\n private readonly baseUrl: string,\n ) {}\n\n /**\n * Make an authenticated HTTP request\n */\n async request(config: RequestConfig): Promise<SWCResponse> {\n const { method, endpoint, body, options = {} } = config;\n\n // Build URL with query parameters\n const url = this.buildUrl(endpoint, options.query);\n\n // Get access token (either from OAuthManager or directly)\n const accessToken = typeof this.auth === \"string\"\n ? this.auth\n : await this.auth.getAccessToken();\n\n // Build headers\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n // SWC API uses \"OAuth\" instead of \"Bearer\"\n Authorization: `OAuth ${accessToken}`,\n ...options.headers,\n });\n\n // Build fetch options\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: options.signal,\n };\n\n // Add body for POST/PUT/PATCH requests\n if (body && (method === \"POST\" || method === \"PUT\" || method === \"PATCH\")) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n // Make request with timeout\n try {\n const response = await this.fetchWithTimeout(url, fetchOptions, options.timeout);\n return await this.handleResponse(response);\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new NetworkError(\n `Network request failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(\n endpoint: string,\n query?: Record<string, string | number | boolean | string[]>,\n ): string {\n // Ensure endpoint starts with /\n const path = endpoint.startsWith(\"/\") ? endpoint : `/${endpoint}`;\n const url = new URL(path, this.baseUrl);\n\n // Add query parameters\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n // Handle array values by appending each element\n value.forEach((item) => {\n url.searchParams.append(key, String(item));\n });\n } else {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n return url.toString();\n }\n\n /**\n * Fetch with optional timeout\n */\n private async fetchWithTimeout(\n url: string,\n options: RequestInit,\n timeout?: number,\n ): Promise<Response> {\n if (!timeout) {\n return fetch(url, options);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Handle response and convert to SWCResponse or throw error\n */\n private async handleResponse(response: Response): Promise<SWCResponse> {\n const { status, headers } = response;\n\n // Parse rate limit headers\n const rateLimit = parseRateLimitHeaders(headers);\n\n // Handle successful responses\n if (status >= 200 && status < 300) {\n const data = await this.parseResponseBody(response);\n return {\n data,\n status,\n headers,\n rateLimit,\n };\n }\n\n // Parse error response body\n const errorData = await this.parseResponseBody(response);\n\n // Extract error message\n const message = this.extractErrorMessage(errorData, status);\n\n // Throw specific error types based on status code\n if (status === 400) {\n throw new ValidationError(message, errorData);\n }\n\n if (status === 401) {\n throw new AuthenticationError(message, errorData);\n }\n\n if (status === 403) {\n throw new AuthorizationError(message, errorData);\n }\n\n if (status === 404) {\n throw new NotFoundError(message, errorData);\n }\n\n if (status === 429) {\n if (!rateLimit) {\n throw new RateLimitError(\n message,\n {\n limit: 0,\n remaining: 0,\n reset: new Date(Date.now() + 3600 * 1000),\n },\n errorData,\n );\n }\n throw new RateLimitError(message, rateLimit, errorData);\n }\n\n if (status >= 500) {\n throw new ServerError(message, status, errorData);\n }\n\n // Generic API error for other status codes\n throw new APIError(message, status, errorData);\n }\n\n /**\n * Parse response body as JSON, or return text if parsing fails\n */\n private async parseResponseBody(response: Response): Promise<any> {\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n return await response.json();\n } catch {\n // If JSON parsing fails, return text\n return await response.text();\n }\n }\n\n return await response.text();\n }\n\n /**\n * Extract error message from response data\n */\n private extractErrorMessage(data: any, status: number): string {\n // Try common error message fields\n if (typeof data === \"object\" && data !== null) {\n if (data.error) return String(data.error);\n if (data.message) return String(data.message);\n if (data.error_description) return String(data.error_description);\n }\n\n // Fallback to HTTP status text\n return `HTTP ${status} error`;\n }\n}\n",
|
|
11
|
+
"/**\n * Base class for all API resource classes\n */\n\nimport type { SWCClient } from \"./client.ts\";\nimport type { RequestOptions } from \"./types.ts\";\n\n/**\n * Base resource class that provides HTTP methods for child resources\n */\nexport abstract class BaseResource {\n constructor(protected readonly client: SWCClient) {}\n\n /**\n * Make a GET request\n */\n protected async request_get(endpoint: string, options?: RequestOptions): Promise<any> {\n return this.client.request({\n method: \"GET\",\n endpoint,\n options,\n });\n }\n\n /**\n * Make a POST request\n */\n protected async request_post(\n endpoint: string,\n body?: any,\n options?: RequestOptions,\n ): Promise<any> {\n return this.client.request({\n method: \"POST\",\n endpoint,\n body,\n options,\n });\n }\n\n /**\n * Make a PUT request\n */\n protected async request_put(\n endpoint: string,\n body?: any,\n options?: RequestOptions,\n ): Promise<any> {\n return this.client.request({\n method: \"PUT\",\n endpoint,\n body,\n options,\n });\n }\n\n /**\n * Make a PATCH request\n */\n protected async request_patch(\n endpoint: string,\n body?: any,\n options?: RequestOptions,\n ): Promise<any> {\n return this.client.request({\n method: \"PATCH\",\n endpoint,\n body,\n options,\n });\n }\n\n /**\n * Make a DELETE request\n */\n protected async request_delete(\n endpoint: string,\n body?: any,\n options?: RequestOptions,\n ): Promise<any> {\n return this.client.request({\n method: \"DELETE\",\n endpoint,\n body,\n options,\n });\n }\n}\n",
|
|
12
|
+
"/**\n * API utility endpoints resource\n */\n\nimport { BaseResource } from \"../base-resource.ts\";\nimport type { RequestOptions } from \"../types.ts\";\n\n/**\n * Api resource for utility endpoints\n */\nexport class ApiResource extends BaseResource {\n /**\n * Print a HelloWorld message (no authentication required)\n *\n * @see https://www.swcombine.com/ws/v2.0/api/helloworld\n */\n async helloWorld(options?: RequestOptions): Promise<any> {\n return this.request_get(\"/api/helloworld\", options);\n }\n\n /**\n * Print a HelloWorld message for authenticated clients\n * Requires: character_read permission\n *\n * @see https://www.swcombine.com/ws/v2.0/api/helloauth\n */\n async helloAuth(options?: RequestOptions): Promise<any> {\n return this.request_get(\"/api/helloauth\", options);\n }\n\n /**\n * Get list of available OAuth permissions/scopes\n *\n * @see https://www.swcombine.com/ws/v2.0/api/permissions\n */\n async permissions(options?: RequestOptions): Promise<any> {\n return this.request_get(\"/api/permissions\", options);\n }\n\n /**\n * Get current rate limit status\n *\n * @see https://www.swcombine.com/ws/v2.0/api/ratelimits\n */\n async rateLimits(options?: RequestOptions): Promise<any> {\n return this.request_get(\"/api/ratelimits\", options);\n }\n\n /**\n * Get current server time\n *\n * @see https://www.swcombine.com/ws/v2.0/api/time\n */\n async time(options?: RequestOptions): Promise<any> {\n return this.request_get(\"/api/time\", options);\n }\n}\n",
|
|
13
|
+
"/**\n * Character resource\n */\n\nimport { BaseResource } from \"../base-resource.ts\";\nimport type { RequestOptions } from \"../types.ts\";\n\n/**\n * Credit transfer parameters for POST /character/credits\n */\nexport interface CharacterCreditTransfer {\n /** The character or faction name receiving credits */\n recipient: string;\n /** The credit quantity to transfer */\n amount: number;\n /** The reason for the transfer (optional) */\n reason?: string;\n}\n\n/**\n * Message send parameters for PUT /character/messages\n */\nexport interface CharacterMessageSend {\n /** Semi-colon separated list of receiver handles (max 25) */\n receivers: string;\n /** Text of the message */\n communication: string;\n}\n\n/**\n * Privilege grant/revoke parameters for POST /character/privilege\n */\nexport interface CharacterPrivilegeUpdate {\n /** Flags that the privilege should be revoked instead of granted (optional) */\n revoke?: string;\n}\n\n/**\n * Character resource for accessing character data\n */\nexport class CharacterResource extends BaseResource {\n /**\n * Nested resource for character credit log\n */\n public readonly creditlog: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for character permissions\n */\n public readonly permissions: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for character skills\n */\n public readonly skills: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for character privileges\n */\n public readonly privileges: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for a specific privilege\n */\n public readonly privilege: {\n get: (id: string, options?: RequestOptions) => Promise<any>;\n post: (\n id: string,\n data: CharacterPrivilegeUpdate,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n\n /**\n * Nested resource for character credits\n */\n public readonly credits: {\n get: (options?: RequestOptions) => Promise<any>;\n post: (\n data: CharacterCreditTransfer,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n\n /**\n * Nested resource for character messages\n */\n public readonly messages: {\n get: (id?: string, options?: RequestOptions) => Promise<any>;\n put: (data: CharacterMessageSend, options?: RequestOptions) => Promise<any>;\n delete: (id: string, options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for character handle check\n */\n public readonly handlecheck: {\n get: (handle: string, options?: RequestOptions) => Promise<any>;\n };\n\n constructor(client: any) {\n super(client);\n\n // Store reference to parent's methods to avoid ambiguity\n const parentGet = (endpoint: string, options?: RequestOptions) =>\n this.request_get(endpoint, options);\n const parentPost = (endpoint: string, body?: any, options?: RequestOptions) =>\n this.request_post(endpoint, body, options);\n const parentPut = (endpoint: string, body?: any, options?: RequestOptions) =>\n this.request_put(endpoint, body, options);\n const parentDelete = (endpoint: string, body?: any, options?: RequestOptions) =>\n this.request_delete(endpoint, body, options);\n\n // Initialize nested resources with proper this binding\n this.creditlog = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/character/creditlog\", options);\n },\n };\n\n this.permissions = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/character/permissions\", options);\n },\n };\n\n this.skills = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/character/skills\", options);\n },\n };\n\n this.privileges = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/character/privileges\", options);\n },\n };\n\n this.privilege = {\n get: (id: string, options?: RequestOptions): Promise<any> => {\n return parentGet(`/character/privilege/${id}`, options);\n },\n post: (\n id: string,\n data: CharacterPrivilegeUpdate,\n options?: RequestOptions,\n ): Promise<any> => {\n return parentPost(`/character/privilege/${id}`, data, options);\n },\n };\n\n this.credits = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/character/credits\", options);\n },\n post: (\n data: CharacterCreditTransfer,\n options?: RequestOptions,\n ): Promise<any> => {\n return parentPost(\"/character/credits\", data, options);\n },\n };\n\n this.messages = {\n get: (id?: string, options?: RequestOptions): Promise<any> => {\n const endpoint = id ? `/character/messages/${id}` : \"/character/messages\";\n return parentGet(endpoint, options);\n },\n put: (data: CharacterMessageSend, options?: RequestOptions): Promise<any> => {\n return parentPut(\"/character/messages\", data, options);\n },\n delete: (id: string, options?: RequestOptions): Promise<any> => {\n return parentDelete(`/character/messages/${id}`, undefined, options);\n },\n };\n\n this.handlecheck = {\n get: (handle: string, options?: RequestOptions): Promise<any> => {\n return parentGet(`/character/handlecheck/${handle}`, options);\n },\n };\n }\n\n /**\n * Get basic character information\n * Requires: character_read permission\n *\n * @see https://www.swcombine.com/ws/v2.0/character\n */\n async get(options?: RequestOptions): Promise<any> {\n return this.request_get(\"/character\", options);\n }\n}\n",
|
|
14
|
+
"/**\n * Faction resource\n */\n\nimport { BaseResource } from \"../base-resource.ts\";\nimport type { RequestOptions } from \"../types.ts\";\n\n/**\n * Credit transfer parameters for POST /faction/credits\n */\nexport interface FactionCreditTransfer {\n /** The character or faction name receiving credits */\n recipient: string;\n /** The credit quantity to transfer */\n amount: number;\n /** The UID identifying which budget to draw from (optional) */\n budget?: string;\n /** The reason for the transfer (optional) */\n reason?: string;\n}\n\n/**\n * Faction resource for accessing faction data\n */\nexport class FactionResource extends BaseResource {\n /**\n * Nested resource for faction budgets\n */\n public readonly budgets: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for a specific faction budget\n */\n public readonly budget: {\n get: (id: string, options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for faction credit log\n */\n public readonly creditlog: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for faction members\n */\n public readonly members: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for faction stockholders\n */\n public readonly stockholders: {\n get: (options?: RequestOptions) => Promise<any>;\n };\n\n /**\n * Nested resource for faction credits\n */\n public readonly credits: {\n get: (options?: RequestOptions) => Promise<any>;\n post: (\n data: FactionCreditTransfer,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n\n constructor(client: any) {\n super(client);\n\n // Store reference to parent's methods to avoid ambiguity\n const parentGet = (endpoint: string, options?: RequestOptions) =>\n this.request_get(endpoint, options);\n const parentPost = (endpoint: string, body?: any, options?: RequestOptions) =>\n this.request_post(endpoint, body, options);\n\n // Initialize nested resources with proper this binding\n this.budgets = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/faction/budgets\", options);\n },\n };\n\n this.budget = {\n get: (id: string, options?: RequestOptions): Promise<any> => {\n return parentGet(`/faction/budget/${id}`, options);\n },\n };\n\n this.creditlog = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/faction/creditlog\", options);\n },\n };\n\n this.members = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/faction/members\", options);\n },\n };\n\n this.stockholders = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/faction/stockholders\", options);\n },\n };\n\n this.credits = {\n get: (options?: RequestOptions): Promise<any> => {\n return parentGet(\"/faction/credits\", options);\n },\n post: (\n data: FactionCreditTransfer,\n options?: RequestOptions,\n ): Promise<any> => {\n return parentPost(\"/faction/credits\", data, options);\n },\n };\n }\n\n /**\n * Get faction information\n * Requires: faction_read permission\n *\n * @param id - Optional faction ID. If not provided, returns your faction\n * @see https://www.swcombine.com/ws/v2.0/faction\n */\n async get(id?: string, options?: RequestOptions): Promise<any> {\n const endpoint = id ? `/faction/${id}` : \"/faction\";\n return this.request_get(endpoint, options);\n }\n}\n",
|
|
15
|
+
"/**\n * Inventory resource\n */\n\nimport { BaseResource } from \"../base-resource.ts\";\nimport type {\n RequestOptions,\n EntityType,\n AssignmentType,\n InventoryFilters,\n} from \"../types.ts\";\n\n/**\n * Options for inventory entity list queries\n */\nexport interface InventoryListOptions extends RequestOptions {\n /** Filters to apply to the inventory query */\n filters?: InventoryFilters;\n}\n\n/**\n * Inventory resource for accessing inventory data\n */\nexport class InventoryResource extends BaseResource {\n // Entity type resources\n public readonly ships: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly vehicles: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly stations: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly cities: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly facilities: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly planets: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly items: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly npcs: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly droids: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly creatures: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n public readonly materials: {\n get: (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ) => Promise<any>;\n };\n\n // Entity-specific resource\n public readonly entity: {\n ships: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n vehicles: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n stations: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n cities: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n facilities: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n planets: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n items: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n npcs: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n droids: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n creatures: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n materials: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n properties: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n tags: {\n get: (entityUid: string, options?: RequestOptions) => Promise<any>;\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ) => Promise<any>;\n };\n };\n };\n\n constructor(client: any) {\n super(client);\n\n // Store reference to parent's methods to avoid ambiguity\n const parentGet = (endpoint: string, options?: RequestOptions) =>\n this.request_get(endpoint, options);\n const parentPost = (endpoint: string, body?: any, options?: RequestOptions) =>\n this.request_post(endpoint, body, options);\n const parentDelete = (endpoint: string, body?: any, options?: RequestOptions) =>\n this.request_delete(endpoint, body, options);\n\n // Helper function to create entity type get method\n const createEntityTypeGet = (entityType: EntityType) => {\n return (\n uid: string,\n assignType?: AssignmentType,\n options?: InventoryListOptions,\n ): Promise<any> => {\n let endpoint = `/inventory/${uid}/${entityType}`;\n if (assignType) {\n endpoint += `/${assignType}`;\n }\n\n // Build filter query parameters if provided\n const filterQuery = options?.filters\n ? this.buildFilterQuery(options.filters)\n : {};\n\n // Merge filter query with existing query params\n const mergedOptions = {\n ...options,\n query: {\n ...options?.query,\n ...filterQuery,\n },\n };\n\n return parentGet(endpoint, mergedOptions);\n };\n };\n\n // Helper function to create entity-specific methods\n const createEntityMethods = (entityType: EntityType) => {\n return {\n get: (entityUid: string, options?: RequestOptions): Promise<any> => {\n return parentGet(`/inventory/entity/${entityType}/${entityUid}`, options);\n },\n properties: {\n get: (entityUid: string, options?: RequestOptions): Promise<any> => {\n return parentGet(\n `/inventory/entity/${entityType}/${entityUid}/properties`,\n options,\n );\n },\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ): Promise<any> => {\n return parentPost(\n `/inventory/entity/${entityType}/${entityUid}/properties`,\n data,\n options,\n );\n },\n },\n tags: {\n get: (entityUid: string, options?: RequestOptions): Promise<any> => {\n return parentGet(\n `/inventory/entity/${entityType}/${entityUid}/tags`,\n options,\n );\n },\n post: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ): Promise<any> => {\n return parentPost(\n `/inventory/entity/${entityType}/${entityUid}/tags`,\n data,\n options,\n );\n },\n delete: (\n entityUid: string,\n data: any,\n options?: RequestOptions,\n ): Promise<any> => {\n return parentDelete(\n `/inventory/entity/${entityType}/${entityUid}/tags`,\n data,\n options,\n );\n },\n },\n };\n };\n\n // Initialize entity type resources\n this.ships = { get: createEntityTypeGet(\"ships\") };\n this.vehicles = { get: createEntityTypeGet(\"vehicles\") };\n this.stations = { get: createEntityTypeGet(\"stations\") };\n this.cities = { get: createEntityTypeGet(\"cities\") };\n this.facilities = { get: createEntityTypeGet(\"facilities\") };\n this.planets = { get: createEntityTypeGet(\"planets\") };\n this.items = { get: createEntityTypeGet(\"items\") };\n this.npcs = { get: createEntityTypeGet(\"npcs\") };\n this.droids = { get: createEntityTypeGet(\"droids\") };\n this.creatures = { get: createEntityTypeGet(\"creatures\") };\n this.materials = { get: createEntityTypeGet(\"materials\") };\n\n // Initialize entity-specific resources\n this.entity = {\n ships: createEntityMethods(\"ships\"),\n vehicles: createEntityMethods(\"vehicles\"),\n stations: createEntityMethods(\"stations\"),\n cities: createEntityMethods(\"cities\"),\n facilities: createEntityMethods(\"facilities\"),\n planets: createEntityMethods(\"planets\"),\n items: createEntityMethods(\"items\"),\n npcs: createEntityMethods(\"npcs\"),\n droids: createEntityMethods(\"droids\"),\n creatures: createEntityMethods(\"creatures\"),\n materials: createEntityMethods(\"materials\"),\n };\n }\n\n /**\n * Get inventory overview for a character or faction\n * Requires: appropriate inventory permissions\n *\n * @param uid - Character or faction UID\n * @param options - Request options\n * @see https://www.swcombine.com/ws/v2.0/inventory/:uid\n */\n async get(uid: string, options?: RequestOptions): Promise<any> {\n return this.request_get(`/inventory/${uid}`, options);\n }\n\n /**\n * Build filter query parameters from InventoryFilters\n *\n * NOTE: Currently, the SDK only supports filtering based on tags.\n * Other filter types may be added in future API versions.\n *\n * @param filters - Filter configuration\n * @returns Query parameter object\n */\n private buildFilterQuery(\n filters: InventoryFilters,\n ): Record<string, string | string[]> {\n const query: Record<string, string | string[]> = {};\n\n // Add filter types\n if (filters.filter_type && filters.filter_type.length > 0) {\n filters.filter_type.forEach((type) => {\n const key = \"filter_type[]\";\n if (Array.isArray(query[key])) {\n (query[key] as string[]).push(type);\n } else {\n query[key] = [type];\n }\n });\n }\n\n // Add filter values\n if (filters.filter_value) {\n Object.entries(filters.filter_value).forEach(([filterType, values]) => {\n const valueArray = Array.isArray(values) ? values : [values];\n valueArray.forEach((value) => {\n const key = `filter_value[${filterType}][]`;\n if (Array.isArray(query[key])) {\n (query[key] as string[]).push(value);\n } else {\n query[key] = [value];\n }\n });\n });\n }\n\n // Add filter inclusions\n if (filters.filter_inclusion) {\n Object.entries(filters.filter_inclusion).forEach(\n ([filterType, inclusion]) => {\n query[`filter_inclusion[${filterType}]`] = inclusion;\n },\n );\n }\n\n return query;\n }\n}\n",
|
|
16
|
+
"/**\n * Main SWC API Client\n */\n\nimport type { OAuthManager } from \"../auth/oauth-manager.ts\";\nimport { HttpClient } from \"./http-client.ts\";\nimport type { RequestConfig, SWCResponse } from \"./types.ts\";\nimport {\n ApiResource,\n CharacterResource,\n FactionResource,\n InventoryResource,\n} from \"./resources/index.ts\";\n\n/**\n * Configuration options for SWCClient\n */\nexport interface SWCClientConfig {\n /** Authentication: either an OAuthManager instance or a direct access token string */\n auth: OAuthManager | string;\n /** Base URL for the API (defaults to SWC API v2.0) */\n baseUrl?: string;\n}\n\n/**\n * Legacy configuration options (backward compatibility)\n * @deprecated Use SWCClientConfig with auth instead\n */\ninterface LegacySWCClientConfig {\n /** OAuth manager instance for authentication */\n oauth: OAuthManager;\n /** Base URL for the API (defaults to SWC API v2.0) */\n baseUrl?: string;\n}\n\n/**\n * Default SWC API base URL\n */\nconst DEFAULT_BASE_URL = \"https://www.swcombine.com/ws/v2.0\";\n\n/**\n * Main client for interacting with the Star Wars Combine API\n *\n * @example With OAuthManager\n * ```typescript\n * import { OAuthManager, SWCClient } from \"swcombine.js\";\n *\n * const oauth = new OAuthManager(\n * {\n * clientId: \"your-client-id\",\n * clientSecret: \"your-client-secret\",\n * redirectUri: \"https://example.com/callback\",\n * },\n * storage\n * );\n *\n * const client = new SWCClient({ auth: oauth });\n *\n * // Access resources\n * const character = await client.character.get();\n * const skills = await client.character.skills.get();\n * const faction = await client.faction.get();\n * ```\n *\n * @example With direct access token\n * ```typescript\n * import { SWCClient } from \"swcombine.js\";\n *\n * const client = new SWCClient({ auth: \"your-access-token\" });\n *\n * // Access resources (token won't auto-refresh)\n * const character = await client.character.get();\n * ```\n */\nexport class SWCClient {\n private readonly httpClient: HttpClient;\n\n /** API utility endpoints */\n public readonly api: ApiResource;\n\n /** Character resource */\n public readonly character: CharacterResource;\n\n /** Faction resource */\n public readonly faction: FactionResource;\n\n /** Inventory resource */\n public readonly inventory: InventoryResource;\n\n /**\n * Create a new SWC API client\n *\n * @param oauth - OAuth manager instance for authentication (deprecated, use config object)\n * @param baseUrl - Optional base URL (defaults to https://www.swcombine.com/ws/v2.0)\n * @deprecated Use config object instead: `new SWCClient({ auth: oauth })`\n */\n constructor(oauth: OAuthManager, baseUrl?: string);\n\n /**\n * Create a new SWC API client\n *\n * @param config - Client configuration\n */\n constructor(config: SWCClientConfig);\n\n constructor(\n oauthOrConfig: OAuthManager | SWCClientConfig | LegacySWCClientConfig,\n baseUrl?: string,\n ) {\n // Handle both constructor signatures\n let auth: OAuthManager | string;\n let url: string;\n\n if (\"auth\" in oauthOrConfig) {\n // New config object with auth\n auth = oauthOrConfig.auth;\n url = oauthOrConfig.baseUrl ?? DEFAULT_BASE_URL;\n } else if (\"oauth\" in oauthOrConfig) {\n // Old config object with oauth (backward compatibility)\n auth = (oauthOrConfig as LegacySWCClientConfig).oauth;\n url = oauthOrConfig.baseUrl ?? DEFAULT_BASE_URL;\n } else {\n // Direct OAuth manager (backward compatibility)\n auth = oauthOrConfig as OAuthManager;\n url = baseUrl ?? DEFAULT_BASE_URL;\n }\n\n // Initialize HTTP client\n this.httpClient = new HttpClient(auth, url);\n\n // Initialize resources\n this.api = new ApiResource(this);\n this.character = new CharacterResource(this);\n this.faction = new FactionResource(this);\n this.inventory = new InventoryResource(this);\n }\n\n /**\n * Internal method used by resources to make requests\n * @internal\n */\n async request(config: RequestConfig): Promise<any> {\n const response = await this.httpClient.request(config);\n return response.data;\n }\n\n /**\n * Internal method used by resources to make requests with full response\n * @internal\n */\n async requestWithResponse(config: RequestConfig): Promise<SWCResponse> {\n return this.httpClient.request(config);\n }\n}\n",
|
|
17
|
+
"/**\n * Timestamp utility for working with Star Wars Combine Combine Galactic Time (CGT)\n */\n\nimport type {\n TimestampMoment,\n Duration,\n TimestampFormat,\n TimestampUnit,\n} from \"./types.ts\";\n\n/**\n * Utility class for working with Star Wars Combine timestamps.\n * Represents Combine Galactic Time and can convert unix timestamps\n * and Date objects to/from CGT.\n *\n * @example\n * ```typescript\n * // Get current CGT\n * const now = Timestamp.now();\n *\n * // Create from Unix timestamp\n * const ts = Timestamp.fromUnixTimestamp(1735920000);\n *\n * // Create from Date\n * const ts2 = Timestamp.fromDate(new Date());\n *\n * // Create specific moment\n * const ts3 = new Timestamp({ year: 25, day: 60, hour: 12 });\n *\n * // Format as string\n * console.log(now.toString(\"full\")); // \"Year 27 Day 134, 8:45:23\"\n * ```\n */\nexport class Timestamp {\n /**\n * SWC start date (December 3, 1998 at 07:00:00 UTC)\n */\n private static readonly swcStart = new Date(Date.UTC(1998, 11, 3, 7, 0, 0));\n\n protected year: number;\n protected day: number;\n protected hour: number;\n protected minute: number;\n protected second: number;\n\n /**\n * Create a new Timestamp object for a specific moment in Combine Galactic Time\n *\n * @param source - Moment in CGT (year, day, and optionally hour, minute, second)\n */\n constructor(source: TimestampMoment) {\n const { year, day, hour = 0, minute = 0, second = 0 } = source;\n\n this.year = year;\n this.day = day;\n this.hour = hour;\n this.minute = minute;\n this.second = second;\n }\n\n /**\n * Convert a unix timestamp to Combine Galactic Time\n *\n * @param unixTimestamp - Unix timestamp (seconds or milliseconds, auto-detected)\n * @returns Timestamp instance representing the CGT moment\n */\n static fromUnixTimestamp(unixTimestamp: number): Timestamp {\n let timestamp = unixTimestamp;\n // Auto-detect seconds vs milliseconds\n if (timestamp < 100000000000) {\n timestamp = timestamp * 1000;\n }\n return this.calculateTimestampFromMillisecondsSinceStart(\n timestamp - this.swcStart.getTime(),\n );\n }\n\n /**\n * Convert a Date object into Combine Galactic Time\n *\n * @param date - JavaScript Date object\n * @returns Timestamp instance representing the CGT moment\n */\n static fromDate(date: Date): Timestamp {\n return this.calculateTimestampFromMillisecondsSinceStart(\n date.getTime() - this.swcStart.getTime(),\n );\n }\n\n /**\n * Get the current Combine Galactic Time\n *\n * @returns Timestamp instance representing the current CGT moment\n */\n static now(): Timestamp {\n return Timestamp.fromDate(new Date());\n }\n\n /**\n * Calculate CGT from milliseconds since SWC start\n *\n * @param msSinceSwcStart - Milliseconds since SWC start date\n * @returns Timestamp instance\n */\n private static calculateTimestampFromMillisecondsSinceStart(\n msSinceSwcStart: number,\n ): Timestamp {\n const msPerYear = 365 * 24 * 60 * 60 * 1000;\n const msPerDay = 24 * 60 * 60 * 1000;\n const msPerHour = 60 * 60 * 1000;\n const msPerMinute = 60 * 1000;\n\n let remaining = msSinceSwcStart;\n\n const year = Math.floor(remaining / msPerYear);\n remaining -= year * msPerYear;\n\n const day = Math.floor(remaining / msPerDay);\n remaining -= day * msPerDay;\n\n const hour = Math.floor(remaining / msPerHour);\n remaining -= hour * msPerHour;\n\n const minute = Math.floor(remaining / msPerMinute);\n remaining -= minute * msPerMinute;\n\n const seconds = Math.floor(remaining / 1000);\n\n return new Timestamp({\n year,\n day: day + 1, // Days are 1-indexed\n hour,\n minute,\n second: seconds,\n });\n }\n\n /**\n * Convert the CGT timestamp into a unix timestamp\n *\n * @param unit - Output unit (seconds or milliseconds)\n * @returns Unix timestamp\n */\n toUnixTimestamp(unit: TimestampUnit): number {\n const raw =\n this.calculateMillisecondsSinceStartFromTimestamp() +\n Timestamp.swcStart.getTime();\n\n if (unit === \"sec\" || unit === \"seconds\") {\n return raw / 1000;\n } else {\n return raw;\n }\n }\n\n /**\n * Convert the CGT timestamp into a Date object\n *\n * @returns JavaScript Date object\n */\n toDate(): Date {\n return new Date(\n this.calculateMillisecondsSinceStartFromTimestamp() +\n Timestamp.swcStart.getTime(),\n );\n }\n\n /**\n * Get the timestamp as a TimestampMoment object\n *\n * @returns TimestampMoment representation\n */\n asMoment(): TimestampMoment {\n return {\n year: this.year,\n day: this.day,\n hour: this.hour,\n minute: this.minute,\n second: this.second,\n };\n }\n\n /**\n * Get the year component\n *\n * @returns Year in CGT\n */\n getYear(): number {\n return this.year;\n }\n\n /**\n * Get the day component\n *\n * @returns Day of the year (1-365)\n */\n getDay(): number {\n return this.day;\n }\n\n /**\n * Get the hour component\n *\n * @returns Hour of the day (0-23)\n */\n getHour(): number {\n return this.hour;\n }\n\n /**\n * Get the minute component\n *\n * @returns Minute of the hour (0-59)\n */\n getMinute(): number {\n return this.minute;\n }\n\n /**\n * Get the second component\n *\n * @returns Second of the minute (0-59)\n */\n getSecond(): number {\n return this.second;\n }\n\n /**\n * Calculate a new timestamp by adding time to this timestamp\n *\n * @param duration - Duration to add (partial duration allowed)\n * @returns New Timestamp with added duration\n */\n add(duration: Partial<Duration>): Timestamp {\n const unixTime = this.toUnixTimestamp(\"sec\");\n return Timestamp.fromUnixTimestamp(\n unixTime + durationToSeconds(duration),\n );\n }\n\n /**\n * Calculate a new timestamp by subtracting time from this timestamp\n *\n * @param duration - Duration to subtract (partial duration allowed)\n * @returns New Timestamp with subtracted duration (won't go before SWC start)\n */\n subtract(duration: Partial<Duration>): Timestamp {\n const unixTime = this.toUnixTimestamp(\"sec\");\n return Timestamp.fromUnixTimestamp(\n Math.max(\n unixTime - durationToSeconds(duration),\n Timestamp.swcStart.getTime() / 1000,\n ),\n );\n }\n\n /**\n * Calculate the duration from this timestamp to another timestamp\n *\n * @param otherTimestamp - Target timestamp\n * @returns Duration between timestamps (positive if other is in future)\n */\n getDurationTo(otherTimestamp: Timestamp): Duration {\n const startTime = this.toUnixTimestamp(\"sec\");\n const endTime = otherTimestamp.toUnixTimestamp(\"sec\");\n\n return secondsToDuration(endTime - startTime);\n }\n\n /**\n * Convert the CGT timestamp to a string\n *\n * You can either pass in a preset name, or a custom format string.\n *\n * **Preset formats:**\n * - `'full'`: Year 25 Day 60, 6:03:12\n * - `'minute'`: Year 25 Day 60, 6:03\n * - `'day'`: Year 25 Day 60\n * - `'shortFull'`: Y25 D60, 6:03:12\n * - `'shortMinute'`: Y25 D60, 6:03\n * - `'shortDay'`: Y26 D60\n *\n * **Custom format tags:**\n * - `{y}`: year\n * - `{d}`: day\n * - `{h}`: hour\n * - `{m}`: minute\n * - `{s}`: second\n * - Double the tag for leading zeroes (e.g., `{hh}` = 08)\n * - `{hms}`: shorthand for `{hh}:{mm}:{ss}`\n *\n * @param format - Preset format name or custom format string\n * @returns Formatted timestamp string\n *\n * @example\n * ```typescript\n * const ts = new Timestamp({ year: 25, day: 6, hour: 8, minute: 12, second: 14 });\n * ts.toString(\"full\"); // \"Year 25 Day 6, 8:12:14\"\n * ts.toString(\"{hms} on Day {d} of Year {y}\"); // \"08:12:14 on Day 6 of Year 25\"\n * ```\n */\n toString(format: TimestampFormat | string = \"full\"): string {\n // Handle preset formats\n switch (format) {\n case \"full\":\n return `Year ${this.year} Day ${this.day}, ${this.hour}:${this.minute\n .toString()\n .padStart(2, \"0\")}:${this.second.toString().padStart(2, \"0\")}`;\n case \"minute\":\n return `Year ${this.year} Day ${this.day}, ${this.hour}:${this.minute\n .toString()\n .padStart(2, \"0\")}`;\n case \"day\":\n return `Year ${this.year} Day ${this.day}`;\n case \"shortFull\":\n return `Y${this.year} D${this.day}, ${this.hour}:${this.minute\n .toString()\n .padStart(2, \"0\")}:${this.second.toString().padStart(2, \"0\")}`;\n case \"shortMinute\":\n return `Y${this.year} D${this.day}, ${this.hour}:${this.minute\n .toString()\n .padStart(2, \"0\")}`;\n case \"shortDay\":\n return `Y${this.year} D${this.day}`;\n }\n\n // Handle custom format strings\n let formattedString = \"\";\n let currentTag = \"\";\n let isInTag = false;\n\n format.split(\"\").forEach((char) => {\n if (char === \"{\" && !isInTag) {\n isInTag = true;\n return;\n }\n if (char === \"}\" && isInTag) {\n formattedString += this.substituteTag(currentTag);\n isInTag = false;\n currentTag = \"\";\n return;\n }\n\n if (isInTag) {\n currentTag += char;\n } else {\n formattedString += char;\n }\n });\n\n return formattedString;\n }\n\n /**\n * Substitute a format tag with its value\n *\n * @param tag - Format tag (e.g., \"y\", \"yy\", \"hms\")\n * @returns Substituted value\n */\n private substituteTag(tag: string): string {\n if (tag.localeCompare(\"y\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.year.toString();\n }\n if (tag.localeCompare(\"yy\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.year.toString().padStart(2, \"0\");\n }\n if (tag.localeCompare(\"d\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.day.toString();\n }\n if (tag.localeCompare(\"dd\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.day.toString().padStart(2, \"0\");\n }\n if (tag.localeCompare(\"h\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.hour.toString();\n }\n if (tag.localeCompare(\"hh\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.hour.toString().padStart(2, \"0\");\n }\n if (tag.localeCompare(\"m\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.minute.toString();\n }\n if (tag.localeCompare(\"mm\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.minute.toString().padStart(2, \"0\");\n }\n if (tag.localeCompare(\"s\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.second.toString();\n }\n if (tag.localeCompare(\"ss\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return this.second.toString().padStart(2, \"0\");\n }\n if (tag.localeCompare(\"hms\", \"en\", { sensitivity: \"accent\" }) === 0) {\n return `${this.hour.toString().padStart(2, \"0\")}:${this.minute\n .toString()\n .padStart(2, \"0\")}:${this.second.toString().padStart(2, \"0\")}`;\n }\n return \"\";\n }\n\n /**\n * Calculate milliseconds since SWC start from this timestamp\n *\n * @returns Milliseconds since SWC start date\n */\n private calculateMillisecondsSinceStartFromTimestamp(): number {\n const msPerYear = 365 * 24 * 60 * 60 * 1000;\n const msPerDay = 24 * 60 * 60 * 1000;\n const msPerHour = 60 * 60 * 1000;\n const msPerMinute = 60 * 1000;\n\n let msSinceSwcStart = 0;\n\n msSinceSwcStart += this.year * msPerYear;\n msSinceSwcStart += (this.day - 1) * msPerDay; // Days are 1-indexed\n msSinceSwcStart += this.hour * msPerHour;\n msSinceSwcStart += this.minute * msPerMinute;\n msSinceSwcStart += this.second * 1000;\n\n return msSinceSwcStart;\n }\n}\n\n/**\n * Convert a duration to total seconds\n *\n * @param duration - Duration object (partial allowed)\n * @returns Total seconds\n */\nfunction durationToSeconds(duration: Partial<Duration>): number {\n return (\n (duration.years || 0) * 365 * 24 * 60 * 60 +\n (duration.days || 0) * 24 * 60 * 60 +\n (duration.hours || 0) * 60 * 60 +\n (duration.minutes || 0) * 60 +\n (duration.seconds || 0)\n );\n}\n\n/**\n * Convert seconds to a duration object\n *\n * @param seconds - Total seconds\n * @returns Duration breakdown\n */\nfunction secondsToDuration(seconds: number): Duration {\n const secPerYear = 365 * 24 * 60 * 60;\n const secPerDay = 24 * 60 * 60;\n const secPerHour = 60 * 60;\n const secPerMinute = 60;\n let remaining = seconds;\n\n const years = Math.floor(remaining / secPerYear);\n remaining -= years * secPerYear;\n\n const days = Math.floor(remaining / secPerDay);\n remaining -= days * secPerDay;\n\n const hours = Math.floor(remaining / secPerHour);\n remaining -= hours * secPerHour;\n\n const minutes = Math.floor(remaining / secPerMinute);\n remaining -= minutes * secPerMinute;\n\n return { years, days, hours, minutes, seconds: remaining };\n}\n",
|
|
18
|
+
"/**\n * SWC Combine API SDK\n *\n * TypeScript SDK for interacting with the Star Wars Combine API\n * @see https://www.swcombine.com/ws\n */\n\n// Export OAuth functionality\nexport * from \"./auth/index.ts\";\n\n// Export HTTP Client functionality\nexport * from \"./client/index.ts\";\n\n// Export utilities\nexport * from \"./utils/index.ts\";\n\n// SDK version\nexport const VERSION = \"0.1.0\";\n"
|
|
19
|
+
],
|
|
20
|
+
"mappings": "AA0OO,IAAM,EAAkC,CAC7C,eAAgB,CACd,KAAM,iBACN,YACE,yGACF,SAAU,CAAC,CACb,EACA,eAAgB,CACd,KAAM,iBACN,YACE,gOACF,SAAU,CAAC,CACb,EACA,gBAAiB,CACf,KAAM,kBACN,YAAa,mDACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,qBAAsB,CACpB,KAAM,uBACN,YAAa,4BACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,iBAAkB,CAChB,KAAM,mBACN,YAAa,wBACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,kBAAmB,CACjB,KAAM,oBACN,YAAa,oCACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,6BACb,SAAU,CAAC,oBAAqB,gBAAgB,CAClD,EACA,gBAAiB,CACf,KAAM,kBACN,YACE,0KACF,SAAU,CAAC,gBAAgB,CAC7B,EACA,mBAAoB,CAClB,KAAM,qBACN,YAAa,6BACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,iBAAkB,CAChB,KAAM,mBACN,YAAa,8BACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,cAAe,CACb,KAAM,gBACN,YAAa,mCACb,SAAU,CACR,0BACA,mBACA,qBACA,kBACA,mBACA,uBACA,kBACA,oBACA,gBACF,CACF,EACA,cAAe,CACb,KAAM,gBACN,YAAa,4CACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,cAAe,CACb,KAAM,gBACN,YAAa,yCACb,SAAU,CAAC,gBAAiB,gBAAgB,CAC9C,EACA,gBAAiB,CACf,KAAM,kBACN,YAAa,2CACb,SAAU,CAAC,gBAAiB,gBAAgB,CAC9C,EACA,aAAc,CACZ,KAAM,eACN,YAAa,0DACb,SAAU,CAAC,gBAAiB,kBAAmB,gBAAiB,gBAAgB,CAClF,EACA,sBAAuB,CACrB,KAAM,wBACN,YAAa,gDACb,SAAU,CAAC,CACb,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,0CACb,SAAU,CAAC,+BAAgC,wBAAyB,gBAAgB,CACtF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,oBACb,SAAU,CACR,0BACA,+BACA,wBACA,gBACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,oBACb,SAAU,CACR,0BACA,+BACA,wBACA,gBACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,uBACb,SAAU,CACR,0BACA,+BACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,uCACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,yCACb,SAAU,CACR,4BACA,0BACA,+BACA,wBACA,gBACF,CACF,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,oDACb,SAAU,CACR,gCACA,8BACA,4BACA,4BACA,0BACA,+BACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,6CACb,SAAU,CAAC,kCAAmC,wBAAyB,gBAAgB,CACzF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,uBACb,SAAU,CACR,6BACA,kCACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,uBACb,SAAU,CACR,6BACA,kCACA,wBACA,gBACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,0BACb,SAAU,CACR,6BACA,kCACA,wBACA,gBACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,0CACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,4CACb,SAAU,CACR,+BACA,6BACA,kCACA,wBACA,gBACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,uDACb,SAAU,CACR,mCACA,iCACA,+BACA,+BACA,6BACA,kCACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,mDACb,SAAU,CAAC,kCAAmC,wBAAyB,gBAAgB,CACzF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,6BACb,SAAU,CACR,6BACA,kCACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,6BACb,SAAU,CACR,6BACA,kCACA,wBACA,gBACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,gCACb,SAAU,CACR,6BACA,kCACA,wBACA,gBACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,gDACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,kDACb,SAAU,CACR,+BACA,6BACA,kCACA,wBACA,gBACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,6DACb,SAAU,CACR,mCACA,iCACA,+BACA,+BACA,6BACA,kCACA,wBACA,gBACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,2CACb,SAAU,CAAC,gCAAiC,wBAAyB,gBAAgB,CACvF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,qBACb,SAAU,CACR,2BACA,gCACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,qBACb,SAAU,CACR,2BACA,gCACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,wBACb,SAAU,CACR,2BACA,gCACA,wBACA,gBACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,wCACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,0CACb,SAAU,CACR,6BACA,2BACA,gCACA,wBACA,gBACF,CACF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,oDACb,SAAU,CACR,iCACA,+BACA,6BACA,6BACA,2BACA,gCACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,+CACb,SAAU,CAAC,oCAAqC,wBAAyB,gBAAgB,CAC3F,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,yBACb,SAAU,CACR,+BACA,oCACA,wBACA,gBACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,yBACb,SAAU,CACR,+BACA,oCACA,wBACA,gBACF,CACF,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,4BACb,SAAU,CACR,+BACA,oCACA,wBACA,gBACF,CACF,EACA,kCAAmC,CACjC,KAAM,oCACN,YAAa,4CACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,mCAAoC,CAClC,KAAM,qCACN,YAAa,8CACb,SAAU,CACR,iCACA,+BACA,oCACA,wBACA,gBACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,wDACb,SAAU,CACR,qCACA,mCACA,iCACA,iCACA,+BACA,oCACA,wBACA,gBACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,4CACb,SAAU,CAAC,iCAAkC,wBAAyB,gBAAgB,CACxF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,sBACb,SAAU,CACR,4BACA,iCACA,wBACA,gBACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,yCACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,2CACb,SAAU,CACR,8BACA,4BACA,iCACA,wBACA,gBACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,sDACb,SAAU,CACR,kCACA,8BACA,4BACA,iCACA,wBACA,gBACF,CACF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,0CACb,SAAU,CAAC,+BAAgC,wBAAyB,gBAAgB,CACtF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,oBACb,SAAU,CACR,0BACA,+BACA,wBACA,gBACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,oBACb,SAAU,CACR,0BACA,+BACA,wBACA,gBACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,uBACb,SAAU,CACR,0BACA,+BACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,uCACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,yCACb,SAAU,CACR,4BACA,0BACA,+BACA,wBACA,gBACF,CACF,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,oDACb,SAAU,CACR,gCACA,8BACA,4BACA,4BACA,0BACA,+BACA,wBACA,gBACF,CACF,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,yCACb,SAAU,CAAC,8BAA+B,wBAAyB,gBAAgB,CACrF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,mBACb,SAAU,CACR,yBACA,8BACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,sBACb,SAAU,CACR,yBACA,8BACA,wBACA,gBACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,sCACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,wCACb,SAAU,CACR,2BACA,yBACA,8BACA,wBACA,gBACF,CACF,EACA,sBAAuB,CACrB,KAAM,wBACN,YAAa,mDACb,SAAU,CACR,+BACA,6BACA,2BACA,yBACA,8BACA,wBACA,gBACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,2CACb,SAAU,CAAC,gCAAiC,wBAAyB,gBAAgB,CACvF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,qBACb,SAAU,CACR,2BACA,gCACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,qBACb,SAAU,CACR,2BACA,gCACA,wBACA,gBACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,wBACb,SAAU,CACR,2BACA,gCACA,wBACA,gBACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,wCACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,0CACb,SAAU,CACR,6BACA,2BACA,gCACA,wBACA,gBACF,CACF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,qDACb,SAAU,CACR,iCACA,+BACA,6BACA,6BACA,2BACA,gCACA,wBACA,gBACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,8CACb,SAAU,CAAC,mCAAoC,wBAAyB,gBAAgB,CAC1F,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,wBACb,SAAU,CACR,8BACA,mCACA,wBACA,gBACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,2BACb,SAAU,CACR,8BACA,mCACA,wBACA,gBACF,CACF,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,2CACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,kCAAmC,CACjC,KAAM,oCACN,YAAa,6CACb,SAAU,CACR,8BACA,mCACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,wDACb,SAAU,CACR,oCACA,kCACA,gCACA,8BACA,mCACA,wBACA,gBACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,8CACb,SAAU,CAAC,mCAAoC,wBAAyB,gBAAgB,CAC1F,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,wBACb,SAAU,CACR,8BACA,mCACA,wBACA,gBACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,wBACb,SAAU,CACR,8BACA,mCACA,wBACA,gBACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,2BACb,SAAU,CACR,8BACA,mCACA,wBACA,gBACF,CACF,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,2CACb,SAAU,CAAC,wBAAyB,gBAAgB,CACtD,EACA,kCAAmC,CACjC,KAAM,oCACN,YAAa,6CACb,SAAU,CACR,gCACA,8BACA,mCACA,wBACA,gBACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,wDACb,SAAU,CACR,oCACA,kCACA,gCACA,gCACA,8BACA,mCACA,wBACA,gBACF,CACF,EACA,qBAAsB,CACpB,KAAM,uBACN,YAAa,0DACb,SAAU,CAAC,CACb,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,oDACb,SAAU,CAAC,8BAA+B,uBAAwB,cAAc,CAClF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,8BACb,SAAU,CACR,yBACA,8BACA,uBACA,cACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,8BACb,SAAU,CACR,yBACA,8BACA,uBACA,cACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,iCACb,SAAU,CACR,yBACA,8BACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,iDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,mDACb,SAAU,CACR,2BACA,yBACA,8BACA,uBACA,cACF,CACF,EACA,sBAAuB,CACrB,KAAM,wBACN,YAAa,8DACb,SAAU,CACR,+BACA,6BACA,2BACA,2BACA,yBACA,8BACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,uDACb,SAAU,CAAC,iCAAkC,uBAAwB,cAAc,CACrF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,iCACb,SAAU,CACR,4BACA,iCACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,iCACb,SAAU,CACR,4BACA,iCACA,uBACA,cACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,oCACb,SAAU,CACR,4BACA,iCACA,uBACA,cACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,oDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,sDACb,SAAU,CACR,8BACA,4BACA,iCACA,uBACA,cACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,iEACb,SAAU,CACR,kCACA,gCACA,8BACA,8BACA,4BACA,iCACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,6DACb,SAAU,CAAC,iCAAkC,uBAAwB,cAAc,CACrF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,uCACb,SAAU,CACR,4BACA,iCACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,uCACb,SAAU,CACR,4BACA,iCACA,uBACA,cACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,0CACb,SAAU,CACR,4BACA,iCACA,uBACA,cACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,0DACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,4DACb,SAAU,CACR,8BACA,4BACA,iCACA,uBACA,cACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,uEACb,SAAU,CACR,kCACA,gCACA,8BACA,8BACA,4BACA,iCACA,uBACA,cACF,CACF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,qDACb,SAAU,CAAC,+BAAgC,uBAAwB,cAAc,CACnF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,+BACb,SAAU,CACR,0BACA,+BACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,+BACb,SAAU,CACR,0BACA,+BACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,kCACb,SAAU,CACR,0BACA,+BACA,uBACA,cACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,kDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,oDACb,SAAU,CACR,4BACA,0BACA,+BACA,uBACA,cACF,CACF,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,8DACb,SAAU,CACR,gCACA,8BACA,4BACA,4BACA,0BACA,+BACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,yDACb,SAAU,CAAC,mCAAoC,uBAAwB,cAAc,CACvF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,mCACb,SAAU,CACR,8BACA,mCACA,uBACA,cACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,mCACb,SAAU,CACR,8BACA,mCACA,uBACA,cACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,sCACb,SAAU,CACR,8BACA,mCACA,uBACA,cACF,CACF,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,sDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,kCAAmC,CACjC,KAAM,oCACN,YAAa,wDACb,SAAU,CACR,gCACA,8BACA,mCACA,uBACA,cACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,kEACb,SAAU,CACR,oCACA,kCACA,gCACA,gCACA,8BACA,mCACA,uBACA,cACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,sDACb,SAAU,CAAC,gCAAiC,uBAAwB,cAAc,CACpF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,gCACb,SAAU,CACR,2BACA,gCACA,uBACA,cACF,CACF,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,mDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,qDACb,SAAU,CACR,6BACA,2BACA,gCACA,uBACA,cACF,CACF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,gEACb,SAAU,CACR,iCACA,6BACA,2BACA,gCACA,uBACA,cACF,CACF,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,oDACb,SAAU,CAAC,8BAA+B,uBAAwB,cAAc,CAClF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,8BACb,SAAU,CACR,yBACA,8BACA,uBACA,cACF,CACF,EACA,yBAA0B,CACxB,KAAM,2BACN,YAAa,8BACb,SAAU,CACR,yBACA,8BACA,uBACA,cACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,iCACb,SAAU,CACR,yBACA,8BACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,iDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,mDACb,SAAU,CACR,2BACA,yBACA,8BACA,uBACA,cACF,CACF,EACA,sBAAuB,CACrB,KAAM,wBACN,YAAa,8DACb,SAAU,CACR,+BACA,6BACA,2BACA,2BACA,yBACA,8BACA,uBACA,cACF,CACF,EACA,sBAAuB,CACrB,KAAM,wBACN,YAAa,mDACb,SAAU,CAAC,6BAA8B,uBAAwB,cAAc,CACjF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,6BACb,SAAU,CACR,wBACA,6BACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,gCACb,SAAU,CACR,wBACA,6BACA,uBACA,cACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,gDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,kDACb,SAAU,CACR,0BACA,wBACA,6BACA,uBACA,cACF,CACF,EACA,qBAAsB,CACpB,KAAM,uBACN,YAAa,6DACb,SAAU,CACR,8BACA,4BACA,0BACA,wBACA,6BACA,uBACA,cACF,CACF,EACA,wBAAyB,CACvB,KAAM,0BACN,YAAa,qDACb,SAAU,CAAC,+BAAgC,uBAAwB,cAAc,CACnF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,+BACb,SAAU,CACR,0BACA,+BACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,+BACb,SAAU,CACR,0BACA,+BACA,uBACA,cACF,CACF,EACA,4BAA6B,CAC3B,KAAM,8BACN,YAAa,kCACb,SAAU,CACR,0BACA,+BACA,uBACA,cACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,kDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,8BAA+B,CAC7B,KAAM,gCACN,YAAa,oDACb,SAAU,CACR,4BACA,0BACA,+BACA,uBACA,cACF,CACF,EACA,uBAAwB,CACtB,KAAM,yBACN,YAAa,+DACb,SAAU,CACR,gCACA,8BACA,4BACA,4BACA,0BACA,+BACA,uBACA,cACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,wDACb,SAAU,CAAC,kCAAmC,uBAAwB,cAAc,CACtF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,kCACb,SAAU,CACR,6BACA,kCACA,uBACA,cACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,qCACb,SAAU,CACR,6BACA,kCACA,uBACA,cACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,qDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,uDACb,SAAU,CACR,6BACA,kCACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,kEACb,SAAU,CACR,mCACA,iCACA,+BACA,6BACA,kCACA,uBACA,cACF,CACF,EACA,2BAA4B,CAC1B,KAAM,6BACN,YAAa,wDACb,SAAU,CAAC,kCAAmC,uBAAwB,cAAc,CACtF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,kCACb,SAAU,CACR,6BACA,kCACA,uBACA,cACF,CACF,EACA,6BAA8B,CAC5B,KAAM,+BACN,YAAa,kCACb,SAAU,CACR,6BACA,kCACA,uBACA,cACF,CACF,EACA,+BAAgC,CAC9B,KAAM,iCACN,YAAa,qCACb,SAAU,CACR,6BACA,kCACA,uBACA,cACF,CACF,EACA,gCAAiC,CAC/B,KAAM,kCACN,YAAa,qDACb,SAAU,CAAC,uBAAwB,cAAc,CACnD,EACA,iCAAkC,CAChC,KAAM,mCACN,YAAa,uDACb,SAAU,CACR,+BACA,6BACA,kCACA,uBACA,cACF,CACF,EACA,0BAA2B,CACzB,KAAM,4BACN,YAAa,kEACb,SAAU,CACR,mCACA,iCACA,+BACA,+BACA,6BACA,kCACA,uBACA,cACF,CACF,EACA,aAAc,CACZ,KAAM,eACN,YAAa,4CACb,SAAU,CAAC,gBAAgB,CAC7B,EACA,gBAAiB,CACf,KAAM,kBACN,YAAa,kCACb,SAAU,CAAC,eAAgB,gBAAgB,CAC7C,EACA,eAAgB,CACd,KAAM,iBACN,YAAa,mCACb,SAAU,CAAC,eAAgB,gBAAgB,CAC7C,EACA,qBAAsB,CACpB,KAAM,uBACN,YAAa,yCACb,SAAU,CAAC,eAAgB,gBAAgB,CAC7C,EACA,sBAAuB,CAC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",
|
|
21
|
+
"debugId": "B05C2413B260D4A564756E2164756E21",
|
|
22
|
+
"names": []
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC"}
|