cloudfrontize 1.1.0 → 1.1.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.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +1 -2
package/dist/cli.js CHANGED
@@ -34,7 +34,7 @@ Expecting one of '${i.join("', '")}'`);let s=`${e}Help`;return this.on(s,o=>{let
34
34
  throw new Error('CFF must define a "handler" function.');
35
35
  }
36
36
  handler(event);
37
- `,t=new _s.Script(o,{filename:e.name,timeout:Pe.MAX_TOTAL_TIME_MS}),p=process.hrtime.bigint();try{let r=t.runInContext(s,{timeout:Pe.MAX_TOTAL_TIME_MS,breakOnSigint:!0}),c=process.hrtime.bigint(),l=Number(c-p)/1e6;return l>Pe.MAX_CPU_TIME_MS&&console.warn(`\u26A0\uFE0F [CFF] ${e.name} exceeded 1ms CPU limit (Used: ${l.toFixed(2)}ms). AWS may throttle this function.`),r}catch(r){return console.error(`\u{1F6D1} [CFF] Execution Error in ${e.name}: ${r.message}`),null}}toCFFEvent(e,a,i,s=null){let o=new URL(e.url,`http://${e.headers.host||"localhost"}`),t={version:"1.0",context:{eventType:i,requestId:e.requestID||"local",distributionDomainName:"localhost",distributionId:"EDGETEST"},viewer:{ip:e.socket&&e.socket.remoteAddress||"127.0.0.1"},request:{method:e.method,uri:o.pathname,headers:{},querystring:{},cookies:{}}};if(s){t.response={statusCode:s.status||200,statusDescription:s.statusDescription||"OK",headers:{},cookies:{}};for(let[p,r]of Object.entries(s.headers||{})){let c=Array.isArray(r)?r[0]:r;t.response.headers[p.toLowerCase()]={value:String(c)}}}if(e.rawHeaders){let p={};for(let r=0;r<e.rawHeaders.length;r+=2){let c=e.rawHeaders[r],l=c.toLowerCase();p[l]||(p[l]=[]),p[l].push({key:c,value:String(e.rawHeaders[r+1])})}for(let[r,c]of Object.entries(p))c.length===1?t.request.headers[r]={value:c[0].value}:t.request.headers[r]={value:c[0].value,multiValue:c.map(l=>({value:l.value}))}}else for(let[p,r]of Object.entries(e.headers||{}))t.request.headers[p.toLowerCase()]={value:String(r)};return o.searchParams.forEach((p,r)=>{t.request.querystring[r]={value:p}}),e.headers.cookie&&e.headers.cookie.split(";").forEach(p=>{let[r,c]=p.trim().split("=");r&&(t.request.cookies[r]={value:c||""})}),t}fromCFFEvent(e){if(!e)return null;let a=e;if(e.request&&!e.method&&!e.statusCode&&(e.response&&e.context&&e.context.eventType==="viewer-request"||e.response&&e.context&&e.context.eventType==="viewer-response"?a=e.response:a=e.request),a.method||a.uri){let i=a.uri;if(a.querystring){let o=Object.entries(a.querystring).map(([t,p])=>`${encodeURIComponent(t)}=${encodeURIComponent(p.value)}`).join("&");o&&(i+="?"+o)}let s={};if(a.headers)for(let[o,t]of Object.entries(a.headers))s[o]=[{key:o,value:t.value}];return{url:i,headers:s,_isResponse:!1}}if(a.statusCode){let i={};if(a.headers)for(let[s,o]of Object.entries(a.headers))i[s.toLowerCase()]=[{key:s,value:o.value}];return{status:a.statusCode,statusDescription:a.statusDescription||"OK",headers:i,body:a.body?a.body.data:"",_isResponse:!0}}return null}};js.exports={CFFRunner:$a}});var{Command:dp}=Ya(),{startServer:mp}=ls(),{EdgeRunner:xp}=ks(),{CFFRunner:fp}=Es(),V=require("path"),Os=new dp,vp="1.1.0";Os.name("cloudfrontize").description("Static server with CloudFront Fidelity: Environments & Variable Baking").version(vp).argument("[directory]","directory to serve").option("-p, --port <number>","port to listen on","3000").option("-l, --listen <uri>","listen URI","3000").option("-s, --single","SPA mode: rewrite all not-found to index.html").option("-C, --cors","enable CORS").option("-d, --debug","show negotiation logs").option("-u, --no-compression","disable auto-compression for small files").option("--no-etag","disable ETag").option("--headers <path>","path to JSON file with default request headers").option("-L, --no-request-logging","mute logs").option("--log <path>","path to log file for Lambda@Edge console output (overwrites)").option("-e, --edge <path>","path to a Lambda@Edge module or directory to simulate").option("--cff <path>","path to a CloudFront Functions module or directory to simulate").option("-E, --env <path>","path to environment file (Strict: Reserved AWS variables only)").option("-b, --bake <path>","path to variables file for __VAR__ string replacement").option("-o, --output <path>","output the baked .js file(s) for production deployment").option("--strict","enforce strict CloudFront limits (40KB body, forbidden headers)").option("-m, --mode <mode>","routing behavior: website (S3 Website Hosting) or rest (S3 REST/OAC, default)","rest").action((n,e)=>{!n&&!e.output&&(console.error("\u{1F6D1} Error: A directory to serve must be provided (e.g., cloudfrontize ./www)."),console.error(" Or use --output to bake Lambda@Edge or CFF files without starting the server."),process.exit(1));let a=e.listen!=="3000"?e.listen:e.port,i=e.output&&!n,s=null,o=null;if(e.edge||e.bake||e.output||e.cff){let p=e.edge?V.resolve(e.edge):null,r=e.cff?V.resolve(e.cff):null;if(!p&&!r&&(e.bake||e.output)&&(console.error("\u{1F6D1} Error: --bake and --output require a source --edge or --cff file or directory."),process.exit(1)),p&&(s=new xp(p,{debug:e.debug,logPath:e.log?V.resolve(e.log):null,envPath:e.env?V.resolve(e.env):null,bakePath:e.bake?V.resolve(e.bake):null,outputPath:e.output?V.resolve(e.output):null})),r){let c=e.output?V.resolve(e.output):null,l=c?V.join(c,"cff"):null;o=new fp(r,{debug:e.debug,strict:e.strict,bakePath:e.bake?V.resolve(e.bake):null,outputPath:l})}i&&(console.log(`\u2705 Production-ready file(s) generated at: ${e.output}`),console.log("\u2139\uFE0F Baking complete. No directory provided, so the server will not start."),process.exit(0))}let t=e.headers?V.resolve(e.headers):null;mp({...e,port:parseInt(a),directory:V.resolve(n),headersPath:t,edgeRunner:s,cffRunner:o})});Os.parse(process.argv);
37
+ `,t=new _s.Script(o,{filename:e.name,timeout:Pe.MAX_TOTAL_TIME_MS}),p=process.hrtime.bigint();try{let r=t.runInContext(s,{timeout:Pe.MAX_TOTAL_TIME_MS,breakOnSigint:!0}),c=process.hrtime.bigint(),l=Number(c-p)/1e6;return l>Pe.MAX_CPU_TIME_MS&&console.warn(`\u26A0\uFE0F [CFF] ${e.name} exceeded 1ms CPU limit (Used: ${l.toFixed(2)}ms). AWS may throttle this function.`),r}catch(r){return console.error(`\u{1F6D1} [CFF] Execution Error in ${e.name}: ${r.message}`),null}}toCFFEvent(e,a,i,s=null){let o=new URL(e.url,`http://${e.headers.host||"localhost"}`),t={version:"1.0",context:{eventType:i,requestId:e.requestID||"local",distributionDomainName:"localhost",distributionId:"EDGETEST"},viewer:{ip:e.socket&&e.socket.remoteAddress||"127.0.0.1"},request:{method:e.method,uri:o.pathname,headers:{},querystring:{},cookies:{}}};if(s){t.response={statusCode:s.status||200,statusDescription:s.statusDescription||"OK",headers:{},cookies:{}};for(let[p,r]of Object.entries(s.headers||{})){let c=Array.isArray(r)?r[0]:r;t.response.headers[p.toLowerCase()]={value:String(c)}}}if(e.rawHeaders){let p={};for(let r=0;r<e.rawHeaders.length;r+=2){let c=e.rawHeaders[r],l=c.toLowerCase();p[l]||(p[l]=[]),p[l].push({key:c,value:String(e.rawHeaders[r+1])})}for(let[r,c]of Object.entries(p))c.length===1?t.request.headers[r]={value:c[0].value}:t.request.headers[r]={value:c[0].value,multiValue:c.map(l=>({value:l.value}))}}else for(let[p,r]of Object.entries(e.headers||{}))t.request.headers[p.toLowerCase()]={value:String(r)};return o.searchParams.forEach((p,r)=>{t.request.querystring[r]={value:p}}),e.headers.cookie&&e.headers.cookie.split(";").forEach(p=>{let[r,c]=p.trim().split("=");r&&(t.request.cookies[r]={value:c||""})}),t}fromCFFEvent(e){if(!e)return null;let a=e;if(e.request&&!e.method&&!e.statusCode&&(e.response&&e.context&&e.context.eventType==="viewer-request"||e.response&&e.context&&e.context.eventType==="viewer-response"?a=e.response:a=e.request),a.method||a.uri){let i=a.uri;if(a.querystring){let o=Object.entries(a.querystring).map(([t,p])=>`${encodeURIComponent(t)}=${encodeURIComponent(p.value)}`).join("&");o&&(i+="?"+o)}let s={};if(a.headers)for(let[o,t]of Object.entries(a.headers))s[o]=[{key:o,value:t.value}];return{url:i,headers:s,_isResponse:!1}}if(a.statusCode){let i={};if(a.headers)for(let[s,o]of Object.entries(a.headers))i[s.toLowerCase()]=[{key:s,value:o.value}];return{status:a.statusCode,statusDescription:a.statusDescription||"OK",headers:i,body:a.body?a.body.data:"",_isResponse:!0}}return null}};js.exports={CFFRunner:$a}});var{Command:dp}=Ya(),{startServer:mp}=ls(),{EdgeRunner:xp}=ks(),{CFFRunner:fp}=Es(),V=require("path"),Os=new dp,vp="1.1.1";Os.name("cloudfrontize").description("Static server with CloudFront Fidelity: Environments & Variable Baking").version(vp).argument("[directory]","directory to serve").option("-p, --port <number>","port to listen on","3000").option("-l, --listen <uri>","listen URI","3000").option("-s, --single","SPA mode: rewrite all not-found to index.html").option("-C, --cors","enable CORS").option("-d, --debug","show negotiation logs").option("-u, --no-compression","disable auto-compression for small files").option("--no-etag","disable ETag").option("--headers <path>","path to JSON file with default request headers").option("-L, --no-request-logging","mute logs").option("--log <path>","path to log file for Lambda@Edge console output (overwrites)").option("-e, --edge <path>","path to a Lambda@Edge module or directory to simulate").option("--cff <path>","path to a CloudFront Functions module or directory to simulate").option("-E, --env <path>","path to environment file (Strict: Reserved AWS variables only)").option("-b, --bake <path>","path to variables file for __VAR__ string replacement").option("-o, --output <path>","output the baked .js file(s) for production deployment").option("--strict","enforce strict CloudFront limits (40KB body, forbidden headers)").option("-m, --mode <mode>","routing behavior: website (S3 Website Hosting) or rest (S3 REST/OAC, default)","rest").action((n,e)=>{!n&&!e.output&&(console.error("\u{1F6D1} Error: A directory to serve must be provided (e.g., cloudfrontize ./www)."),console.error(" Or use --output to bake Lambda@Edge or CFF files without starting the server."),process.exit(1));let a=e.listen!=="3000"?e.listen:e.port,i=e.output&&!n,s=null,o=null;if(e.edge||e.bake||e.output||e.cff){let p=e.edge?V.resolve(e.edge):null,r=e.cff?V.resolve(e.cff):null;if(!p&&!r&&(e.bake||e.output)&&(console.error("\u{1F6D1} Error: --bake and --output require a source --edge or --cff file or directory."),process.exit(1)),p&&(s=new xp(p,{debug:e.debug,logPath:e.log?V.resolve(e.log):null,envPath:e.env?V.resolve(e.env):null,bakePath:e.bake?V.resolve(e.bake):null,outputPath:e.output?V.resolve(e.output):null})),r){let c=e.output?V.resolve(e.output):null,l=c?V.join(c,"cff"):null;o=new fp(r,{debug:e.debug,strict:e.strict,bakePath:e.bake?V.resolve(e.bake):null,outputPath:l})}i&&(console.log(`\u2705 Production-ready file(s) generated at: ${e.output}`),console.log("\u2139\uFE0F Baking complete. No directory provided, so the server will not start."),process.exit(0))}let t=e.headers?V.resolve(e.headers):null;mp({...e,port:parseInt(a),directory:V.resolve(n),headersPath:t,edgeRunner:s,cffRunner:o})});Os.parse(process.argv);
38
38
  /*! Bundled license information:
39
39
 
40
40
  mime-db/index.js:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cloudfrontize",
3
3
  "description": "High-performance, high-fidelity local emulator for AWS Lambda@Edge and CloudFront Functions. Validate edge logic, catch illegal header mutations, and execute production-grade runtimes on a specialized local static server.",
4
- "version": "1.1.0",
4
+ "version": "1.1.1",
5
5
  "type": "commonjs",
6
6
  "main": "dist/cli.js",
7
7
  "bin": {
@@ -26,7 +26,6 @@
26
26
  "@aws-sdk/types": "^3.0.0",
27
27
  "@aws-sdk/util-base64": "^3.0.0",
28
28
  "@aws-sdk/util-utf8": "^3.0.0",
29
- "cloudfrontize": "file:cloudfrontize-1.1.0.tgz",
30
29
  "commander": "^11.0.0",
31
30
  "compression": "^1.7.4",
32
31
  "dotenv": "^17.3.1",