diff --git a/files/0477beb99a044831d2f9.module.wasm b/files/0477beb99a044831d2f9.module.wasm new file mode 100644 index 0000000..30a8f7e Binary files /dev/null and b/files/0477beb99a044831d2f9.module.wasm differ diff --git a/files/300d6d637e5bf64a16ef.module.wasm b/files/300d6d637e5bf64a16ef.module.wasm new file mode 100644 index 0000000..8a5028e Binary files /dev/null and b/files/300d6d637e5bf64a16ef.module.wasm differ diff --git a/files/5fb8879e6b79b9e20a1c.module.wasm b/files/5fb8879e6b79b9e20a1c.module.wasm new file mode 100644 index 0000000..a51af9f Binary files /dev/null and b/files/5fb8879e6b79b9e20a1c.module.wasm differ diff --git a/files/626c868b7f0abde67fc3.module.wasm b/files/626c868b7f0abde67fc3.module.wasm new file mode 100644 index 0000000..389c0d0 Binary files /dev/null and b/files/626c868b7f0abde67fc3.module.wasm differ diff --git a/files/70fb10772a0bd9e78257.module.wasm b/files/70fb10772a0bd9e78257.module.wasm new file mode 100644 index 0000000..e08c457 Binary files /dev/null and b/files/70fb10772a0bd9e78257.module.wasm differ diff --git a/files/b83462ba388d9d52c585.module.wasm b/files/b83462ba388d9d52c585.module.wasm new file mode 100644 index 0000000..9296658 Binary files /dev/null and b/files/b83462ba388d9d52c585.module.wasm differ diff --git a/files/eab78e09b4c32c8317f1.module.wasm b/files/eab78e09b4c32c8317f1.module.wasm new file mode 100644 index 0000000..c6d7d3e Binary files /dev/null and b/files/eab78e09b4c32c8317f1.module.wasm differ diff --git a/files/main.js b/files/main.js index 88c7a0c..88dad6c 100644 --- a/files/main.js +++ b/files/main.js @@ -1 +1 @@ -(()=>{"use strict";function t(t){return new Promise((function(e,n){var o=new XMLHttpRequest;o.open("GET",t,!0),o.onload=function(){200==o.status?e(JSON.parse(o.response)):n(o.statusText)},o.onerror=function(){n(o.statusText)},o.send()}))}var e,n,o=new Date,r=o.getHours(),a=o.getMinutes();n=a<10?"0"+a:a.toString(),e=r>=0&&r<4?0==r?"Wow it's 12:".concat(a," in the morning... you're up late."):"Wow it's ".concat(r,":").concat(n," in the morning... you're up late."):r>=4&&r<12?"Good Morning!":r>=12&&r<15?"Good Afternoon!":"Good Evening!";const c=$;function i(){return t=this,e=void 0,o=function(){var t,e,n,o;return function(t,e){var n,o,r,a,c={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,i[0]&&(c=0)),c;)try{if(n=1,o&&(r=2&i[0]?o.return:i[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,i[1])).done)return r;switch(o=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,o=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!((r=(r=c.trys).length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){c=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]0&&r[r.length-1])||6!==i[0]&&2!==i[0])){c=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
').concat(e.title,'
\n\t\t\t\t\t\t\t').concat(e.comment,'\n\t\t\t\t\t\t
\n\t\t\t\t\t\t').concat(e.likes,"\n\t\t\t\t\t\n\n\t\t\t\t"))})),t},t}();(function(){return e=this,n=void 0,r=function(){var e,n,o,r,a;return function(t,e){var n,o,r,a,c={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,i[0]&&(c=0)),c;)try{if(n=1,o&&(r=2&i[0]?o.return:i[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,i[1])).done)return r;switch(o=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,o=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!((r=(r=c.trys).length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){c=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]{"use strict";var e,t,n,r,o={519:(e,t,n)=>{n.a(e,(async(e,t)=>{try{var r=n(83),o=n(217),a=n(911),i=n(393),c=e([o]);o=(c.then?(await c)():c)[0];function u(){return e=this,t=void 0,o=function(){var e,t,n,o,a;return function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,r=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]{n.a(e,(async(e,t)=>{try{var r=n(193),o=n(682),a=n(685),i=e([r]);r=(i.then?(await i)():i)[0];function c(e){return t=this,n=void 0,i=function(){var t,n,o,i;return function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,r=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]{n.a(e,(async(e,r)=>{try{n.d(t,{Qq:()=>a.Qq});var o=n(110),a=n(337),i=e([o]);o=(i.then?(await i)():i)[0],(0,a.oT)(o),r()}catch(e){r(e)}}))},337:(e,t,n)=>{var r;function o(e){r=e}n.d(t,{Ek:()=>k,KM:()=>g,Or:()=>A,Qq:()=>b,VQ:()=>j,a2:()=>m,dN:()=>S,iX:()=>_,oT:()=>o,pT:()=>T,qA:()=>E,ug:()=>x}),e=n.hmd(e);var a=new Array(128).fill(void 0);function i(e){return a[e]}a.push(void 0,null,!0,!1);var c=a.length;function u(e){c===a.length&&a.push(a.length+1);var t=c;return c=a[t],a[t]=e,t}var s=new("undefined"==typeof TextDecoder?(0,e.require)("util").TextDecoder:TextDecoder)("utf-8",{ignoreBOM:!0,fatal:!0});s.decode();var l=null;function f(){return null!==l&&0!==l.byteLength||(l=new Uint8Array(r.memory.buffer)),l}function d(e,t){return e>>>=0,s.decode(f().subarray(e,e+t))}var p=null;function h(){return null!==p&&0!==p.byteLength||(p=new Int32Array(r.memory.buffer)),p}function b(){var e,t;try{var n=r.__wbindgen_add_to_stack_pointer(-16);r.greet(n);var o=h()[n/4+0],a=h()[n/4+1];return e=o,t=a,d(o,a)}finally{r.__wbindgen_add_to_stack_pointer(16),r.__wbindgen_free(e,t,1)}}var y=0,w=new("undefined"==typeof TextEncoder?(0,e.require)("util").TextEncoder:TextEncoder)("utf-8"),v="function"==typeof w.encodeInto?function(e,t){return w.encodeInto(e,t)}:function(e,t){var n=w.encode(e);return t.set(n),{read:e.length,written:n.length}};function m(){return u(new Error)}function g(e,t){var n=function(e,t,n){if(void 0===n){var r=w.encode(e),o=t(r.length,1)>>>0;return f().subarray(o,o+r.length).set(r),y=r.length,o}for(var a=e.length,i=t(a,1)>>>0,c=f(),u=0;u127)break;c[i+u]=s}if(u!==a){0!==u&&(e=e.slice(u)),i=n(i,a,a=u+3*e.length,1)>>>0;var l=f().subarray(i+u,i+a);i=n(i,a,u+=v(e,l).written,1)>>>0}return y=u,i}(i(t).stack,r.__wbindgen_malloc,r.__wbindgen_realloc),o=y;h()[e/4+1]=o,h()[e/4+0]=n}function _(e,t){var n,o;try{n=e,o=t,console.error(d(e,t))}finally{r.__wbindgen_free(n,o,1)}}function x(e){var t;i(t=e),function(e){e<132||(a[e]=c,c=e)}(t)}function T(e){return u(e)}function k(e){return i(e).getTime()}function S(e){return i(e).getTimezoneOffset()}function E(e){return u(new Date(i(e)))}function j(){return u(new Date)}function A(e,t){throw new Error(d(e,t))}},911:(e,t,n)=>{n.d(t,{J:()=>o});var r=function(){},o=function(){function e(e){this.data=e}return Object.defineProperty(e.prototype,"property",{get:function(){return this.data.modhash},enumerable:!1,configurable:!0}),e.prototype.getdata=function(){var e=this.data.data.children,t=new Array;return e.forEach((function(e){var n=new r;n.title=e.data.link_title,n.comment=e.data.body,n.subreddit=e.data.subreddit,n.link=e.data.link_permalink,n.hash=e.data.modhash,n.likes=e.data.score,t.push(n)})),t},e}()},393:(e,t,n)=>{n.d(t,{A:()=>r});var r=function(){function e(e){this.data=e}return Object.defineProperty(e.prototype,"property",{get:function(){return this.data[0].hash},enumerable:!1,configurable:!0}),e.prototype.construct_il=function(){var e=new Array;return this.data.forEach((function(t){e.push('\n\t\t\t\t\t
  • \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    ').concat(t.title,'
    \n\t\t\t\t\t\t\t').concat(t.comment,'\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t').concat(t.likes,"\n\t\t\t\t\t
  • \n\n\t\t\t\t"))})),e},e}()},83:(e,t,n)=>{function r(e){return new Promise((function(t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.onload=function(){200==r.status?t(JSON.parse(r.response)):n(r.statusText)},r.onerror=function(){n(r.statusText)},r.send()}))}n.d(t,{U:()=>r})},193:(e,t,n)=>{n.a(e,(async(e,r)=>{try{n.d(t,{Q:()=>o});var o,a=n(568),i=e([a]),c=(0,(a=(i.then?(await i)():i)[0]).Qq)();console.log(c),o="m"===c?"Good Morning!":"a"===c?"Good Afternoon!":"e"===c?"Good Evening!":"You're up late!",r()}catch(e){r(e)}}))},682:(e,t,n)=>{n.d(t,{g:()=>i});const r=$;var o=function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{u(r.next(e))}catch(e){a(e)}}function c(e){try{u(r.throw(e))}catch(e){a(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,c)}u((r=r.apply(e,t||[])).next())}))},a=function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,r=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]{e.exports=bootstrap},110:(e,t,n)=>{var r=n(337);e.exports=n.v(t,e.id,"626c868b7f0abde67fc3",{"./pweb_bg.js":{__wbg_new_abda76e883ba8a5f:r.a2,__wbg_stack_658279fe44541cf6:r.KM,__wbg_error_f851667af71bcfc6:r.iX,__wbindgen_object_drop_ref:r.ug,__wbindgen_number_new:r.pT,__wbg_getTime_0e03c3f524be31ef:r.Ek,__wbg_getTimezoneOffset_840b552f34917133:r.dN,__wbg_new_a9d80688888b4894:r.qA,__wbg_new0_7a6141101f2206da:r.VQ,__wbindgen_throw:r.Or}})}},a={};function i(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,loaded:!1,exports:{}};return o[e](n,n.exports,i),n.loaded=!0,n.exports}e="function"==typeof Symbol?Symbol("webpack queues"):"__webpack_queues__",t="function"==typeof Symbol?Symbol("webpack exports"):"__webpack_exports__",n="function"==typeof Symbol?Symbol("webpack error"):"__webpack_error__",r=e=>{e&&e.d<1&&(e.d=1,e.forEach((e=>e.r--)),e.forEach((e=>e.r--?e.r++:e())))},i.a=(o,a,i)=>{var c;i&&((c=[]).d=-1);var u,s,l,f=new Set,d=o.exports,p=new Promise(((e,t)=>{l=t,s=e}));p[t]=d,p[e]=e=>(c&&e(c),f.forEach(e),p.catch((e=>{}))),o.exports=p,a((o=>{var a;u=(o=>o.map((o=>{if(null!==o&&"object"==typeof o){if(o[e])return o;if(o.then){var a=[];a.d=0,o.then((e=>{i[t]=e,r(a)}),(e=>{i[n]=e,r(a)}));var i={};return i[e]=e=>e(a),i}}var c={};return c[e]=e=>{},c[t]=o,c})))(o);var i=()=>u.map((e=>{if(e[n])throw e[n];return e[t]})),s=new Promise((t=>{(a=()=>t(i)).r=0;var n=e=>e!==c&&!f.has(e)&&(f.add(e),e&&!e.d&&(a.r++,e.push(a)));u.map((t=>t[e](n)))}));return a.r?s:i()}),(e=>(e?l(p[n]=e):s(d),r(c)))),c&&c.d<0&&(c.d=0)},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.v=(e,t,n,r)=>{var o=fetch(i.p+""+n+".module.wasm");return"function"==typeof WebAssembly.instantiateStreaming?WebAssembly.instantiateStreaming(o,r).then((t=>Object.assign(e,t.instance.exports))):o.then((e=>e.arrayBuffer())).then((e=>WebAssembly.instantiate(e,r))).then((t=>Object.assign(e,t.instance.exports)))},(()=>{var e;i.g.importScripts&&(e=i.g.location+"");var t=i.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var r=n.length-1;r>-1&&!e;)e=n[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=e})(),i(519)})(); \ No newline at end of file diff --git a/index.html b/index.html index c4be449..ec6c5c2 100644 --- a/index.html +++ b/index.html @@ -58,7 +58,7 @@
    -

    Hello there! Welcome to my little nook. This page is a work in progress...

    +

    Hello there! Welcome to my little nook. This page is a work in progress... over-engineered using TypeScript and WASM.

    My name is Dan: I am a dad, a software development engineer, a lifelong learner, and a service member in the US Armed Forces.

    I am a full stack developer with a heavier emphasis in the back-end and data science.

    @@ -83,6 +83,10 @@ Kubernetes +
  • + + WebAssembly +
  • Docker @@ -165,7 +169,7 @@
  • -

    Last Updated: 2024-01-02

    +

    Last Updated: 2024-02-18

    Public Key
    diff --git a/src/material.ts b/src/material.ts index 51a8a58..decf703 100644 --- a/src/material.ts +++ b/src/material.ts @@ -1,6 +1,6 @@ // import * as $ from "jquery"; -import {greeting} from "./time"; -import {vidGen} from "./video"; +import { greeting } from "./time"; +import { vidGen } from "./video"; import * as BS from "bootstrap"; // window.showem = function(iden) { @@ -12,10 +12,10 @@ import * as BS from "bootstrap"; // let mCollection = new Object; // function timer(ms: number) { - return new Promise(resolve => setTimeout(() => resolve(true), ms)); + return new Promise(resolve => setTimeout(() => resolve(true), ms)); } async function startToast(x: number) { - await timer(x); + await timer(x); let toastLive = document.getElementById('liveToast'); let toastbody = document.querySelector('#liveToast .toast-body'); let toastheader = document.querySelector('#liveToast .me-auto'); @@ -31,18 +31,22 @@ async function startToast(x: number) { // mCollection.sidenav[0].close(); // } // -document.addEventListener('DOMContentLoaded', function() { - // let elems = [ - // document.querySelectorAll('.collapsible'), - // document.querySelectorAll('.tooltipped'), - // document.querySelectorAll('.sidenav'), - // ]; - // mCollection.collInst = M.Collapsible.init(elems[0]); - // mCollection.toolInst = M.Tooltip.init(elems[1], {"position": "right"}); - // mCollection.sidenav = M.Sidenav.init(elems[2]); - startToast(5000).then(() => console.log("Toast has launched!")); - vidGen(); - console.log("STARTING!"); +document.addEventListener('readystatechange', function() { + if (document.readyState === "complete") { + // let elems = [ + // document.querySelectorAll('.collapsible'), + // document.querySelectorAll('.tooltipped'), + // document.querySelectorAll('.sidenav'), + // ]; + // mCollection.collInst = M.Collapsible.init(elems[0]); + // mCollection.toolInst = M.Tooltip.init(elems[1], {"position": "right"}); + // mCollection.sidenav = M.Sidenav.init(elems[2]); + console.log("STARTING!"); + startToast(5000).then(() => console.log("Toast has launched!")); + vidGen(); + console.log("STARTED!"); + + } }); // // document.querySelector("#menu").addEventListener("click", function() { diff --git a/src/pweb/.appveyor.yml b/src/pweb/.appveyor.yml new file mode 100644 index 0000000..50910bd --- /dev/null +++ b/src/pweb/.appveyor.yml @@ -0,0 +1,11 @@ +install: + - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe + - if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly + - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin + - rustc -V + - cargo -V + +build: false + +test_script: + - cargo test --locked diff --git a/src/pweb/.github/dependabot.yml b/src/pweb/.github/dependabot.yml new file mode 100644 index 0000000..7377d37 --- /dev/null +++ b/src/pweb/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: +- package-ecosystem: cargo + directory: "/" + schedule: + interval: daily + time: "08:00" + open-pull-requests-limit: 10 diff --git a/src/pweb/.gitignore b/src/pweb/.gitignore new file mode 100644 index 0000000..4e30131 --- /dev/null +++ b/src/pweb/.gitignore @@ -0,0 +1,6 @@ +/target +**/*.rs.bk +Cargo.lock +bin/ +pkg/ +wasm-pack.log diff --git a/src/pweb/.travis.yml b/src/pweb/.travis.yml new file mode 100644 index 0000000..7a91325 --- /dev/null +++ b/src/pweb/.travis.yml @@ -0,0 +1,69 @@ +language: rust +sudo: false + +cache: cargo + +matrix: + include: + + # Builds with wasm-pack. + - rust: beta + env: RUST_BACKTRACE=1 + addons: + firefox: latest + chrome: stable + before_script: + - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) + - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) + - cargo install-update -a + - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f + script: + - cargo generate --git . --name testing + # Having a broken Cargo.toml (in that it has curlies in fields) anywhere + # in any of our parent dirs is problematic. + - mv Cargo.toml Cargo.toml.tmpl + - cd testing + - wasm-pack build + - wasm-pack test --chrome --firefox --headless + + # Builds on nightly. + - rust: nightly + env: RUST_BACKTRACE=1 + before_script: + - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) + - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) + - cargo install-update -a + - rustup target add wasm32-unknown-unknown + script: + - cargo generate --git . --name testing + - mv Cargo.toml Cargo.toml.tmpl + - cd testing + - cargo check + - cargo check --target wasm32-unknown-unknown + - cargo check --no-default-features + - cargo check --target wasm32-unknown-unknown --no-default-features + - cargo check --no-default-features --features console_error_panic_hook + - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook + - cargo check --no-default-features --features "console_error_panic_hook wee_alloc" + - cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc" + + # Builds on beta. + - rust: beta + env: RUST_BACKTRACE=1 + before_script: + - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) + - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) + - cargo install-update -a + - rustup target add wasm32-unknown-unknown + script: + - cargo generate --git . --name testing + - mv Cargo.toml Cargo.toml.tmpl + - cd testing + - cargo check + - cargo check --target wasm32-unknown-unknown + - cargo check --no-default-features + - cargo check --target wasm32-unknown-unknown --no-default-features + - cargo check --no-default-features --features console_error_panic_hook + - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook + # Note: no enabling the `wee_alloc` feature here because it requires + # nightly for now. diff --git a/src/pweb/Cargo.toml b/src/pweb/Cargo.toml new file mode 100644 index 0000000..fcb2a90 --- /dev/null +++ b/src/pweb/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "pweb" +version = "0.1.0" +authors = ["Daniel Choi "] +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +default = ["console_error_panic_hook"] + +[dependencies] +wasm-bindgen = "0.2.84" + +# The `console_error_panic_hook` crate provides better debugging of panics by +# logging them with `console.error`. This is great for development, but requires +# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for +# code size when deploying. +console_error_panic_hook = { version = "0.1.7", optional = true } +chrono = { version = "0.4.34", features = ["wasmbind"] } + +[dev-dependencies] +wasm-bindgen-test = "0.3.34" + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" diff --git a/src/pweb/LICENSE_APACHE b/src/pweb/LICENSE_APACHE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/src/pweb/LICENSE_APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/src/pweb/LICENSE_MIT b/src/pweb/LICENSE_MIT new file mode 100644 index 0000000..8c1d392 --- /dev/null +++ b/src/pweb/LICENSE_MIT @@ -0,0 +1,25 @@ +Copyright (c) 2018 Daniel Choi + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/src/pweb/README.md b/src/pweb/README.md new file mode 100644 index 0000000..6b68408 --- /dev/null +++ b/src/pweb/README.md @@ -0,0 +1,84 @@ +
    + +

    wasm-pack-template

    + + A template for kick starting a Rust and WebAssembly project using wasm-pack. + +

    + Build Status +

    + +

    + Tutorial + | + Chat +

    + + Built with 🦀🕸 by The Rust and WebAssembly Working Group +
    + +## About + +[**📚 Read this template tutorial! 📚**][template-docs] + +This template is designed for compiling Rust libraries into WebAssembly and +publishing the resulting package to NPM. + +Be sure to check out [other `wasm-pack` tutorials online][tutorials] for other +templates and usages of `wasm-pack`. + +[tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html +[template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html + +## 🚴 Usage + +### 🐑 Use `cargo generate` to Clone this Template + +[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate) + +``` +cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project +cd my-project +``` + +### 🛠️ Build with `wasm-pack build` + +``` +wasm-pack build +``` + +### 🔬 Test in Headless Browsers with `wasm-pack test` + +``` +wasm-pack test --headless --firefox +``` + +### 🎁 Publish to NPM with `wasm-pack publish` + +``` +wasm-pack publish +``` + +## 🔋 Batteries Included + +* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating + between WebAssembly and JavaScript. +* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook) + for logging panic messages to the developer console. +* `LICENSE-APACHE` and `LICENSE-MIT`: most Rust projects are licensed this way, so these are included for you + +## License + +Licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally +submitted for inclusion in the work by you, as defined in the Apache-2.0 +license, shall be dual licensed as above, without any additional terms or +conditions. diff --git a/src/pweb/src/lib.rs b/src/pweb/src/lib.rs new file mode 100644 index 0000000..570e493 --- /dev/null +++ b/src/pweb/src/lib.rs @@ -0,0 +1,26 @@ +mod utils; + +use chrono::Timelike; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn greet() -> String { + utils::set_panic_hook(); + + let time = chrono::offset::Local::now(); + let hour = time.hour(); + + if (4..12).contains(&hour) { + // morning + "m".to_string() + } else if (12..17).contains(&hour) { + // afternoon + "a".to_string() + } else if (0..4).contains(&hour) { + // evening + "l".to_string() + } else { + // late + "e".to_string() + } +} diff --git a/src/pweb/src/utils.rs b/src/pweb/src/utils.rs new file mode 100644 index 0000000..b1d7929 --- /dev/null +++ b/src/pweb/src/utils.rs @@ -0,0 +1,10 @@ +pub fn set_panic_hook() { + // When the `console_error_panic_hook` feature is enabled, we can call the + // `set_panic_hook` function at least once during initialization, and then + // we will get better error messages if our code ever panics. + // + // For more details see + // https://github.com/rustwasm/console_error_panic_hook#readme + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); +} diff --git a/src/pweb/tests/web.rs b/src/pweb/tests/web.rs new file mode 100644 index 0000000..de5c1da --- /dev/null +++ b/src/pweb/tests/web.rs @@ -0,0 +1,13 @@ +//! Test suite for the Web and headless browsers. + +#![cfg(target_arch = "wasm32")] + +extern crate wasm_bindgen_test; +use wasm_bindgen_test::*; + +wasm_bindgen_test_configure!(run_in_browser); + +#[wasm_bindgen_test] +fn pass() { + assert_eq!(1 + 1, 2); +} diff --git a/src/time.ts b/src/time.ts index 9ff6157..6ecd070 100644 --- a/src/time.ts +++ b/src/time.ts @@ -1,29 +1,20 @@ +import { greet } from "./pweb/pkg/pweb"; + // Get the time when the site was first opened... -let d = new Date; -let theHour = d.getHours(); -let theMin = d.getMinutes(); let greeting: string; // Greetings -let theStringMin: string; -if (theMin < 10) { - theStringMin = '0' + theMin; -} else { - theStringMin = theMin.toString(); -} +let category = greet(); +console.log(category); -if (theHour >= 0 && theHour < 4) { - if (theHour == 0) { - greeting = `Wow it's 12:${theMin} in the morning... you're up late.`; - } else { - greeting = `Wow it's ${theHour}:${theStringMin} in the morning... you're up late.`; - } -} else if (theHour >= 4 && theHour < 12) { - greeting = "Good Morning!"; -} else if (theHour >= 12 && theHour < 15) { - greeting = "Good Afternoon!"; +if (category === "m") { + greeting = "Good Morning!"; +} else if (category === "a") { + greeting = "Good Afternoon!"; +} else if (category === "e") { + greeting = "Good Evening!"; } else { - greeting = "Good Evening!"; + greeting = "You're up late!"; } -export {greeting}; +export { greeting }; diff --git a/webpack.config.js b/webpack.config.js index 33ca928..307573d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -24,6 +24,10 @@ module.exports = { resolve: { extensions: ['.tsx', '.ts', '.js'], }, + experiments: { + asyncWebAssembly: true, + syncWebAssembly: true, + }, module: { rules: [{ test: /\.ts|\.js$/,