@tsmodule/tsmodule 15.1.0 → 17.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. package/dist/commands/build/index.js +3 -3
  2. package/dist/commands/create/index.js +1 -1
  3. package/dist/commands/dev/index.js +3 -3
  4. package/dist/commands/execute/index.js +1 -1
  5. package/dist/commands/normalize/index.js +2 -2
  6. package/dist/index.js +1 -1
  7. package/dist/loader/index.js +1 -1
  8. package/dist/package.json +3 -0
  9. package/dist/utils/pkgJson.js +1 -1
  10. package/package.json +5 -5
  11. package/templates/default/.eslintrc +52 -0
  12. package/templates/default/.github/workflows/ci.yml +30 -0
  13. package/templates/default/.gitignore +10 -0
  14. package/templates/default/README.md +5 -0
  15. package/templates/default/package.json +35 -0
  16. package/templates/default/src/index.ts +4 -0
  17. package/templates/default/test/example.test.ts +7 -0
  18. package/templates/default/tsconfig.json +41 -0
  19. package/templates/react/.eslintrc +54 -0
  20. package/templates/react/.gitignore +11 -0
  21. package/templates/react/next-env.d.ts +5 -0
  22. package/templates/react/next.config.js +18 -0
  23. package/templates/react/package.json +38 -0
  24. package/templates/react/postcss.config.js +6 -0
  25. package/templates/react/src/components/Card/index.tsx +13 -0
  26. package/templates/react/src/components/CardGrid/index.tsx +29 -0
  27. package/templates/react/src/components/Footer/index.tsx +19 -0
  28. package/templates/react/src/components/GetStarted/index.tsx +8 -0
  29. package/templates/react/src/components/Welcome/index.tsx +7 -0
  30. package/templates/react/src/components/index.ts +4 -0
  31. package/templates/react/src/index.ts +1 -0
  32. package/templates/react/src/pages/_app.tsx +13 -0
  33. package/templates/react/src/pages/api/hello.ts +13 -0
  34. package/templates/react/src/pages/index.tsx +26 -0
  35. package/templates/react/src/styles/custom/index.css +0 -0
  36. package/templates/react/src/styles/elements/card/index.css +14 -0
  37. package/templates/react/src/styles/elements/index.css +1 -0
  38. package/templates/react/src/styles/index.css +253 -0
  39. package/templates/react/src/styles/viewport/index.css +26 -0
  40. package/templates/react/src/utils/globs.ts +1 -0
  41. package/templates/react/tailwind.config.js +21 -0
@@ -1,3 +1,3 @@
1
- import{build as T}from"esbuild";import{existsSync as O,readFileSync as k,writeFileSync as x}from"fs";import{extname as B,isAbsolute as D,resolve as C,resolve as d}from"path";import m from"chalk";import{copy as P}from"fs-extra";import{env as h}from"process";import J from"fs/promises";import W from"fast-glob";import l from"ora";import{createDebugLogger as $,log as g}from"create-debug-logger";import{isJsOrTs as v,isTs as p,isTsxOrJsx as a}from"../../utils/index.js";import{emitTsDeclarations as G}from"./lib/emitTsDeclarations.js";import{getPackageJsonFile as _}from"../../utils/pkgJson.js";import{normalizeImportSpecifiers as A}from"../normalize/index.js";const E=t=>{g(m.bgBlue(m.white(` ${t} `)))},L=async({files:t="src/**/*",dev:o=!1,fast:y=!1})=>{h.NODE_ENV=o?"development":"production";const s=$(L);s.log("Building",{files:t,dev:o,fast:y}),E(`${m.bold("TS Module")} [${h.NODE_ENV}]`);const F=await _(),r=process.cwd(),S={absWorkingDir:r,outbase:"src",outdir:"dist",assetNames:"[name].js",logLevel:o?"warning":"error",charset:"utf8",format:"esm",target:"esnext",minify:!o,define:{PACKAGE_JSON:F}},f=d(r,"src"),i=d(r,"dist");if(D(t)){const e=t.replace(f,i).replace(p,".js").replace(a,".js");s.log("Cleaning emitted file:",{outfile:e}),await J.rm(e,{force:!0})}else s.log("Cleaning old output:",{outDir:i}),await J.rm(i,{force:!0,recursive:!0});console.log();const n=W.sync(t,{cwd:r}).filter(e=>B(e)!==".d.ts").map(e=>d(e)),j=n.filter(e=>p.test(e)).filter(e=>!a.test(e));s.log("Compiling TS files:",{tsFiles:j}),await T({...S,entryPoints:j.filter(e=>!e.endsWith(".d.ts"))}),l("Built TS files.").succeed();const b=n.filter(e=>a.test(e));s.log("Compiling TSX files:",{tsxFiles:b}),await T({...S,entryPoints:b.filter(e=>!e.endsWith(".d.ts")),jsxFactory:"createElement",banner:{js:`import { createElement } from "react";
2
- `}}),l("Built TSX files.").succeed();const N=n.filter(e=>!v.test(e));if(s.log("Copying non-JS/TS files."),await Promise.all(N.map(async e=>{const w=C(r,e).replace(f,i).replace(p,".js").replace(a,".js");s.log("Copying non-source file:",{file:e,outfile:w}),await P(e,w)})),process.env.NO_REWRITES)return;const u=t.replace(f,i).replace(/^(\.\/)?src\//,"dist/").replace(p,".js").replace(a,".js");if(await A(u.endsWith(".js")?u:`${u}.js`),l("Normalized import specifiers.").succeed(),console.log(),o||y)return;E("Running post-build setup."),g(`Generating type declarations.
3
- This might take a moment.`),G(n),l(`Generated delcarations for ${n.length} files.`).succeed();let c;O("dist/package.json")?c=JSON.parse(k("dist/package.json","utf-8")):c={},c.type="module",x("dist/package.json",JSON.stringify(c,null,2)),l('Forced "type": "module" in output.').succeed(),g(m.green("Build complete."))};export{E as bannerLog,L as build};
1
+ import{build as T}from"esbuild";import{extname as E,isAbsolute as F,resolve as N,resolve as u}from"path";import{existsSync as O,readFileSync as x,rmSync as h,writeFileSync as D}from"fs";import l from"chalk";import{copy as P}from"fs-extra";import{env as w}from"process";import B from"fast-glob";import c from"ora";import{createDebugLogger as C,log as d}from"create-debug-logger";import{isJsOrTs as W,isTs as m,isTsxOrJsx as a}from"../../utils/index.js";import{emitTsDeclarations as $}from"./lib/emitTsDeclarations.js";import{getPackageJsonFile as v}from"../../utils/pkgJson.js";import{normalizeImportSpecifiers as G}from"../normalize/index.js";const J=t=>{const s=` ${t} `;d(l.bgBlue(l.bold(l.white(s))))},_=()=>{let t;if(O("dist/package.json")?t=JSON.parse(x("dist/package.json","utf-8")):t={},t?.module==="module")return!0;t.type="module",D("dist/package.json",JSON.stringify(t,null,2))},A=async({files:t="src/**/*",dev:s=!1,fast:g=!1})=>{w.NODE_ENV=s?"development":"production";const r=C(A);r.log("Building",{files:t,dev:s,fast:g}),J(`${l.bold("TS Module")} [${w.NODE_ENV}]`);const k=await v(),i=process.cwd(),f={absWorkingDir:i,outbase:"src",outdir:"dist",assetNames:"[name].js",logLevel:s?"warning":"error",charset:"utf8",format:"esm",target:"esnext",minify:!s,define:{PACKAGE_JSON:k}},p=u(i,"src"),n=u(i,"dist"),o=B.sync(t,{cwd:i}).filter(e=>E(e)!==".d.ts").map(e=>u(e));if(F(t)){o.length||o.push(t);const e=t.replace(p,n).replace(m,".js").replace(a,".js");r.log("Cleaning emitted file:",{outfile:e}),h(e,{force:!0})}else r.log("Cleaning old output:",{outDir:n}),h(n,{force:!0,recursive:!0});console.log();const y=o.filter(e=>m.test(e)).filter(e=>!a.test(e));r.log("Compiling TS files:",{tsFiles:y}),await T({...f,entryPoints:y.filter(e=>!e.endsWith(".d.ts"))}),c("Built TS files.").succeed();const S=o.filter(e=>a.test(e));r.log("Compiling TSX files:",{tsxFiles:S}),await T({...f,entryPoints:S.filter(e=>!e.endsWith(".d.ts")),jsxFactory:"createElement",banner:{js:`import { createElement } from "react";
2
+ `}}),c("Built TSX files.").succeed();const b=o.filter(e=>!W.test(e));if(r.log("Copying non-JS/TS files.",{allFiles:o,nonJsTsFiles:b}),await Promise.all(b.map(async e=>{const j=N(i,e).replace(p,n).replace(m,".js").replace(a,".js");r.log("Copying non-source file:",{file:e,outfile:j}),await P(e,j)})),!process.env.NO_REWRITES){const e=t.replace(p,n).replace(/^(\.\/)?src\//,"dist/").replace(m,".js").replace(a,".js");await G(e.endsWith(".js")?e:`${e}.js`),c("Normalized import specifiers.").succeed()}_()&&c('Forced "type": "module" in output.').succeed(),console.log(),!(s||g)&&(J("Running post-build setup."),d(`Generating type declarations.
3
+ This might take a moment.`),$(o),c(`Generated delcarations for ${o.length} files.`).succeed(),d(l.green("Build complete.")))};export{J as bannerLog,A as build};
@@ -1 +1 @@
1
- import o from"chalk";import c from"ora";import{shell as r}from"await-shell";import{createTemplate as a}from"./lib/createTemplate.js";import{rewritePkgJson as d}from"./lib/rewritePkgJson.js";globalThis.SHELL_OPTIONS={stdio:["ignore","ignore","inherit"]};const h=async(e,{react:s=!1})=>{const t=c(`Creating new module ${o.blueBright(e)}.`).start();await a("default",e),s&&await a("react",e),await d(e),t.succeed("Project created."),process.chdir(e);const i=[],n=["@tsmodule/tsmodule"];s&&(i.push("react","react-dom"),n.push("next","eslint-config-next","tailwindcss","postcss","autoprefixer")),t.start("Installing dependencies."),i.length&&await r(`yarn add ${i.join(" ")}`),n.length&&await r(`yarn add -D ${n.join(" ")}`),t.succeed("Dependencies installed."),t.start("Initializing git."),await r("git init"),t.succeed("Git initialized.")};export{h as create};
1
+ import o from"chalk";import{createShell as c}from"await-shell";import d from"ora";import{createTemplate as a}from"./lib/createTemplate.js";import{rewritePkgJson as l}from"./lib/rewritePkgJson.js";globalThis.SHELL_OPTIONS={stdio:["ignore","ignore","inherit"]};const w=async(e,{react:s=!1})=>{const i=c(),t=d(`Creating new module ${o.blueBright(e)}.`).start();await a("default",e),s&&await a("react",e),await l(e),t.succeed("Project created. Installing dependencies."),process.chdir(e);const n=[],r=["@tsmodule/tsmodule"];s&&(n.push("react","react-dom"),r.push("next","eslint-config-next","tailwindcss","postcss","autoprefixer")),n.length&&await i.run(`yarn add ${n.join(" ")}`),r.length&&await i.run(`yarn add -D ${r.join(" ")}`),t.succeed("Dependencies installed. Initializing git."),await i.run("git init"),t.succeed("Git initialized.")};export{w as create};
@@ -1,3 +1,3 @@
1
- import{relative as a,resolve as m}from"path";import{build as o}from"../build/index.js";import e from"chalk";import{log as l}from"create-debug-logger";import p from"ora";import{shell as d}from"await-shell";import u from"node-watch";const s=()=>{console.clear()},i=r=>{l(`
2
- `,e.gray(`Built ${e.bold(r)}.`),`
3
- `,e.blue(new Date().toLocaleString()))},B=async()=>{const r=process.cwd();await d("clear"),s(),await o({dev:!0}),i("src/**/*"),u(m(r,"src"),{recursive:!0,persistent:!0}).on("change",async(f,t)=>{s();const c=Date.now();await o({dev:!0,files:t});const n=Date.now()-c;p(e.blueBright(`Dev refresh finished in ${e.bold(`${n}ms`)}.`)).succeed(),i(a(r,t))})};export{B as dev};
1
+ import{relative as a,resolve as m}from"path";import{build as s}from"../build/index.js";import r from"chalk";import{createShell as p}from"await-shell";import{existsSync as u,lstatSync as f}from"fs";import{log as d}from"create-debug-logger";import w from"ora";import g from"node-watch";const o=()=>{console.clear()},i=t=>{d(`
2
+ `,r.gray(`Built ${r.bold(t)}.`),`
3
+ `,r.blue(new Date().toLocaleString()))},L=async()=>{const t=process.cwd(),n=p();process.platform!=="win32"&&await n.run("clear"),o(),await s({dev:!0}),i("src/**/*"),g(m(t,"src"),{recursive:!0,persistent:!0}).on("change",async(v,e)=>{if(!u(e)||!f(e).isFile())return;o();const c=Date.now();await s({dev:!0,files:e});const l=Date.now()-c;w(r.blueBright(`Dev refresh finished in ${r.bold(`${l}ms`)}.`)).succeed(),i(a(t,e))})};export{L as dev};
@@ -1 +1 @@
1
- import{URL as n}from"url";import{shell as s}from"await-shell";const l=async()=>{const e=import.meta.url,o=new n("../../../dist/loader/index.js",e),r=["--no-warnings","--loader",o.href,...process.argv.slice(2)];await s(`node ${r.join(" ")}`)};export{l as execute};
1
+ import{URL as n}from"url";import{createShell as s}from"await-shell";const i=async()=>{const e=import.meta.url,o=new n("../../../dist/loader/index.js",e),r=["--no-warnings","--loader",o.href,...process.argv.slice(2)];await s().run(`node ${r.join(" ")}`)};export{i as execute};
@@ -1,2 +1,2 @@
1
- import{promises as g}from"fs";import $ from"fast-glob";import{pathToFileURL as x}from"url";import{resolve as E}from"path";import{createDebugLogger as d}from"create-debug-logger";import{getRewrittenSpecifiers as y}from"./lib/typescriptApi.js";const I=t=>{const r=`[^
2
- \r;]*`,o=t.replace(".","\\.").replace("/","\\/"),n=`${r}["']${o}["']${r}`,e=`(import${r}from)`,i=`(import|require)${r}\\(`,s=`(export${r}from)`;return new RegExp(`(${e}|${i}|${s})${n}`,"g")},u=(t,r,o)=>{d(u).log("Rewriting import",{importStatement:t,specifierToReplace:r,specifierReplacement:o});const[,e]=t.split(/from|\(/),i=e.replace(r,o).trim();return t.replace(e,i)},P=async(t="dist/**/*.js")=>{const r=d(P),o=await $(t,{cwd:process.cwd()});r.log("Normalizing import/require specifiers:",{filesToNormalize:o});for(const n of o){const e=E(n),i=x(e).href,s=y(e);if(!s)return null;r.log("TypeScript API yielded specifiers to rewrite:",{rewrites:s});let p=await g.readFile(e,"utf8");r.group();for(const{specifierToReplace:c,specifierReplacement:a}of s){const w=I(c),l=p.match(w)??[];r.log("Replacing import statements.",{entryPointURL:i,specifierToReplace:c,specifierReplacement:a,importStatements:l});for(const m of l){r.group();const f=u(m,c,a);r.log("Performing specifier rewrite.",{entryPointURL:i,importStatement:m,rewrittenImportStatement:f}),p=p.replace(m,f),await g.writeFile(e,p),r.log("Wrote output file.",{resolvedEntryPoint:e}),r.groupEnd()}}r.groupEnd()}};export{I as generateImportPattern,P as normalizeImportSpecifiers,u as rewriteImportStatement};
1
+ import{readFileSync as w,writeFileSync as $}from"fs";import y from"fast-glob";import{pathToFileURL as S}from"url";import{resolve as x}from"path";import{createDebugLogger as g}from"create-debug-logger";import{getRewrittenSpecifiers as E}from"./lib/typescriptApi.js";const I=t=>{const r=`[^
2
+ \r;]*`,o=t.replace(".","\\.").replace("/","\\/"),s=`${r}["']${o}["']${r}`,e=`(import${r}from)`,i=`(import|require)${r}\\(`,n=`(export${r}from)`;return new RegExp(`(${e}|${i}|${n})${s}`,"g")},d=(t,r,o)=>{g(d).log("Rewriting import",{importStatement:t,specifierToReplace:r,specifierReplacement:o});const[,e]=t.split(/from|\(/),i=e.replace(r,o).trim();return t.replace(e,i)},P=async(t="dist/**/*.js")=>{const r=g(P),o=await y(t,{cwd:process.cwd()});r.log("Normalizing import/require specifiers:",{filesToNormalize:o});for(const s of o){const e=x(s),i=S(e).href,n=E(e);if(!n)return null;r.log("TypeScript API yielded specifiers to rewrite:",{rewrites:n});let c=w(e,"utf8");r.group();for(const{specifierToReplace:p,specifierReplacement:l}of n){const u=I(p),a=c.match(u)??[];r.log("Replacing import statements.",{entryPointURL:i,specifierToReplace:p,specifierReplacement:l,importStatements:a});for(const m of a){r.group();const f=d(m,p,l);r.log("Performing specifier rewrite.",{entryPointURL:i,importStatement:m,rewrittenImportStatement:f}),c=c.replace(m,f),$(e,c),r.log("Wrote output file.",{resolvedEntryPoint:e}),r.groupEnd()}}r.groupEnd()}};export{I as generateImportPattern,P as normalizeImportSpecifiers,d as rewriteImportStatement};
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var r="@tsmodule/tsmodule",a="module",m="15.1.0",d="tsmodule/tsmodule",s="TypeScript Module loader and compiler",l="MIT",c={tsmodule:"dist/index.js"},p={".":"./dist/loader/index.js","./*":"./dist/*/index.js","./package.json":"./package.json"},u="dist/types/index.d.ts",f=[{name:"C. Lewis",email:"ctj.lewis@icloud.com",url:"https://ctjlewis.com"}],b=["dist/","template/"],v={node:">=14"},g={bootstrap:"node bootstrap.js",bootload:"node --no-warnings --loader ./dist/loader/index.js src/index.ts build -f",prebuild:"yarn bootstrap && yarn bootload && yarn link -f",build:"tsmodule build",dev:"tsmodule dev",lint:"eslint --fix src",prepare:"yarn build -f",prepublishOnly:"yarn build && yarn test",pretest:"yarn build -f",test:"ava --no-worker-threads"},h={"@types/node":"^17.0.15","@types/react":"^17.0.39","@types/react-dom":"^17.0.11","@typescript-eslint/eslint-plugin":"^5.9.1","@typescript-eslint/parser":"^5.9.1",ava:"^4.0.1","await-shell":"^16.0.0",chalk:"^5.0.0",commander:"^8.3.0","create-debug-logger":"^1.10.1",esbuild:"^0.14.0",eslint:"^8.8.0","fast-glob":"^3.2.10","fs-extra":"^10.0.0","node-watch":"^0.7.3",ora:"^6.0.1",path:"^0.12.7",typescript:"^4.5.5"},S=["esm","loader","typescript","loader hook","require hook","experimental-loader"],w={timeout:"10 minutes",files:["test/**/*.test.ts"],extensions:{ts:"module"},nodeArguments:["--no-warnings","--loader=@tsmodule/tsmodule"]},y={"@types/fs-extra":"^9.0.13"},t={name:r,type:a,version:m,repository:d,description:s,license:l,bin:c,exports:p,types:u,contributors:f,files:b,engines:v,scripts:g,dependencies:h,keywords:S,ava:w,devDependencies:y};import e from"chalk";import{Command as T}from"commander";import{build as B}from"./commands/build/index.js";import{create as C}from"./commands/create/index.js";import{dev as R}from"./commands/dev/index.js";import{execute as j}from"./commands/execute/index.js";import{normalizeImportSpecifiers as x}from"./commands/normalize/index.js";const{version:A}=t,i=new T;i.name(e.white(e.bold("tsmodule"))).usage(e.white(e.bold("<file | command> [options]"))).description(e.blueBright(`A tool for building TypeScript modules.
2
+ var r="@tsmodule/tsmodule",a="module",m="17.0.2",d="tsmodule/tsmodule",s="TypeScript Module loader and compiler",l="MIT",c={tsmodule:"dist/index.js"},p={".":"./dist/loader/index.js","./*":"./dist/*/index.js","./package.json":"./package.json"},u="dist/types/index.d.ts",f=[{name:"C. Lewis",email:"ctj.lewis@icloud.com",url:"https://ctjlewis.com"}],b=["dist/","templates/"],v={node:">=14"},g={bootstrap:"node bootstrap.js",bootload:"node --no-warnings --loader ./dist/loader/index.js src/index.ts build -f",prebuild:"yarn bootstrap && yarn bootload && yarn link -f",build:"tsmodule build",dev:"tsmodule dev",lint:"eslint --fix src",prepare:"yarn build -f",prepublishOnly:"yarn build && yarn test",pretest:"yarn build -f",test:"ava --no-worker-threads"},h={"@types/glob":"^7.2.0","@types/node":"^17.0.15","@typescript-eslint/eslint-plugin":"^5.9.1","@typescript-eslint/parser":"^5.9.1",ava:"^4.0.1","await-shell":"^29.0.1-0",chalk:"^5.0.0",commander:"^8.3.0","create-debug-logger":"^1.10.1",esbuild:"^0.14.0",eslint:"^8.8.0","fast-glob":"^3.2.10","fs-extra":"^10.0.0",glob:"^7.2.0","node-watch":"^0.7.3",ora:"^6.0.1",path:"^0.12.7",typescript:"^4.5.5"},S=["esm","loader","typescript","loader hook","require hook","experimental-loader"],w={timeout:"10 minutes",files:["test/**/*.test.ts"],extensions:{ts:"module"},nodeArguments:["--no-warnings","--loader=@tsmodule/tsmodule"]},y={"@types/fs-extra":"^9.0.13"},t={name:r,type:a,version:m,repository:d,description:s,license:l,bin:c,exports:p,types:u,contributors:f,files:b,engines:v,scripts:g,dependencies:h,keywords:S,ava:w,devDependencies:y};import e from"chalk";import{Command as T}from"commander";import{build as B}from"./commands/build/index.js";import{create as C}from"./commands/create/index.js";import{dev as R}from"./commands/dev/index.js";import{execute as j}from"./commands/execute/index.js";import{normalizeImportSpecifiers as x}from"./commands/normalize/index.js";const{version:A}=t,i=new T;i.name(e.white(e.bold("tsmodule"))).usage(e.white(e.bold("<file | command> [options]"))).description(e.blueBright(`A tool for building TypeScript modules.
3
3
 
4
4
  Run TS directly: ${e.bold("tsmodule src/index.ts")}
5
5
  Use a command: ${e.bold("tsmodule build")}`)).version(String(A)),i.command("dev").description("Build and watch for changes.").action(R),i.command("build").option("--files <files>","The files to build (default: all)").option("-d, --dev","Build development version").option("-f, --fast","Do not emit type declarations, only transform to JS").description("Builds TS files to output in dist/.").action(B),i.command("create <name>").option("--react","Create React component library with Next.js").description("Create a new project.").action(C),i.command("normalize [files]").description(`Rewrites import specifiers in files to ESM-compliant paths.
@@ -1 +1 @@
1
- import{extname as m,isAbsolute as U,join as E,normalize as w,resolve as S}from"path";import{fileURLToPath as H,pathToFileURL as v,URL as L}from"url";import{createDebugLogger as c}from"create-debug-logger";import{promises as G}from"fs";import{transform as h}from"esbuild";import{posix as M}from"path";import{win32 as T}from"path";import{checkExtensions as k,checkTsExtensions as D,fileExists as b,isJs as N,isTs as P,MODULE_LOADERS as R}from"../utils/index.js";import{getPackageJsonFile as y}from"../utils/pkgJson.js";const F=await y(),A=async(o,r,t)=>{const{parentURL:s}=r,e=c(A);if(e.log("Resolving specifier:",{importedFromURL:s,specifier:o}),!o.startsWith(".")&&!U(o))return e.log("Using defaultResolve for named module:",{specifier:o}),t(o,r,t);const{href:l}=v(process.cwd()),{href:i}=new L(s||l);e.log("Finding import URL for",{specifier:o,baseURL:i});let n=o;o.startsWith("file://")||(U(o)?(e.log("Setting import URL to absolute specifier."),n=v(S(w(o))).href):(e.log("Setting import URL relative to baseURL."),n=new L(o,i).href),e.log("Resolved import URL:",{importedFileURL:n,importedFromURL:s}));const f=m(s??"").toLowerCase(),d=m(n).toLowerCase();if(e.log("Rewriting file extension:",{parentExtension:f,specifierExtension:d}),d){const a=n.substring(0,n.lastIndexOf(d));if(e.log("Re-resolving specifier:",{unresolvedSpecifier:a}),N.test(d)&&P.test(f)){const p=D(a);if(p)return e.log("Found JS import in TS:",{unresolvedSpecifier:a,resolvedTsSourceFile:p}),{url:p}}return b(a)?(e.log("Found file at unresolved specifier:",{unresolvedSpecifier:a}),{url:a}):t(o,r,t)}e.log("Resolving incomplete URL import to file:",{specifier:o});const g=k(n);if(g)return e.log("Resolved import URL to file:",{resolvedFile:g}),{url:g};const x=new L(E(n,"index")).href,u=k(x);return u?(e.log("Resolved import URL to index file:",{resolvedIndexFile:u}),{url:u}):t(o,r,t)},J=async(o,r,t)=>{const s=c(J);if(s.log("Loading source file:",{url:o}),!o.includes(T.sep)&&!o.includes(M.sep))return s.log("Using defaultLoad for named module:",{url:o}),t(o,r,t);const e=m(o),l=R[e];if(!l)return s.log("No loader found, using defaultLoad:",{url:o}),t(o,r,t);const i=H(o),n=await G.readFile(i),f=await h(n.toString(),{...l,sourcefile:i,format:"esm",define:{PACKAGE_JSON:F}});return{format:"module",source:f.code}},O=async(o,r,t)=>{const s=c(O);s.log("Getting format for source file:",{url:o});const e=m(o);return R[e]?{format:"module"}:(s.log("No loader found, using default format:",{url:o}),t(o,r,t))},B=async(o,r,t)=>{const s=c(B);s.log("Transforming source from context:",{context:r});const{url:e}=r,l=m(e),i=R[l];return i?{source:(await h(o.toString(),{...i,logLevel:"info",charset:"utf8",target:"esnext",sourcefile:r.url,format:r.format==="module"?"esm":"cjs",define:{PACKAGE_JSON:F}})).code}:(s.log("No loader found, using default transformer:",{url:e}),t(o,r,t))};export{O as getFormat,J as load,A as resolve,B as transformSource};
1
+ import{extname as m,isAbsolute as U,join as E,normalize as S,resolve as w}from"path";import{fileURLToPath as H,pathToFileURL as v,URL as L}from"url";import{createDebugLogger as d}from"create-debug-logger";import{readFileSync as G}from"fs";import{transform as h}from"esbuild";import{posix as M}from"path";import{win32 as T}from"path";import{checkExtensions as k,checkTsExtensions as D,fileExists as b,isJs as y,isTs as N,MODULE_LOADERS as R}from"../utils/index.js";import{getPackageJsonFile as P}from"../utils/pkgJson.js";const F=await P(),A=async(o,r,t)=>{const{parentURL:s}=r,e=d(A);if(e.log("Resolving specifier:",{importedFromURL:s,specifier:o}),!o.startsWith(".")&&!U(o))return e.log("Using defaultResolve for named module:",{specifier:o}),t(o,r,t);const{href:l}=v(process.cwd()),{href:i}=new L(s||l);e.log("Finding import URL for",{specifier:o,baseURL:i});let n=o;o.startsWith("file://")||(U(o)?(e.log("Setting import URL to absolute specifier."),n=v(w(S(o))).href):(e.log("Setting import URL relative to baseURL."),n=new L(o,i).href),e.log("Resolved import URL:",{importedFileURL:n,importedFromURL:s}));const f=m(s??"").toLowerCase(),c=m(n).toLowerCase();if(e.log("Rewriting file extension:",{parentExtension:f,specifierExtension:c}),c){const a=n.substring(0,n.lastIndexOf(c));if(e.log("Re-resolving specifier:",{unresolvedSpecifier:a}),y.test(c)&&N.test(f)){const p=D(a);if(p)return e.log("Found JS import in TS:",{unresolvedSpecifier:a,resolvedTsSourceFile:p}),{url:p}}return b(a)?(e.log("Found file at unresolved specifier:",{unresolvedSpecifier:a}),{url:a}):t(o,r,t)}e.log("Resolving incomplete URL import to file:",{specifier:o});const u=k(n);if(u)return e.log("Resolved import URL to file:",{resolvedFile:u}),{url:u};const x=new L(E(n,"index")).href,g=k(x);return g?(e.log("Resolved import URL to index file:",{resolvedIndexFile:g}),{url:g}):t(o,r,t)},J=async(o,r,t)=>{const s=d(J);if(s.log("Loading source file:",{url:o}),!o.includes(T.sep)&&!o.includes(M.sep))return s.log("Using defaultLoad for named module:",{url:o}),t(o,r,t);const e=m(o),l=R[e];if(!l)return s.log("No loader found, using defaultLoad:",{url:o}),t(o,r,t);const i=H(o),n=G(i,"utf8"),f=await h(n.toString(),{...l,sourcefile:i,format:"esm",define:{PACKAGE_JSON:F}});return{format:"module",source:f.code}},O=async(o,r,t)=>{const s=d(O);s.log("Getting format for source file:",{url:o});const e=m(o);return R[e]?{format:"module"}:(s.log("No loader found, using default format:",{url:o}),t(o,r,t))},B=async(o,r,t)=>{const s=d(B);s.log("Transforming source from context:",{context:r});const{url:e}=r,l=m(e),i=R[l];return i?{source:(await h(o.toString(),{...i,logLevel:"info",charset:"utf8",target:"esnext",sourcefile:r.url,format:r.format==="module"?"esm":"cjs",define:{PACKAGE_JSON:F}})).code}:(s.log("No loader found, using default transformer:",{url:e}),t(o,r,t))};export{O as getFormat,J as load,A as resolve,B as transformSource};
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -1 +1 @@
1
- import{promises as e}from"fs";import{resolve as r}from"path";const n=async()=>{const o=process.cwd(),s=r(o,"package.json");return await e.readFile(s,"utf-8")};export{n as getPackageJsonFile};
1
+ import{readFileSync as c}from"fs";import{resolve as r}from"path";const a=async()=>{const o=process.cwd(),e=r(o,"package.json");return c(e,"utf-8")};export{a as getPackageJsonFile};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tsmodule/tsmodule",
3
3
  "type": "module",
4
- "version": "15.1.0",
4
+ "version": "17.0.2",
5
5
  "repository": "tsmodule/tsmodule",
6
6
  "description": "TypeScript Module loader and compiler",
7
7
  "license": "MIT",
@@ -23,7 +23,7 @@
23
23
  ],
24
24
  "files": [
25
25
  "dist/",
26
- "template/"
26
+ "templates/"
27
27
  ],
28
28
  "engines": {
29
29
  "node": ">=14"
@@ -41,13 +41,12 @@
41
41
  "test": "ava --no-worker-threads"
42
42
  },
43
43
  "dependencies": {
44
+ "@types/glob": "^7.2.0",
44
45
  "@types/node": "^17.0.15",
45
- "@types/react": "^17.0.39",
46
- "@types/react-dom": "^17.0.11",
47
46
  "@typescript-eslint/eslint-plugin": "^5.9.1",
48
47
  "@typescript-eslint/parser": "^5.9.1",
49
48
  "ava": "^4.0.1",
50
- "await-shell": "^16.0.0",
49
+ "await-shell": "^29.0.1-0",
51
50
  "chalk": "^5.0.0",
52
51
  "commander": "^8.3.0",
53
52
  "create-debug-logger": "^1.10.1",
@@ -55,6 +54,7 @@
55
54
  "eslint": "^8.8.0",
56
55
  "fast-glob": "^3.2.10",
57
56
  "fs-extra": "^10.0.0",
57
+ "glob": "^7.2.0",
58
58
  "node-watch": "^0.7.3",
59
59
  "ora": "^6.0.1",
60
60
  "path": "^0.12.7",
@@ -0,0 +1,52 @@
1
+ {
2
+ "extends": [
3
+ "plugin:@typescript-eslint/recommended"
4
+ ],
5
+ "parser": "@typescript-eslint/parser",
6
+ "plugins": ["@typescript-eslint"],
7
+ "rules": {
8
+
9
+ "no-console": "error",
10
+ "no-trailing-spaces": "error",
11
+ "max-len": [1, 80, 2, {
12
+ "ignorePattern": "^import\\s.+\\sfrom\\s.+;$",
13
+ "ignoreUrls": true,
14
+ "ignoreStrings": true,
15
+ "ignoreTemplateLiterals": true,
16
+ "ignoreRegExpLiterals": true
17
+ }],
18
+
19
+ "@typescript-eslint/type-annotation-spacing": ["error"],
20
+
21
+ "@typescript-eslint/ban-ts-comment": [
22
+ "error",
23
+ {
24
+ "ts-nocheck": "allow-with-description",
25
+ "ts-ignore": "allow-with-description"
26
+ }
27
+ ],
28
+
29
+ "indent": "off",
30
+ "@typescript-eslint/indent": ["error", 2],
31
+
32
+ "semi": "off",
33
+ "@typescript-eslint/semi": ["error", "always"],
34
+
35
+ "quotes": "off",
36
+ "@typescript-eslint/quotes": ["error", "double"],
37
+
38
+ "object-curly-spacing": "off",
39
+ "@typescript-eslint/object-curly-spacing": ["error", "always"],
40
+
41
+ "sort-imports": [
42
+ "warn",
43
+ {
44
+ "ignoreCase": false,
45
+ "ignoreDeclarationSort": false,
46
+ "ignoreMemberSort": true,
47
+ "memberSyntaxSortOrder": ["none", "all", "multiple", "single"],
48
+ "allowSeparatedGroups": true
49
+ }
50
+ ]
51
+ }
52
+ }
@@ -0,0 +1,30 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+ pull_request:
8
+ branches:
9
+ - '**'
10
+
11
+ jobs:
12
+ test:
13
+ name: Node ${{ matrix.nodejs }} on ${{ matrix.os }}
14
+ runs-on: ${{ matrix.os }}
15
+ timeout-minutes: 10
16
+ strategy:
17
+ matrix:
18
+ nodejs: [14, 16, "lts/*"]
19
+ os: [ubuntu-latest, windows-latest, macos-latest]
20
+ steps:
21
+ - uses: actions/checkout@v2
22
+ - uses: actions/setup-node@v2
23
+ with:
24
+ node-version: ${{ matrix.nodejs }}
25
+
26
+ - name: Install and link
27
+ run: yarn install --frozen-lockfile && yarn build
28
+
29
+ - name: Test
30
+ run: yarn test
@@ -0,0 +1,10 @@
1
+ node_modules
2
+
3
+ # Potential Firebase / GCP credentials.
4
+ service-account.json
5
+
6
+ # Emitted output.
7
+ dist/
8
+
9
+ # Incremental TS build info.
10
+ *.tsbuildinfo
@@ -0,0 +1,5 @@
1
+ This is a TS module. Build it with tsmodule via:
2
+
3
+ ```shell
4
+ yarn build
5
+ ```
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "template",
3
+ "type": "module",
4
+ "version": "0.0.1",
5
+ "license": "MIT",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ ".": "./dist/index.js",
13
+ "./*": "./dist/*/index.js"
14
+ },
15
+ "scripts": {
16
+ "build": "tsmodule build",
17
+ "test": "ava",
18
+ "lint": "eslint src --fix",
19
+ "pretest": "tsmodule build -f",
20
+ "prepublishOnly": "yarn build && yarn test"
21
+ },
22
+ "ava": {
23
+ "timout": 240000,
24
+ "files": [
25
+ "test/**/*.test.ts"
26
+ ],
27
+ "extensions": {
28
+ "ts": "module"
29
+ },
30
+ "nodeArguments": [
31
+ "--no-warnings",
32
+ "--loader=@tsmodule/tsmodule"
33
+ ]
34
+ }
35
+ }
@@ -0,0 +1,4 @@
1
+ export const helloWorld = () => {
2
+ // eslint-disable-next-line no-console
3
+ console.log("Hello World!");
4
+ };
@@ -0,0 +1,7 @@
1
+ import test from "ava";
2
+
3
+ test("two plus two should equal four", (t) => {
4
+ if (2 + 2 === 4) {
5
+ t.pass();
6
+ }
7
+ });
@@ -0,0 +1,41 @@
1
+ {
2
+ "include": [
3
+ "*env.d.ts",
4
+ "src/**/*"
5
+ ],
6
+ "exclude": [
7
+ "node_modules",
8
+ "test/**"
9
+ ],
10
+ "compilerOptions": {
11
+ "moduleResolution": "Node",
12
+ "target": "ESNext",
13
+ "module": "ESNext",
14
+ "lib": [
15
+ "DOM",
16
+ "DOM.Iterable",
17
+ "ESNext"
18
+ ],
19
+ "jsx": "preserve",
20
+ "rootDir": "src",
21
+ "outDir": "dist",
22
+ "allowJs": true,
23
+ "importHelpers": true,
24
+ "esModuleInterop": true,
25
+ "allowSyntheticDefaultImports": true,
26
+ "strict": true,
27
+ "noUnusedLocals": true,
28
+ "noUnusedParameters": true,
29
+ "noImplicitReturns": true,
30
+ "noFallthroughCasesInSwitch": true,
31
+ "skipLibCheck": true,
32
+ "resolveJsonModule": true,
33
+ "declaration": true,
34
+ "sourceMap": true,
35
+ "checkJs": true,
36
+ "noEmit": false,
37
+ "forceConsistentCasingInFileNames": true,
38
+ "isolatedModules": true,
39
+ "incremental": false
40
+ }
41
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "extends": [
3
+ "plugin:@typescript-eslint/recommended",
4
+ "next",
5
+ "next/core-web-vitals"
6
+ ],
7
+ "parser": "@typescript-eslint/parser",
8
+ "plugins": ["@typescript-eslint"],
9
+ "rules": {
10
+
11
+ "no-console": "error",
12
+ "no-trailing-spaces": "error",
13
+ "max-len": [1, 80, 2, {
14
+ "ignorePattern": "^import\\s.+\\sfrom\\s.+;$",
15
+ "ignoreUrls": true,
16
+ "ignoreStrings": true,
17
+ "ignoreTemplateLiterals": true,
18
+ "ignoreRegExpLiterals": true
19
+ }],
20
+
21
+ "@typescript-eslint/type-annotation-spacing": ["error"],
22
+
23
+ "@typescript-eslint/ban-ts-comment": [
24
+ "error",
25
+ {
26
+ "ts-nocheck": "allow-with-description",
27
+ "ts-ignore": "allow-with-description"
28
+ }
29
+ ],
30
+
31
+ "indent": "off",
32
+ "@typescript-eslint/indent": ["error", 2],
33
+
34
+ "semi": "off",
35
+ "@typescript-eslint/semi": ["error", "always"],
36
+
37
+ "quotes": "off",
38
+ "@typescript-eslint/quotes": ["error", "double"],
39
+
40
+ "object-curly-spacing": "off",
41
+ "@typescript-eslint/object-curly-spacing": ["error", "always"],
42
+
43
+ "sort-imports": [
44
+ "warn",
45
+ {
46
+ "ignoreCase": false,
47
+ "ignoreDeclarationSort": false,
48
+ "ignoreMemberSort": true,
49
+ "memberSyntaxSortOrder": ["none", "all", "multiple", "single"],
50
+ "allowSeparatedGroups": true
51
+ }
52
+ ]
53
+ }
54
+ }
@@ -0,0 +1,11 @@
1
+ node_modules
2
+
3
+ # Potential Firebase / GCP credentials.
4
+ service-account.json
5
+
6
+ # Emitted output.
7
+ dist/
8
+ .next/
9
+
10
+ # Incremental TS build info.
11
+ *.tsbuildinfo
@@ -0,0 +1,5 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+
4
+ // NOTE: This file should not be edited
5
+ // see https://nextjs.org/docs/basic-features/typescript for more information.
@@ -0,0 +1,18 @@
1
+ module.exports = {
2
+ reactStrictMode: true,
3
+ webpack: (config) => {
4
+ // config.experiments = { topLevelAwait: true };
5
+ // config.resolve.fallback = {
6
+ // assert: false,
7
+ // process: false,
8
+ // events: false,
9
+ // fs: false,
10
+ // util: false,
11
+ // path: false,
12
+ // stream: false,
13
+ // constants: false,
14
+ // os: false,
15
+ // };
16
+ return config;
17
+ },
18
+ };
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "template",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "types": "dist/index.d.ts",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "exports": {
10
+ ".": "./dist/index.js",
11
+ "./styles": "./dist/styles/index.css",
12
+ "./styles/*": "./dist/styles/*/index.css",
13
+ "./package.json": "./package.json",
14
+ "./*": "./dist/components/*/index.js"
15
+ },
16
+ "scripts": {
17
+ "export": "tsmodule build",
18
+ "dev": "next dev",
19
+ "build": "next build",
20
+ "start": "next start",
21
+ "lint": "next lint --fix",
22
+ "test": "ava",
23
+ "prepublishOnly": "yarn build && yarn test"
24
+ },
25
+ "ava": {
26
+ "timout": 240000,
27
+ "files": [
28
+ "test/**/*.test.ts"
29
+ ],
30
+ "extensions": {
31
+ "ts": "module"
32
+ },
33
+ "nodeArguments": [
34
+ "--no-warnings",
35
+ "--loader=@tsmodule/tsmodule"
36
+ ]
37
+ }
38
+ }
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
@@ -0,0 +1,13 @@
1
+ import { FC } from "react";
2
+
3
+ interface CardProps {
4
+ href: string;
5
+ }
6
+
7
+ export const Card: FC<CardProps> = ({ href, children }) => {
8
+ return (
9
+ <a href={href} className="card">
10
+ {children}
11
+ </a>
12
+ );
13
+ };
@@ -0,0 +1,29 @@
1
+ import { Card } from "../Card";
2
+
3
+ export const CardGrid = () => {
4
+ return (
5
+ <div className="grid md:grid-cols-2">
6
+ <a href="https://nextjs.org/docs" className="card">
7
+ <h4>Documentation &rarr;</h4>
8
+ <p>Find in-depth information about Next.js features and API.</p>
9
+ </a>
10
+
11
+ <Card href="https://nextjs.org/learn">
12
+ <h4>Learn &rarr;</h4>
13
+ <p>Learn about Next.js in an interactive course with quizzes!</p>
14
+ </Card>
15
+
16
+ <Card href="https://github.com/vercel/next.js/tree/master/examples">
17
+ <h4>Examples &rarr;</h4>
18
+ <p>Discover and deploy boilerplate example Next.js projects.</p>
19
+ </Card>
20
+
21
+ <Card href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app">
22
+ <h4>Deploy &rarr;</h4>
23
+ <p>
24
+ Instantly deploy your Next.js site to a public URL with Vercel.
25
+ </p>
26
+ </Card>
27
+ </div>
28
+ );
29
+ };
@@ -0,0 +1,19 @@
1
+ import Image from "next/image";
2
+
3
+ export const Footer = () => {
4
+ return (
5
+ <footer>
6
+ <a
7
+ className="flex-center"
8
+ href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
9
+ target="_blank"
10
+ rel="noopener noreferrer"
11
+ >
12
+ Powered by{" "}
13
+ <span className="h-4 ml-2 flex-center">
14
+ <Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
15
+ </span>
16
+ </a>
17
+ </footer>
18
+ );
19
+ };
@@ -0,0 +1,8 @@
1
+ export const GetStarted = () => {
2
+ return (
3
+ <p className="my-8 text-center md:my-16 font-size-3">
4
+ Get started by editing{" "}
5
+ <code className="code">pages/index.js</code>
6
+ </p>
7
+ );
8
+ };
@@ -0,0 +1,7 @@
1
+ export const Welcome = () => {
2
+ return (
3
+ <h1 className="text-center">
4
+ Welcome to <a href="https://nextjs.org">Next.js!</a>
5
+ </h1>
6
+ );
7
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./Card";
2
+ export * from "./CardGrid";
3
+ export * from "./GetStarted";
4
+ export * from "./Welcome";
@@ -0,0 +1 @@
1
+ export * from "./components";
@@ -0,0 +1,13 @@
1
+ import "../styles/index.css";
2
+ import type { AppProps } from "next/app";
3
+ import { StrictMode } from "react";
4
+
5
+ function MyApp({ Component, pageProps }: AppProps) {
6
+ return (
7
+ <StrictMode>
8
+ <Component {...pageProps} />
9
+ </StrictMode>
10
+ );
11
+ }
12
+
13
+ export default MyApp;
@@ -0,0 +1,13 @@
1
+ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2
+ import type { NextApiRequest, NextApiResponse } from "next";
3
+
4
+ type Data = {
5
+ name: string
6
+ };
7
+
8
+ export default function handler(
9
+ _: NextApiRequest,
10
+ res: NextApiResponse<Data>
11
+ ) {
12
+ res.status(200).json({ name: "John Doe" });
13
+ }
@@ -0,0 +1,26 @@
1
+ import Head from "next/head";
2
+
3
+ import { CardGrid } from "../components/CardGrid";
4
+ import { Footer } from "../components/Footer";
5
+ import { GetStarted } from "../components/GetStarted";
6
+ import { Welcome } from "../components/Welcome";
7
+
8
+ export default function Home() {
9
+ return (
10
+ <>
11
+ <Head>
12
+ <title>Create Next App</title>
13
+ <meta name="description" content="Generated by create next app" />
14
+ <link rel="icon" href="/favicon.ico" />
15
+ </Head>
16
+
17
+ <main>
18
+ <Welcome />
19
+ <GetStarted />
20
+ <CardGrid />
21
+ </main>
22
+
23
+ <Footer />
24
+ </>
25
+ );
26
+ }
File without changes
@@ -0,0 +1,14 @@
1
+ .card {
2
+ @apply m-4 p-6 text-left rounded-lg;
3
+ text-decoration: none;
4
+ border: 1px solid #eaeaea;
5
+ transition: color 0.15s ease, border-color 0.15s ease;
6
+ /* max-width: 300px; */
7
+ }
8
+
9
+ .card:hover,
10
+ .card:focus,
11
+ .card:active {
12
+ color: #0070f3;
13
+ border-color: #0070f3;
14
+ }
@@ -0,0 +1 @@
1
+ @import './card/index.css';
@@ -0,0 +1,253 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* FONTS: Customize */
6
+ @layer base {
7
+ /* Style your serif font here. */
8
+ .serif {
9
+ font-family: serif;
10
+ }
11
+
12
+ /* Style your sans font here. */
13
+ .sans-serif {
14
+ font-family: sans-serif;
15
+ }
16
+
17
+ /* Style your display font here. */
18
+ .display {}
19
+
20
+ /* Style your interface font here. */
21
+ .interface {
22
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
23
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
24
+ }
25
+ }
26
+
27
+ /* DEFAULT BODY FONT */
28
+ @layer base {
29
+ html, body {
30
+ @apply font-size-sm interface;
31
+ }
32
+ }
33
+
34
+ /* LINKS */
35
+ @layer base {
36
+ a {
37
+ @apply underline;
38
+ color: inherit;
39
+ text-decoration: none;
40
+ }
41
+
42
+ h1 a,
43
+ h2 a,
44
+ h3 a,
45
+ h4 a,
46
+ h5 a,
47
+ h6 a {
48
+ color: #0070f3;
49
+ }
50
+
51
+ /* If the user can hover, transition in by default. */
52
+ @media (hover: hover) {
53
+ a {
54
+ transition: 300ms;
55
+ text-decoration: underline;
56
+ text-decoration-color: transparent;
57
+ }
58
+
59
+ a:hover {
60
+ text-decoration-color: inherit;
61
+ }
62
+ }
63
+ }
64
+
65
+ /* FONT SIZES */
66
+ @layer base {
67
+ .font-size-1 {
68
+ @apply text-4xl sm:text-5xl 2xl:text-6xl 4xl:text-8xl;
69
+ }
70
+
71
+ .font-size-2 {
72
+ @apply text-2xl sm:text-4xl 2xl:text-5xl 4xl:text-6xl;
73
+ }
74
+
75
+ .font-size-3 {
76
+ @apply text-xl sm:text-2xl 2xl:text-4xl 4xl:text-5xl;
77
+ }
78
+
79
+ .font-size-base {
80
+ @apply text-lg sm:text-xl 2xl:text-2xl 4xl:text-3xl;
81
+ }
82
+
83
+ .font-size-sm {
84
+ @apply text-base 2xl:text-lg 4xl:text-2xl;
85
+ }
86
+
87
+ .font-size-xs {
88
+ @apply text-sm 2xl:text-base 4xl:text-lg;
89
+ }
90
+ }
91
+
92
+ /* HEADINGS */
93
+ @layer base {
94
+ h1, .h1,
95
+ h2, .h2,
96
+ h3, .h3,
97
+ h4, .h4,
98
+ h5, .h5,
99
+ h6, .h6 {
100
+ @apply font-bold display;
101
+ @apply pb-2 leading-snug;
102
+ }
103
+
104
+ h1, .h1 {
105
+ @apply font-size-1;
106
+ }
107
+
108
+ h2, .h2 {
109
+ @apply font-size-2;
110
+ }
111
+
112
+ h3, .h3 {
113
+ @apply font-size-3;
114
+ }
115
+
116
+ h4, .h4 {
117
+ @apply font-size-base;
118
+ }
119
+
120
+ h5, .h5 {
121
+ @apply font-size-sm;
122
+ }
123
+
124
+ h6, .h6 {
125
+ @apply font-size-xs;
126
+ }
127
+
128
+ .title {
129
+ @apply mt-2 display font-bold;
130
+ }
131
+
132
+ .title p {
133
+ @apply p-0 m-0;
134
+ }
135
+ }
136
+
137
+ /* FLEX */
138
+ @layer base {
139
+ /**
140
+ * A container that fills its parent.
141
+ */
142
+ .expanded {
143
+ @apply h-full w-full;
144
+ }
145
+ /**
146
+ * Flex container that fills its content.
147
+ */
148
+ .filled {
149
+ @apply flex flex-1 items-stretch;
150
+ }
151
+ /**
152
+ * A pure-flex container will be display: flex.
153
+ */
154
+ .pure-flex {
155
+ @apply flex;
156
+ }
157
+ /**
158
+ * And its immediate children will have zero padding and margin.
159
+ */
160
+ .pure-flex > * {
161
+ @apply m-0 p-0;
162
+ }
163
+ /*
164
+ * A flex container centered along both axes.
165
+ */
166
+ .flex-center {
167
+ @apply flex justify-center items-center;
168
+ }
169
+ /**
170
+ * Center flex and text.
171
+ */
172
+ .center {
173
+ @apply flex-center text-center;
174
+ }
175
+ }
176
+
177
+ /* CONTENT */
178
+ @layer base {
179
+ code {}
180
+
181
+ main {
182
+ @apply p-8 flex-col filled flex-center;
183
+ }
184
+
185
+ header {
186
+ z-index: 9999;
187
+ }
188
+
189
+ footer {
190
+ @apply flex-center py-4 border-t-2 border-gray-200;
191
+ }
192
+
193
+ article {
194
+ @apply font-size-base serif mx-auto;
195
+ @apply max-w-screen-sm lg:max-w-screen-lg 2xl:max-w-screen-2xl 4xl:max-w-screen-4xl;
196
+ }
197
+ }
198
+
199
+ /* FORMS */
200
+ @layer base {
201
+ button, .button {
202
+ text-decoration: none !important;
203
+ @apply cursor-pointer;
204
+ @apply pure-flex flex-center;
205
+ @apply px-8 py-4;
206
+ @apply rounded-lg border-2;
207
+ @apply bg-blue-500 text-white font-bold;
208
+ }
209
+
210
+ label {
211
+ @apply p-4 font-light;
212
+ }
213
+
214
+ input {
215
+ @apply border-2 border-gray-300 rounded-lg;
216
+ @apply p-2;
217
+ }
218
+
219
+ select {
220
+ @apply bg-white;
221
+ @apply border-2 border-gray-300 rounded-lg;
222
+ @apply p-2;
223
+ }
224
+
225
+ /* Buttons already signal that the user can interact by touching. */
226
+ button, .button {
227
+ text-decoration: none !important;
228
+ @apply cursor-pointer;
229
+ @apply pure-flex flex-center;
230
+ @apply px-8 py-4;
231
+ @apply rounded-lg border-2;
232
+ @apply bg-blue-500 text-white font-bold;
233
+ }
234
+ }
235
+
236
+ /* TABLES */
237
+ @layer base {
238
+ table {
239
+ @apply mx-auto w-full;
240
+ }
241
+
242
+ table tr, table tr div {
243
+ @apply truncate;
244
+ }
245
+
246
+ table tr:nth-child(even) {
247
+ /* @apply bg-gray-400; */
248
+ }
249
+ }
250
+
251
+ @import './elements/index.css';
252
+ @import './viewport/index.css';
253
+ @import './custom/index.css';
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Ensure the page fills the viewport. Prevent purgecss from removing this
3
+ * styling, which it likes to do for the #__next selector.
4
+ */
5
+ /* purgecss start ignore */
6
+ html, body, #__next, #root, main {
7
+ /* Border-box, no padding. */
8
+ @apply m-0 p-0 box-border;
9
+ /* Fill screen, flex column, stretch items. */
10
+ @apply min-h-screen flex-col;
11
+ }
12
+
13
+ html,
14
+ body {
15
+ background: #fafafa;
16
+
17
+ /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
18
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
19
+ sans-serif; */
20
+ -webkit-font-smoothing: antialiased;
21
+ -moz-osx-font-smoothing: grayscale;
22
+ /* background-color: #90d5ec; */
23
+ /* background-image: linear-gradient(320deg, #fec3c5 20%, #d1ebf6 80%); */
24
+ }
25
+
26
+ /* purgecss end ignore */
@@ -0,0 +1 @@
1
+ export const PRODUCTION = process.env.NODE_ENV === 'production';
@@ -0,0 +1,21 @@
1
+ module.exports = {
2
+ content: ["src/**/*.{js,ts,jsx,tsx}"],
3
+ theme: {
4
+ extend: {
5
+ screens: {
6
+ "3xl": "1920px",
7
+ "4xl": "3840px",
8
+ },
9
+ backgroundImage: {
10
+ "gradient-radial": "radial-gradient(var(--tw-gradient-stops))"
11
+ },
12
+ border : [ "hover"],
13
+
14
+
15
+ },
16
+ },
17
+ variants: {
18
+ extend: {},
19
+ },
20
+ plugins: [],
21
+ };