@canva/cli 0.0.1-beta.31 → 0.0.1-beta.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +1 -1
- package/package.json +1 -1
- package/templates/base/package.json +4 -4
- package/templates/base/webpack.config.ts +5 -3
- package/templates/dam/package.json +4 -4
- package/templates/dam/webpack.config.ts +5 -3
- package/templates/data_connector/package.json +4 -4
- package/templates/data_connector/webpack.config.ts +5 -3
- package/templates/gen_ai/package.json +4 -4
- package/templates/gen_ai/webpack.config.ts +5 -3
- package/templates/hello_world/package.json +4 -4
- package/templates/hello_world/webpack.config.ts +5 -3
package/cli.js
CHANGED
|
@@ -422,7 +422,7 @@ GFS4: `),console.error(e)});$t[Or]||(xj=global[Or]||[],Ej($t,xj),$t.close=functi
|
|
|
422
422
|
`:`
|
|
423
423
|
`)+r,i=n+1,n=e.indexOf(`
|
|
424
424
|
`,i)}while(n!==-1);return o+=e.slice(i),o}var{stdout:xA,stderr:CA}=yA,zD=Symbol("GENERATOR"),Wl=Symbol("STYLER"),Jf=Symbol("IS_EMPTY"),EA=["ansi","ansi","ansi256","ansi16m"],zl=Object.create(null),TG=(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 r=xA?xA.level:0;e.level=t.level===void 0?r:t.level};var LG=e=>{let t=(...r)=>r.join(" ");return TG(t,e),Object.setPrototypeOf(t,Zf.prototype),t};function Zf(e){return LG(e)}Object.setPrototypeOf(Zf.prototype,Function.prototype);for(let[e,t]of Object.entries(ki))zl[e]={get(){let r=eh(this,HD(t.open,t.close,this[Wl]),this[Jf]);return Object.defineProperty(this,e,{value:r}),r}};zl.visible={get(){let e=eh(this,this[Wl],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var qD=(e,t,r,...n)=>e==="rgb"?t==="ansi16m"?ki[r].ansi16m(...n):t==="ansi256"?ki[r].ansi256(ki.rgbToAnsi256(...n)):ki[r].ansi(ki.rgbToAnsi(...n)):e==="hex"?qD("rgb",t,r,...ki.hexToRgb(...n)):ki[r][e](...n),PG=["rgb","hex","ansi256"];for(let e of PG){zl[e]={get(){let{level:r}=this;return function(...n){let i=HD(qD(e,EA[r],"color",...n),ki.color.close,this[Wl]);return eh(this,i,this[Jf])}}};let t="bg"+e[0].toUpperCase()+e.slice(1);zl[t]={get(){let{level:r}=this;return function(...n){let i=HD(qD(e,EA[r],"bgColor",...n),ki.bgColor.close,this[Wl]);return eh(this,i,this[Jf])}}}}var kG=Object.defineProperties(()=>{},{...zl,level:{enumerable:!0,get(){return this[zD].level},set(e){this[zD].level=e}}}),HD=(e,t,r)=>{let n,i;return r===void 0?(n=e,i=t):(n=r.openAll+e,i=t+r.closeAll),{open:e,close:t,openAll:n,closeAll:i,parent:r}},eh=(e,t,r)=>{let n=(...i)=>NG(n,i.length===1?""+i[0]:i.join(" "));return Object.setPrototypeOf(n,kG),n[zD]=e,n[Wl]=t,n[Jf]=r,n},NG=(e,t)=>{if(e.level<=0||!t)return e[Jf]?"":t;let r=e[Wl];if(r===void 0)return t;let{openAll:n,closeAll:i}=r;if(t.includes("\x1B"))for(;r!==void 0;)t=vA(t,r.close,r.open),r=r.parent;let o=t.indexOf(`
|
|
425
|
-
`);return o!==-1&&(t=DA(t,i,n,o)),n+t+i};Object.defineProperties(Zf.prototype,zl);var RG=Zf(),Yye=Zf({level:CA?CA.level:0});var at=RG;var KD=at.inverse(" "),wA=({isDisabled:e=!1,state:t,placeholder:r=""})=>{let n=SA(()=>e?r?at.dim(r):"":r&&r.length>0?at.inverse(r[0])+at.dim(r.slice(1)):KD,[e,r]),i=SA(()=>{if(e)return t.value;let o=0,s=t.value.length>0?"":KD;for(let a of t.value)s+=o===t.cursorOffset?at.inverse(a):a,o++;return t.suggestion?(t.cursorOffset===t.value.length?s+=at.inverse(t.suggestion[0])+at.dim(t.suggestion.slice(1)):s+=at.dim(t.suggestion),s):(t.value.length>0&&t.cursorOffset===t.value.length&&(s+=KD),s)},[e,t.value,t.cursorOffset,t.suggestion]);return MG((o,s)=>{if(!(s.upArrow||s.downArrow||s.ctrl&&o==="c"||s.tab||s.shift&&s.tab)){if(s.return){t.submit();return}s.leftArrow?t.moveCursorLeft():s.rightArrow?t.moveCursorRight():s.backspace||s.delete?t.delete():t.insert(o)}},{isActive:!e}),{inputValue:t.value.length>0?i:n}};function _A({isDisabled:e=!1,defaultValue:t,placeholder:r="",suggestions:n,onChange:i,onSubmit:o}){let s=fA({defaultValue:t,suggestions:n,onChange:i,onSubmit:o}),{inputValue:a}=wA({isDisabled:e,placeholder:r,state:s}),{styles:u}=gt("TextInput");return BG.createElement(jG,{...u.value()},a)}import{Box as WG}from"ink";import Qf,{useContext as zG,isValidElement as AA}from"react";import{Box as bA,Text as UG}from"ink";import YD,{useContext as $G}from"react";import{createContext as VG}from"react";var th=VG({marker:Gt.line});function rh({children:e}){let{marker:t}=$G(th),{styles:r}=gt("OrderedList");return YD.createElement(bA,{...r.listItem()},YD.createElement(UG,{...r.marker()},t),YD.createElement(bA,{...r.content()},e))}import{createContext as GG}from"react";var XD=GG({marker:""});function qG({children:e}){let{marker:t}=zG(XD),{styles:r}=gt("OrderedList"),n=0;for(let o of Qf.Children.toArray(e))!AA(o)||o.type!==rh||n++;let i=String(n).length;return Qf.createElement(WG,{...r.list()},Qf.Children.map(e,(o,s)=>{if(!AA(o)||o.type!==rh)return o;let a=`${String(s+1).padStart(i)}.`,u=`${t}${a}`;return Qf.createElement(XD.Provider,{value:{marker:u}},Qf.createElement(th.Provider,{value:{marker:u}},o))}))}qG.Item=rh;import JG from"react";import{Text as ZG}from"ink";import{useReducer as HG,useCallback as ep,useEffect as KG}from"react";var YG=(e,t)=>{switch(t.type){case"move-cursor-left":return{...e,cursorOffset:Math.max(0,e.cursorOffset-1)};case"move-cursor-right":return{...e,cursorOffset:Math.min(e.value.length,e.cursorOffset+1)};case"insert":return{...e,previousValue:e.value,value:e.value.slice(0,e.cursorOffset)+t.text+e.value.slice(e.cursorOffset),cursorOffset:e.cursorOffset+t.text.length};case"delete":{let r=Math.max(0,e.cursorOffset-1);return{...e,previousValue:e.value,value:e.value.slice(0,r)+e.value.slice(r+1),cursorOffset:r}}}},OA=({onChange:e,onSubmit:t})=>{let[r,n]=HG(YG,{previousValue:"",value:"",cursorOffset:0}),i=ep(()=>{n({type:"move-cursor-left"})},[]),o=ep(()=>{n({type:"move-cursor-right"})},[]),s=ep(l=>{n({type:"insert",text:l})},[]),a=ep(()=>{n({type:"delete"})},[]),u=ep(()=>{t?.(r.value)},[r.value,t]);return KG(()=>{r.value!==r.previousValue&&e?.(r.value)},[r.previousValue,r.value,e]),{...r,moveCursorLeft:i,moveCursorRight:o,insert:s,delete:a,submit:u}};import{useMemo as IA}from"react";import{useInput as XG}from"ink";var JD=at.inverse(" "),FA=({isDisabled:e=!1,state:t,placeholder:r=""})=>{let n=IA(()=>e?r?at.dim(r):"":r&&r.length>0?at.inverse(r[0])+at.dim(r.slice(1)):JD,[e,r]),i=IA(()=>{let o="*".repeat(t.value.length);if(e)return o;let s=0,a=o.length>0?"":JD;for(let u of o)a+=s===t.cursorOffset?at.inverse(u):u,s++;return o.length>0&&t.cursorOffset===o.length&&(a+=JD),a},[e,t.value,t.cursorOffset]);return XG((o,s)=>{if(!(s.upArrow||s.downArrow||s.ctrl&&o==="c"||s.tab||s.shift&&s.tab)){if(s.return){t.submit();return}s.leftArrow?t.moveCursorLeft():s.rightArrow?t.moveCursorRight():s.backspace||s.delete?t.delete():t.insert(o)}},{isActive:!e}),{inputValue:t.value.length>0?i:n}};function TA({isDisabled:e=!1,placeholder:t="",onChange:r,onSubmit:n}){let i=OA({onChange:r,onSubmit:n}),{inputValue:o}=FA({isDisabled:e,placeholder:t,state:i}),{styles:s}=gt("PasswordInput");return JG.createElement(ZG,{...s.value()},o)}import Gve from"react";import{Box as zve,Text as qve}from"ink";import Zve from"react";import{Box as eDe,Text as tDe}from"ink";import EDe from"react";import{Text as wDe}from"ink";import{useReducer as aDe,useCallback as uDe,useEffect as lDe,useMemo as cDe}from"react";import{useMemo as dDe}from"react";import{useInput as hDe}from"ink";var yDe=at.inverse(" ");import LA,{useContext as QG}from"react";var co=e=>{let{lite:t}=QG(Xe),r=e.yesLabel||"Yes",n=e.noLabel||"No",i=[{label:r,value:"yes"},{label:n,value:"no"}],o=a=>{let u=a==="yes";e.onChange?.(u)},s=e.default==="no"?i.reverse():i;return t?LA.createElement(Qb,{onConfirm:()=>o("yes"),onCancel:()=>o("no"),defaultChoice:e.default==="yes"?"confirm":"cancel"}):LA.createElement(Go,{options:s,onChange:a=>o(a)})};async function bn(e=500){let t=(await Promise.resolve().then(()=>(NA(),kA))).default;return t(e)}var MA=({packageName:e,handlePromptDecision:t})=>{let{exit:r}=eW(),[n,i]=Ps.useState(!1);return Ps.createElement(RA,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:"yellow",width:80},Ps.createElement(ZD,null,Ps.createElement(Be,{color:"greenBright"},"? "),"You're using an older version of our CLI. Would you like to update?"),Ps.createElement(co,{default:"yes",yesLabel:"Yes (Recommended to access the latest templates)",noLabel:"No (Some features, such as app templates, may be outdated)",onChange:async s=>{s&&(i(!0),await bn(),r()),t(s)}}),n&&Ps.createElement(RA,{marginTop:1},Ps.createElement(ZD,null,"Run ",Ps.createElement(ZD,{bold:!0},"npm i -g ",e,"@latest")," to update.")))};import{Text as tW}from"ink";import*as tp from"react";var Ir=e=>{let{lite:t}=tp.useContext(Xe);return t?tp.createElement(tW,null,e.label):tp.createElement(cA,{type:"bouncingBall",...e})};import BA from"react";var nh=class extends BA.Component{state={isCrashed:!1,message:void 0};static getDerivedStateFromError(t){return{isCrashed:!0,message:t.message}}render(){return this.state.isCrashed?BA.createElement(z,{variant:"error"},this.state.message??"Sorry, a problem occurred"):this.props.children}componentDidCatch(t){this.setState({isCrashed:!0,message:t.message})}componentDidMount(){process.setUncaughtExceptionCaptureCallback(this.crashed)}componentWillUnmount(){process.setUncaughtExceptionCaptureCallback(null)}crashed=t=>{this.setState({isCrashed:!0,message:t.message}),process.exitCode=1}};var UA=({pkg:e,getUpdateInfo:t,border:r="regular",children:n,shouldPromptUpdate:i=!1,Logo:o})=>{let{lite:s}=rW(Xe),[a,u]=ih(!0),[l,c]=ih(),[f,p]=ih(null),[d,m]=ih(!1);nW(()=>{(async()=>{let g=await t();g.success?p(g.data.latest):m(!0),u(!1)})()},[e]);let y=h=>{c(h?"agreed":"disagreed")};return a?Wo.createElement(Ir,{type:"bouncingBall",label:"Loading..."}):i&&f&&f!==e.version&&!l?Wo.createElement(MA,{packageName:e.name,handlePromptDecision:y}):Wo.createElement(jA,{borderColor:r==="regular"&&!s?Ym:void 0,borderStyle:r==="regular"&&!s?"round":void 0,margin:r==="regular"&&!s?2:void 0,flexDirection:"column"},o&&Wo.createElement(jA,{flexDirection:"row",paddingY:1},Wo.createElement(VA,null),Wo.createElement(o,null),Wo.createElement(VA,null)),Wo.createElement(nh,null,!d&&Wo.createElement(Lb,{name:e.name,currentVersion:e.version,latestVersion:f}),n))};var ql={name:"@canva/cli",version:"0.0.1-beta.31",description:"The official Canva CLI.",license:"SEE LICENSE IN LICENSE.md",author:"Canva Pty Ltd.",repository:{directory:"git+https://github.com/canva-sdks/canva-cli.git",type:"git"},type:"module",main:"./lib/cjs/index.cjs",module:"./lib/esm/index.mjs",exports:{".":{require:"./lib/cjs/index.cjs",import:"./lib/esm/index.mjs"}},bin:{canva:"./dist/cli.js"},files:["templates","cli.js","LICENSE.md","README.md","lib"],scripts:{"//0":"The following scripts must be run from the root directory of cli/canva-cli",build:"npm run compile && npm run build:patch && npm run build:patch && npm run build:library","build:patch":"npm run build:docs && npm run build:templates && npm run build:meta && npm run build:patch:code","build:patch:code":"node ./build/patch.mjs ./dist/cli.js","build:docs":"cp README.md LICENSE.md dist","build:templates":"node ./build/templates.mjs ./templates dist/templates","build:meta":"node ./build/package_json.mjs ./package.json dist/package.json canva","build:library":"node ./build/library.mjs",compile:"rm -rf dist && node ./build/build.mjs","prepare:release":"cd ../.. && npm run build:package:beta cli/canva-cli","lint:types:watch":"tsc --watch","lint:types":"tsc",lint:"eslint .","lint:fix":"eslint . --fix","test:unit":"jest --no-cache","test:unit:watch":"jest --watchAll","test:unit:ci":"jest --ci --collectCoverage","prebuild:ava":"tsc && tsc-alias","test:feature":"npm run prebuild:ava && ava src/**/*.feature.*","test:feature:specific":"npm run prebuild:ava && ava","test:feature:watch":"npm run test:feature -- --watch","test:feature:ci":"npm run prebuild:ava && ava src/**/*.feature.*","test:feature:update-snapshots":"npm run test:feature -- --u",format:"prettier ./ --no-config --write","format:check":"prettier ./ --no-config --check",start:"npm run build && node ./dist/cli.js","readme:check":"node ./bin/readme_check.mjs",dev:"ENV=dev npm run start",staging:"ENV=staging npm run start",prod:"ENV=prod npm run start",link:"npm run build && cp -r ./dist ../../ && cd ../../dist && npm install && npm link && chmod +x ./cli.js"},dependencies:{"@canva/app-ui-kit":"^4.9.0","@inkjs/ui":"2.0.0","@modelcontextprotocol/sdk":"1.8.0","@t3-oss/env-core":"0.11.1",clipboardy:"4.0.0",ink:"5.1.0","ink-gradient":"3.0.0",jose:"5.9.6",mobx:"6.13.3","mobx-react":"9.1.1",open:"10.1.0",react:"18.3.1","react-docgen-typescript":"2.2.2",semver:"7.6.3",systeminformation:"5.25.11","terminal-link":"3.0.0","update-notifier":"7.3.1",yargs:"17.7.2",zod:"3.24.1"},devDependencies:{"@ava/typescript":"5.0.0","@eslint/js":"9.23.0","@jest/globals":"29.7.0","@tsconfig/node20":"20.1.4","@types/jest":"29.5.14","@types/react":"18.3.12","@types/semver":"7.5.8","@types/update-notifier":"6.0.8","@typescript-eslint/eslint-plugin":"8.27.0","@typescript-eslint/parser":"8.27.0",ava:"6.2.0",esbuild:"0.25.0",eslint:"9.23.0","eslint-plugin-ava":"15.0.1","eslint-plugin-jest":"28.11.0","eslint-plugin-react":"7.37.4","eslint-plugin-unicorn":"57.0.0","ink-testing-library":"4.0.0",jest:"29.7.0",prettier:"3.4.2","react-dom":"18.3.1",testdouble:"3.20.2","ts-jest":"29.2.5","ts-jest-mock-import-meta":"1.2.1","ts-node":"10.9.2","tsc-alias":"1.8.10",typescript:"5.5.4","typescript-eslint":"8.27.0"},keywords:["apps sdk","canva","cli","starter kit"],engines:{node:">=16"}};import Ni from"react";import{Text as jO,Newline as NW}from"ink";var fo=ht(YA(),1),g1=ht(RO(),1);import PW from"react";import{Transform as kW}from"ink";function m1({onlyFirst:e=!1}={}){let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}var LW=m1();function h1(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(LW,"")}var MO=e=>{if(e.name&&e.colors)throw new Error("The `name` and `colors` props are mutually exclusive");let t;if(e.name)t=g1.default[e.name];else if(e.colors)t=(0,g1.default)(e.colors);else throw new Error("Either `name` or `colors` prop must be provided");let r=n=>t.multiline(h1(n));return PW.createElement(kW,{transform:r},e.children)};MO.propTypes={children:fo.default.oneOfType([fo.default.arrayOf(fo.default.node),fo.default.node]).isRequired,name:fo.default.oneOf(["cristal","teen","mind","morning","vice","passion","fruit","instagram","atlas","retro","summer","pastel","rainbow"]),colors:fo.default.arrayOf(fo.default.oneOfType([fo.default.string,fo.default.object]))};var BO=MO;var RW=`
|
|
425
|
+
`);return o!==-1&&(t=DA(t,i,n,o)),n+t+i};Object.defineProperties(Zf.prototype,zl);var RG=Zf(),Yye=Zf({level:CA?CA.level:0});var at=RG;var KD=at.inverse(" "),wA=({isDisabled:e=!1,state:t,placeholder:r=""})=>{let n=SA(()=>e?r?at.dim(r):"":r&&r.length>0?at.inverse(r[0])+at.dim(r.slice(1)):KD,[e,r]),i=SA(()=>{if(e)return t.value;let o=0,s=t.value.length>0?"":KD;for(let a of t.value)s+=o===t.cursorOffset?at.inverse(a):a,o++;return t.suggestion?(t.cursorOffset===t.value.length?s+=at.inverse(t.suggestion[0])+at.dim(t.suggestion.slice(1)):s+=at.dim(t.suggestion),s):(t.value.length>0&&t.cursorOffset===t.value.length&&(s+=KD),s)},[e,t.value,t.cursorOffset,t.suggestion]);return MG((o,s)=>{if(!(s.upArrow||s.downArrow||s.ctrl&&o==="c"||s.tab||s.shift&&s.tab)){if(s.return){t.submit();return}s.leftArrow?t.moveCursorLeft():s.rightArrow?t.moveCursorRight():s.backspace||s.delete?t.delete():t.insert(o)}},{isActive:!e}),{inputValue:t.value.length>0?i:n}};function _A({isDisabled:e=!1,defaultValue:t,placeholder:r="",suggestions:n,onChange:i,onSubmit:o}){let s=fA({defaultValue:t,suggestions:n,onChange:i,onSubmit:o}),{inputValue:a}=wA({isDisabled:e,placeholder:r,state:s}),{styles:u}=gt("TextInput");return BG.createElement(jG,{...u.value()},a)}import{Box as WG}from"ink";import Qf,{useContext as zG,isValidElement as AA}from"react";import{Box as bA,Text as UG}from"ink";import YD,{useContext as $G}from"react";import{createContext as VG}from"react";var th=VG({marker:Gt.line});function rh({children:e}){let{marker:t}=$G(th),{styles:r}=gt("OrderedList");return YD.createElement(bA,{...r.listItem()},YD.createElement(UG,{...r.marker()},t),YD.createElement(bA,{...r.content()},e))}import{createContext as GG}from"react";var XD=GG({marker:""});function qG({children:e}){let{marker:t}=zG(XD),{styles:r}=gt("OrderedList"),n=0;for(let o of Qf.Children.toArray(e))!AA(o)||o.type!==rh||n++;let i=String(n).length;return Qf.createElement(WG,{...r.list()},Qf.Children.map(e,(o,s)=>{if(!AA(o)||o.type!==rh)return o;let a=`${String(s+1).padStart(i)}.`,u=`${t}${a}`;return Qf.createElement(XD.Provider,{value:{marker:u}},Qf.createElement(th.Provider,{value:{marker:u}},o))}))}qG.Item=rh;import JG from"react";import{Text as ZG}from"ink";import{useReducer as HG,useCallback as ep,useEffect as KG}from"react";var YG=(e,t)=>{switch(t.type){case"move-cursor-left":return{...e,cursorOffset:Math.max(0,e.cursorOffset-1)};case"move-cursor-right":return{...e,cursorOffset:Math.min(e.value.length,e.cursorOffset+1)};case"insert":return{...e,previousValue:e.value,value:e.value.slice(0,e.cursorOffset)+t.text+e.value.slice(e.cursorOffset),cursorOffset:e.cursorOffset+t.text.length};case"delete":{let r=Math.max(0,e.cursorOffset-1);return{...e,previousValue:e.value,value:e.value.slice(0,r)+e.value.slice(r+1),cursorOffset:r}}}},OA=({onChange:e,onSubmit:t})=>{let[r,n]=HG(YG,{previousValue:"",value:"",cursorOffset:0}),i=ep(()=>{n({type:"move-cursor-left"})},[]),o=ep(()=>{n({type:"move-cursor-right"})},[]),s=ep(l=>{n({type:"insert",text:l})},[]),a=ep(()=>{n({type:"delete"})},[]),u=ep(()=>{t?.(r.value)},[r.value,t]);return KG(()=>{r.value!==r.previousValue&&e?.(r.value)},[r.previousValue,r.value,e]),{...r,moveCursorLeft:i,moveCursorRight:o,insert:s,delete:a,submit:u}};import{useMemo as IA}from"react";import{useInput as XG}from"ink";var JD=at.inverse(" "),FA=({isDisabled:e=!1,state:t,placeholder:r=""})=>{let n=IA(()=>e?r?at.dim(r):"":r&&r.length>0?at.inverse(r[0])+at.dim(r.slice(1)):JD,[e,r]),i=IA(()=>{let o="*".repeat(t.value.length);if(e)return o;let s=0,a=o.length>0?"":JD;for(let u of o)a+=s===t.cursorOffset?at.inverse(u):u,s++;return o.length>0&&t.cursorOffset===o.length&&(a+=JD),a},[e,t.value,t.cursorOffset]);return XG((o,s)=>{if(!(s.upArrow||s.downArrow||s.ctrl&&o==="c"||s.tab||s.shift&&s.tab)){if(s.return){t.submit();return}s.leftArrow?t.moveCursorLeft():s.rightArrow?t.moveCursorRight():s.backspace||s.delete?t.delete():t.insert(o)}},{isActive:!e}),{inputValue:t.value.length>0?i:n}};function TA({isDisabled:e=!1,placeholder:t="",onChange:r,onSubmit:n}){let i=OA({onChange:r,onSubmit:n}),{inputValue:o}=FA({isDisabled:e,placeholder:t,state:i}),{styles:s}=gt("PasswordInput");return JG.createElement(ZG,{...s.value()},o)}import Gve from"react";import{Box as zve,Text as qve}from"ink";import Zve from"react";import{Box as eDe,Text as tDe}from"ink";import EDe from"react";import{Text as wDe}from"ink";import{useReducer as aDe,useCallback as uDe,useEffect as lDe,useMemo as cDe}from"react";import{useMemo as dDe}from"react";import{useInput as hDe}from"ink";var yDe=at.inverse(" ");import LA,{useContext as QG}from"react";var co=e=>{let{lite:t}=QG(Xe),r=e.yesLabel||"Yes",n=e.noLabel||"No",i=[{label:r,value:"yes"},{label:n,value:"no"}],o=a=>{let u=a==="yes";e.onChange?.(u)},s=e.default==="no"?i.reverse():i;return t?LA.createElement(Qb,{onConfirm:()=>o("yes"),onCancel:()=>o("no"),defaultChoice:e.default==="yes"?"confirm":"cancel"}):LA.createElement(Go,{options:s,onChange:a=>o(a)})};async function bn(e=500){let t=(await Promise.resolve().then(()=>(NA(),kA))).default;return t(e)}var MA=({packageName:e,handlePromptDecision:t})=>{let{exit:r}=eW(),[n,i]=Ps.useState(!1);return Ps.createElement(RA,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:"yellow",width:80},Ps.createElement(ZD,null,Ps.createElement(Be,{color:"greenBright"},"? "),"You're using an older version of our CLI. Would you like to update?"),Ps.createElement(co,{default:"yes",yesLabel:"Yes (Recommended to access the latest templates)",noLabel:"No (Some features, such as app templates, may be outdated)",onChange:async s=>{s&&(i(!0),await bn(),r()),t(s)}}),n&&Ps.createElement(RA,{marginTop:1},Ps.createElement(ZD,null,"Run ",Ps.createElement(ZD,{bold:!0},"npm i -g ",e,"@latest")," to update.")))};import{Text as tW}from"ink";import*as tp from"react";var Ir=e=>{let{lite:t}=tp.useContext(Xe);return t?tp.createElement(tW,null,e.label):tp.createElement(cA,{type:"bouncingBall",...e})};import BA from"react";var nh=class extends BA.Component{state={isCrashed:!1,message:void 0};static getDerivedStateFromError(t){return{isCrashed:!0,message:t.message}}render(){return this.state.isCrashed?BA.createElement(z,{variant:"error"},this.state.message??"Sorry, a problem occurred"):this.props.children}componentDidCatch(t){this.setState({isCrashed:!0,message:t.message})}componentDidMount(){process.setUncaughtExceptionCaptureCallback(this.crashed)}componentWillUnmount(){process.setUncaughtExceptionCaptureCallback(null)}crashed=t=>{this.setState({isCrashed:!0,message:t.message}),process.exitCode=1}};var UA=({pkg:e,getUpdateInfo:t,border:r="regular",children:n,shouldPromptUpdate:i=!1,Logo:o})=>{let{lite:s}=rW(Xe),[a,u]=ih(!0),[l,c]=ih(),[f,p]=ih(null),[d,m]=ih(!1);nW(()=>{(async()=>{let g=await t();g.success?p(g.data.latest):m(!0),u(!1)})()},[e]);let y=h=>{c(h?"agreed":"disagreed")};return a?Wo.createElement(Ir,{type:"bouncingBall",label:"Loading..."}):i&&f&&f!==e.version&&!l?Wo.createElement(MA,{packageName:e.name,handlePromptDecision:y}):Wo.createElement(jA,{borderColor:r==="regular"&&!s?Ym:void 0,borderStyle:r==="regular"&&!s?"round":void 0,margin:r==="regular"&&!s?2:void 0,flexDirection:"column"},o&&Wo.createElement(jA,{flexDirection:"row",paddingY:1},Wo.createElement(VA,null),Wo.createElement(o,null),Wo.createElement(VA,null)),Wo.createElement(nh,null,!d&&Wo.createElement(Lb,{name:e.name,currentVersion:e.version,latestVersion:f}),n))};var ql={name:"@canva/cli",version:"0.0.1-beta.32",description:"The official Canva CLI.",license:"SEE LICENSE IN LICENSE.md",author:"Canva Pty Ltd.",repository:{directory:"git+https://github.com/canva-sdks/canva-cli.git",type:"git"},type:"module",main:"./lib/cjs/index.cjs",module:"./lib/esm/index.mjs",exports:{".":{require:"./lib/cjs/index.cjs",import:"./lib/esm/index.mjs"}},bin:{canva:"./dist/cli.js"},files:["templates","cli.js","LICENSE.md","README.md","lib"],scripts:{"//0":"The following scripts must be run from the root directory of cli/canva-cli",build:"npm run compile && npm run build:patch && npm run build:patch && npm run build:library","build:patch":"npm run build:docs && npm run build:templates && npm run build:meta && npm run build:patch:code","build:patch:code":"node ./build/patch.mjs ./dist/cli.js","build:docs":"cp README.md LICENSE.md dist","build:templates":"node ./build/templates.mjs ./templates dist/templates","build:meta":"node ./build/package_json.mjs ./package.json dist/package.json canva","build:library":"node ./build/library.mjs",compile:"rm -rf dist && node ./build/build.mjs","prepare:release":"cd ../.. && npm run build:package:beta cli/canva-cli","lint:types:watch":"tsc --watch","lint:types":"tsc",lint:"eslint .","lint:fix":"eslint . --fix","test:unit":"jest --no-cache","test:unit:watch":"jest --watchAll","test:unit:ci":"jest --ci --collectCoverage","prebuild:ava":"tsc && tsc-alias","test:feature":"npm run prebuild:ava && ava src/**/*.feature.*","test:feature:specific":"npm run prebuild:ava && ava","test:feature:watch":"npm run test:feature -- --watch","test:feature:ci":"npm run prebuild:ava && ava src/**/*.feature.*","test:feature:update-snapshots":"npm run test:feature -- --u",format:"prettier ./ --no-config --write","format:check":"prettier ./ --no-config --check",start:"npm run build && node ./dist/cli.js","readme:check":"node ./bin/readme_check.mjs",dev:"ENV=dev npm run start",staging:"ENV=staging npm run start",prod:"ENV=prod npm run start",link:"npm run build && cp -r ./dist ../../ && cd ../../dist && npm install && npm link && chmod +x ./cli.js"},dependencies:{"@canva/app-ui-kit":"^4.10.0","@inkjs/ui":"2.0.0","@modelcontextprotocol/sdk":"1.8.0","@t3-oss/env-core":"0.11.1",clipboardy:"4.0.0",ink:"5.1.0","ink-gradient":"3.0.0",jose:"5.9.6",mobx:"6.13.3","mobx-react":"9.1.1",open:"10.1.0",react:"18.3.1","react-docgen-typescript":"2.2.2",semver:"7.6.3",systeminformation:"5.25.11","terminal-link":"3.0.0","update-notifier":"7.3.1",yargs:"17.7.2",zod:"3.24.1"},devDependencies:{"@ava/typescript":"5.0.0","@eslint/js":"9.23.0","@jest/globals":"29.7.0","@tsconfig/node20":"20.1.4","@types/jest":"29.5.14","@types/react":"18.3.12","@types/semver":"7.5.8","@types/update-notifier":"6.0.8","@typescript-eslint/eslint-plugin":"8.27.0","@typescript-eslint/parser":"8.27.0",ava:"6.2.0",esbuild:"0.25.0",eslint:"9.23.0","eslint-plugin-ava":"15.0.1","eslint-plugin-jest":"28.11.0","eslint-plugin-react":"7.37.4","eslint-plugin-unicorn":"57.0.0","ink-testing-library":"4.0.0",jest:"29.7.0",prettier:"3.4.2","react-dom":"18.3.1",testdouble:"3.20.2","ts-jest":"29.2.5","ts-jest-mock-import-meta":"1.2.1","ts-node":"10.9.2","tsc-alias":"1.8.10",typescript:"5.5.4","typescript-eslint":"8.27.0"},keywords:["apps sdk","canva","cli","starter kit"],engines:{node:">=16"}};import Ni from"react";import{Text as jO,Newline as NW}from"ink";var fo=ht(YA(),1),g1=ht(RO(),1);import PW from"react";import{Transform as kW}from"ink";function m1({onlyFirst:e=!1}={}){let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}var LW=m1();function h1(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(LW,"")}var MO=e=>{if(e.name&&e.colors)throw new Error("The `name` and `colors` props are mutually exclusive");let t;if(e.name)t=g1.default[e.name];else if(e.colors)t=(0,g1.default)(e.colors);else throw new Error("Either `name` or `colors` prop must be provided");let r=n=>t.multiline(h1(n));return PW.createElement(kW,{transform:r},e.children)};MO.propTypes={children:fo.default.oneOfType([fo.default.arrayOf(fo.default.node),fo.default.node]).isRequired,name:fo.default.oneOf(["cristal","teen","mind","morning","vice","passion","fruit","instagram","atlas","retro","summer","pastel","rainbow"]),colors:fo.default.arrayOf(fo.default.oneOfType([fo.default.string,fo.default.object]))};var BO=MO;var RW=`
|
|
426
426
|
\u2584\u259F\u2580\u2580\u2580\u2584
|
|
427
427
|
|
|
428
428
|
\u2588\u259B \u259D\u2598 \u2584\u2584\u2596\u2584 \u2584 \u2584\u2584 \u2584 \u2597\u2580\u2596 \u2584\u2584\u2596\u2584
|
package/package.json
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
7
7
|
"author": "Canva Pty Ltd.",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@canva/app-ui-kit": "^4.
|
|
9
|
+
"@canva/app-ui-kit": "^4.10.0",
|
|
10
10
|
"@canva/asset": "^2.2.0",
|
|
11
|
-
"@canva/design": "^2.
|
|
11
|
+
"@canva/design": "^2.6.0",
|
|
12
12
|
"@canva/error": "^2.1.0",
|
|
13
|
-
"@canva/platform": "^2.
|
|
13
|
+
"@canva/platform": "^2.2.0",
|
|
14
14
|
"@canva/user": "^2.1.0",
|
|
15
15
|
"cookie-parser": "1.4.7",
|
|
16
16
|
"react": "18.3.1",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"url-loader": "4.1.1",
|
|
65
65
|
"webpack": "5.97.1",
|
|
66
66
|
"webpack-cli": "5.1.4",
|
|
67
|
-
"webpack-dev-server": "5.2.
|
|
67
|
+
"webpack-dev-server": "5.2.2",
|
|
68
68
|
"yargs": "17.7.2"
|
|
69
69
|
},
|
|
70
70
|
"keywords": [
|
|
@@ -199,6 +199,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
199
199
|
|
|
200
200
|
const { port, enableHmr, appOrigin, appId, enableHttps, certFile, keyFile } =
|
|
201
201
|
options;
|
|
202
|
+
const host = "localhost";
|
|
202
203
|
|
|
203
204
|
let devServer: DevServerConfiguration = {
|
|
204
205
|
server: enableHttps
|
|
@@ -210,7 +211,8 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
210
211
|
},
|
|
211
212
|
}
|
|
212
213
|
: "http",
|
|
213
|
-
host
|
|
214
|
+
host,
|
|
215
|
+
allowedHosts: [host],
|
|
214
216
|
historyApiFallback: {
|
|
215
217
|
rewrites: [{ from: /^\/$/, to: "/app.js" }],
|
|
216
218
|
},
|
|
@@ -227,7 +229,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
227
229
|
if (enableHmr && appOrigin) {
|
|
228
230
|
devServer = {
|
|
229
231
|
...devServer,
|
|
230
|
-
allowedHosts: new URL(appOrigin).hostname,
|
|
232
|
+
allowedHosts: [host, new URL(appOrigin).hostname],
|
|
231
233
|
headers: {
|
|
232
234
|
"Access-Control-Allow-Origin": appOrigin,
|
|
233
235
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -245,7 +247,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
245
247
|
const appDomain = `app-${appId.toLowerCase().trim()}.canva-apps.com`;
|
|
246
248
|
devServer = {
|
|
247
249
|
...devServer,
|
|
248
|
-
allowedHosts: appDomain,
|
|
250
|
+
allowedHosts: [host, appDomain],
|
|
249
251
|
headers: {
|
|
250
252
|
"Access-Control-Allow-Origin": `https://${appDomain}`,
|
|
251
253
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@canva/app-components": "^1.3.0",
|
|
22
22
|
"@canva/app-i18n-kit": "^1.0.2",
|
|
23
|
-
"@canva/app-ui-kit": "^4.
|
|
23
|
+
"@canva/app-ui-kit": "^4.10.0",
|
|
24
24
|
"@canva/asset": "^2.2.0",
|
|
25
|
-
"@canva/design": "^2.
|
|
25
|
+
"@canva/design": "^2.6.0",
|
|
26
26
|
"@canva/error": "^2.1.0",
|
|
27
|
-
"@canva/platform": "^2.
|
|
27
|
+
"@canva/platform": "^2.2.0",
|
|
28
28
|
"@canva/user": "^2.1.0",
|
|
29
29
|
"cookie-parser": "1.4.7",
|
|
30
30
|
"cors": "2.8.5",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"url-loader": "4.1.1",
|
|
90
90
|
"webpack": "5.97.1",
|
|
91
91
|
"webpack-cli": "5.1.4",
|
|
92
|
-
"webpack-dev-server": "5.2.
|
|
92
|
+
"webpack-dev-server": "5.2.2",
|
|
93
93
|
"yargs": "17.7.2"
|
|
94
94
|
}
|
|
95
95
|
}
|
|
@@ -199,6 +199,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
199
199
|
|
|
200
200
|
const { port, enableHmr, appOrigin, appId, enableHttps, certFile, keyFile } =
|
|
201
201
|
options;
|
|
202
|
+
const host = "localhost";
|
|
202
203
|
|
|
203
204
|
let devServer: DevServerConfiguration = {
|
|
204
205
|
server: enableHttps
|
|
@@ -210,7 +211,8 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
210
211
|
},
|
|
211
212
|
}
|
|
212
213
|
: "http",
|
|
213
|
-
host
|
|
214
|
+
host,
|
|
215
|
+
allowedHosts: [host],
|
|
214
216
|
historyApiFallback: {
|
|
215
217
|
rewrites: [{ from: /^\/$/, to: "/app.js" }],
|
|
216
218
|
},
|
|
@@ -227,7 +229,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
227
229
|
if (enableHmr && appOrigin) {
|
|
228
230
|
devServer = {
|
|
229
231
|
...devServer,
|
|
230
|
-
allowedHosts: new URL(appOrigin).hostname,
|
|
232
|
+
allowedHosts: [host, new URL(appOrigin).hostname],
|
|
231
233
|
headers: {
|
|
232
234
|
"Access-Control-Allow-Origin": appOrigin,
|
|
233
235
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -245,7 +247,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
245
247
|
const appDomain = `app-${appId.toLowerCase().trim()}.canva-apps.com`;
|
|
246
248
|
devServer = {
|
|
247
249
|
...devServer,
|
|
248
|
-
allowedHosts: appDomain,
|
|
250
|
+
allowedHosts: [host, appDomain],
|
|
249
251
|
headers: {
|
|
250
252
|
"Access-Control-Allow-Origin": `https://${appDomain}`,
|
|
251
253
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -20,12 +20,12 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@canva/app-i18n-kit": "^1.0.2",
|
|
23
|
-
"@canva/app-ui-kit": "^4.
|
|
23
|
+
"@canva/app-ui-kit": "^4.10.0",
|
|
24
24
|
"@canva/asset": "^2.2.0",
|
|
25
|
-
"@canva/design": "^2.
|
|
25
|
+
"@canva/design": "^2.6.0",
|
|
26
26
|
"@canva/error": "^2.1.0",
|
|
27
27
|
"@canva/intents": "^2.0.0",
|
|
28
|
-
"@canva/platform": "^2.
|
|
28
|
+
"@canva/platform": "^2.2.0",
|
|
29
29
|
"@canva/user": "^2.1.0",
|
|
30
30
|
"react": "18.3.1",
|
|
31
31
|
"react-dom": "18.3.1",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"url-loader": "4.1.1",
|
|
86
86
|
"webpack": "5.97.1",
|
|
87
87
|
"webpack-cli": "5.1.4",
|
|
88
|
-
"webpack-dev-server": "5.2.
|
|
88
|
+
"webpack-dev-server": "5.2.2",
|
|
89
89
|
"yargs": "17.7.2"
|
|
90
90
|
}
|
|
91
91
|
}
|
|
@@ -199,6 +199,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
199
199
|
|
|
200
200
|
const { port, enableHmr, appOrigin, appId, enableHttps, certFile, keyFile } =
|
|
201
201
|
options;
|
|
202
|
+
const host = "localhost";
|
|
202
203
|
|
|
203
204
|
let devServer: DevServerConfiguration = {
|
|
204
205
|
server: enableHttps
|
|
@@ -210,7 +211,8 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
210
211
|
},
|
|
211
212
|
}
|
|
212
213
|
: "http",
|
|
213
|
-
host
|
|
214
|
+
host,
|
|
215
|
+
allowedHosts: [host],
|
|
214
216
|
historyApiFallback: {
|
|
215
217
|
rewrites: [{ from: /^\/$/, to: "/app.js" }],
|
|
216
218
|
},
|
|
@@ -227,7 +229,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
227
229
|
if (enableHmr && appOrigin) {
|
|
228
230
|
devServer = {
|
|
229
231
|
...devServer,
|
|
230
|
-
allowedHosts: new URL(appOrigin).hostname,
|
|
232
|
+
allowedHosts: [host, new URL(appOrigin).hostname],
|
|
231
233
|
headers: {
|
|
232
234
|
"Access-Control-Allow-Origin": appOrigin,
|
|
233
235
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -245,7 +247,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
245
247
|
const appDomain = `app-${appId.toLowerCase().trim()}.canva-apps.com`;
|
|
246
248
|
devServer = {
|
|
247
249
|
...devServer,
|
|
248
|
-
allowedHosts: appDomain,
|
|
250
|
+
allowedHosts: [host, appDomain],
|
|
249
251
|
headers: {
|
|
250
252
|
"Access-Control-Allow-Origin": `https://${appDomain}`,
|
|
251
253
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@canva/app-i18n-kit": "^1.0.2",
|
|
22
|
-
"@canva/app-ui-kit": "^4.
|
|
22
|
+
"@canva/app-ui-kit": "^4.10.0",
|
|
23
23
|
"@canva/asset": "^2.2.0",
|
|
24
|
-
"@canva/design": "^2.
|
|
24
|
+
"@canva/design": "^2.6.0",
|
|
25
25
|
"@canva/error": "^2.1.0",
|
|
26
|
-
"@canva/platform": "^2.
|
|
26
|
+
"@canva/platform": "^2.2.0",
|
|
27
27
|
"@canva/user": "^2.1.0",
|
|
28
28
|
"cookie-parser": "1.4.7",
|
|
29
29
|
"cors": "2.8.5",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"url-loader": "4.1.1",
|
|
94
94
|
"webpack": "5.97.1",
|
|
95
95
|
"webpack-cli": "5.1.4",
|
|
96
|
-
"webpack-dev-server": "5.2.
|
|
96
|
+
"webpack-dev-server": "5.2.2",
|
|
97
97
|
"yargs": "17.7.2"
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -199,6 +199,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
199
199
|
|
|
200
200
|
const { port, enableHmr, appOrigin, appId, enableHttps, certFile, keyFile } =
|
|
201
201
|
options;
|
|
202
|
+
const host = "localhost";
|
|
202
203
|
|
|
203
204
|
let devServer: DevServerConfiguration = {
|
|
204
205
|
server: enableHttps
|
|
@@ -210,7 +211,8 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
210
211
|
},
|
|
211
212
|
}
|
|
212
213
|
: "http",
|
|
213
|
-
host
|
|
214
|
+
host,
|
|
215
|
+
allowedHosts: [host],
|
|
214
216
|
historyApiFallback: {
|
|
215
217
|
rewrites: [{ from: /^\/$/, to: "/app.js" }],
|
|
216
218
|
},
|
|
@@ -227,7 +229,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
227
229
|
if (enableHmr && appOrigin) {
|
|
228
230
|
devServer = {
|
|
229
231
|
...devServer,
|
|
230
|
-
allowedHosts: new URL(appOrigin).hostname,
|
|
232
|
+
allowedHosts: [host, new URL(appOrigin).hostname],
|
|
231
233
|
headers: {
|
|
232
234
|
"Access-Control-Allow-Origin": appOrigin,
|
|
233
235
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -245,7 +247,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
245
247
|
const appDomain = `app-${appId.toLowerCase().trim()}.canva-apps.com`;
|
|
246
248
|
devServer = {
|
|
247
249
|
...devServer,
|
|
248
|
-
allowedHosts: appDomain,
|
|
250
|
+
allowedHosts: [host, appDomain],
|
|
249
251
|
headers: {
|
|
250
252
|
"Access-Control-Allow-Origin": `https://${appDomain}`,
|
|
251
253
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@canva/app-i18n-kit": "^1.0.2",
|
|
23
|
-
"@canva/app-ui-kit": "^4.
|
|
23
|
+
"@canva/app-ui-kit": "^4.10.0",
|
|
24
24
|
"@canva/asset": "^2.2.0",
|
|
25
|
-
"@canva/design": "^2.
|
|
25
|
+
"@canva/design": "^2.6.0",
|
|
26
26
|
"@canva/error": "^2.1.0",
|
|
27
|
-
"@canva/platform": "^2.
|
|
27
|
+
"@canva/platform": "^2.2.0",
|
|
28
28
|
"@canva/user": "^2.1.0",
|
|
29
29
|
"react": "18.3.1",
|
|
30
30
|
"react-dom": "18.3.1",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"url-loader": "4.1.1",
|
|
83
83
|
"webpack": "5.97.1",
|
|
84
84
|
"webpack-cli": "5.1.4",
|
|
85
|
-
"webpack-dev-server": "5.2.
|
|
85
|
+
"webpack-dev-server": "5.2.2",
|
|
86
86
|
"yargs": "17.7.2"
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -199,6 +199,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
199
199
|
|
|
200
200
|
const { port, enableHmr, appOrigin, appId, enableHttps, certFile, keyFile } =
|
|
201
201
|
options;
|
|
202
|
+
const host = "localhost";
|
|
202
203
|
|
|
203
204
|
let devServer: DevServerConfiguration = {
|
|
204
205
|
server: enableHttps
|
|
@@ -210,7 +211,8 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
210
211
|
},
|
|
211
212
|
}
|
|
212
213
|
: "http",
|
|
213
|
-
host
|
|
214
|
+
host,
|
|
215
|
+
allowedHosts: [host],
|
|
214
216
|
historyApiFallback: {
|
|
215
217
|
rewrites: [{ from: /^\/$/, to: "/app.js" }],
|
|
216
218
|
},
|
|
@@ -227,7 +229,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
227
229
|
if (enableHmr && appOrigin) {
|
|
228
230
|
devServer = {
|
|
229
231
|
...devServer,
|
|
230
|
-
allowedHosts: new URL(appOrigin).hostname,
|
|
232
|
+
allowedHosts: [host, new URL(appOrigin).hostname],
|
|
231
233
|
headers: {
|
|
232
234
|
"Access-Control-Allow-Origin": appOrigin,
|
|
233
235
|
"Access-Control-Allow-Credentials": "true",
|
|
@@ -245,7 +247,7 @@ function buildDevConfig(options?: DevConfig): {
|
|
|
245
247
|
const appDomain = `app-${appId.toLowerCase().trim()}.canva-apps.com`;
|
|
246
248
|
devServer = {
|
|
247
249
|
...devServer,
|
|
248
|
-
allowedHosts: appDomain,
|
|
250
|
+
allowedHosts: [host, appDomain],
|
|
249
251
|
headers: {
|
|
250
252
|
"Access-Control-Allow-Origin": `https://${appDomain}`,
|
|
251
253
|
"Access-Control-Allow-Credentials": "true",
|