@stacksjs/ts-cloud 0.4.0 → 0.4.1
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/dist/bin/cli.js +2 -2
- package/dist/index.js +1 -2
- package/package.json +3 -3
package/dist/bin/cli.js
CHANGED
|
@@ -3693,7 +3693,7 @@ COPY app/ \${LAMBDA_TASK_ROOT}/
|
|
|
3693
3693
|
|
|
3694
3694
|
# Per-function CMD (e.g. index.http) is supplied via ImageConfig.Command.
|
|
3695
3695
|
CMD [ "index.http" ]
|
|
3696
|
-
`}function vW(){return P_(C_(import.meta.url))}function TJ(){return y9(E2(vW(),"runtime.mjs"),"utf-8")}function fW($){return y9(E2(vW(),`${$}-bootstrap`),"utf-8")}function x_($){let J=$.architecture??"x86_64",Y=J==="arm64"?"arm64":"x64",Q=$.version.replace(/^v/,""),Z=$.onStep??(()=>{}),G=hW(E2(yW(),"tscloud-node-layer-"));try{let W=Q.includes(".")?Q:k_(Q),z=`node-v${W}-linux-${Y}`,U=`https://nodejs.org/dist/v${W}/${z}.tar.xz`;Z(`downloading Node ${W} (${J})`);let H=E2(G,"node.tar.xz");gW(U,H),Z("extracting node binary"),b9("tar",["-xf",H,"-C",G,`${z}/bin/node`],{stdio:"inherit"});let X=y9(E2(G,z,"bin","node"));Z("packaging layer");let B=[{name:"bootstrap",data:fW("node"),mode:493},{name:"runtime.mjs",data:TJ(),mode:420},{name:"bin/node",data:X,mode:493}];return{zip:Z$(B),architecture:J,version:W,fileCount:B.length}}finally{bW(G,{recursive:!0,force:!0})}}function I_($){let J=$.architecture??"x86_64",Y=J==="arm64"?"bun-linux-aarch64":"bun-linux-x64",Q=$.version==="latest"?"":$.version.replace(/^v/,""),Z=$.onStep??(()=>{}),G=hW(E2(yW(),"tscloud-bun-layer-"));try{let
|
|
3696
|
+
`}function vW(){return P_(C_(import.meta.url))}function TJ(){return y9(E2(vW(),"runtime.mjs"),"utf-8")}function fW($){return y9(E2(vW(),`${$}-bootstrap`),"utf-8")}function x_($){let J=$.architecture??"x86_64",Y=J==="arm64"?"arm64":"x64",Q=$.version.replace(/^v/,""),Z=$.onStep??(()=>{}),G=hW(E2(yW(),"tscloud-node-layer-"));try{let W=Q.includes(".")?Q:k_(Q),z=`node-v${W}-linux-${Y}`,U=`https://nodejs.org/dist/v${W}/${z}.tar.xz`;Z(`downloading Node ${W} (${J})`);let H=E2(G,"node.tar.xz");gW(U,H),Z("extracting node binary"),b9("tar",["-xf",H,"-C",G,`${z}/bin/node`],{stdio:"inherit"});let X=y9(E2(G,z,"bin","node"));Z("packaging layer");let B=[{name:"bootstrap",data:fW("node"),mode:493},{name:"runtime.mjs",data:TJ(),mode:420},{name:"bin/node",data:X,mode:493}];return{zip:Z$(B),architecture:J,version:W,fileCount:B.length}}finally{bW(G,{recursive:!0,force:!0})}}function I_($){let J=$.architecture??"x86_64",Y=J==="arm64"?"bun-linux-aarch64":"bun-linux-x64",Q=$.version==="latest"?"":$.version.replace(/^v/,""),Z=$.onStep??(()=>{}),G=hW(E2(yW(),"tscloud-bun-layer-"));try{let W=Q?`https://github.com/oven-sh/bun/releases/download/bun-v${Q}/${Y}.zip`:`https://github.com/oven-sh/bun/releases/latest/download/${Y}.zip`;Z(`downloading Bun ${Q||"latest"} (${J})`);let z=E2(G,"bun.zip");gW(W,z),Z("extracting bun binary"),b9("unzip",["-o","-q",z,"-d",G],{stdio:"inherit"});let U=y9(E2(G,Y,"bun"));Z("packaging layer");let H=[{name:"bootstrap",data:fW("bun"),mode:493},{name:"runtime.mjs",data:TJ(),mode:420},{name:"bin/bun",data:U,mode:493}];return{zip:Z$(H),architecture:J,version:Q||"latest",fileCount:H.length}}finally{bW(G,{recursive:!0,force:!0})}}function gW($,J){b9("curl",["-fsSL","-o",J,$],{stdio:["ignore","ignore","inherit"]})}function k_($){let J=b9("curl",["-fsSL","https://nodejs.org/dist/index.json"],{encoding:"utf-8"}),Q=JSON.parse(J).find((Z)=>Z.version.startsWith(`v${$}.`));if(!Q)throw Error(`No Node release found for major version ${$}`);return Q.version.replace(/^v/,"")}function h_($){let J=$,Y=J?.default??J;if(typeof Y==="function")return{fetch:Y};return{fetch:Y?.fetch??J?.fetch,queue:Y?.queue??J?.queue,cli:Y?.cli??J?.cli}}function y_($){if(!$)return!0;return b_.test($)}function v_($){if($?.maintenance)return $.maintenance;let J=globalThis.process?.env??{};return{enabled:J.MAINTENANCE_MODE==="1"||J.MAINTENANCE_MODE==="true",bypassSecret:J.MAINTENANCE_BYPASS_SECRET}}function uW($){let J=$.requestContext?.domainName??"localhost",Y=$.rawQueryString?`?${$.rawQueryString}`:"",Q=`https://${J}${$.rawPath||"/"}${Y}`,Z=new Headers;for(let[z,U]of Object.entries($.headers??{}))if(U!==void 0)Z.set(z,U);if($.cookies?.length)Z.set("cookie",$.cookies.join("; "));let G=$.requestContext.http.method,W;if($.body!==void 0&&G!=="GET"&&G!=="HEAD")W=$.isBase64Encoded?new Uint8Array(Buffer.from($.body,"base64")):new TextEncoder().encode($.body);return new Request(Q,{method:G,headers:Z,body:W})}async function dW($){let J={},Y=[],Q=typeof $.headers.getSetCookie==="function"?$.headers.getSetCookie():[];for(let W of Q)Y.push(W);$.headers.forEach((W,z)=>{if(z.toLowerCase()==="set-cookie")return;J[z]=W});let Z=Buffer.from(await $.arrayBuffer()),G=y_($.headers.get("content-type"));return{statusCode:$.status,headers:J,...Y.length?{cookies:Y}:{},body:G?Z.toString("utf-8"):Z.toString("base64"),isBase64Encoded:!G}}function cW($,J){return async(Y)=>{if(Y.warmer)return{statusCode:200,headers:{"content-type":"text/plain"},body:"warm",isBase64Encoded:!1};if(!$)return{statusCode:501,headers:{"content-type":"text/plain"},body:"No HTTP handler configured",isBase64Encoded:!1};let Q=v_(J);if(Q.enabled){let W=Y.headers?.["x-maintenance-bypass"]??Y.cookies?.find((z)=>z.startsWith("tscloud_bypass="))?.split("=")[1];if(!Q.bypassSecret||W!==Q.bypassSecret)return{statusCode:503,headers:{"content-type":"text/plain","retry-after":"120"},body:"Service temporarily unavailable (maintenance mode)",isBase64Encoded:!1}}let Z=uW(Y),G=await $(Z);return dW(G)}}function f_($){try{return JSON.parse($)}catch{return $}}function mW($){return async(J)=>{let Y=[];if(!$)return{batchItemFailures:Y};for(let Q of J.Records??[])try{await $(f_(Q.body),Q)}catch{Y.push({itemIdentifier:Q.messageId})}return{batchItemFailures:Y}}}function lW($){return async(J)=>{if(!$)return{statusCode:501,output:"No CLI handler configured"};return $(J)}}function g_($,J){return{http:cW($.fetch,J),queue:mW($.queue),cli:lW($.cli)}}function pW($={}){let J=$.socketPath??"/tmp/.tscloud-fpm.sock",Y=$.maxChildren??1;return`; ts-cloud php-fpm configuration (generated) — AWS Lambda custom runtime.
|
|
3697
3697
|
[global]
|
|
3698
3698
|
daemonize = no
|
|
3699
3699
|
error_log = ${$.errorLog??"/tmp/storage/logs/php-fpm.log"}
|
|
@@ -7338,7 +7338,7 @@ Run \`${this.name??"cli"} --help\` for usage.`;H2.stderr.write(`${G}${Z}${W}
|
|
|
7338
7338
|
`).length-1;this.output.write(p1.move(-999,$*-1))}render(){let $=VQ(this._render(this)??"",_Q.stdout.columns,{hard:!0,trim:!1});if($===this._prevFrame)return;if(this.state==="initial")this.output.write(p1.hide);else{let J=NU(this._prevFrame,$);if(this.restoreCursor(),J&&J?.length===1){let Y=J[0];this.output.write(p1.move(0,Y)),this.output.write(D6.lines(1));let Q=$.split(`
|
|
7339
7339
|
`);this.output.write(Q[Y]),this._prevFrame=$,this.output.write(p1.move(0,Q.length-Y-1));return}if(J&&J?.length>1){let Y=J[0];this.output.write(p1.move(0,Y)),this.output.write(D6.down());let Z=$.split(`
|
|
7340
7340
|
`).slice(Y);this.output.write(Z.join(`
|
|
7341
|
-
`)),this._prevFrame=$;return}this.output.write(D6.down())}if(this.output.write($),this.state==="initial")this.state="active";this._prevFrame=$}}function kU($,J){if($===void 0)return 0;if(J.length===0)return 0;let Q=J.findIndex((Z)=>Z.value===$);return Q!==-1?Q:0}function hU($,J){return(J.label??String(J.value)).toLowerCase().includes($.toLowerCase())}function bU($,J){if(!J)return;if($)return J;return J[0]}class yU extends x6{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#$=0;#Y="";#Q;#J;get cursor(){return this.#$}get userInputWithCursor(){if(!this.userInput)return D8.inverse(D8.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}█`;let $=this.userInput.slice(0,this._cursor),[J,...Y]=this.userInput.slice(this._cursor);return`${$}${D8.inverse(J)}${Y.join("")}`}get options(){if(typeof this.#J==="function")return this.#J();return this.#J}constructor($){super($);this.#J=$.options;let J=this.options;this.filteredOptions=[...J],this.multiple=$.multiple===!0,this.#Q=$.filter??hU;let Y;if($.initialValue&&Array.isArray($.initialValue))if(this.multiple)Y=$.initialValue;else Y=$.initialValue.slice(0,1);else if(!this.multiple&&this.options.length>0)Y=[this.options[0].value];if(Y)for(let Q of Y){let Z=J.findIndex((G)=>G.value===Q);if(Z!==-1)this.toggleSelected(Q),this.#$=Z}this.focusedValue=this.options[this.#$]?.value,this.on("key",(Q,Z)=>this.#Z(Q,Z)),this.on("userInput",(Q)=>this.#G(Q))}_isActionKey($,J){return $==="\t"||this.multiple&&this.isNavigating&&J.name==="space"&&$!==void 0&&$!==""}#Z($,J){let Y=J.name==="up",Q=J.name==="down",Z=J.name==="return";if(Y||Q){if(this.#$=Math.max(0,Math.min(this.#$+(Y?-1:1),this.filteredOptions.length-1)),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)this.selectedValues=[this.focusedValue];this.isNavigating=!0}else if(Z)this.value=bU(this.multiple,this.selectedValues);else if(this.multiple)if(this.focusedValue!==void 0&&(J.name==="tab"||this.isNavigating&&J.name==="space"))this.toggleSelected(this.focusedValue);else this.isNavigating=!1;else{if(this.focusedValue)this.selectedValues=[this.focusedValue];this.isNavigating=!1}}deselectAll(){this.selectedValues=[]}toggleSelected($){if(this.filteredOptions.length===0)return;if(this.multiple)if(this.selectedValues.includes($))this.selectedValues=this.selectedValues.filter((J)=>J!==$);else this.selectedValues=[...this.selectedValues,$];else this.selectedValues=[$]}#G($){if($!==this.#Y){this.#Y=$;let J=this.options;if($)this.filteredOptions=J.filter((Y)=>this.#Q($,Y));else this.filteredOptions=[...J];if(this.#$=kU(this.focusedValue,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)if(this.focusedValue!==void 0)this.toggleSelected(this.focusedValue);else this.deselectAll()}}}class vU extends x6{options;cursor=0;#$;getGroupItems($){return this.options.filter((J)=>J.group===$)}isGroupSelected($){let J=this.getGroupItems($),Y=this.value;if(Y===void 0)return!1;return J.every((Q)=>Y.includes(Q.value))}toggleValue(){let $=this.options[this.cursor];if(this.value===void 0)this.value=[];if($.group===!0){let J=$.value,Y=this.getGroupItems(J);if(this.isGroupSelected(J))this.value=this.value.filter((Q)=>Y.findIndex((Z)=>Z.value===Q)===-1);else this.value=[...this.value,...Y.map((Q)=>Q.value)];this.value=Array.from(new Set(this.value))}else{let J=this.value.includes($.value);this.value=J?this.value.filter((Y)=>Y!==$.value):[...this.value,$.value]}}constructor($){super($,!1);let{options:J}=$;this.#$=$.selectableGroups!==!1,this.options=Object.entries(J).flatMap(([Y,Q])=>[{value:Y,group:!0,label:Y},...Q.map((Z)=>({...Z,group:Y}))]),this.value=[...$.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:Y})=>Y===$.cursorAt),this.#$?0:1),this.on("cursor",(Y)=>{switch(Y){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}case"space":this.toggleValue();break}})}}var fU=rz();var E0=($,J)=>fU?$:J,dL=E0("◆","*"),cL=E0("■","x"),mL=E0("▲","x"),lL=E0("◇","o"),pL=E0("┌","T"),gU=E0("│","|"),rL=E0("└","—"),nL=E0("●",">"),iL=E0("○"," "),tL=E0("◻","[•]"),aL=E0("◼","[+]"),sL=E0("◻","[ ]"),oL=E0("▪","•"),eL=E0("─","-"),$E=E0("╮","+"),JE=E0("├","+"),YE=E0("╯","+"),QE=E0("●","•"),ZE=E0("◆","*"),GE=E0("▲","!"),WE=E0("■","x");var zE={light:E0("─","-"),heavy:E0("━","="),block:E0("█","#")};function uU(){return`${D8.gray(gU)} `}var UE=uU();var I6="0.4.
|
|
7341
|
+
`)),this._prevFrame=$;return}this.output.write(D6.down())}if(this.output.write($),this.state==="initial")this.state="active";this._prevFrame=$}}function kU($,J){if($===void 0)return 0;if(J.length===0)return 0;let Q=J.findIndex((Z)=>Z.value===$);return Q!==-1?Q:0}function hU($,J){return(J.label??String(J.value)).toLowerCase().includes($.toLowerCase())}function bU($,J){if(!J)return;if($)return J;return J[0]}class yU extends x6{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#$=0;#Y="";#Q;#J;get cursor(){return this.#$}get userInputWithCursor(){if(!this.userInput)return D8.inverse(D8.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}█`;let $=this.userInput.slice(0,this._cursor),[J,...Y]=this.userInput.slice(this._cursor);return`${$}${D8.inverse(J)}${Y.join("")}`}get options(){if(typeof this.#J==="function")return this.#J();return this.#J}constructor($){super($);this.#J=$.options;let J=this.options;this.filteredOptions=[...J],this.multiple=$.multiple===!0,this.#Q=$.filter??hU;let Y;if($.initialValue&&Array.isArray($.initialValue))if(this.multiple)Y=$.initialValue;else Y=$.initialValue.slice(0,1);else if(!this.multiple&&this.options.length>0)Y=[this.options[0].value];if(Y)for(let Q of Y){let Z=J.findIndex((G)=>G.value===Q);if(Z!==-1)this.toggleSelected(Q),this.#$=Z}this.focusedValue=this.options[this.#$]?.value,this.on("key",(Q,Z)=>this.#Z(Q,Z)),this.on("userInput",(Q)=>this.#G(Q))}_isActionKey($,J){return $==="\t"||this.multiple&&this.isNavigating&&J.name==="space"&&$!==void 0&&$!==""}#Z($,J){let Y=J.name==="up",Q=J.name==="down",Z=J.name==="return";if(Y||Q){if(this.#$=Math.max(0,Math.min(this.#$+(Y?-1:1),this.filteredOptions.length-1)),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)this.selectedValues=[this.focusedValue];this.isNavigating=!0}else if(Z)this.value=bU(this.multiple,this.selectedValues);else if(this.multiple)if(this.focusedValue!==void 0&&(J.name==="tab"||this.isNavigating&&J.name==="space"))this.toggleSelected(this.focusedValue);else this.isNavigating=!1;else{if(this.focusedValue)this.selectedValues=[this.focusedValue];this.isNavigating=!1}}deselectAll(){this.selectedValues=[]}toggleSelected($){if(this.filteredOptions.length===0)return;if(this.multiple)if(this.selectedValues.includes($))this.selectedValues=this.selectedValues.filter((J)=>J!==$);else this.selectedValues=[...this.selectedValues,$];else this.selectedValues=[$]}#G($){if($!==this.#Y){this.#Y=$;let J=this.options;if($)this.filteredOptions=J.filter((Y)=>this.#Q($,Y));else this.filteredOptions=[...J];if(this.#$=kU(this.focusedValue,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)if(this.focusedValue!==void 0)this.toggleSelected(this.focusedValue);else this.deselectAll()}}}class vU extends x6{options;cursor=0;#$;getGroupItems($){return this.options.filter((J)=>J.group===$)}isGroupSelected($){let J=this.getGroupItems($),Y=this.value;if(Y===void 0)return!1;return J.every((Q)=>Y.includes(Q.value))}toggleValue(){let $=this.options[this.cursor];if(this.value===void 0)this.value=[];if($.group===!0){let J=$.value,Y=this.getGroupItems(J);if(this.isGroupSelected(J))this.value=this.value.filter((Q)=>Y.findIndex((Z)=>Z.value===Q)===-1);else this.value=[...this.value,...Y.map((Q)=>Q.value)];this.value=Array.from(new Set(this.value))}else{let J=this.value.includes($.value);this.value=J?this.value.filter((Y)=>Y!==$.value):[...this.value,$.value]}}constructor($){super($,!1);let{options:J}=$;this.#$=$.selectableGroups!==!1,this.options=Object.entries(J).flatMap(([Y,Q])=>[{value:Y,group:!0,label:Y},...Q.map((Z)=>({...Z,group:Y}))]),this.value=[...$.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:Y})=>Y===$.cursorAt),this.#$?0:1),this.on("cursor",(Y)=>{switch(Y){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}case"space":this.toggleValue();break}})}}var fU=rz();var E0=($,J)=>fU?$:J,dL=E0("◆","*"),cL=E0("■","x"),mL=E0("▲","x"),lL=E0("◇","o"),pL=E0("┌","T"),gU=E0("│","|"),rL=E0("└","—"),nL=E0("●",">"),iL=E0("○"," "),tL=E0("◻","[•]"),aL=E0("◼","[+]"),sL=E0("◻","[ ]"),oL=E0("▪","•"),eL=E0("─","-"),$E=E0("╮","+"),JE=E0("├","+"),YE=E0("╯","+"),QE=E0("●","•"),ZE=E0("◆","*"),GE=E0("▲","!"),WE=E0("■","x");var zE={light:E0("─","-"),heavy:E0("━","="),block:E0("█","#")};function uU(){return`${D8.gray(gU)} `}var UE=uU();var I6="0.4.1";Q0();import{existsSync as u6}from"node:fs";import{mkdir as aU,writeFile as fQ}from"node:fs/promises";function d6($){$.command("init","Initialize a new ts-cloud project").option("--mode <mode>","Deployment mode: server, serverless, or hybrid").option("--name <name>","Project name").option("--region <region>","AWS Region").action(async(J)=>{if(M("Initializing ts-cloud Project"),u6("cloud.config.ts")){if(!await f("cloud.config.ts already exists. Overwrite?",!1)){F("Initialization cancelled");return}}let Y=J?.name||await j0("Project name","my-app"),Q=J?.mode||await f6("Select deployment mode",["serverless","server","hybrid"]),Z=J?.region||await f6("Select AWS region",["us-east-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1"]),G=new w("Creating configuration file...");G.start();let W=`import { defineConfig } from '@ts-cloud/core'
|
|
7342
7342
|
|
|
7343
7343
|
export default defineConfig({
|
|
7344
7344
|
project: {
|
package/dist/index.js
CHANGED
|
@@ -26456,8 +26456,7 @@ function buildBunRuntimeLayerZip(options) {
|
|
|
26456
26456
|
const step = options.onStep ?? (() => {});
|
|
26457
26457
|
const stage = mkdtempSync2(join72(tmpdir2(), "tscloud-bun-layer-"));
|
|
26458
26458
|
try {
|
|
26459
|
-
const
|
|
26460
|
-
const url = `https://github.com/oven-sh/bun/releases/download/${tag}/${bunArch}.zip`;
|
|
26459
|
+
const url = version2 ? `https://github.com/oven-sh/bun/releases/download/bun-v${version2}/${bunArch}.zip` : `https://github.com/oven-sh/bun/releases/latest/download/${bunArch}.zip`;
|
|
26461
26460
|
step(`downloading Bun ${version2 || "latest"} (${architecture})`);
|
|
26462
26461
|
const zipPath = join72(stage, "bun.zip");
|
|
26463
26462
|
fetchToFile(url, zipPath);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/ts-cloud",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"description": "A lightweight, performant infrastructure-as-code library and CLI for deploying both server-based (EC2) and serverless applications.",
|
|
6
6
|
"author": "Chris Breuer <chris@stacksjs.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
"test": "bun test"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@ts-cloud/aws-types": "0.4.
|
|
93
|
-
"@ts-cloud/core": "0.4.
|
|
92
|
+
"@ts-cloud/aws-types": "0.4.1",
|
|
93
|
+
"@ts-cloud/core": "0.4.1",
|
|
94
94
|
"@stacksjs/ts-xml": "^0.1.0"
|
|
95
95
|
},
|
|
96
96
|
"devDependencies": {
|