appos 0.2.4-0 → 0.3.0-0

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 (130) hide show
  1. package/dist/bin/event-Su-wo96Y.mjs +2 -0
  2. package/dist/bin/extract-blob-metadata-CPnQ5z-I.mjs +2 -0
  3. package/dist/bin/generate-image-variant-0jPXp8Gu.mjs +2 -0
  4. package/dist/bin/generate-preview-QDAk8NkM.mjs +2 -0
  5. package/dist/bin/main.mjs +13 -37
  6. package/dist/bin/{purge-attachment-CMlJMNOk.mjs → purge-attachment-BNMcVoEh.mjs} +1 -1
  7. package/dist/bin/{purge-audit-logs-hd6q6vnR.mjs → purge-audit-logs-C6bh2l3g.mjs} +1 -1
  8. package/dist/bin/{purge-unattached-blobs-BYv5b9R9.mjs → purge-unattached-blobs-CmLk3lNK.mjs} +1 -1
  9. package/dist/bin/{track-db-changes-q0Vl7Htm.mjs → track-db-changes-BUCo-YXD.mjs} +1 -1
  10. package/dist/bin/workflow-CsbetKWL.mjs +2 -0
  11. package/dist/exports/api/auth.mjs +1 -1
  12. package/dist/exports/api/constants.mjs +1 -0
  13. package/dist/exports/api/database.mjs +1 -1
  14. package/dist/exports/api/event.mjs +1 -1
  15. package/dist/exports/api/i18n.mjs +1 -1
  16. package/dist/exports/api/index.d.mts +2 -2
  17. package/dist/exports/api/index.mjs +1 -1
  18. package/dist/exports/api/instrumentation.mjs +1 -0
  19. package/dist/exports/api/middleware.mjs +1 -1
  20. package/dist/exports/api/openapi.d.mts +2 -2
  21. package/dist/exports/api/openapi.mjs +1 -1
  22. package/dist/exports/api/otel.d.mts +1 -1
  23. package/dist/exports/api/otel.mjs +1 -1
  24. package/dist/exports/api/workflow.mjs +1 -1
  25. package/dist/exports/api/workflows/api/event.mjs +1 -0
  26. package/dist/exports/api/workflows/{orm.d.mts → api/orm.d.mts} +1 -1
  27. package/dist/exports/api/workflows/{storage.d.mts → api/storage.d.mts} +1 -1
  28. package/dist/exports/api/workflows/api/workflow.mjs +1 -0
  29. package/dist/exports/api/workflows/constants.mjs +1 -0
  30. package/dist/exports/api/workflows/extract-blob-metadata.mjs +1 -1
  31. package/dist/exports/api/workflows/generate-image-variant.d.mts +2 -2
  32. package/dist/exports/api/workflows/generate-image-variant.mjs +1 -1
  33. package/dist/exports/api/workflows/generate-preview.mjs +1 -1
  34. package/dist/exports/api/workflows/purge-attachment.mjs +1 -1
  35. package/dist/exports/api/workflows/purge-audit-logs.mjs +1 -1
  36. package/dist/exports/api/workflows/purge-unattached-blobs.mjs +1 -1
  37. package/dist/exports/api/workflows/track-db-changes.d.mts +2 -2
  38. package/dist/exports/api/workflows/track-db-changes.mjs +1 -1
  39. package/dist/exports/cli/api/event.mjs +1 -1
  40. package/dist/exports/cli/api/workflow.mjs +1 -1
  41. package/dist/exports/cli/api/workflows/extract-blob-metadata.mjs +1 -1
  42. package/dist/exports/cli/api/workflows/generate-image-variant.mjs +1 -1
  43. package/dist/exports/cli/api/workflows/generate-preview.mjs +1 -1
  44. package/dist/exports/cli/constants.mjs +1 -0
  45. package/dist/exports/tests/api/app-context.mjs +1 -0
  46. package/dist/exports/tests/api/event.mjs +1 -0
  47. package/dist/exports/tests/{packages/appos/src/api → api}/index.d.mts +2 -2
  48. package/dist/exports/tests/api/middleware.mjs +1 -0
  49. package/dist/exports/tests/{packages/appos/src/api → api}/openapi.d.mts +2 -2
  50. package/dist/exports/tests/api/openapi.mjs +1 -0
  51. package/dist/exports/tests/{packages/appos/src/api → api}/orm.d.mts +1 -1
  52. package/dist/exports/tests/api/server.mjs +1 -0
  53. package/dist/exports/tests/api/workflow.mjs +1 -0
  54. package/dist/exports/tests/api/workflows/extract-blob-metadata.mjs +1 -0
  55. package/dist/exports/tests/api/workflows/generate-image-variant.mjs +1 -0
  56. package/dist/exports/tests/api/workflows/generate-preview.mjs +1 -0
  57. package/dist/exports/tests/api.d.mts +3 -3
  58. package/dist/exports/tests/api.mjs +1 -1
  59. package/dist/exports/tests/constants.mjs +1 -0
  60. package/dist/exports/tests/instrumentation.mjs +1 -0
  61. package/package.json +8 -10
  62. package/dist/bin/event-v2sCJkNd.mjs +0 -2
  63. package/dist/bin/extract-blob-metadata-TqNd9w-6.mjs +0 -2
  64. package/dist/bin/generate-image-variant-D8H9FxgD.mjs +0 -2
  65. package/dist/bin/generate-preview-5jLZLX6I.mjs +0 -2
  66. package/dist/bin/workflow-BagSlsMp.mjs +0 -2
  67. package/dist/exports/api/node_modules/.bun/change-case@5.4.4/node_modules/change-case/dist/index.mjs +0 -1
  68. package/dist/exports/api/packages/appos/src/constants.mjs +0 -1
  69. package/dist/exports/api/packages/appos/src/instrumentation.mjs +0 -1
  70. package/dist/exports/api/workflows/event.mjs +0 -1
  71. package/dist/exports/api/workflows/workflow.mjs +0 -1
  72. package/dist/exports/tests/node_modules/.bun/change-case@5.4.4/node_modules/change-case/dist/index.mjs +0 -1
  73. package/dist/exports/tests/node_modules/.bun/rate-limit-redis@4.3.1_f1fa5524233c9c60/node_modules/rate-limit-redis/dist/index.mjs +0 -25
  74. package/dist/exports/tests/packages/appos/src/api/event.mjs +0 -1
  75. package/dist/exports/tests/packages/appos/src/api/middleware.mjs +0 -1
  76. package/dist/exports/tests/packages/appos/src/api/server.mjs +0 -1
  77. package/dist/exports/tests/packages/appos/src/api/workflow.mjs +0 -1
  78. package/dist/exports/tests/packages/appos/src/api/workflows/extract-blob-metadata.mjs +0 -1
  79. package/dist/exports/tests/packages/appos/src/api/workflows/generate-image-variant.mjs +0 -1
  80. package/dist/exports/tests/packages/appos/src/api/workflows/generate-preview.mjs +0 -1
  81. package/dist/exports/tests/packages/appos/src/constants.mjs +0 -1
  82. package/dist/exports/tests/packages/appos/src/instrumentation.mjs +0 -1
  83. /package/dist/exports/api/{packages/appos/src/instrumentation.d.mts → instrumentation.d.mts} +0 -0
  84. /package/dist/exports/api/{packages/appos/src/web → web}/auth.mjs +0 -0
  85. /package/dist/exports/api/workflows/{auth-schema.mjs → api/auth-schema.mjs} +0 -0
  86. /package/dist/exports/api/workflows/{auth.d.mts → api/auth.d.mts} +0 -0
  87. /package/dist/exports/api/workflows/{cache.d.mts → api/cache.d.mts} +0 -0
  88. /package/dist/exports/api/workflows/{config.d.mts → api/config.d.mts} +0 -0
  89. /package/dist/exports/api/workflows/{container.d.mts → api/container.d.mts} +0 -0
  90. /package/dist/exports/api/workflows/{database.d.mts → api/database.d.mts} +0 -0
  91. /package/dist/exports/api/workflows/{event.d.mts → api/event.d.mts} +0 -0
  92. /package/dist/exports/api/workflows/{logger.d.mts → api/logger.d.mts} +0 -0
  93. /package/dist/exports/api/workflows/{mailer.d.mts → api/mailer.d.mts} +0 -0
  94. /package/dist/exports/api/workflows/{redis.mjs → api/redis.mjs} +0 -0
  95. /package/dist/exports/api/workflows/{storage-schema.d.mts → api/storage-schema.d.mts} +0 -0
  96. /package/dist/exports/api/workflows/{workflow.d.mts → api/workflow.d.mts} +0 -0
  97. /package/dist/exports/tests/{packages/appos/src/api → api}/app-context.d.mts +0 -0
  98. /package/dist/exports/tests/{packages/appos/src/api → api}/auth-schema.d.mts +0 -0
  99. /package/dist/exports/tests/{packages/appos/src/api → api}/auth-schema.mjs +0 -0
  100. /package/dist/exports/tests/{packages/appos/src/api → api}/auth.d.mts +0 -0
  101. /package/dist/exports/tests/{packages/appos/src/api → api}/cache.d.mts +0 -0
  102. /package/dist/exports/tests/{packages/appos/src/api → api}/config.d.mts +0 -0
  103. /package/dist/exports/tests/{packages/appos/src/api → api}/container.d.mts +0 -0
  104. /package/dist/exports/tests/{packages/appos/src/api → api}/database.d.mts +0 -0
  105. /package/dist/exports/tests/{packages/appos/src/api → api}/database.mjs +0 -0
  106. /package/dist/exports/tests/{packages/appos/src/api → api}/event.d.mts +0 -0
  107. /package/dist/exports/tests/{packages/appos/src/api → api}/i18n.d.mts +0 -0
  108. /package/dist/exports/tests/{packages/appos/src/api → api}/logger.d.mts +0 -0
  109. /package/dist/exports/tests/{packages/appos/src/api → api}/mailer.d.mts +0 -0
  110. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/error-handler.mjs +0 -0
  111. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/health.mjs +0 -0
  112. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/i18n.mjs +0 -0
  113. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/request-logger.d.mts +0 -0
  114. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/request-logger.mjs +0 -0
  115. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/shutdown.mjs +0 -0
  116. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/timeout.mjs +0 -0
  117. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware/youch-handler.mjs +0 -0
  118. /package/dist/exports/tests/{packages/appos/src/api → api}/middleware.d.mts +0 -0
  119. /package/dist/exports/tests/{packages/appos/src/api → api}/otel.d.mts +0 -0
  120. /package/dist/exports/tests/{packages/appos/src/api → api}/redis.d.mts +0 -0
  121. /package/dist/exports/tests/{packages/appos/src/api → api}/redis.mjs +0 -0
  122. /package/dist/exports/tests/{packages/appos/src/api → api}/storage-schema.d.mts +0 -0
  123. /package/dist/exports/tests/{packages/appos/src/api → api}/storage.d.mts +0 -0
  124. /package/dist/exports/tests/{packages/appos/src/api → api}/workflow.d.mts +0 -0
  125. /package/dist/exports/tests/{packages/appos/src/api → api}/workflows/generate-image-variant.d.mts +0 -0
  126. /package/dist/exports/tests/{packages/appos/src/api → api}/workflows/purge-attachment.mjs +0 -0
  127. /package/dist/exports/tests/{packages/appos/src/api → api}/workflows/purge-audit-logs.mjs +0 -0
  128. /package/dist/exports/tests/{packages/appos/src/api → api}/workflows/purge-unattached-blobs.mjs +0 -0
  129. /package/dist/exports/tests/{packages/appos/src/api → api}/workflows/track-db-changes.mjs +0 -0
  130. /package/dist/exports/tests/{packages/appos/src/instrumentation.d.mts → instrumentation.d.mts} +0 -0
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node --import=appos/instrumentation --no-warnings
2
+ import{c as e,i as t,s as n}from"./workflow-CsbetKWL.mjs";import{basename as r,join as i}from"node:path";import{glob as a}from"node:fs/promises";import{camelCase as o}from"es-toolkit";import{z as s}from"zod";import{createClient as c}from"redis";function l(e){let t=null,n=null;return{inputSchema:e.input,get name(){return n},register(e,r){t=e,n=r},async emit(r){if(!t||!n)throw Error(`Event not registered. Ensure the worker is started before emitting events.`);let i=e.input.parse(r),a={container:t,input:i};await e.run(a),t.eventBus.publish(n,i).catch(e=>{t.logger.error({err:e,event:n},`Redis publish failed`)})},async subscribe(r){if(!t||!n)throw Error(`Event not registered. Ensure the worker is started before subscribing.`);return t.eventBus.subscribe(n,async i=>{let a=e.input.parse(i),o={container:t,input:a};try{await r(o)}catch(e){t.logger.error({err:e,event:n},`Event subscription handler error`)}})}}}const u=l({input:s.object({action:s.enum([`INSERT`,`UPDATE`,`DELETE`]),newData:s.record(s.string(),s.unknown()).nullable(),oldData:s.record(s.string(),s.unknown()).nullable(),organizationId:s.string().nullable(),tableName:s.string(),timestamp:s.string(),userId:s.string().nullable()}),async run(){}});function d(e){return o(r(e,`.ts`))}async function f(r){let{container:o}=r,s=r.eventsDir??i(process.cwd(),t,n);u.register(o,`dbChanges`);let c=await Array.fromAsync(a(`${s}/**/*.${e}`,{exclude:[`**/*.test.ts`,`**/*.spec.ts`,`**/*.test.js`,`**/*.spec.js`]}));for(let e of c){let t=await import(e);if(t.default&&typeof t.default==`object`&&`emit`in t.default&&`subscribe`in t.default){let n=d(e);t.default.register(o,n)}}}export{f as n,u as t};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node --import=appos/instrumentation --no-warnings
2
+ import{n as e}from"./workflow-CsbetKWL.mjs";import{join as t}from"node:path";import n from"zod";import{ALL_FORMATS as r,BlobSource as i,Input as a}from"mediabunny";const o=e({input:n.object({blobId:n.string()}),async run({container:e,input:{blobId:n},step:o}){let s=await o(`fetch-blob`,async()=>e.storage.primary.getBlob(n));if(!s)throw Error(`Blob ${n} not found`);let c=await o(`download-blob`,async()=>e.storage.primary.downloadBlob(n));if(!c)throw Error(`Failed to download blob ${n}`);let l={};return s.contentType?.startsWith(`image/`)?l=await o(`extract-image-metadata`,async()=>{let e=(await import(`sharp`)).default,t=await e(c).metadata();return{width:t.width,height:t.height,format:t.format,hasAlpha:t.hasAlpha,space:t.space}}):s.contentType?.startsWith(`video/`)||s.contentType?.startsWith(`audio/`)?l=await o(`extract-media-metadata`,async()=>{let e=new Uint8Array(c),t=new a({source:new i(new Blob([e],{type:s.contentType||`video/mp4`})),formats:r}),n=await t.computeDuration(),o=await t.getMetadataTags(),l={},u={},d=!1,f=!1;try{let e=await t.getPrimaryVideoTrack();if(e){d=!0;let t=e.displayWidth&&e.displayHeight?e.displayWidth/e.displayHeight:null;l={width:e.displayWidth,height:e.displayHeight,rotation:e.rotation,angle:e.rotation,displayAspectRatio:t}}}catch{}try{let e=await t.getPrimaryAudioTrack();e&&(f=!0,u={sampleRate:e.sampleRate,channels:e.numberOfChannels})}catch{}return{duration:n,video:d,audio:f,...l,...u,tags:o}}):s.contentType===`application/pdf`&&(l=await o(`extract-pdf-metadata`,async()=>{try{let e=await import(`pdfjs-dist/legacy/build/pdf.mjs`),n=`${t(process.cwd(),`node_modules/pdfjs-dist/standard_fonts`)}/`,r=await e.getDocument({data:new Uint8Array(c),standardFontDataUrl:n}).promise,i=await r.getMetadata(),a=(await r.getPage(1)).getViewport({scale:1}),o=i.info;return{pageCount:r.numPages,width:a.width,height:a.height,title:o?.Title||null,author:o?.Author||null,subject:o?.Subject||null,keywords:o?.Keywords||null,creator:o?.Creator||null,producer:o?.Producer||null,creationDate:o?.CreationDate||null,modificationDate:o?.ModDate||null,pdfVersion:o?.PDFFormatVersion||null}}catch(t){return e.logger.error({error:t,errorMessage:t instanceof Error?t.message:String(t),errorStack:t instanceof Error?t.stack:void 0,errorCode:t?.code,blobId:n},`Failed to extract PDF metadata`),{error:`Failed to extract PDF metadata`,errorMessage:t instanceof Error?t.message:String(t)}}})),await o(`save-metadata`,async()=>{await e.storage.primary.updateBlobMetadata(n,{...l,analyzed:!0})}),e.logger.info({blobId:n,metadata:l},`Metadata extracted`),{...l,analyzed:!0}}});export{o as extractBlobMetadata};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node --import=appos/instrumentation --no-warnings
2
+ import{n as e}from"./workflow-CsbetKWL.mjs";import{z as t}from"zod";const n=t.object({width:t.number().optional(),height:t.number().optional(),fit:t.enum([`cover`,`contain`,`fill`,`inside`,`outside`]).optional(),position:t.enum([`top`,`right top`,`right`,`right bottom`,`bottom`,`left bottom`,`left`,`left top`,`centre`]).optional(),kernel:t.enum([`nearest`,`linear`,`cubic`,`mitchell`,`lanczos2`,`lanczos3`]).optional()}),r=t.object({resize:n.optional(),rotate:t.number().optional(),flip:t.boolean().optional(),flop:t.boolean().optional(),sharpen:t.boolean().optional(),blur:t.number().optional(),grayscale:t.boolean().optional(),format:t.enum([`jpeg`,`png`,`webp`,`avif`,`gif`]).optional(),quality:t.number().min(1).max(100).optional(),preview:t.literal(!0).optional()}),i=e({input:t.object({blobId:t.string(),transformations:r}),async run({container:e,input:{blobId:t,transformations:n},step:r}){if(!await r(`fetch-blob`,async()=>e.storage.primary.getBlob(t)))throw Error(`Blob ${t} not found`);let i=await r(`download-blob`,async()=>e.storage.primary.downloadBlob(t));if(!i)throw Error(`Failed to download blob ${t}`);let a=await r(`apply-transformations`,async()=>{let e=(await import(`sharp`)).default,t=e(i);return n.resize&&(t=t.resize({width:n.resize.width,height:n.resize.height,fit:n.resize.fit,position:n.resize.position,kernel:n.resize.kernel})),n.rotate!==void 0&&(t=t.rotate(n.rotate)),n.flip&&(t=t.flip()),n.flop&&(t=t.flop()),n.sharpen&&(t=t.sharpen()),n.blur!==void 0&&(t=t.blur(n.blur)),n.grayscale&&(t=t.grayscale()),n.format&&(t=t.toFormat(n.format,{quality:n.quality})),t.toBuffer()}),o=await r(`store-variant`,async()=>e.storage.primary.createVariant(t,n,a));return e.logger.info({blobId:t,variantId:o.id},`Image variant generated`),o}});export{i as generateImageVariant};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node --import=appos/instrumentation --no-warnings
2
+ import{n as e}from"./workflow-CsbetKWL.mjs";import{spawn as t}from"node:child_process";import{join as n}from"node:path";import r from"zod";const i=e({input:r.object({blobId:r.string(),timeInSeconds:r.number().optional()}),async run({container:e,input:{blobId:r,timeInSeconds:i=1},step:a}){let o=await a(`fetch-blob`,async()=>e.storage.primary.getBlob(r));if(!o)throw Error(`Blob ${r} not found`);let s=await a(`download-blob`,async()=>e.storage.primary.downloadBlob(r));if(!s)throw Error(`Failed to download blob ${r}`);let c=null;if(o.contentType?.startsWith(`video/`))c=await a(`generate-video-preview`,async()=>new Promise((n,a)=>{try{let o=t(`ffmpeg`,[`-i`,`pipe:0`,`-ss`,i.toString(),`-frames:v`,`1`,`-f`,`image2pipe`,`-c:v`,`png`,`pipe:1`]),c=[],l=[];o.stdout.on(`data`,e=>{c.push(e)}),o.stderr.on(`data`,e=>{l.push(e)}),o.on(`close`,async t=>{if(t===0)try{let e=Buffer.concat(c),t=(await import(`sharp`)).default;n(await t(e).jpeg({quality:80}).toBuffer())}catch(t){e.logger.error({error:t,blobId:r},`Failed to convert video frame to JPEG`),a(t)}else{let n=Buffer.concat(l).toString(),i=Error(`FFmpeg exited with code ${t}: ${n}`);e.logger.error({error:i,blobId:r,code:t,stderr:n},`Failed to generate video preview`),a(i)}}),o.on(`error`,t=>{e.logger.error({error:t,blobId:r},`Failed to spawn FFmpeg process`),a(t)}),o.stdin.on(`error`,t=>{t.code!==`EPIPE`&&e.logger.error({error:t,blobId:r},`Failed to write to FFmpeg stdin`)}),o.stdin.write(s),o.stdin.end()}catch(t){e.logger.error({error:t,blobId:r},`Failed to generate video preview`),a(t)}}));else if(o.contentType===`application/pdf`)c=await a(`generate-pdf-preview`,async()=>{try{let e=await import(`pdfjs-dist/legacy/build/pdf.mjs`),{createCanvas:t}=await import(`canvas`),r=(await import(`sharp`)).default,i=`${n(process.cwd(),`node_modules/pdfjs-dist/standard_fonts`)}/`,a=await(await e.getDocument({data:new Uint8Array(s),standardFontDataUrl:i}).promise).getPage(1),o=a.getViewport({scale:2}),c=t(o.width,o.height),l=c.getContext(`2d`);return await a.render({canvasContext:l,viewport:o,canvas:c}).promise,await r(c.toBuffer(`image/png`)).resize(800,800,{fit:`inside`,withoutEnlargement:!0}).jpeg({quality:85}).toBuffer()}catch(t){throw e.logger.error({error:t,errorMessage:t instanceof Error?t.message:String(t),errorStack:t instanceof Error?t.stack:void 0,errorCode:t?.code,blobId:r},`Failed to generate PDF preview`),t}});else if(o.contentType?.startsWith(`image/`))c=await a(`generate-image-preview`,async()=>{let e=(await import(`sharp`)).default;return await e(s).resize(800,800,{fit:`inside`,withoutEnlargement:!0}).jpeg({quality:85}).toBuffer()});else throw Error(`Preview generation not supported for content type: ${o.contentType}`);let l=await a(`store-preview`,async()=>await e.storage.primary.createVariant(r,{preview:!0},c));return e.logger.info({blobId:r,previewId:l.id,contentType:o.contentType},`Preview generated`),l}});export{i as generatePreview};