From 4088a967f95ca479e84e1dee83153bc0911cdd96 Mon Sep 17 00:00:00 2001 From: Daniel Ramos Date: Sun, 9 May 2021 02:31:35 +0100 Subject: [PATCH] First commit --- .github/workflows/main.yml | 24 + .gitignore | 3 + .vscode/settings.json | 5 + CODE_OF_CONDUCT.md | 132 +++++ CONTRIBUTING.md | 15 + LICENSE | 117 ++++ Makefile | 13 + README.md | 31 ++ deps.ts | 1 + icons/empty.png | Bin 0 -> 131 bytes icons/facebook.png | Bin 0 -> 313 bytes icons/github.png | Bin 0 -> 558 bytes icons/instagram.png | Bin 0 -> 1128 bytes icons/linkedin.png | Bin 0 -> 359 bytes icons/twitter.png | Bin 0 -> 514 bytes icons/youtube.png | Bin 0 -> 380 bytes src/build.ts | 72 +++ src/companies.ts | 512 ++++++++++++++++++ src/linter/lint.ts | 14 + .../companiesAreSortedAlphabetically.test.ts | 48 ++ .../rules/companiesAreSortedAlphabetically.ts | 17 + ...ialNetworksAreSortedAlphabetically.test.ts | 57 ++ .../socialNetworksAreSortedAlphabetically.ts | 21 + src/models.ts | 40 ++ test/createCompany.ts | 25 + 25 files changed, 1147 insertions(+) create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 deps.ts create mode 100644 icons/empty.png create mode 100644 icons/facebook.png create mode 100644 icons/github.png create mode 100644 icons/instagram.png create mode 100644 icons/linkedin.png create mode 100644 icons/twitter.png create mode 100644 icons/youtube.png create mode 100644 src/build.ts create mode 100644 src/companies.ts create mode 100644 src/linter/lint.ts create mode 100644 src/linter/rules/companiesAreSortedAlphabetically.test.ts create mode 100644 src/linter/rules/companiesAreSortedAlphabetically.ts create mode 100644 src/linter/rules/socialNetworksAreSortedAlphabetically.test.ts create mode 100644 src/linter/rules/socialNetworksAreSortedAlphabetically.ts create mode 100644 src/models.ts create mode 100644 test/createCompany.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..9882467 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,24 @@ +name: Deno + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Setup repo + uses: actions/checkout@v2 + - name: Setup Deno + uses: denoland/setup-deno@main + with: + deno-version: v1.x + - name: Cache Dependencies + run: deno cache deps.ts + - name: Run Tests + run: deno test + - name: Run Linter + run: deno run src/linter/lint.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..08302ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +.idea + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..99f2846 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "deno.enable": true, + "deno.lint": true, + "deno.unstable": false +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..2079595 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[INSERT CONTACT METHOD]. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][mozilla coc]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][faq]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html +[mozilla coc]: https://github.com/mozilla/diversity +[faq]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a36be0f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Contributing Guidelines + +Please send a Pull Request if you have any additions or changes. + +Pull requests will be accepted based on the following: + +1. The pull request adheres to the repository's [Code of Conduct](/CODE_OF_CONDUCT.md) +1. If the company offer work in any of the Canary Islands +1. If you add the company in alphabetical order in the list +1. If you submit the company with all their attributes (name, website, social networks...) +1. If the company is not fully-remote + +Please adhere to the [Contributor Code of Conduct](/CODE_OF_CONDUCT.md). + +Thanks for contributing! diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2c4afab --- /dev/null +++ b/LICENSE @@ -0,0 +1,117 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..64431cb --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY: lint clean format test + +lint: + deno run src/linter/lint.ts + +format: + deno fmt + +test: + deno test + +README.md: src/build.ts src/companies.ts + deno run src/build.ts > README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..20ceb9f --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Tech Companies Canarias + +Tech Companies Canarias is a list of tech companies that are offer tech work from the Canary Islands. + +Contributions are very welcome! Please submit a pull request on GitHub. + +| Company | Hiring from | Social Networks | Job Page | +| ------------------------------------------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| [Acid Tango](https://acidtango.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/Acid-Tango-101103077972357) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/acidtango) [![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/instagram.png)](https://www.instagram.com/acidtango) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/acid-tango) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/acidtango) [![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/youtube.png)](https://www.youtube.com/channel/UCFqkwvYiCRR3dupcxvbNOGA) | [๐Ÿ’ผ](https://www.linkedin.com/company/avantic-estudio-de-ingenieros/jobs) | +| [Avantic](http://www.avantic.net) | Tenerife | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/avantic) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/avantic-estudio-de-ingenieros) ![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/avantic-estudio-de-ingenieros/jobs) | +| [Desarrollo Cometa](https://www.desarrollocometa.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/desarrollocometa) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/devCometa) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.desarrollocometa.com) | +| [Ecommium](https://ecommium.com) | Gran Canaria | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/ecommium-ecommerce) ![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://ecommium.com/unete-al-equipo) | +| [edataconsulting](https://edataconsulting.es) | Gran Canaria | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/edataconsulting) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/edataconsulting/) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/edataconsulting) [![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/youtube.png)](https://www.youtube.com/channel/UCEEixyMsLJPw7-v_gtkSDrw) | [๐Ÿ’ผ](https://people.edataconsulting.es/) | +| [Expero](https://www.experoinc.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/experoinc) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/experoinc) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/experoinc) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/experoinc) [![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/youtube.png)](https://www.youtube.com/channel/UCSpX7JV7sC-mH46oM09n_Nw) | [๐Ÿ’ผ](https://www.experoinc.com/about/careers) | +| [Glotio](https://glotio.com) | Gran Canaria | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/glotio) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/Glotio1) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/glotio/jobs) | +| [HolaSoft](https://www.holasoft.es) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/HolaSoft.tpv.erp) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/holasoft) ![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/holasoft/jobs) | +| [HYVE](https://www.hyve.net) | Gran Canaria | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/hyvetheinnovationcompany) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/instagram.png)](https://www.instagram.com/hyve_innovation) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/hyve-ag) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/hyve_innovation) [![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/youtube.png)](https://www.youtube.com/channel/UCnazwh6SE2Rex_J2982kyTQ) | [๐Ÿ’ผ](https://www.hyve.net/en/careers) | +| [Ingenium Ventures](https://www.ingeniumventures.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/IngeniumVentures) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/ingenium-ventures) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/ingeniumv) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.ingeniumventures.com/talento) | +| [Intelequia](https://intelequia.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/Intelequia) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/intelequia) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/intelequia) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://intelequia.com/social/empleos) | +| [Lean Mind](https://leanmind.es) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/Lean-Mind-106484421092863) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/lean-mind) [![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/instagram.png)](https://www.instagram.com/leanfulness_es) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/leanfulness) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/leanfulness_es) [![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/youtube.png)](https://www.youtube.com/channel/UCW16ot2jRfF3LgUSCEiGd8g) | [๐Ÿ’ผ](https://leanmind.es/es/empleo) | +| [Omnia Infosys](https://omniainfosys.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/Omnia-Infosys-126364607419620) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/omnia-infosys-slu) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/OmniaInfosys) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/omnia-infosys-slu/jobs/) | +| [Open Canarias](https://www.opencanarias.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/opencanarias) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/opencanarias) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/open-canarias-sl) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/OpenCanarias) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/open-canarias-sl/jobs) | +| [Prodanet](https://www.prodanet.com) | Tenerife | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/prodanet) ![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/prodanet/jobs) | +| [Proyectran](https://www.proyectran.com) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/Proyectran) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/proyectran) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/Proyectran) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/proyectran/jobs) | +| [Secret Source](https://www.secret-source.eu) | Gran Canaria | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/secretsource) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/instagram.png)](https://www.instagram.com/secret_source.eu) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/secret-source) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/SecretSourceEU) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://careers.secret-source.eu) | +| [Sirokko Open Source Solutions](https://www.sirokko.es) | Gran Canaria | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/SirokkoOSS) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/sirokko) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/sirokko-open-source-solutions-s-l-/) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/sirokkooss) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/sirokko-open-source-solutions-s-l-/jobs/) | +| [Squaads](https://squaads.com) | Gran Canaria | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/squaads/) ![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/squaads/jobs/) | +| [TecAlliance](https://www.tecalliance.net) | Tenerife | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](facebook.com/TecAlliance) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/instagram.png)](https://www.instagram.com/tecalliance) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/tecalliance) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/TecAlliance) [![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/youtube.png)](https://www.youtube.com/channel/UC_b7gPw0OabQ3b2CDTtdFnw) | [๐Ÿ’ผ](https://www.tecalliance.net/en/career) | +| [The Agile Monkeys](https://www.theagilemonkeys.com) | Gran Canaria | [![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/facebook.png)](https://www.facebook.com/TheAgileMonkeys) [![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/github.png)](https://github.com/theam) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/theagilemonkeys) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/theagilemonkeys) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/theagilemonkeys/jobs) | +| [Tรฉcnicas Competitivas](https://www.tecnicascompetitivas.com) | Tenerife, Gran Canaria | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/tecnicas-competitivas) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/TecnicasTCSA) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.linkedin.com/company/tecnicas-competitivas/jobs) | +| [Ultebra](https://www.ultebra.eu) | Tenerife | ![Facebook](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Github](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) ![Instagram](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) [![Linkedin](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/linkedin.png)](https://www.linkedin.com/company/ultebra-solutions-s-l) [![Twitter](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/twitter.png)](https://twitter.com/ultebra) ![YouTube](https://raw.githubusercontent.com/DanielRamosAcosta/tech-companies-canarias/main/icons/empty.png) | [๐Ÿ’ผ](https://www.ultebra.eu/#join) | diff --git a/deps.ts b/deps.ts new file mode 100644 index 0000000..056a216 --- /dev/null +++ b/deps.ts @@ -0,0 +1 @@ +export * from "https://deno.land/x/expect/mod.ts"; diff --git a/icons/empty.png b/icons/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..6e08c1cac0cad50dd06cdb8c2ed94c523a87f572 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!JgF%}28J2BoosZ$T+a29w(7Bet# z3xhBt!>l>$B>FS$q5T|fxH9;#%G&3 Q)PXDpPgg&ebxsLQ0JrWO?EnA( literal 0 HcmV?d00001 diff --git a/icons/facebook.png b/icons/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc30dfe620a9718c7323cac3f5c4e428aa873a6 GIT binary patch literal 313 zcmV-90mlA`P)m=n>oiNhOw!!a~IgD^Uw^8;cQj18(35B$A1w$&;#)5=j#?Z7j@w z{{Madn>UY;@u7_Mk*|U4s{la5kSdU#XlacX0@qh;D1N^#J@M2vGGO8ZF`eR~xDHUo zia{h?3aPsuiK8Y?#%oBx=dg5jf`08$d2C_P06Xc4W+dA7FLg#?nTV)r91(+88?W5E zS3Oq~5XSEh!z?1kR1U?&z5#I`pnWmKQ8%|UQ%+cf6F(wsHOY4bgq9qLXb?Z1%jCU00000 LNkvXXu0mjfJ`96V literal 0 HcmV?d00001 diff --git a/icons/github.png b/icons/github.png new file mode 100644 index 0000000000000000000000000000000000000000..6135e12621a8c93f54deadae0a91f2cfca88ce2a GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J2BoosZ$T+a29w(7Bet# z3xhBt!>l;eLVC^$!%#e|i zQjnFMHFKtbfPlEDsG+`oTx=}ROk)EBpcK#q8EI)HMMWb6g8+a3<;#~VD=Vw3s&;mC zXsWBLsi|38Td!HO251WeELgB$VOH!Rpo^_ag8YIRQkPu%za%B}$-}8r{(@Beegq_z z{=fYH$p8O`|8FVzFYxj2|CWDS|14Sg@Bja_kN>`;7q_4KbFN(U9)A+hl*^tjjv*Cu z=1!~?ZgdbhcG20zB|M}>8LH;TehZ^5)ymzt4MLwmsxm^wTaTjjOk2 zue}zyV&SQMY@TQJ?H1U6X3*WsTVmC)u$*z?TJ{+|kv$)eE-CN&-@vTMbX0V9*)Q%d znp-R-0?O1*F08UxAl%2pV`RtV&LI9F#egM-&#mN8{ZG5rWInaXt-&{sw=^f1U3acX zOlyyOcD`xPAr9`-j?sTOI=ZH@c&}NqNs#^gw{;tDzGLZl+Nkn-Pb|BPf4;Fz{JPAl f-Rkp?{hKXUkSZE7v&vW*=sgBcS3j3^P6Vyb>UB- zP$;-)>86@SLWE-dDYPmX9TRm`H-fYX7IhQ6w}ooy>dpo__bem&^;VT}i!g@_z2U-*>)qzIP`9-QyAb?*x}0{eD+}%-e$#fE}(5Bu;}gJR!z;#6`phX(<^bY^QO5Y7;?VIt^im zdBEVhp1W=$0J!ri0#nTe-f#vaUE?K2L1<|`pJqS(be)J&CzOO)i8D8IZ;gi#a%`xIv z#LTtH&#wuG=d9wD6)1|<*O(GPB%La=C$L2Yryl%q?({#;zELBMzC%f#M0uQ5X=pB?AHj z6-bY~0wuT0Hx%THcsY|=(}m=Fg(N=q`zn>*gmoL)s}sRaqa}jK+)@sZeTcaLiw#1| z+n9RAMD{S*d_CUYd(tcOnJ%{n0h#?mxo*5!b&P=9@GmAP^>R=Trf%mX7O( zPft?fPEyZYp;dVPU%StC!*>8a>3q#4J3b8i9-+(83dQ8_usLnfUC( ui=TChn5Exj-uJ_GT)xcXKaYFmN>kw*5QGm9PJk(}D7gtWrZG1#HMX4GAYEK?gruTCFlg6y#9zQ+ zV-UjCjU*HscmM)W&n`+b1IOr$Q6DnkKp-6fiXOlnaLY7b=G#5>f$4D=4fc(nKO z0v$>u<0?5E)E*Qg(Eaw1e_BLa4;$GeJ(#tkyK!-@=tUbl0hX1@k8=aG-R1-cqSCwH zd@Kb5fum^>TCdtnodN#Y?SLmKjgTle)2q;U&=0^E|JJLuX7G;zc9Io4Xezc_Jd{xr zd!~cz`lEf_+H{qN;r-sv=D_`j1B;i~wzAt@zdrr<0ne?R^ci6%x*Pxi002ovPDHLk FV1h?|pCteQ literal 0 HcmV?d00001 diff --git a/icons/twitter.png b/icons/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5849669c576f4e21d7825a1d1a4201b877335d GIT binary patch literal 514 zcmV+d0{#7oP)sJ4X6(86@9$%aG7s6cr8#Xm)u3x!2#qkuBOedw?z5NS7lCWT_Mv=t7c_C&A6QJCxWXz>^$b{zcOl!uq zWSMO3izX%91*HII3j9a zTFL_z)b+C#0$FVM+K36yq8c3n^BW + `${iconsBaseUrl}/${socialNetworkType.toLowerCase()}.png`; + +const createImage = (alt: string, url: string) => `![${alt}](${url})`; + +const createLink = (content: string, link: string) => `[${content}](${link})`; + +const createSocialNetworkEnabledIcon = ({ + type, + link, +}: SocialNetwork) => + createLink(createImage(type, createSocialNetworkImageLink(type)), link); + +const createSocialNetworkDisabledIcon = (type: SocialNetworkType) => + createImage(type, `${iconsBaseUrl}/empty.png`); + +const createSocialIcons = (socialNetworks: SocialNetworks) => { + return Object.values(SocialNetworkType).map( + (socialNetworkType) => { + const socialNetwork = socialNetworks.find((socialNetwork) => + socialNetwork.type === socialNetworkType + ); + + return socialNetwork + ? createSocialNetworkEnabledIcon(socialNetwork) + : createSocialNetworkDisabledIcon(socialNetworkType); + }, + ).join(" "); +}; + +const toColumns = ({ + name, + website, + hiringFrom, + socialNetworks, + jobPage, +}: Company) => [ + createLink(name, website), + hiringFrom.join(", "), + createSocialIcons(socialNetworks), + createLink("๐Ÿ’ผ", jobPage), +]; + +const toMarkdownColumns = (columns: string[]) => `| ${columns.join(" | ")} |`; + +const companyTable = companies + .map(toColumns) + .map(toMarkdownColumns) + .join("\n"); + +console.log(markdownHeader.concat(companyTable)); diff --git a/src/companies.ts b/src/companies.ts new file mode 100644 index 0000000..08727b6 --- /dev/null +++ b/src/companies.ts @@ -0,0 +1,512 @@ +import { Companies, CompanyType, Island, SocialNetworkType } from "./models.ts"; + +export const companies: Companies = [ + { + name: "Acid Tango", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://acidtango.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/Acid-Tango-101103077972357", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/acidtango", + }, + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/acidtango", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/acid-tango", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/acidtango", + }, + { + type: SocialNetworkType.YOUTUBE, + link: "https://www.youtube.com/channel/UCFqkwvYiCRR3dupcxvbNOGA", + }, + ], + jobPage: + "https://www.linkedin.com/company/avantic-estudio-de-ingenieros/jobs", + }, + { + name: "Avantic", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "http://www.avantic.net", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/avantic", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/avantic-estudio-de-ingenieros", + }, + ], + jobPage: + "https://www.linkedin.com/company/avantic-estudio-de-ingenieros/jobs", + }, + { + name: "Desarrollo Cometa", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.desarrollocometa.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/desarrollocometa", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/devCometa", + }, + ], + jobPage: "https://www.desarrollocometa.com", // Not sure about this + }, + { + name: "Ecommium", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://ecommium.com", + hiringFrom: [Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/ecommium-ecommerce", + }, + ], + jobPage: "https://ecommium.com/unete-al-equipo", + }, + { + name: "edataconsulting", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://edataconsulting.es", + hiringFrom: [Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/edataconsulting", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/edataconsulting/", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/edataconsulting", + }, + { + type: SocialNetworkType.YOUTUBE, + link: "https://www.youtube.com/channel/UCEEixyMsLJPw7-v_gtkSDrw", + }, + ], + jobPage: "https://people.edataconsulting.es/", + }, + { + name: "Expero", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.experoinc.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/experoinc", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/experoinc", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/experoinc", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/experoinc", + }, + { + type: SocialNetworkType.YOUTUBE, + link: "https://www.youtube.com/channel/UCSpX7JV7sC-mH46oM09n_Nw", + }, + ], + jobPage: "https://www.experoinc.com/about/careers", + }, + { + name: "Glotio", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://glotio.com", + hiringFrom: [Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/glotio", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/Glotio1", + }, + ], + jobPage: "https://www.linkedin.com/company/glotio/jobs", + }, + { + name: "HolaSoft", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.holasoft.es", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/HolaSoft.tpv.erp", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/holasoft", + }, + ], + jobPage: "https://www.linkedin.com/company/holasoft/jobs", + }, + { + name: "HYVE", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.hyve.net", + hiringFrom: [Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/hyvetheinnovationcompany", + }, + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/hyve_innovation", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/hyve-ag", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/hyve_innovation", + }, + { + type: SocialNetworkType.YOUTUBE, + link: "https://www.youtube.com/channel/UCnazwh6SE2Rex_J2982kyTQ", + }, + ], + jobPage: "https://www.hyve.net/en/careers", + }, + { + name: "Ingenium Ventures", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.ingeniumventures.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/IngeniumVentures", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/ingenium-ventures", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/ingeniumv", + }, + ], + jobPage: "https://www.ingeniumventures.com/talento", + }, + { + name: "Intelequia", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://intelequia.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/Intelequia", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/intelequia", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/intelequia", + }, + ], + jobPage: "https://intelequia.com/social/empleos", + }, + { + name: "Lean Mind", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://leanmind.es", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/Lean-Mind-106484421092863", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/lean-mind", + }, + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/leanfulness_es", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/leanfulness", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/leanfulness_es", + }, + { + type: SocialNetworkType.YOUTUBE, + link: "https://www.youtube.com/channel/UCW16ot2jRfF3LgUSCEiGd8g", + }, + ], + jobPage: "https://leanmind.es/es/empleo", + }, + { + name: "Omnia Infosys", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://omniainfosys.com", + hiringFrom: [Island.TENERIFE], // Not sure about this + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/Omnia-Infosys-126364607419620", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/omnia-infosys-slu", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/OmniaInfosys", + }, + ], + jobPage: "https://www.linkedin.com/company/omnia-infosys-slu/jobs/", + }, + { + name: "Open Canarias", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.opencanarias.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/opencanarias", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/opencanarias", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/open-canarias-sl", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/OpenCanarias", + }, + ], + jobPage: "https://www.linkedin.com/company/open-canarias-sl/jobs", + }, + { + name: "Prodanet", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.prodanet.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/prodanet", + }, + ], + jobPage: "https://www.linkedin.com/company/prodanet/jobs", + }, + { + name: "Proyectran", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.proyectran.com", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/Proyectran", + }, + + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/proyectran", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/Proyectran", + }, + ], + jobPage: "https://www.linkedin.com/company/proyectran/jobs", + }, + { + name: "Secret Source", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.secret-source.eu", + hiringFrom: [Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/secretsource", + }, + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/secret_source.eu", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/secret-source", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/SecretSourceEU", + }, + ], + jobPage: "https://careers.secret-source.eu", + }, + { + name: "Sirokko Open Source Solutions", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.sirokko.es", + hiringFrom: [Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/SirokkoOSS", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/sirokko", + }, + { + type: SocialNetworkType.LINKEDIN, + link: + "https://www.linkedin.com/company/sirokko-open-source-solutions-s-l-/", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/sirokkooss", + }, + ], + jobPage: + "https://www.linkedin.com/company/sirokko-open-source-solutions-s-l-/jobs/", + }, + { + name: "Squaads", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://squaads.com", + hiringFrom: [Island.GRAN_CANARIA], // Not sure about this + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/squaads/", + }, + ], + jobPage: "https://www.linkedin.com/company/squaads/jobs/", + }, + { + name: "TecAlliance", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.tecalliance.net", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "facebook.com/TecAlliance", + }, + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/tecalliance", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/tecalliance", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/TecAlliance", + }, + { + type: SocialNetworkType.YOUTUBE, + link: "https://www.youtube.com/channel/UC_b7gPw0OabQ3b2CDTtdFnw", + }, + ], + jobPage: "https://www.tecalliance.net/en/career", + }, + { + name: "The Agile Monkeys", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.theagilemonkeys.com", + hiringFrom: [Island.GRAN_CANARIA], // Not sure about this + socialNetworks: [ + { + type: SocialNetworkType.FACEBOOK, + link: "https://www.facebook.com/TheAgileMonkeys", + }, + { + type: SocialNetworkType.GITHUB, + link: "https://github.com/theam", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/theagilemonkeys", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/theagilemonkeys", + }, + ], + jobPage: "https://www.linkedin.com/company/theagilemonkeys/jobs", + }, + { + name: "Tรฉcnicas Competitivas", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.tecnicascompetitivas.com", + hiringFrom: [Island.TENERIFE, Island.GRAN_CANARIA], + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/tecnicas-competitivas", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/TecnicasTCSA", + }, + ], + jobPage: "https://www.linkedin.com/company/tecnicas-competitivas/jobs", + }, + { + name: "Ultebra", + type: CompanyType.SOFTWARE_DEVELOPMENT, + website: "https://www.ultebra.eu", + hiringFrom: [Island.TENERIFE], + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/ultebra-solutions-s-l", + }, + { + type: SocialNetworkType.TWITTER, + link: "https://twitter.com/ultebra", + }, + ], + jobPage: "https://www.ultebra.eu/#join", + }, +]; diff --git a/src/linter/lint.ts b/src/linter/lint.ts new file mode 100644 index 0000000..0e8d375 --- /dev/null +++ b/src/linter/lint.ts @@ -0,0 +1,14 @@ +import { companies } from "../companies.ts"; +import { companiesAreSortedAlphabetically } from "./rules/companiesAreSortedAlphabetically.ts"; +import { socialNetworksAreSortedAlphabetically } from "./rules/socialNetworksAreSortedAlphabetically.ts"; + +function ensure(error?: Error) { + if (error) { + throw error; + } +} + +ensure(companiesAreSortedAlphabetically(companies)); +ensure(socialNetworksAreSortedAlphabetically(companies)); + +console.log("All ok!"); diff --git a/src/linter/rules/companiesAreSortedAlphabetically.test.ts b/src/linter/rules/companiesAreSortedAlphabetically.test.ts new file mode 100644 index 0000000..8127fe4 --- /dev/null +++ b/src/linter/rules/companiesAreSortedAlphabetically.test.ts @@ -0,0 +1,48 @@ +import { expect } from "../../../deps.ts"; +import { createCompany } from "../../../test/createCompany.ts"; +import { companiesAreSortedAlphabetically } from "./companiesAreSortedAlphabetically.ts"; + +Deno.test({ + name: "returns void if commpanies are sorted", + fn: () => { + const companies = [ + createCompany({ company: "A Company" }), + createCompany({ company: "B Company" }), + ]; + + const result = companiesAreSortedAlphabetically(companies); + + expect(result).toBeUndefined(); + }, +}); + +Deno.test({ + name: "returns an error if companies are not sorted", + fn: () => { + const companies = [ + createCompany({ company: "B Company" }), + createCompany({ company: "A Company" }), + ]; + + const result = companiesAreSortedAlphabetically(companies) as Error; + + expect(result).toBeInstanceOf(Error); + expect(result.message).toEqual( + "Companies are not sorted, expected 'a company' but found 'b company'", + ); + }, +}); + +Deno.test({ + name: "returns an error if companies are not sorted ignoring the case", + fn: () => { + const companies = [ + createCompany({ company: "a Company" }), + createCompany({ company: "B Company" }), + ]; + + const result = companiesAreSortedAlphabetically(companies) as Error; + + expect(result).toBeUndefined(); + }, +}); diff --git a/src/linter/rules/companiesAreSortedAlphabetically.ts b/src/linter/rules/companiesAreSortedAlphabetically.ts new file mode 100644 index 0000000..50793b4 --- /dev/null +++ b/src/linter/rules/companiesAreSortedAlphabetically.ts @@ -0,0 +1,17 @@ +import { Companies } from "../../models.ts"; + +export function companiesAreSortedAlphabetically(companies: Companies) { + const companyNames = companies.map((company) => company.name.toLowerCase()); + const sortedCompanyNames = [...companyNames].sort(); + + for (let i = 0; i < companyNames.length; i++) { + const companyName = companyNames[i]; + const expectedCompanyName = sortedCompanyNames[i]; + + if (companyName != expectedCompanyName) { + return new Error( + `Companies are not sorted, expected '${expectedCompanyName}' but found '${companyName}'`, + ); + } + } +} diff --git a/src/linter/rules/socialNetworksAreSortedAlphabetically.test.ts b/src/linter/rules/socialNetworksAreSortedAlphabetically.test.ts new file mode 100644 index 0000000..17cac0f --- /dev/null +++ b/src/linter/rules/socialNetworksAreSortedAlphabetically.test.ts @@ -0,0 +1,57 @@ +import { expect } from "../../../deps.ts"; +import { createCompany } from "../../../test/createCompany.ts"; +import { SocialNetworkType } from "../../models.ts"; +import { socialNetworksAreSortedAlphabetically } from "./socialNetworksAreSortedAlphabetically.ts"; + +Deno.test({ + name: "returns void if social networks are sorted", + fn: () => { + const companies = [ + createCompany({ + socialNetworks: [ + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/example", + }, + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/example", + }, + ], + }), + ]; + + const result = socialNetworksAreSortedAlphabetically(companies); + + expect(result).toBeUndefined(); + }, +}); + +Deno.test({ + name: "returns an error if social networks are not sorted", + fn: () => { + let companyName = "My Company"; + const companies = [ + createCompany({ + company: companyName, + socialNetworks: [ + { + type: SocialNetworkType.LINKEDIN, + link: "https://www.linkedin.com/company/example", + }, + { + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/example", + }, + ], + }), + ]; + + const result = socialNetworksAreSortedAlphabetically(companies) as Error; + + expect(result).toBeInstanceOf(Error); + expect(result.message).toEqual( + `Social networks of company '${companyName}' are not sorted`, + ); + }, +}); diff --git a/src/linter/rules/socialNetworksAreSortedAlphabetically.ts b/src/linter/rules/socialNetworksAreSortedAlphabetically.ts new file mode 100644 index 0000000..24ddcd7 --- /dev/null +++ b/src/linter/rules/socialNetworksAreSortedAlphabetically.ts @@ -0,0 +1,21 @@ +import { Companies } from "../../models.ts"; + +export function socialNetworksAreSortedAlphabetically(companies: Companies) { + for (const company of companies) { + const socialNetworks = company.socialNetworks.map((socialNetwork) => + socialNetwork.type + ); + const sortedSocialNetworks = [...socialNetworks].sort(); + + for (let i = 0; i < socialNetworks.length; i++) { + const socialNetwork = socialNetworks[i]; + const expectedCompanyName = sortedSocialNetworks[i]; + + if (socialNetwork !== expectedCompanyName) { + return new Error( + `Social networks of company '${company.name}' are not sorted`, + ); + } + } + } +} diff --git a/src/models.ts b/src/models.ts new file mode 100644 index 0000000..c58d9a5 --- /dev/null +++ b/src/models.ts @@ -0,0 +1,40 @@ +export const enum Island { + EL_HIERRO = "El Hierro", + LA_PALMA = "La Palma", + LA_GOMERA = "La Gomera", + TENERIFE = "Tenerife", + GRAN_CANARIA = "Gran Canaria", + FUERTEVENTURA = "Fuerteventura", + LANZAROTE = "Lanzarote", + LA_GRACIOSA = "La Graciosa", +} + +export enum SocialNetworkType { + FACEBOOK = "Facebook", + GITHUB = "Github", + INSTAGRAM = "Instagram", + LINKEDIN = "Linkedin", + TWITTER = "Twitter", + YOUTUBE = "YouTube", +} + +export const enum CompanyType { + SOFTWARE_DEVELOPMENT, +} + +export type SocialNetwork = { type: SocialNetworkType; link: string }; + +export type SocialNetworks = SocialNetwork[]; + +export type Islands = Island[]; + +export type Company = { + name: string; + type: CompanyType; + website: string; + hiringFrom: Islands; + socialNetworks: SocialNetworks; + jobPage: string; +}; + +export type Companies = Company[]; diff --git a/test/createCompany.ts b/test/createCompany.ts new file mode 100644 index 0000000..10a6597 --- /dev/null +++ b/test/createCompany.ts @@ -0,0 +1,25 @@ +import { + Company, + CompanyType, + Island, + SocialNetworkType, +} from "../src/models.ts"; + +export const createCompany = ({ + company = "Example Company", + type = CompanyType.SOFTWARE_DEVELOPMENT, + website = "https://example.org/", + hiringFrom = [Island.TENERIFE], + socialNetworks = [{ + type: SocialNetworkType.INSTAGRAM, + link: "https://www.instagram.com/example", + }], + jobPage = "https://example.org/jobs", +} = {}): Company => ({ + name: company, + type, + website, + hiringFrom, + socialNetworks, + jobPage, +});