{"id":42213886,"url":"https://github.com/sffjunkie/astral-ts","last_synced_at":"2026-01-27T01:08:26.706Z","repository":{"id":57140282,"uuid":"243198806","full_name":"sffjunkie/astral-ts","owner":"sffjunkie","description":"Calculations for the position of the sun and moon","archived":false,"fork":false,"pushed_at":"2021-03-14T11:53:37.000Z","size":321,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-10-13T07:26:56.805Z","etag":null,"topics":["blue-hour","dawn","dusk","golden-hour","midnight","moon","noon","rahukalaam","sun","sunrise","sunset"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sffjunkie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-26T07:39:45.000Z","updated_at":"2025-07-31T14:54:30.000Z","dependencies_parsed_at":"2022-09-04T22:10:35.922Z","dependency_job_id":null,"html_url":"https://github.com/sffjunkie/astral-ts","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sffjunkie/astral-ts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffjunkie%2Fastral-ts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffjunkie%2Fastral-ts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffjunkie%2Fastral-ts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffjunkie%2Fastral-ts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sffjunkie","download_url":"https://codeload.github.com/sffjunkie/astral-ts/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffjunkie%2Fastral-ts/sbom","scorecard":{"id":814009,"data":{"date":"2025-08-11","repo":{"name":"github.com/sffjunkie/astral-ts","commit":"cc1de3f866b066e3dbcb8e93b80c0c93eb857ff7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'develop'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T13:48:41.974Z","repository_id":57140282,"created_at":"2025-08-23T13:48:41.974Z","updated_at":"2025-08-23T13:48:41.974Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28794722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T01:07:07.743Z","status":"ssl_error","status_checked_at":"2026-01-27T01:07:06.974Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blue-hour","dawn","dusk","golden-hour","midnight","moon","noon","rahukalaam","sun","sunrise","sunset"],"created_at":"2026-01-27T01:08:22.858Z","updated_at":"2026-01-27T01:08:26.558Z","avatar_url":"https://github.com/sffjunkie.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Calculations for the position of the sun and moon\n\n[![Build Status](https://travis-ci.org/sffjunkie/astral-ts.svg?branch=develop)](https://travis-ci.org/sffjunkie/astral-ts)\n\nAstral is a typescript package for calculating the times of various aspects of\nthe sun and phases of the moon.\n\nIt can calculate the following\n\n\u003cdl\u003e\n\u003cdt\u003eDawn\u003c/dt\u003e\n\u003cdd\u003eThe time in the morning when the sun is a specific number of degrees\nbelow the horizon.\u003c/dd\u003e\n\n\u003cdt\u003eSunrise\u003c/dt\u003e\n\u003cdd\u003eThe time in the morning when the top of the sun breaks the horizon\n(asuming a location with no obscuring features.)\u003c/dd\u003e\n\n\u003cdt\u003eNoon\u003c/dt\u003e\n\u003cdd\u003eThe time when the sun is at its highest point directly above the\nobserver.\u003c/dd\u003e\n\n\u003cdt\u003eMidnight\u003c/dt\u003e\n\u003cdd\u003eThe time when the sun is at its lowest point.\u003c/dd\u003e\n\n\u003cdt\u003eSunset\u003c/dt\u003e\n\u003cdd\u003eThe time in the evening when the sun is about to disappear below the\nhorizon (asuming a location with no obscuring features.)\u003c/dd\u003e\n\n\u003cdt\u003eDusk\u003c/dt\u003e\n\u003cdd\u003eThe time in the evening when the sun is a specific number of degrees\nbelow the horizon.\u003c/dd\u003e\n\n\u003cdt\u003eDaylight\u003c/dt\u003e\n\u003cdd\u003eThe time when the sun is up i.e. between sunrise and sunset\u003c/dd\u003e\n\n\u003cdt\u003eNight\u003c/dt\u003e\n\u003cdd\u003eThe time between astronomical dusk of one day and astronomical dawn of\nthe next\u003c/dd\u003e\n\n\u003cdt\u003eTwilight\u003c/dt\u003e\n\u003cdd\u003eThe time between dawn and sunrise or between sunset and dusk\u003c/dd\u003e\n\n\u003cdt\u003eThe Golden Hour\u003c/dt\u003e\n\u003cdd\u003eThe time when the sun is between 4 degrees below the horizon\nand 6 degrees above.\u003c/dd\u003e\n\n\u003cdt\u003eThe Blue Hour\u003c/dt\u003e\n\u003cdd\u003eThe time when the sun is between 6 and 4 degrees below the\nhorizon.\u003c/dd\u003e\n\n\u003cdt\u003eTime At Elevation\u003c/dt\u003e\n\u003cdd\u003eThe time when the sun is at a specific elevation for either a\nrising or a setting sun.\u003c/dd\u003e\n\n\u003cdt\u003eSolar Azimuth\u003c/dt\u003e\n\u003cdd\u003eThe number of degrees clockwise from North at which the sun can be\nseen\u003c/dd\u003e\n\n\u003cdt\u003eSolar Zenith\u003c/dt\u003e\n\u003cdd\u003eThe angle of the sun down from directly above the observer\u003c/dd\u003e\n\n\u003cdt\u003eSolar Elevation\u003c/dt\u003e\n\u003cdd\u003eThe number of degrees up from the horizon at which the sun can\nbe seen\u003c/dd\u003e\n\n\u003cdt\u003eRahukaalam\u003c/dt\u003e\n\u003cdd\u003eRahukaalam or the period of Rahu is a certain amount of time\nevery day that is considered inauspicious for any new venture according to\nIndian Vedic astrology\".\u003c/dd\u003e\n\n\u003cdt\u003eMoon Phase\u003c/dt\u003e\n\u003cdd\u003eThe phase of the moon for a specified date.\u003c/dd\u003e\n\u003c/dl\u003e\n\nAstral also comes with a geocoder containing a local database that allows you to\nlook up information for a small set of locations,\n[new locations can be added](#additional_locations).\n\n## Examples\n\nThe following examples demonstrates some of the functionality available in the\nmodule\n\n### Sun\n\n```typescript\n\u003e import { DateTime } from \"luxon\";\n\u003e import { LocationInfo } from \"astral\";\n\u003e let city = new LocationInfo(\"London\", \"England\", \"Europe/London\", 51.5, -0.116);\n\u003e console.log(\n... `Information for ${city.name}/${city.region}\n... Timezone: ${city.timezone}\n... Latitude: ${city.latitude}; Longitude: ${city.longitude}\n... `);\n\nInformation for London/England\nTimezone: Europe/London\nLatitude: 51.50; Longitude: -0.116\n\n\u003e import { DateTime } from \"luxon\";\n\u003e import { sun } from \"astral/sun\";\n\u003e let s = sun(city.observer, DateTime.fromObject({year: 2009, month: 4, day: 22}));\n\u003e console.log(\n... `Dawn:    ${s[\"dawn\"].toISO()}\n... Sunrise: ${s[\"sunrise\"].toISO()}\n... Noon:    ${s[\"noon\"].toISO()}\n... Sunset:  ${s[\"sunset\"].toISO()}\n... Dusk:    ${s[\"dusk\"].toISO()}`\n... );\n\nDawn:    2009-04-22T04:13:04.923Z\nSunrise: 2009-04-22T04:50:16.515Z\nNoon:    2009-04-22T11:59:02.000Z\nSunset:  2009-04-22T19:08:41.215Z\nDusk:    2009-04-22T19:46:06.362Z\n```\n\n### Moon\n\n```typescript\n\u003e import { DateTime } from \"luxon\";\n\u003e import { phase } from \"astral/moon\";\n\u003e console.log(phase(DateTime.fromObject({year: 2018, month: 1, day: 1})));\n13.255666666666668\n```\n\nThe moon phase method returns an number describing the phase, where the value is\nbetween 0 and 27.99. The following lists the mapping of various values to the\ndescription of the phase of the moon.\n\n| Value       | Phase         |\n| ----------- | ------------- |\n| 0 .. 6.99   | New moon      |\n| 7 .. 13.99  | First quarter |\n| 14 .. 20.99 | Full moon     |\n| 21 .. 27.99 | Last quarter  |\n\nIf for example the number returned was 27.99 then the moon would be almost at\nthe New Moon phase, and if it was 24.00 it would be half way between the Last\nQuarter and a New Moon.\n\nNote: The moon phase does not depend on your location. However what the moon\nactually looks like to you does depend on your location. If you're in the\nsouthern hemisphere it looks different than if you were in the northern\nhemisphere.\n\nSee http://moongazer.x10.mx/website/astronomy/moon-phases/ for further information.\n\n### Geocoder\n\n```typescript\n\u003e import { database, lookup } from \"astral/geocoder\";\n\u003e console.log(lookup(\"London\", database()));\nLocationInfo {\n  name: 'London',\n  region: 'England',\n  timezone: 'Europe/London',\n  latitude: 51.473333333333336,\n  longitude: -0.0008333333333333334\n}\n```\n\n#### Custom Location\n\nIf you only need a single location that is not in the database then you can\nconstruct a `LocationInfo` and fill in the values, either on\ninitialization\n\n```typescript\nimport { LocationInfo } from \"astral/index\";\nlet l = new LocationInfo('name', 'region', 'timezone/name', 0.1, 1.2);\n```\n\nor set the attributes after initialization::\n\n```typescript\nimport { LocationInfo } from \"astral/index\";\nlet l = new LocationInfo();\nl.name = 'name';\nl.region = 'region';\nl.timezone = 'US/Central';\nl.latitude = 0.1;\nl.longitude = 1.2;\n```\n\nNote: `name` and `region` can be anything you like.\n\n#### Additional Locations\n\nYou can add to the list of available locations using the\n`add_locations` function and passing either a string with\none line per location or by passing an Array containing strings, Arrays or tuples\n(lists and tuples are passed directly to the LocationInfo constructor).\n\n```typescript\n\u003e import { addLocations, database, lookup } from \"astral/geocoder\";\n\u003e let db = database();\n\u003e try {\n...     lookup(\"Somewhere\", db);\n... }\n... catch(err) {\n...     console.log(err.msg);\n... }\n...\nLocation or group \"Somewhere\" not found in database\n\u003e addLocations(\"Somewhere,Secret Location,UTC,24°28'N,39°36'E\", db);\n\u003e console.log(lookup(\"Somewhere\", db));\nLocationInfo {\n  name: 'Somewhere',\n  region: 'Secret Location',\n  timezone: 'UTC',\n  latitude: 24.466666666666665,\n  longitude: 39.6\n}\n```\n\n#### Timezone Groups\n\nTimezone groups such as Europe can be accessed via the `group` function in\nthe `geocoder` module\n\n```typescript\n\u003e import { group } from \"astral/geocoder\";\n\u003e let europe = group(\"europe\");\n\u003e console.log(Object.keys(europe).sort());\n['aberdeen', 'amsterdam', 'andorra_la_vella', 'ankara', 'athens', ...]\n```\n\n## Effect of Elevation\n\n### Times Of The Sun\n\nThe times of the sun that you experience depend on what obscurs your view of it.\nIt may either be obscured by the horizon or some other geographical feature\n(e.g. mountains)\n\n1. If what obscures you at ground level is the horizon and you are at a\n   elevation above ground level then the times of the sun depends on how far\n   further round the earth you can see due to your elevation (the sun rises\n   earlier and sets later).\n\n    The extra angle you can see round the earth is determined by calculating the\n    angle α in the image below based on your elevation above ground level, and\n    adding this to the depression angle for the sun calculations.\n\n    \u003cimg src=\"media://elevation_horizon.svg\"/\u003e\n\n2. If your view is obscured by some other geographical feature than the horizon,\n   then the adjustment angle is based on how far you are above or below the\n   feature and your distance to it.\n\nFor the first case i.e. obscured by the horizon you need to pass a single number\nto the Observer as its elevation. For the second case pass a tuple of 2 numbers.\nThe first being the vertical distance to the top of the feature and the second\nthe horizontal distance to the feature.\n\n### Elevation Of The Sun\n\nEven though an observer's elevation can significantly affect the times of the\nsun the same is not true for the elevation angle from the observer to the sun.\n\nAs an example the diagram below shows the difference in angle between an\nobserver at ground level and one on the ISS orbiting 408 km above the earth.\n\n\u003cimg src=\"media://elevation_sun.svg\"/\u003e\n\nThe largest difference between the two angles is when the angle at ground level\nis 1 degree. The difference then is approximately 0.15 degrees.\n\nAt the summit of mount Everest (8,848 m) the maximum difference is 0.00338821\ndegrees.\n\nDue to the very small difference the astral package does not currently adjust\nthe solar elevation for changes in observer elevation.\n\n## Effect of Refraction\n\nWhen viewing the sun the position you see it at is different from its actual\nposition due to the effect of\n[atmospheric refraction](https://en.wikipedia.org/wiki/Atmospheric_refraction)\nwhich makes the sun appear to be higher in the sky. The calculations in the\npackage take this refraction into account.\n\nThe `sunrise` and `sunset` functions use the\nrefraction at an angle when the sun is half of its apparent diameter below the\nhorizon. This is between about 30 and 32 arcminutes and for the astral package a\nvalue of 32\" is used.\n\nNote: The refraction calculation does not take into account temperature and\npressure which can affect the angle of refraction.\n\n## License\n\nThis module is licensed under the terms of the\n[Apache](https://www.apache.org/licenses/LICENSE-2.0) V2.0 license.\n\n## Dependencies\n\nAstral has one required external dependency on\n[luxon](https://moment.github.io/luxon/index.html).\n\n## Installation\n\nTo install Astral you should use the `npm` tool:\n\n```\nnpm install @sffjunkie/astral\n```\n\n## Cities\n\nThe module includes location and time zone data for the following cities. The\nlist includes all capital cities plus some from the UK. The list also includes\nthe US state capitals and some other US cities.\n\nAberdeen, Abu Dhabi, Abu Dhabi, Abuja, Accra, Addis Ababa, Adelaide, Al Jubail,\nAlbany, Albuquerque, Algiers, Amman, Amsterdam, Anchorage, Andorra la Vella,\nAnkara, Annapolis, Antananarivo, Apia, Ashgabat, Asmara, Astana, Asuncion,\nAthens, Atlanta, Augusta, Austin, Avarua, Baghdad, Baku, Baltimore, Bamako,\nBandar Seri Begawan, Bangkok, Bangui, Banjul, Barrow-In-Furness, Basse-Terre,\nBasseterre, Baton Rouge, Beijing, Beirut, Belfast, Belgrade, Belmopan, Berlin,\nBern, Billings, Birmingham, Birmingham, Bishkek, Bismarck, Bissau, Bloemfontein,\nBogota, Boise, Bolton, Boston, Bradford, Brasilia, Bratislava, Brazzaville,\nBridgeport, Bridgetown, Brisbane, Bristol, Brussels, Bucharest, Bucuresti,\nBudapest, Buenos Aires, Buffalo, Bujumbura, Burlington, Cairo, Canberra, Cape\nTown, Caracas, Cardiff, Carson City, Castries, Cayenne, Charleston, Charlotte,\nCharlotte Amalie, Cheyenne, Chicago, Chisinau, Cleveland, Columbia, Columbus,\nConakry, Concord, Copenhagen, Cotonou, Crawley, Dakar, Dallas, Damascus, Dammam,\nDenver, Des Moines, Detroit, Dhaka, Dili, Djibouti, Dodoma, Doha, Douglas,\nDover, Dublin, Dushanbe, Edinburgh, El Aaiun, Fargo, Fort-de-France, Frankfort,\nFreetown, Funafuti, Gaborone, George Town, Georgetown, Gibraltar, Glasgow,\nGreenwich, Guatemala, Hanoi, Harare, Harrisburg, Hartford, Havana, Helena,\nHelsinki, Hobart, Hong Kong, Honiara, Honolulu, Houston, Indianapolis,\nIslamabad, Jackson, Jacksonville, Jakarta, Jefferson City, Jerusalem, Juba,\nJubail, Juneau, Kabul, Kampala, Kansas City, Kathmandu, Khartoum, Kiev, Kigali,\nKingston, Kingston, Kingstown, Kinshasa, Koror, Kuala Lumpur, Kuwait, La Paz,\nLansing, Las Vegas, Leeds, Leicester, Libreville, Lilongwe, Lima, Lincoln,\nLisbon, Little Rock, Liverpool, Ljubljana, Lome, London, Los Angeles,\nLouisville, Luanda, Lusaka, Luxembourg, Macau, Madinah, Madison, Madrid, Majuro,\nMakkah, Malabo, Male, Mamoudzou, Managua, Manama, Manchester, Manchester,\nManila, Maputo, Maseru, Masqat, Mbabane, Mecca, Medina, Melbourne, Memphis,\nMexico, Miami, Milwaukee, Minneapolis, Minsk, Mogadishu, Monaco, Monrovia,\nMontevideo, Montgomery, Montpelier, Moroni, Moscow, Moskva, Mumbai, Muscat,\nN'Djamena, Nairobi, Nashville, Nassau, Naypyidaw, New Delhi, New Orleans, New\nYork, Newark, Newcastle, Newcastle Upon Tyne, Ngerulmud, Niamey, Nicosia,\nNorwich, Nouakchott, Noumea, Nuku'alofa, Nuuk, Oklahoma City, Olympia, Omaha,\nOranjestad, Orlando, Oslo, Ottawa, Ouagadougou, Oxford, P'yongyang, Pago Pago,\nPalikir, Panama, Papeete, Paramaribo, Paris, Perth, Philadelphia, Phnom Penh,\nPhoenix, Pierre, Plymouth, Podgorica, Port Louis, Port Moresby, Port of Spain,\nPort-Vila, Port-au-Prince, Portland, Portland, Porto-Novo, Portsmouth, Prague,\nPraia, Pretoria, Pristina, Providence, Quito, Rabat, Raleigh, Reading,\nReykjavik, Richmond, Riga, Riyadh, Road Town, Rome, Roseau, Sacramento, Saint\nHelier, Saint Paul, Saint Pierre, Saipan, Salem, Salt Lake City, San Diego, San\nFrancisco, San Jose, San Juan, San Marino, San Salvador, Sana, Sana'a, Santa Fe,\nSantiago, Santo Domingo, Sao Tome, Sarajevo, Seattle, Seoul, Sheffield,\nSingapore, Sioux Falls, Skopje, Sofia, Southampton, Springfield, Sri\nJayawardenapura Kotte, St. George's, St. John's, St. Peter Port, Stanley,\nStockholm, Sucre, Suva, Swansea, Swindon, Sydney, T'bilisi, Taipei, Tallahassee,\nTallinn, Tarawa, Tashkent, Tbilisi, Tegucigalpa, Tehran, Thimphu, Tirana,\nTirane, Tokyo, Toledo, Topeka, Torshavn, Trenton, Tripoli, Tunis, Ulaanbaatar,\nUlan Bator, Vaduz, Valletta, Vienna, Vientiane, Vilnius, Virginia Beach, W.\nIndies, Warsaw, Washington DC, Wellington, Wichita, Willemstad, Wilmington,\nWindhoek, Wolverhampton, Yamoussoukro, Yangon, Yaounde, Yaren, Yerevan, Zagreb\n\n### US Cities\n\nAlbany, Albuquerque, Anchorage, Annapolis, Atlanta, Augusta, Austin, Baltimore,\nBaton Rouge, Billings, Birmingham, Bismarck, Boise, Boston, Bridgeport, Buffalo,\nBurlington, Carson City, Charleston, Charlotte, Cheyenne, Chicago, Cleveland,\nColumbia, Columbus, Concord, Dallas, Denver, Des Moines, Detroit, Dover, Fargo,\nFrankfort, Harrisburg, Hartford, Helena, Honolulu, Houston, Indianapolis,\nJackson, Jacksonville, Jefferson City, Juneau, Kansas City, Lansing, Las Vegas,\nLincoln, Little Rock, Los Angeles, Louisville, Madison, Manchester, Memphis,\nMiami, Milwaukee, Minneapolis, Montgomery, Montpelier, Nashville, New Orleans,\nNew York, Newark, Oklahoma City, Olympia, Omaha, Orlando, Philadelphia, Phoenix,\nPierre, Portland, Portland, Providence, Raleigh, Richmond, Sacramento, Saint\nPaul, Salem, Salt Lake City, San Diego, San Francisco, Santa Fe, Seattle, Sioux\nFalls, Springfield, Tallahassee, Toledo, Topeka, Trenton, Virginia Beach,\nWichita, Wilmington\n\n## Thanks\n\nThe sun calculations in this package were adapted from the\nspreadsheets on the following page.\n\nhttps://www.esrl.noaa.gov/gmd/grad/solcalc/calcdetails.html\n\nRefraction calculation is taken from\n\nSun-Pointing Programs and Their Accuracy\\\nJohn C. Zimmerman Of Sandia National Laboratones\\\nhttps://www.osti.gov/servlets/purl/6377969\n\nWhich cites the following as the original source\n\nIn Solar Energy Vol 20 No.5-C\\\nRobert Walraven Of The University Of California, Davis\n\nThe moon phase calculation is based on some javascript code from Sky and\nTelescope magazine\n\nMoon-phase calculation\\\nRoger W. Sinnott, Sky \u0026 Telescope, June 16, 2006.\\\nhttp://www.skyandtelescope.com/wp-content/observing-tools/moonphase/moon.html\n\n\u003c!-- Also to `Sphinx`\\_ for making doc generation an easy thing (not that the writing\nof the docs is any easier.) --\u003e\n\n## Contact\n\nSimon Kennedy \u003csffjunkie+code@gmail.com\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsffjunkie%2Fastral-ts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsffjunkie%2Fastral-ts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsffjunkie%2Fastral-ts/lists"}