@arcgis/create
Version:
ArcGIS command line tool to create new web GIS projects and applications
16 lines (12 loc) • 15 kB
JavaScript
import{Command as Xe}from"@commander-js/extra-typings";var Y="4.32.14";var f=(p=>(p.VANILLA="vanilla JS",p.REACT="react",p.ANGULAR="angular",p.VITE="vite",p.VUE="vue",p.WEBPACK="webpack",p.LUMINA_COMPONENTS="lumina-components",p))(f||{}),h=(o=>(o.CHARTS="charts",o.CODING="coding",o))(h||{});var L="github.com",_={"vanilla JS":"Esri/jsapi-resources",vite:"Esri/jsapi-resources",react:"Esri/jsapi-resources",angular:"Esri/jsapi-resources",vue:"Esri/jsapi-resources",webpack:"Esri/jsapi-resources","lumina-components":"WebGIS/arcgis-web-components"},w={"vanilla JS":"component-samples/map-components/samples/vite",vite:"component-samples/map-components/samples/vite",react:"component-samples/map-components/samples/react",angular:"component-samples/map-components/samples/angular",vue:"component-samples/map-components/samples/vue",webpack:"component-samples/map-components/samples/webpack","lumina-components":"packages/starter-packages/lumina-components"},H={"vanilla JS":"APP_SAMPLE",vite:"APP_SAMPLE",react:"APP_SAMPLE",angular:"APP_SAMPLE",vue:"APP_SAMPLE",webpack:"APP_SAMPLE","lumina-components":"CODE_SAMPLE"};import g from"fs/promises";import k from"path";import B from"process";import Pe from"child_process";import{promisify as be}from"util";import Ce from"normalize-package-data";var y=be(Pe.exec);async function A(e,t,o){let r=B.cwd();try{await g.mkdir(e)}catch(n){throw new Error(`could not create new directory in file system, details: ${String(n)}`)}B.chdir(e),await y("git init"),await y(`git remote add origin ${t}`),await y("git config core.sparseCheckout true"),await y(`git sparse-checkout set --no-cone ${o}/*`),await y("git pull origin main"),await Oe(o,"."),await g.rm(".git",{recursive:!0}),B.chdir(r)}async function Oe(e,t){if(!(e==="."||e===""||["./","/"].includes(e.split("/")[0])))try{let o=await g.readdir(e);await Promise.all(o.map(async n=>{let s=k.join(e,n),a=k.join(t,n);await g.rename(s,a)}));let r=e.split("/")[0];await g.rm(r,{recursive:!0})}catch(o){console.error("Error:",o)}}async function E(e){let t=await g.readFile(k.join(e,"package.json"),"utf-8"),o=JSON.parse(t);return Ce(o,n=>{console.error(n)}),o}async function v(e,t){await g.writeFile(k.join(e,"package.json"),JSON.stringify(t,null,2))}function K(e){return e.scripts?.start?"start":"dev"}function J(e,t,o){let r="@arcgis/map-components",n=["react","angular"].some(a=>a===o);n&&(r=`@arcgis/map-components-${o.toLowerCase()}`);let s=e.dependencies[r];e.dependencies={...e.dependencies,...t.reduce((a,p)=>{let d=`@arcgis/${p}-components${n?`-${o.toLowerCase()}`:""}`;return{...a,[d]:s}},{})}}var z=e=>{let t={};return Object.keys(e).forEach(o=>{let r=o;if(e?.[r])switch(r){case"name":t.name=e.name;break;case"template":{let n=e.template?.toUpperCase().replace(/-/gu,"_")??"";if(!Object.keys(f).includes(n))throw new Error(`Invalid template: ${e.template}`);t.template=f[n];break}case"packages":{let n=e.packages?.replace(/\s/gu,"").split(",")??[];t.packages=n?.reduce((s,a)=>{if(!(a.toUpperCase()in h))throw new Error(`Invalid package: ${a}`);return s.push(h[a.toUpperCase()]),s},[]);break}case"host":t.host=e.host;break;default:throw Error(`Invalid option: ${r}`)}}),t};async function q(e){await g.stat(e)&&await g.rm(e,{recursive:!0})}async function X(e,t){let o=_[e],r=L;t.host&&(r=t.host);let n=`git@${r}:${o}.git`;try{await y(`git ls-remote ${n}`)}catch(s){return console.error(s),!1}return!0}function x(e,t){let o=_[e],r=L;t.host&&(r=t.host);let n=t.ssh?"git@":"https://",s=t.accessToken?`${t.accessToken}@`:"",a=t.ssh?":":"/";return`${n}${s}${r}${a}${o}`}function Q(e,t){["dependencies","devDependencies","peerDependencies"].forEach(r=>{if(t[r]){let n=t[r];Object.keys(n).forEach(s=>{n[s].match(/workspace:.*/u)&&(n[s]=e)})}})}import{cancel as Ye,outro as He,multiselect as Ke,group as Je,confirm as ze}from"@clack/prompts";var Z=(e=0)=>t=>`\x1B[${t+e}m`,ee=(e=0)=>t=>`\x1B[${38+e};5;${t}m`,te=(e=0)=>(t,o,r)=>`\x1B[${38+e};2;${t};${o};${r}m`,i={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},lt=Object.keys(i.modifier),we=Object.keys(i.color),ke=Object.keys(i.bgColor),pt=[...we,...ke];function Ae(){let e=new Map;for(let[t,o]of Object.entries(i)){for(let[r,n]of Object.entries(o))i[r]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},o[r]=i[r],e.set(n[0],n[1]);Object.defineProperty(i,t,{value:o,enumerable:!1})}return Object.defineProperty(i,"codes",{value:e,enumerable:!1}),i.color.close="\x1B[39m",i.bgColor.close="\x1B[49m",i.color.ansi=Z(),i.color.ansi256=ee(),i.color.ansi16m=te(),i.bgColor.ansi=Z(10),i.bgColor.ansi256=ee(10),i.bgColor.ansi16m=te(10),Object.defineProperties(i,{rgbToAnsi256:{value(t,o,r){return t===o&&o===r?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(o/255*5)+Math.round(r/255*5)},enumerable:!1},hexToRgb:{value(t){let o=/[a-f\d]{6}|[a-f\d]{3}/i.exec(t.toString(16));if(!o)return[0,0,0];let[r]=o;r.length===3&&(r=[...r].map(s=>s+s).join(""));let n=Number.parseInt(r,16);return[n>>16&255,n>>8&255,n&255]},enumerable:!1},hexToAnsi256:{value:t=>i.rgbToAnsi256(...i.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let o,r,n;if(t>=232)o=((t-232)*10+8)/255,r=o,n=o;else{t-=16;let p=t%36;o=Math.floor(t/36)/5,r=Math.floor(p/6)/5,n=p%6/5}let s=Math.max(o,r,n)*2;if(s===0)return 30;let a=30+(Math.round(n)<<2|Math.round(r)<<1|Math.round(o));return s===2&&(a+=60),a},enumerable:!1},rgbToAnsi:{value:(t,o,r)=>i.ansi256ToAnsi(i.rgbToAnsi256(t,o,r)),enumerable:!1},hexToAnsi:{value:t=>i.ansi256ToAnsi(i.hexToAnsi256(t)),enumerable:!1}}),i}var Ee=Ae(),u=Ee;import $ from"node:process";import ve from"node:os";import oe from"node:tty";function m(e,t=globalThis.Deno?globalThis.Deno.args:$.argv){let o=e.startsWith("-")?"":e.length===1?"-":"--",r=t.indexOf(o+e),n=t.indexOf("--");return r!==-1&&(n===-1||r<n)}var{env:c}=$,N;m("no-color")||m("no-colors")||m("color=false")||m("color=never")?N=0:(m("color")||m("colors")||m("color=true")||m("color=always"))&&(N=1);function xe(){if("FORCE_COLOR"in c)return c.FORCE_COLOR==="true"?1:c.FORCE_COLOR==="false"?0:c.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(c.FORCE_COLOR,10),3)}function Ne(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function Re(e,{streamIsTTY:t,sniffFlags:o=!0}={}){let r=xe();r!==void 0&&(N=r);let n=o?N:r;if(n===0)return 0;if(o){if(m("color=16m")||m("color=full")||m("color=truecolor"))return 3;if(m("color=256"))return 2}if("TF_BUILD"in c&&"AGENT_NAME"in c)return 1;if(e&&!t&&n===void 0)return 0;let s=n||0;if(c.TERM==="dumb")return s;if($.platform==="win32"){let a=ve.release().split(".");return Number(a[0])>=10&&Number(a[2])>=10586?Number(a[2])>=14931?3:2:1}if("CI"in c)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(a=>a in c)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(a=>a in c)||c.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in c)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(c.TEAMCITY_VERSION)?1:0;if(c.COLORTERM==="truecolor"||c.TERM==="xterm-kitty")return 3;if("TERM_PROGRAM"in c){let a=Number.parseInt((c.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(c.TERM_PROGRAM){case"iTerm.app":return a>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(c.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(c.TERM)||"COLORTERM"in c?1:s}function re(e,t={}){let o=Re(e,{streamIsTTY:e&&e.isTTY,...t});return Ne(o)}var Ie={stdout:re({isTTY:oe.isatty(1)}),stderr:re({isTTY:oe.isatty(2)})},ne=Ie;function se(e,t,o){let r=e.indexOf(t);if(r===-1)return e;let n=t.length,s=0,a="";do a+=e.slice(s,r)+t+o,s=r+n,r=e.indexOf(t,s);while(r!==-1);return a+=e.slice(s),a}function ae(e,t,o,r){let n=0,s="";do{let a=e[r-1]==="\r";s+=e.slice(n,a?r-1:r)+t+(a?`\r
`:`
`)+o,n=r+1,r=e.indexOf(`
`,n)}while(r!==-1);return s+=e.slice(n),s}var{stdout:ie,stderr:ce}=ne,G=Symbol("GENERATOR"),T=Symbol("STYLER"),b=Symbol("IS_EMPTY"),le=["ansi","ansi","ansi256","ansi16m"],P=Object.create(null),Se=(e,t={})=>{if(t.level&&!(Number.isInteger(t.level)&&t.level>=0&&t.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let o=ie?ie.level:0;e.level=t.level===void 0?o:t.level};var Me=e=>{let t=(...o)=>o.join(" ");return Se(t,e),Object.setPrototypeOf(t,C.prototype),t};function C(e){return Me(e)}Object.setPrototypeOf(C.prototype,Function.prototype);for(let[e,t]of Object.entries(u))P[e]={get(){let o=R(this,D(t.open,t.close,this[T]),this[b]);return Object.defineProperty(this,e,{value:o}),o}};P.visible={get(){let e=R(this,this[T],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var U=(e,t,o,...r)=>e==="rgb"?t==="ansi16m"?u[o].ansi16m(...r):t==="ansi256"?u[o].ansi256(u.rgbToAnsi256(...r)):u[o].ansi(u.rgbToAnsi(...r)):e==="hex"?U("rgb",t,o,...u.hexToRgb(...r)):u[o][e](...r),je=["rgb","hex","ansi256"];for(let e of je){P[e]={get(){let{level:o}=this;return function(...r){let n=D(U(e,le[o],"color",...r),u.color.close,this[T]);return R(this,n,this[b])}}};let t="bg"+e[0].toUpperCase()+e.slice(1);P[t]={get(){let{level:o}=this;return function(...r){let n=D(U(e,le[o],"bgColor",...r),u.bgColor.close,this[T]);return R(this,n,this[b])}}}}var Fe=Object.defineProperties(()=>{},{...P,level:{enumerable:!0,get(){return this[G].level},set(e){this[G].level=e}}}),D=(e,t,o)=>{let r,n;return o===void 0?(r=e,n=t):(r=o.openAll+e,n=t+o.closeAll),{open:e,close:t,openAll:r,closeAll:n,parent:o}},R=(e,t,o)=>{let r=(...n)=>Le(r,n.length===1?""+n[0]:n.join(" "));return Object.setPrototypeOf(r,Fe),r[G]=e,r[T]=t,r[b]=o,r},Le=(e,t)=>{if(e.level<=0||!t)return e[b]?"":t;let o=e[T];if(o===void 0)return t;let{openAll:r,closeAll:n}=o;if(t.includes("\x1B"))for(;o!==void 0;)t=se(t,o.close,o.open),o=o.parent;let s=t.indexOf(`
`);return s!==-1&&(t=ae(t,n,r,s)),r+t+n};Object.defineProperties(C.prototype,P);var _e=C(),bt=C({level:ce?ce.level:0});var l=_e;import qe from"gradient-string";import{intro as Be,text as $e,outro as Ge,select as Ue,password as De,log as Ve}from"@clack/prompts";var pe="my-arcgis-app";function I(){Be("initialize a new arcgis project")}async function S(){return await $e({message:"What is the name of your project?",initialValue:pe,placeholder:pe,validate(e){if(e.length===0)return"Value is required!"}})}async function me(){return await Ue({message:"Which template would you like to use?",options:Object.entries(f).map(([,e])=>({value:e,label:e}))})}function M(){Ge(l.greenBright("Your new project is ready!"))}async function ue(e){return Ve.info(`
This command requires a ${e} personal access token with the 'repo' scope.
See https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic
for step-by-step instructions.
`),await De({message:`Please enter your personal access token for ${e}`,mask:"*",validate(t){if(t.length===0)return"Value is required!"}})}function j(e){return{name:e.name,shouldCleanup:!1,async doCleanup(o){if(console.error(l.bgRed(o)),this.shouldCleanup&&this.name)try{await q(this.name)}catch(r){console.error(l.bgRed(r))}throw o}}}import{spinner as We}from"@clack/prompts";async function F(e,t,o){let{startMsg:r,successMsg:n,failureMsg:s}=e,a=We();a.start(r),await t().then(()=>a.stop(n)).catch(p=>{a.stop(l.bgRed(s),1),o(p,a)})}async function de(e){let t=j(e);try{I();let o=await Je({projectName:e.name?async()=>await Promise.resolve(e.name):S,projectTemplate:e.template?async()=>await Promise.resolve(e.template):me},{onCancel:()=>{Ye("Operation cancelled."),process.exit(0)}});t.name=o.projectName;let r=w[o.projectTemplate],n=x(o.projectTemplate,e);await F({startMsg:"Downloading project template...",successMsg:"Project template downloaded successfully",failureMsg:"Error downloading project template"},async()=>{await A(o.projectName,n,r),t.shouldCleanup=!0},d=>{throw He(l.bgRed("Please ensure git is installed and try again.")),d});let s=await E(o.projectName);if(await ze({message:"Would you like to add any additional components?",initialValue:!1})){let d=e.packages?e.packages:await Ke({message:"Would you like to add any additional components? (select multiple)",options:Object.entries(h).map(([,O])=>({value:O,label:O}))});J(s,d,o.projectTemplate),await v(o.projectName,s)}let p=K(s);M(),console.log(l.magenta(`To get started, run the following commands:
`)),console.log(l.grey(`$ cd ${o.projectName}`)),console.log(l.grey("$ npm install")),console.log(l.grey(`$ npm run ${p}`)),console.log(qe.vice(`
Happy mapping!`))}catch(o){await t.doCleanup(o)}}import{outro as V}from"@clack/prompts";async function ge(e){let{template:t}=e;t!=="lumina-components"&&(V(l.red("Template is not a code sample")),process.exit(1)),e.host||(V(l.red("Host option is required for the lumina-components template")),process.exit(1));let o=j(e);try{I();let r=e.name??await S();o.name=r;let n=w[t],s=await X(t,e),a="";s||(a=await ue(e.host));let p=x(t,{...e,ssh:s,accessToken:a});await F({startMsg:"Downloading project template...",successMsg:"Project template downloaded successfully",failureMsg:"Error downloading project template"},async()=>{await A(r,p,n),o.shouldCleanup=!0},ye=>{throw V(l.bgRed("Please ensure git is installed and try again.")),ye});let d=await E(r),O=d.version,he=d["acme:scripts"];delete d["acme:scripts"];let W={...d,name:r,version:"0.0.1",description:"A new Lumina components project",scripts:he??{}};Q(O,W),await v(r,W),M(),console.log(l.magenta(`To get started, run the following commands:
`)),console.log(l.grey(`$ cd ${r}`)),console.log(l.grey("$ yarn set version 4.5.1")),console.log(l.grey("$ yarn install")),console.log(l.grey("$ yarn start"))}catch(r){await o.doCleanup(r)}}var fe=e=>{let t=new Xe;return e?.exitOverride&&t.exitOverride(),e?.suppressOutput&&t.configureOutput({writeOut:()=>"",writeErr:()=>""}),t.version(Y),t.option("-n, --name <name>","Name of the project").option("-t, --template <template>","Template to use").option("-p, --packages <packages>","Additional packages to add").option("--host <host>","Host to use for the source control repository"),t.command("init").description("Initialize a new ArcGIS project").action(async()=>{let o=z(t.opts());if(o.template&&H[o.template]==="CODE_SAMPLE"){await ge(o);return}await de(o)}),t},Qe={makeProgram:fe};process.env.NODE_ENV!=="test"&&(Qe=void 0,fe().parse());export{Qe as exportsForTests};