Hola mundo al estilo Deno

Es habitual, cuando se aprende un lenguaje de programación, escribir una pequeña aplicación mostrando el mensaje “¡Hola mundo!”. En el caso de Deno, vamos a hacer algo un poco diferente para ejecutar tu primer programa con esta tecnología. Ya te conté aquí que Deno ofrece un servicio de repositorios a través de https://deno.land/x/, y vamos a usar un programa ejemplo que tienen publicado con el nombre de welcome. ¡Para que Deno lo descarge, lo compile y lo ejecute, sólo necesitamos escribir una línea!:

$ deno run https://deno.land/std@0.87.0/examples/welcome.ts
Download https://deno.land/std@0.87.0/examples/welcome.ts
Compile https://deno.land/std@0.87.0/examples/welcome.ts
Welcome to Deno!

Por supuesto que ejecutar código de manera arbitraria desde cualquier URL de internet no es una práctica recomendable, pero no olvides que con Deno disponemos de un entorno aislado del resto del sistema operativo donde es posible ajustar distintos tipos de permisos para los ejecutables, es decir, Deno dispone de un sandbox integrado.

El programa que hemos ejecutado es realmente sencillo, tan solo una llamada a console.log().

console.log('Welcome to Deno 🦕')

Si abres en el navegador la URL que hemos utilizado no verás el código fuente, porque la web de Deno reconoce tu navegador y sirve dicho código de un modo más amable para nosotros. Puedes descargarlo con, por ejemplo wget, que solita la versión text/plain en lugar de la versión text/html.

$ wget https://deno.land/std@0.87.0/examples/welcome.ts
--2021-02-13 23:36:09--  https://deno.land/std@0.87.0/examples/welcome.ts
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving deno.land (deno.land)... 104.21.18.123, 172.67.181.211, 2606:4700:3031::ac43:b5d3, ...
Connecting to deno.land (deno.land)|104.21.18.123|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 33 [application/typescript]
Saving to: ‘welcome.ts’

welcome.ts               100%[===============================>]      33  --.-KB/s    in 0s      

2021-02-13 23:36:10 (34.3 MB/s) - ‘welcome.ts’ saved [33/33]

Si volvieras a ejecutar el programa, como es algo que ya hiciste anteriormente, y Deno cacheó dicho programa, verás que en esta ocasión no lo descargará.

$ deno run https://deno.land/std@0.87.0/examples/welcome.ts
Welcome to Deno!

En todo caso, si quieres que lo vuelva a descargar para asegurarte de que ejecuta la última versión publicada, podrías usar la opción –reload o -r.

$ deno run --reload https://deno.land/std@0.87.0/examples/welcome.ts
Download https://deno.land/std@0.87.0/examples/welcome.ts
Compile https://deno.land/std@0.87.0/examples/welcome.ts
Welcome to Deno!

Deno run tiene, además de esta, muchísimas opciones más. Para conocerlas ejecutar el comando deno run –help.

$ deno run --help
deno-run 
Run a program given a filename or url to the module.

By default all programs are run in sandbox without access to disk, network or
ability to spawn subprocesses.
  deno run https://deno.land/std/examples/welcome.ts

Grant all permissions:
  deno run -A https://deno.land/std/http/file_server.ts

Grant permission to read from disk and listen to network:
  deno run --allow-read --allow-net https://deno.land/std/http/file_server.ts

Grant permission to read whitelisted files from disk:
  deno run --allow-read=/etc https://deno.land/std/http/file_server.ts

USAGE:
    deno run [OPTIONS] <SCRIPT_ARG>...

OPTIONS:
    -A, --allow-all                    
            Allow all permissions

        --allow-env                    
            Allow environment access

        --allow-hrtime                 
            Allow high resolution time measurement

        --allow-net=<allow-net>        
            Allow network access

        --allow-plugin                 
            Allow loading plugins

        --allow-read=<allow-read>      
            Allow file system read access

        --allow-run                    
            Allow running subprocesses

        --allow-write=<allow-write>    
            Allow file system write access

        --cached-only                  
            Require that remote dependencies are already cached

        --cert <FILE>                  
            Load certificate authority from PEM encoded file

    -c, --config <FILE>                
            Load tsconfig.json configuration file

    -h, --help                         
            Prints help information

        --importmap <FILE>             
            UNSTABLE:
            Load import map file
            Docs: https://deno.land/std/manual.md#import-maps
            Specification: https://wicg.github.io/import-maps/
            Examples: https://github.com/WICG/import-maps#the-import-map
        --inspect=<HOST:PORT>          
            activate inspector on host:port (default: 127.0.0.1:9229)

        --inspect-brk=<HOST:PORT>      
            activate inspector on host:port and break at start of user script

        --lock <FILE>                  
            Check the specified lock file

        --lock-write                   
            Write lock file. Use with --lock.

    -L, --log-level <log-level>        
            Set log level [possible values: debug, info]

        --no-remote                    
            Do not resolve remote modules

    -q, --quiet                        
            Suppress diagnostic output
            By default, subcommands print human-readable diagnostic messages to stderr.
            If the flag is set, restrict these messages to errors.
    -r, --reload=<CACHE_BLACKLIST>     
            Reload source code cache (recompile TypeScript)
            --reload
              Reload everything
            --reload=https://deno.land/std
              Reload only standard modules
            --reload=https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts
              Reloads specific modules
        --seed <NUMBER>                
            Seed Math.random()

        --unstable                     
            Enable unstable APIs

        --v8-flags=<v8-flags>          
            Set V8 command line options. For help: --v8-flags=--help


ARGS:
    <SCRIPT_ARG>...    
            script args