@webiny/api-file-manager 5.24.0 → 5.25.0-beta.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 (57) hide show
  1. package/handlers/download/index.js +3 -2
  2. package/handlers/download/index.js.map +1 -0
  3. package/handlers/manage/index.js.map +1 -0
  4. package/handlers/transform/index.js.map +1 -0
  5. package/handlers/transform/loaders/imageLoader.d.ts +3 -3
  6. package/handlers/transform/loaders/imageLoader.js +0 -1
  7. package/handlers/transform/loaders/imageLoader.js.map +1 -0
  8. package/handlers/transform/loaders/index.js.map +1 -0
  9. package/handlers/transform/loaders/sanitizeImageTransformations.d.ts +1 -1
  10. package/handlers/transform/loaders/sanitizeImageTransformations.js.map +1 -0
  11. package/handlers/transform/managers/imageManager.js +8 -0
  12. package/handlers/transform/managers/imageManager.js.map +1 -0
  13. package/handlers/transform/managers/index.js.map +1 -0
  14. package/handlers/transform/optimizeImage.js.map +1 -0
  15. package/handlers/transform/transformImage.js.map +1 -0
  16. package/handlers/transform/utils.js.map +1 -0
  17. package/handlers/types.d.ts +2 -2
  18. package/handlers/types.js.map +1 -0
  19. package/handlers/utils/createHandler.d.ts +2 -2
  20. package/handlers/utils/createHandler.js.map +1 -0
  21. package/handlers/utils/getEnvironment.js.map +1 -0
  22. package/handlers/utils/getObjectParams.js.map +1 -0
  23. package/handlers/utils/index.js.map +1 -0
  24. package/package.json +20 -20
  25. package/plugins/crud/files/validation.js.map +1 -0
  26. package/plugins/crud/files.crud.js +4 -7
  27. package/plugins/crud/files.crud.js.map +1 -0
  28. package/plugins/crud/settings.crud.js.map +1 -0
  29. package/plugins/crud/system.crud.js.map +1 -0
  30. package/plugins/crud/utils/checkBasePermissions.js.map +1 -0
  31. package/plugins/crud/utils/createFileModel.js.map +1 -0
  32. package/plugins/crud/utils/lifecycleEvents.js.map +1 -0
  33. package/plugins/definitions/FilePhysicalStoragePlugin.d.ts +1 -1
  34. package/plugins/definitions/FilePhysicalStoragePlugin.js.map +1 -0
  35. package/plugins/definitions/FilePlugin.d.ts +1 -1
  36. package/plugins/definitions/FilePlugin.js +4 -2
  37. package/plugins/definitions/FilePlugin.js.map +1 -0
  38. package/plugins/definitions/FileStorageTransformPlugin.d.ts +1 -1
  39. package/plugins/definitions/FileStorageTransformPlugin.js.map +1 -0
  40. package/plugins/definitions/FilesStorageOperationsProviderPlugin.d.ts +1 -1
  41. package/plugins/definitions/FilesStorageOperationsProviderPlugin.js.map +1 -0
  42. package/plugins/definitions/InstallationPlugin.d.ts +1 -1
  43. package/plugins/definitions/InstallationPlugin.js +4 -2
  44. package/plugins/definitions/InstallationPlugin.js.map +1 -0
  45. package/plugins/definitions/SettingsStorageOperationsProviderPlugin.d.ts +1 -1
  46. package/plugins/definitions/SettingsStorageOperationsProviderPlugin.js.map +1 -0
  47. package/plugins/definitions/SystemStorageOperationsProviderPlugin.d.ts +1 -1
  48. package/plugins/definitions/SystemStorageOperationsProviderPlugin.js.map +1 -0
  49. package/plugins/graphql.js +2 -1
  50. package/plugins/graphql.js.map +1 -0
  51. package/plugins/index.js.map +1 -0
  52. package/plugins/storage/FileStorage.js +15 -4
  53. package/plugins/storage/FileStorage.js.map +1 -0
  54. package/plugins/storage/index.js.map +1 -0
  55. package/types.d.ts +9 -8
  56. package/types.js.map +1 -0
  57. package/utils.js.map +1 -0
@@ -91,13 +91,14 @@ var _default = () => ({
91
91
  params,
92
92
  object
93
93
  } = await getS3Object(event, s3, context);
94
+ const contentLength = object.ContentLength === undefined ? 0 : object.ContentLength;
94
95
 
95
- if (object.ContentLength < MAX_RETURN_CONTENT_LENGTH) {
96
+ if (contentLength < MAX_RETURN_CONTENT_LENGTH) {
96
97
  return {
97
98
  /**
98
99
  * It is safe to cast as buffer or unknown
99
100
  */
100
- data: object.Body,
101
+ data: object.Body || null,
101
102
  headers: {
102
103
  "Content-Type": object.ContentType,
103
104
  "Cache-Control": "public, max-age=" + DEFAULT_CACHE_MAX_AGE
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["MAX_RETURN_CONTENT_LENGTH","DEFAULT_CACHE_MAX_AGE","extractFilenameOptions","event","path","pathParameters","filename","decodeURI","options","queryStringParameters","extension","pathLib","extname","getS3Object","s3","context","loader","loaders","canProcess","file","name","process","params","object","getObject","promise","type","handle","eventHandler","region","S3","contentLength","ContentLength","undefined","data","Body","headers","ContentType","putObjectAcl","Bucket","ACL","Key","statusCode","Location","handler","invocationArgs"],"mappings":"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","sourcesContent":["import { HandlerPlugin } from \"@webiny/handler/types\";\nimport S3 from \"aws-sdk/clients/s3\";\nimport sanitizeFilename from \"sanitize-filename\";\nimport pathLib from \"path\";\nimport { createHandler, getEnvironment, getObjectParams, EventHandlerCallable } from \"../utils\";\nimport loaders from \"../transform/loaders\";\nimport { ArgsContext } from \"@webiny/handler-args/types\";\nimport { DownloadHandlerEventArgs } from \"~/handlers/types\";\nimport { ClientContext } from \"@webiny/handler-client/types\";\n\nconst MAX_RETURN_CONTENT_LENGTH = 5000000; // ~4.77MB\nconst DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year\n\ninterface Context extends ClientContext, ArgsContext<DownloadHandlerEventArgs> {}\n/**\n * Based on given path, extracts file key and additional options sent via query params.\n * @param event\n */\nconst extractFilenameOptions = (event: DownloadHandlerEventArgs) => {\n const path = sanitizeFilename(event.pathParameters.path);\n return {\n filename: decodeURI(path),\n options: event.queryStringParameters,\n extension: pathLib.extname(path)\n };\n};\n\nconst getS3Object = async (event: DownloadHandlerEventArgs, s3: S3, context: Context) => {\n const { options, filename, extension } = extractFilenameOptions(event);\n\n for (const loader of loaders) {\n const canProcess = loader.canProcess({\n context,\n s3,\n options,\n file: {\n name: filename,\n extension\n }\n });\n\n if (!canProcess) {\n continue;\n }\n return loader.process({\n context,\n s3,\n options,\n file: {\n name: filename,\n extension\n }\n });\n }\n\n // If no processors handled the file request, just return the S3 object by default.\n const params = getObjectParams(filename);\n return {\n object: await s3.getObject(params).promise(),\n params: params\n };\n};\n\nexport default (): HandlerPlugin<Context> => ({\n type: \"handler\",\n name: \"handler-download-file\",\n async handle(context) {\n const eventHandler: EventHandlerCallable<DownloadHandlerEventArgs> = async event => {\n const { region } = getEnvironment();\n const s3 = new S3({ region });\n\n const { params, object } = await getS3Object(event, s3, context);\n\n const contentLength = object.ContentLength === undefined ? 0 : object.ContentLength;\n if (contentLength < MAX_RETURN_CONTENT_LENGTH) {\n return {\n /**\n * It is safe to cast as buffer or unknown\n */\n data: object.Body || null,\n headers: {\n \"Content-Type\": object.ContentType,\n \"Cache-Control\": \"public, max-age=\" + DEFAULT_CACHE_MAX_AGE\n }\n };\n }\n\n // Lambda can return max 6MB of content, so if our object's size is larger, we are sending\n // a 301 Redirect, redirecting the user to the public URL of the object in S3.\n await s3\n .putObjectAcl({\n Bucket: params.Bucket,\n ACL: \"public-read\",\n Key: params.Key\n })\n .promise();\n\n return {\n data: null,\n statusCode: 301,\n headers: {\n Location: `https://${params.Bucket}.s3.amazonaws.com/${params.Key}`\n }\n };\n };\n const handler = createHandler(eventHandler);\n\n return await handler(context.invocationArgs);\n }\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["type","name","handle","context","eventHandler","event","keys","i","Records","length","record","s3","object","key","push","region","S3","extension","path","extname","manager","managers","canProcess","process","handler","invocationArgs"],"mappings":";;;;;;;;;AAAA;;AACA;;AAEA;;AACA;;eAIe,OAA2D;AACtEA,EAAAA,IAAI,EAAE,SADgE;AAEtEC,EAAAA,IAAI,EAAE,uBAFgE;;AAGtE,QAAMC,MAAN,CAAaC,OAAb,EAAsB;AAClB;AACA;AACA,UAAMC,YAA0D,GAAG,MAAMC,KAAN,IAAe;AAC9E,YAAMC,IAAc,GAAG,EAAvB;;AACA,WAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGF,KAAK,CAACG,OAAN,CAAcC,MAAlC,EAA0CF,CAAC,EAA3C,EAA+C;AAC3C,cAAMG,MAAM,GAAGL,KAAK,CAACG,OAAN,CAAcD,CAAd,CAAf;;AACA,YAAI,OAAOG,MAAM,CAACC,EAAP,CAAUC,MAAV,CAAiBC,GAAxB,KAAgC,QAApC,EAA8C;AAC1CP,UAAAA,IAAI,CAACQ,IAAL,CAAUJ,MAAM,CAACC,EAAP,CAAUC,MAAV,CAAiBC,GAA3B;AACH;AACJ;;AAED,YAAM;AAAEE,QAAAA;AAAF,UAAa,4BAAnB;AACA,YAAMJ,EAAE,GAAG,IAAIK,UAAJ,CAAO;AAAED,QAAAA;AAAF,OAAP,CAAX;;AAEA,WAAK,MAAMF,GAAX,IAAkBP,IAAlB,EAAwB;AACpB,cAAMW,SAAS,GAAGC,cAAKC,OAAL,CAAaN,GAAb,CAAlB;;AAEA,aAAK,MAAMO,OAAX,IAAsBC,iBAAtB,EAAgC;AAC5B,gBAAMC,UAAU,GAAGF,OAAO,CAACE,UAAR,CAAmB;AAClCT,YAAAA,GADkC;AAElCI,YAAAA;AAFkC,WAAnB,CAAnB;;AAKA,cAAI,CAACK,UAAL,EAAiB;AACb;AACH;;AACD,gBAAMF,OAAO,CAACG,OAAR,CAAgB;AAClBZ,YAAAA,EADkB;AAElBE,YAAAA,GAFkB;AAGlBI,YAAAA;AAHkB,WAAhB,CAAN;AAKH;AACJ;AACJ,KA/BD;;AAiCA,UAAMO,OAAO,GAAG,0BAAcpB,YAAd,CAAhB;AAEA,WAAO,MAAMoB,OAAO,CAACrB,OAAO,CAACsB,cAAT,CAApB;AACH;;AA1CqE,CAA3D,C","sourcesContent":["import path from \"path\";\nimport S3 from \"aws-sdk/clients/s3\";\nimport { HandlerPlugin } from \"@webiny/handler/types\";\nimport { createHandler, getEnvironment, EventHandlerCallable } from \"../utils\";\nimport managers from \"../transform/managers\";\nimport { ArgsContext } from \"@webiny/handler-args/types\";\nimport { ManageHandlerEventArgs } from \"~/handlers/types\";\n\nexport default (): HandlerPlugin<ArgsContext<ManageHandlerEventArgs>> => ({\n type: \"handler\",\n name: \"handler-download-file\",\n async handle(context) {\n // TODO @ts-refactor check in createHandler for returns types that eventHandler must return\n // @ts-ignore\n const eventHandler: EventHandlerCallable<ManageHandlerEventArgs> = async event => {\n const keys: string[] = [];\n for (let i = 0; i < event.Records.length; i++) {\n const record = event.Records[i];\n if (typeof record.s3.object.key === \"string\") {\n keys.push(record.s3.object.key);\n }\n }\n\n const { region } = getEnvironment();\n const s3 = new S3({ region });\n\n for (const key of keys) {\n const extension = path.extname(key);\n\n for (const manager of managers) {\n const canProcess = manager.canProcess({\n key,\n extension\n });\n\n if (!canProcess) {\n continue;\n }\n await manager.process({\n s3,\n key,\n extension\n });\n }\n }\n };\n\n const handler = createHandler(eventHandler);\n\n return await handler(context.invocationArgs);\n }\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["type","name","handle","context","eventHandler","body","transformations","key","env","s3","S3","region","optimizedImageObject","params","initial","optimized","optimizedTransformed","getObject","promise","e","putObject","ContentType","Body","error","message","handler","invocationArgs"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;eAKe,OAA8D;AACzEA,EAAAA,IAAI,EAAE,SADmE;AAEzEC,EAAAA,IAAI,EAAE,uBAFmE;;AAGzE,QAAMC,MAAN,CAAaC,OAAb,EAAsB;AAClB;AACA;AACA,UAAMC,YAA6D,GAAG,OAAO;AACzEC,MAAAA,IAAI,EAAE;AAAEC,QAAAA,eAAF;AAAmBC,QAAAA;AAAnB;AADmE,KAAP,KAEhE;AACF,UAAI;AACA,cAAMC,GAAG,GAAG,4BAAZ;AACA,cAAMC,EAAE,GAAG,IAAIC,UAAJ,CAAO;AAAEC,UAAAA,MAAM,EAAEH,GAAG,CAACG;AAAd,SAAP,CAAX;AAEA,YAAIC,oBAAJ;AAEA,cAAMC,MAAM,GAAG;AACXC,UAAAA,OAAO,EAAE,4BAAgBP,GAAhB,CADE;AAEXQ,UAAAA,SAAS,EAAE,4BAAgB,yBAAY;AAAER,YAAAA;AAAF,WAAZ,CAAhB,CAFA;AAGXS,UAAAA,oBAAoB,EAAE,4BAAgB,yBAAY;AAAET,YAAAA,GAAF;AAAOD,YAAAA;AAAP,WAAZ,CAAhB;AAHX,SAAf,CANA,CAYA;;AACA,YAAI;AACAM,UAAAA,oBAAoB,GAAG,MAAMH,EAAE,CAACQ,SAAH,CAAaJ,MAAM,CAACE,SAApB,EAA+BG,OAA/B,EAA7B;AACH,SAFD,CAEE,OAAOC,CAAP,EAAU;AACR;AACAP,UAAAA,oBAAoB,GAAG,MAAMH,EAAE,CAACQ,SAAH,CAAaJ,MAAM,CAACC,OAApB,EAA6BI,OAA7B,EAA7B;AAEA,gBAAMT,EAAE,CACHW,SADC,iCAEKP,MAAM,CAACE,SAFZ;AAGEM,YAAAA,WAAW,EAAET,oBAAoB,CAACS,WAHpC;AAIEC,YAAAA,IAAI,EAAE,MAAM,4BACRV,oBAAoB,CAACU,IADb,EAERV,oBAAoB,CAACS,WAFb;AAJd,cASDH,OATC,EAAN;AAWAN,UAAAA,oBAAoB,GAAG,MAAMH,EAAE,CAACQ,SAAH,CAAaJ,MAAM,CAACE,SAApB,EAA+BG,OAA/B,EAA7B;AACH,SA/BD,CAiCA;;;AACA,YAAI,CAACZ,eAAL,EAAsB;AAClB,iBAAO;AAAEiB,YAAAA,KAAK,EAAE,KAAT;AAAgBC,YAAAA,OAAO,EAAE;AAAzB,WAAP;AACH,SApCD,CAsCA;;;AACA,cAAMf,EAAE,CACHW,SADC,iCAEKP,MAAM,CAACG,oBAFZ;AAGEK,UAAAA,WAAW,EAAET,oBAAoB,CAACS,WAHpC;AAIEC,UAAAA,IAAI,EAAE,MAAM,6BACRV,oBAAoB,CAACU,IADb,EAERhB,eAFQ;AAJd,YASDY,OATC,EAAN;AAWA,eAAO;AAAEK,UAAAA,KAAK,EAAE,KAAT;AAAgBC,UAAAA,OAAO,EAAE;AAAzB,SAAP;AACH,OAnDD,CAmDE,OAAOL,CAAP,EAAU;AACR,eAAO;AAAEI,UAAAA,KAAK,EAAE,IAAT;AAAeC,UAAAA,OAAO,EAAEL,CAAC,CAACK;AAA1B,SAAP;AACH;AACJ,KAzDD;;AA0DA,UAAMC,OAAO,GAAG,0BAAcrB,YAAd,CAAhB;AAEA,WAAO,MAAMqB,OAAO,CAACtB,OAAO,CAACuB,cAAT,CAApB;AACH;;AAnEwE,CAA9D,C","sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport transformImage from \"./transformImage\";\nimport optimizeImage from \"./optimizeImage\";\nimport { createHandler, EventHandlerCallable, getEnvironment, getObjectParams } from \"../utils\";\nimport { getImageKey } from \"./utils\";\nimport { HandlerPlugin } from \"@webiny/handler/types\";\nimport { ArgsContext } from \"@webiny/handler-args/types\";\nimport { TransformHandlerEventArgs } from \"~/handlers/types\";\n\nexport default (): HandlerPlugin<ArgsContext<TransformHandlerEventArgs>> => ({\n type: \"handler\",\n name: \"handler-download-file\",\n async handle(context) {\n // TODO @ts-refactor check in createHandler for returns types that eventHandler must return\n // @ts-ignore\n const eventHandler: EventHandlerCallable<TransformHandlerEventArgs> = async ({\n body: { transformations, key }\n }) => {\n try {\n const env = getEnvironment();\n const s3 = new S3({ region: env.region });\n\n let optimizedImageObject: S3.Types.GetObjectOutput;\n\n const params = {\n initial: getObjectParams(key),\n optimized: getObjectParams(getImageKey({ key })),\n optimizedTransformed: getObjectParams(getImageKey({ key, transformations }))\n };\n\n // 1. Get optimized image.\n try {\n optimizedImageObject = await s3.getObject(params.optimized).promise();\n } catch (e) {\n // If not found, try to create it by loading the initially uploaded image.\n optimizedImageObject = await s3.getObject(params.initial).promise();\n\n await s3\n .putObject({\n ...params.optimized,\n ContentType: optimizedImageObject.ContentType,\n Body: await optimizeImage(\n optimizedImageObject.Body as Buffer,\n optimizedImageObject.ContentType as string\n )\n })\n .promise();\n\n optimizedImageObject = await s3.getObject(params.optimized).promise();\n }\n\n // 2. If no transformations requested, just exit.\n if (!transformations) {\n return { error: false, message: \"\" };\n }\n\n // 3. If transformations requested, apply them in save it into the bucket.\n await s3\n .putObject({\n ...params.optimizedTransformed,\n ContentType: optimizedImageObject.ContentType,\n Body: await transformImage(\n optimizedImageObject.Body as Buffer,\n transformations\n )\n })\n .promise();\n\n return { error: false, message: \"\" };\n } catch (e) {\n return { error: true, message: e.message };\n }\n };\n const handler = createHandler(eventHandler);\n\n return await handler(context.invocationArgs);\n }\n});\n"]}
@@ -5,18 +5,18 @@ interface File {
5
5
  name: string;
6
6
  }
7
7
  interface Options {
8
- width: string;
8
+ width?: string;
9
9
  }
10
10
  export interface CanProcessParams {
11
11
  s3: S3;
12
12
  file: File;
13
- options: Options;
13
+ options?: Options;
14
14
  context: ClientContext;
15
15
  }
16
16
  export interface ProcessParams {
17
17
  s3: S3;
18
18
  file: File;
19
- options: Options;
19
+ options?: Options;
20
20
  context: ClientContext;
21
21
  }
22
22
  declare const _default: {
@@ -13,7 +13,6 @@ var _utils = require("../../utils");
13
13
 
14
14
  var _utils2 = require("../utils");
15
15
 
16
- // @ts-ignore
17
16
  const IMAGE_TRANSFORMER_FUNCTION = process.env.IMAGE_TRANSFORMER_FUNCTION;
18
17
 
19
18
  const callImageTransformerLambda = async ({
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["imageLoader.ts"],"names":["IMAGE_TRANSFORMER_FUNCTION","process","env","callImageTransformerLambda","key","transformations","context","handlerClient","invoke","name","payload","body","canProcess","params","SUPPORTED_IMAGES","includes","file","extension","s3","options","objectParams","SUPPORTED_TRANSFORMABLE_IMAGES","object","getObject","promise","e","imageTransformerLambdaResponse","error","Error","message"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AAIA,MAAMA,0BAA0B,GAAGC,OAAO,CAACC,GAAR,CAAYF,0BAA/C;;AAQA,MAAMG,0BAA0B,GAAG,OAAO;AAAEC,EAAAA,GAAF;AAAOC,EAAAA,eAAP;AAAwBC,EAAAA;AAAxB,CAAP,KAAgE;AAC/F,SAAO,MAAMA,OAAO,CAACC,aAAR,CAAsBC,MAAtB,CAA6B;AACtCC,IAAAA,IAAI,EAAET,0BADgC;AAEtCU,IAAAA,OAAO,EAAE;AACLC,MAAAA,IAAI,EAAE;AACFP,QAAAA,GADE;AAEFC,QAAAA;AAFE;AADD;AAF6B,GAA7B,CAAb;AASH,CAVD;;eA8Be;AACXO,EAAAA,UAAU,EAAGC,MAAD,IAA8B;AACtC,WAAOC,yBAAiBC,QAAjB,CAA0BF,MAAM,CAACG,IAAP,CAAYC,SAAtC,CAAP;AACH,GAHU;;AAIX,QAAMhB,OAAN,CAAc;AAAEiB,IAAAA,EAAF;AAAMF,IAAAA,IAAN;AAAYG,IAAAA,OAAZ;AAAqBb,IAAAA;AAArB,GAAd,EAA6D;AACzD;AACA,QAAIc,YAAJ;AAEA,UAAMf,eAAe,GAAG,2CAA6Bc,OAA7B,CAAxB;;AAEA,QAAId,eAAe,IAAIgB,uCAA+BN,QAA/B,CAAwCC,IAAI,CAACC,SAA7C,CAAvB,EAAgF;AAC5EG,MAAAA,YAAY,GAAG,4BAAgB,yBAAY;AAAEhB,QAAAA,GAAG,EAAEY,IAAI,CAACP,IAAZ;AAAkBJ,QAAAA;AAAlB,OAAZ,CAAhB,CAAf;;AACA,UAAI;AACA,eAAO;AACHiB,UAAAA,MAAM,EAAE,MAAMJ,EAAE,CAACK,SAAH,CAAaH,YAAb,EAA2BI,OAA3B,EADX;AAEHX,UAAAA,MAAM,EAAEO;AAFL,SAAP;AAIH,OALD,CAKE,OAAOK,CAAP,EAAU;AACR,cAAMC,8BAA8B,GAAG,MAAMvB,0BAA0B,CAAC;AACpEC,UAAAA,GAAG,EAAEY,IAAI,CAACP,IAD0D;AAEpEJ,UAAAA,eAFoE;AAGpEC,UAAAA;AAHoE,SAAD,CAAvE;;AAMA,YAAIoB,8BAA8B,CAACC,KAAnC,EAA0C;AACtC,gBAAMC,KAAK,CAACF,8BAA8B,CAACG,OAAhC,CAAX;AACH;;AAED,eAAO;AACHP,UAAAA,MAAM,EAAE,MAAMJ,EAAE,CAACK,SAAH,CAAaH,YAAb,EAA2BI,OAA3B,EADX;AAEHX,UAAAA,MAAM,EAAEO;AAFL,SAAP;AAIH;AACJ;;AAEDA,IAAAA,YAAY,GAAG,4BAAgB,yBAAY;AAAEhB,MAAAA,GAAG,EAAEY,IAAI,CAACP;AAAZ,KAAZ,CAAhB,CAAf;;AACA,QAAI;AACA,aAAO;AACHa,QAAAA,MAAM,EAAE,MAAMJ,EAAE,CAACK,SAAH,CAAaH,YAAb,EAA2BI,OAA3B,EADX;AAEHX,QAAAA,MAAM,EAAEO;AAFL,OAAP;AAIH,KALD,CAKE,OAAOK,CAAP,EAAU;AACR,YAAMC,8BAA8B,GAAG,MAAMvB,0BAA0B,CAAC;AACpEC,QAAAA,GAAG,EAAEY,IAAI,CAACP,IAD0D;AAEpEH,QAAAA;AAFoE,OAAD,CAAvE;;AAKA,UAAIoB,8BAA8B,CAACC,KAAnC,EAA0C;AACtC,cAAMC,KAAK,CAACF,8BAA8B,CAACG,OAAhC,CAAX;AACH;;AAED,aAAO;AACHP,QAAAA,MAAM,EAAE,MAAMJ,EAAE,CAACK,SAAH,CAAaH,YAAb,EAA2BI,OAA3B,EADX;AAEHX,QAAAA,MAAM,EAAEO;AAFL,OAAP;AAIH;AACJ;;AAxDU,C","sourcesContent":["import sanitizeImageTransformations from \"./sanitizeImageTransformations\";\nimport { getObjectParams } from \"../../utils\";\nimport { SUPPORTED_IMAGES, SUPPORTED_TRANSFORMABLE_IMAGES, getImageKey } from \"../utils\";\nimport { ClientContext } from \"@webiny/handler-client/types\";\nimport S3 from \"aws-sdk/clients/s3\";\n\nconst IMAGE_TRANSFORMER_FUNCTION = process.env.IMAGE_TRANSFORMER_FUNCTION as string;\n\ninterface TransformerParams {\n context: ClientContext;\n key: string;\n transformations?: any;\n}\n\nconst callImageTransformerLambda = async ({ key, transformations, context }: TransformerParams) => {\n return await context.handlerClient.invoke({\n name: IMAGE_TRANSFORMER_FUNCTION,\n payload: {\n body: {\n key,\n transformations\n }\n }\n });\n};\ninterface File {\n extension: string;\n name: string;\n}\ninterface Options {\n width?: string;\n}\nexport interface CanProcessParams {\n s3: S3;\n file: File;\n options?: Options;\n context: ClientContext;\n}\nexport interface ProcessParams {\n s3: S3;\n file: File;\n options?: Options;\n context: ClientContext;\n}\nexport default {\n canProcess: (params: CanProcessParams) => {\n return SUPPORTED_IMAGES.includes(params.file.extension);\n },\n async process({ s3, file, options, context }: ProcessParams) {\n // Loaders must return {object, params} object.\n let objectParams;\n\n const transformations = sanitizeImageTransformations(options);\n\n if (transformations && SUPPORTED_TRANSFORMABLE_IMAGES.includes(file.extension)) {\n objectParams = getObjectParams(getImageKey({ key: file.name, transformations }));\n try {\n return {\n object: await s3.getObject(objectParams).promise(),\n params: objectParams\n };\n } catch (e) {\n const imageTransformerLambdaResponse = await callImageTransformerLambda({\n key: file.name,\n transformations,\n context\n });\n\n if (imageTransformerLambdaResponse.error) {\n throw Error(imageTransformerLambdaResponse.message);\n }\n\n return {\n object: await s3.getObject(objectParams).promise(),\n params: objectParams\n };\n }\n }\n\n objectParams = getObjectParams(getImageKey({ key: file.name }));\n try {\n return {\n object: await s3.getObject(objectParams).promise(),\n params: objectParams\n };\n } catch (e) {\n const imageTransformerLambdaResponse = await callImageTransformerLambda({\n key: file.name,\n context\n });\n\n if (imageTransformerLambdaResponse.error) {\n throw Error(imageTransformerLambdaResponse.message);\n }\n\n return {\n object: await s3.getObject(objectParams).promise(),\n params: objectParams\n };\n }\n }\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["imageLoader"],"mappings":";;;;;;;;;AAAA;;eAEe,CAACA,oBAAD,C","sourcesContent":["import imageLoader from \"./imageLoader\";\n\nexport default [imageLoader];\n"]}
@@ -4,7 +4,7 @@ export interface SanitizeImageArgs {
4
4
  export interface SanitizeImageTransformations {
5
5
  width: number;
6
6
  }
7
- declare const _default: (args: SanitizeImageArgs) => SanitizeImageTransformations;
7
+ declare const _default: (args?: SanitizeImageArgs | undefined) => SanitizeImageTransformations | null;
8
8
  /**
9
9
  * Takes only allowed transformations into consideration, and discards the rest.
10
10
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["sanitizeImageTransformations.ts"],"names":["SUPPORTED_IMAGE_RESIZE_WIDTHS","args","transformations","width","parseInt","i","length","Object","keys"],"mappings":";;;;;;AAAA,MAAMA,6BAAuC,GAAG,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,IAArB,EAA2B,IAA3B,EAAiC,IAAjC,CAAhD;;AASA;AACA;AACA;eACgBC,IAAD,IAAmE;AAC9E,QAAMC,eAAsD,GAAG,EAA/D;;AAEA,MAAI,CAACD,IAAD,IAAS,CAACA,IAAI,CAACE,KAAnB,EAA0B;AACtB,WAAO,IAAP;AACH;;AACD,QAAMA,KAAK,GAAGC,QAAQ,CAACH,IAAI,CAACE,KAAN,CAAtB;;AACA,MAAIA,KAAK,IAAI,CAAb,EAAgB;AACZ,WAAO,IAAP;AACH;;AACDD,EAAAA,eAAe,CAACC,KAAhB,GAAwBH,6BAA6B,CAAC,CAAD,CAArD;AACA,MAAIK,CAAC,GAAGL,6BAA6B,CAACM,MAAtC;;AACA,SAAOD,CAAC,IAAI,CAAZ,EAAe;AACX,QAAIF,KAAK,KAAKH,6BAA6B,CAACK,CAAD,CAA3C,EAAgD;AAC5CH,MAAAA,eAAe,CAACC,KAAhB,GAAwBH,6BAA6B,CAACK,CAAD,CAArD;AACA;AACH;;AAED,QAAIF,KAAK,GAAGH,6BAA6B,CAACK,CAAD,CAAzC,EAA8C;AAC1C;AACAH,MAAAA,eAAe,CAACC,KAAhB,GAAwBH,6BAA6B,CAACK,CAAC,GAAG,CAAL,CAArD;;AACA,UAAI,CAACH,eAAe,CAACC,KAArB,EAA4B;AACxBD,QAAAA,eAAe,CAACC,KAAhB,GAAwBH,6BAA6B,CAACK,CAAD,CAArD;AACH;;AACD;AACH;;AAEDA,IAAAA,CAAC;AACJ;;AAED,MAAIE,MAAM,CAACC,IAAP,CAAYN,eAAZ,EAA6BI,MAA7B,GAAsC,CAA1C,EAA6C;AACzC;AACR;AACA;AACQ,WAAOJ,eAAP;AACH;;AAED,SAAO,IAAP;AACH,C","sourcesContent":["const SUPPORTED_IMAGE_RESIZE_WIDTHS: number[] = [100, 300, 500, 750, 1000, 1500, 2500];\n\nexport interface SanitizeImageArgs {\n width?: string;\n}\n\nexport interface SanitizeImageTransformations {\n width: number;\n}\n/**\n * Takes only allowed transformations into consideration, and discards the rest.\n */\nexport default (args?: SanitizeImageArgs): SanitizeImageTransformations | null => {\n const transformations: Partial<SanitizeImageTransformations> = {};\n\n if (!args || !args.width) {\n return null;\n }\n const width = parseInt(args.width);\n if (width <= 0) {\n return null;\n }\n transformations.width = SUPPORTED_IMAGE_RESIZE_WIDTHS[0];\n let i = SUPPORTED_IMAGE_RESIZE_WIDTHS.length;\n while (i >= 0) {\n if (width === SUPPORTED_IMAGE_RESIZE_WIDTHS[i]) {\n transformations.width = SUPPORTED_IMAGE_RESIZE_WIDTHS[i];\n break;\n }\n\n if (width > SUPPORTED_IMAGE_RESIZE_WIDTHS[i]) {\n // Use next larger width. If there isn't any, use current.\n transformations.width = SUPPORTED_IMAGE_RESIZE_WIDTHS[i + 1];\n if (!transformations.width) {\n transformations.width = SUPPORTED_IMAGE_RESIZE_WIDTHS[i];\n }\n break;\n }\n\n i--;\n }\n\n if (Object.keys(transformations).length > 0) {\n /**\n * It is safe to cast.\n */\n return transformations as SanitizeImageTransformations;\n }\n\n return null;\n};\n"]}
@@ -43,7 +43,15 @@ var _default = {
43
43
  Prefix: (0, _utils2.getOptimizedTransformedImageKeyPrefix)(key)
44
44
  }).promise();
45
45
 
46
+ if (!imagesList.Contents) {
47
+ return;
48
+ }
49
+
46
50
  for (const imageObject of imagesList.Contents) {
51
+ if (!imageObject.Key) {
52
+ continue;
53
+ }
54
+
47
55
  await s3.deleteObject((0, _utils.getObjectParams)(imageObject.Key)).promise();
48
56
  }
49
57
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["imageManager.ts"],"names":["canProcess","params","key","extension","SUPPORTED_IMAGES","includes","startsWith","OPTIMIZED_IMAGE_PREFIX","OPTIMIZED_TRANSFORMED_IMAGE_PREFIX","process","s3","deleteObject","promise","SUPPORTED_TRANSFORMABLE_IMAGES","env","imagesList","listObjects","Bucket","bucket","Prefix","Contents","imageObject","Key"],"mappings":";;;;;;;AACA;;AACA;;eAkBe;AACXA,EAAAA,UAAU,EAAGC,MAAD,IAA0C;AAClD,UAAM;AAAEC,MAAAA,GAAF;AAAOC,MAAAA;AAAP,QAAqBF,MAA3B;;AACA,QAAIG,yBAAiBC,QAAjB,CAA0BF,SAA1B,MAAyC,KAA7C,EAAoD;AAChD,aAAO,KAAP;AACH;;AAED,WACID,GAAG,CAACI,UAAJ,CAAeC,8BAAf,KACAL,GAAG,CAACI,UAAJ,CAAeE,0CAAf,CAFJ;AAIH,GAXU;;AAYX,QAAMC,OAAN,CAAc;AAAEC,IAAAA,EAAF;AAAMR,IAAAA,GAAN;AAAWC,IAAAA;AAAX,GAAd,EAAiE;AAC7D;AAEA,UAAMO,EAAE,CAACC,YAAH,CAAgB,4BAAgB,yBAAY;AAAET,MAAAA;AAAF,KAAZ,CAAhB,CAAhB,EAAuDU,OAAvD,EAAN,CAH6D,CAK7D;;AACA,QAAIC,uCAA+BR,QAA/B,CAAwCF,SAAxC,MAAuD,KAA3D,EAAkE;AAC9D;AACH;;AACD,UAAMW,GAAG,GAAG,4BAAZ;AACA,UAAMC,UAAU,GAAG,MAAML,EAAE,CACtBM,WADoB,CACR;AACTC,MAAAA,MAAM,EAAEH,GAAG,CAACI,MADH;AAETC,MAAAA,MAAM,EAAE,mDAAsCjB,GAAtC;AAFC,KADQ,EAKpBU,OALoB,EAAzB;;AAOA,QAAI,CAACG,UAAU,CAACK,QAAhB,EAA0B;AACtB;AACH;;AAED,SAAK,MAAMC,WAAX,IAA0BN,UAAU,CAACK,QAArC,EAA+C;AAC3C,UAAI,CAACC,WAAW,CAACC,GAAjB,EAAsB;AAClB;AACH;;AACD,YAAMZ,EAAE,CAACC,YAAH,CAAgB,4BAAgBU,WAAW,CAACC,GAA5B,CAAhB,EAAkDV,OAAlD,EAAN;AACH;AACJ;;AAvCU,C","sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { getObjectParams, getEnvironment } from \"~/handlers/utils\";\nimport {\n SUPPORTED_IMAGES,\n SUPPORTED_TRANSFORMABLE_IMAGES,\n OPTIMIZED_IMAGE_PREFIX,\n OPTIMIZED_TRANSFORMED_IMAGE_PREFIX,\n getImageKey,\n getOptimizedTransformedImageKeyPrefix\n} from \"../utils\";\n\nexport interface ImageManagerCanProcessParams {\n key: string;\n extension: string;\n}\nexport interface ImageManagerProcessParams {\n s3: S3;\n key: string;\n extension: string;\n}\nexport default {\n canProcess: (params: ImageManagerCanProcessParams) => {\n const { key, extension } = params;\n if (SUPPORTED_IMAGES.includes(extension) === false) {\n return false;\n }\n\n return (\n key.startsWith(OPTIMIZED_IMAGE_PREFIX) ||\n key.startsWith(OPTIMIZED_TRANSFORMED_IMAGE_PREFIX)\n );\n },\n async process({ s3, key, extension }: ImageManagerProcessParams) {\n // 1. Get optimized image's key.\n\n await s3.deleteObject(getObjectParams(getImageKey({ key }))).promise();\n\n // 2. Search for all transformed images and delete those too.\n if (SUPPORTED_TRANSFORMABLE_IMAGES.includes(extension) === false) {\n return;\n }\n const env = getEnvironment();\n const imagesList = await s3\n .listObjects({\n Bucket: env.bucket,\n Prefix: getOptimizedTransformedImageKeyPrefix(key)\n })\n .promise();\n\n if (!imagesList.Contents) {\n return;\n }\n\n for (const imageObject of imagesList.Contents) {\n if (!imageObject.Key) {\n continue;\n }\n await s3.deleteObject(getObjectParams(imageObject.Key)).promise();\n }\n }\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["imageManager"],"mappings":";;;;;;;;;AAAA;;eAEe,CAACA,qBAAD,C","sourcesContent":["import imageManager from \"./imageManager\";\n\nexport default [imageManager];\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["optimizeImage.ts"],"names":["buffer","type","resize","width","withoutEnlargement","fit","png","compressionLevel","adaptiveFiltering","force","withMetadata","toBuffer","toFormat","quality"],"mappings":";;;;;;;;;AAIA;;AAJA;AACA;AACA;AACA;eAIe,OAAOA,MAAP,EAAqBC,IAArB,KAAqD;AAChE,UAAQA,IAAR;AACI,SAAK,WAAL;AAAkB;AACd,eAAO,MAAM,oBAAMD,MAAN,EACRE,MADQ,CACD;AAAEC,UAAAA,KAAK,EAAE,IAAT;AAAeC,UAAAA,kBAAkB,EAAE,IAAnC;AAAyCC,UAAAA,GAAG,EAAE;AAA9C,SADC,EAERC,GAFQ,CAEJ;AAAEC,UAAAA,gBAAgB,EAAE,CAApB;AAAuBC,UAAAA,iBAAiB,EAAE,IAA1C;AAAgDC,UAAAA,KAAK,EAAE;AAAvD,SAFI,EAGRC,YAHQ,GAIRC,QAJQ,EAAb;AAKH;;AACD,SAAK,YAAL;AACA,SAAK,WAAL;AAAkB;AACd,eAAO,MAAM,oBAAMX,MAAN,EACRE,MADQ,CACD;AAAEC,UAAAA,KAAK,EAAE,IAAT;AAAeC,UAAAA,kBAAkB,EAAE,IAAnC;AAAyCC,UAAAA,GAAG,EAAE;AAA9C,SADC,EAERO,QAFQ,CAEC,MAFD,EAES;AAAEC,UAAAA,OAAO,EAAE;AAAX,SAFT,EAGRF,QAHQ,EAAb;AAIH;;AACD;AACI,aAAOX,MAAP;AAhBR;AAkBH,C","sourcesContent":["/**\n * Sharp is included in the AWS Lambda layer\n */\n// @ts-ignore\nimport sharp from \"sharp\";\nimport { Body } from \"aws-sdk/clients/s3\";\n\nexport default async (buffer: Body, type: string): Promise<Body> => {\n switch (type) {\n case \"image/png\": {\n return await sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .png({ compressionLevel: 9, adaptiveFiltering: true, force: true })\n .withMetadata()\n .toBuffer();\n }\n case \"image/jpeg\":\n case \"image/jpg\": {\n return await sharp(buffer)\n .resize({ width: 2560, withoutEnlargement: true, fit: \"inside\" })\n .toFormat(\"jpeg\", { quality: 90 })\n .toBuffer();\n }\n default:\n return buffer;\n }\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["transformImage.ts"],"names":["buffer","transformations","width","resize","toBuffer"],"mappings":";;;;;;;;;AAIA;;AAJA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;eACe,OAAOA,MAAP,EAAqBC,eAArB,KAAwE;AACnF,QAAM;AAAEC,IAAAA;AAAF,MAAYD,eAAlB;AACA,SAAO,MAAM,oBAAMD,MAAN,EAAcG,MAAd,CAAqB;AAAED,IAAAA;AAAF,GAArB,EAAgCE,QAAhC,EAAb;AACH,C","sourcesContent":["/**\n * Sharp is included in the AWS Lambda layer\n */\n// @ts-ignore\nimport sharp from \"sharp\";\nimport { Body } from \"aws-sdk/clients/s3\";\n\ninterface Transformation {\n width: string;\n}\n/**\n * Only processing \"width\" at the moment.\n * Check \"sanitizeImageTransformations.js\" to allow additional image processing transformations.\n */\nexport default async (buffer: Body, transformations: Transformation): Promise<Body> => {\n const { width } = transformations;\n return await sharp(buffer).resize({ width }).toBuffer();\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["utils.ts"],"names":["SUPPORTED_IMAGES","SUPPORTED_TRANSFORMABLE_IMAGES","OPTIMIZED_TRANSFORMED_IMAGE_PREFIX","OPTIMIZED_IMAGE_PREFIX","getOptimizedImageKeyPrefix","key","getOptimizedTransformedImageKeyPrefix","getImageKey","transformations","prefix"],"mappings":";;;;;;;;;AAAA;;AAEA,MAAMA,gBAAgB,GAAG,CAAC,MAAD,EAAS,OAAT,EAAkB,MAAlB,EAA0B,MAA1B,EAAkC,MAAlC,CAAzB;;AACA,MAAMC,8BAA8B,GAAG,CAAC,MAAD,EAAS,OAAT,EAAkB,MAAlB,CAAvC;;AAEA,MAAMC,kCAAkC,GAAG,UAA3C;;AACA,MAAMC,sBAAsB,GAAG,QAA/B;;;AAEA,MAAMC,0BAA0B,GAAIC,GAAD,IAAyB;AACxD,SAAQ,GAAEF,sBAAuB,GAAE,yBAAWE,GAAX,CAAgB,GAAnD;AACH,CAFD;;;;AAIA,MAAMC,qCAAqC,GAAID,GAAD,IAAyB;AACnE,SAAQ,GAAEH,kCAAmC,GAAE,yBAAWG,GAAX,CAAgB,GAA/D;AACH,CAFD;;;;AASA,MAAME,WAAW,GAAG,CAAC;AAAEF,EAAAA,GAAF;AAAOG,EAAAA;AAAP,CAAD,KAAyD;AACzE,MAAI,CAACA,eAAL,EAAsB;AAClB,UAAMC,MAAM,GAAGL,0BAA0B,CAACC,GAAD,CAAzC;AACA,WAAOI,MAAM,GAAGJ,GAAhB;AACH;;AAED,QAAMI,MAAM,GAAGH,qCAAqC,CAACD,GAAD,CAApD;AACA,SAAQ,GAAEI,MAAO,GAAE,yBAAWD,eAAX,CAA4B,IAAGH,GAAI,EAAtD;AACH,CARD","sourcesContent":["import objectHash from \"object-hash\";\n\nconst SUPPORTED_IMAGES = [\".jpg\", \".jpeg\", \".png\", \".svg\", \".gif\"];\nconst SUPPORTED_TRANSFORMABLE_IMAGES = [\".jpg\", \".jpeg\", \".png\"];\n\nconst OPTIMIZED_TRANSFORMED_IMAGE_PREFIX = \"img-o-t-\";\nconst OPTIMIZED_IMAGE_PREFIX = \"img-o-\";\n\nconst getOptimizedImageKeyPrefix = (key: string): string => {\n return `${OPTIMIZED_IMAGE_PREFIX}${objectHash(key)}-`;\n};\n\nconst getOptimizedTransformedImageKeyPrefix = (key: string): string => {\n return `${OPTIMIZED_TRANSFORMED_IMAGE_PREFIX}${objectHash(key)}-`;\n};\n\ninterface GetImageKeyParams {\n key: string;\n transformations?: any;\n}\n\nconst getImageKey = ({ key, transformations }: GetImageKeyParams): string => {\n if (!transformations) {\n const prefix = getOptimizedImageKeyPrefix(key);\n return prefix + key;\n }\n\n const prefix = getOptimizedTransformedImageKeyPrefix(key);\n return `${prefix}${objectHash(transformations)}-${key}`;\n};\n\nexport {\n SUPPORTED_IMAGES,\n SUPPORTED_TRANSFORMABLE_IMAGES,\n OPTIMIZED_TRANSFORMED_IMAGE_PREFIX,\n OPTIMIZED_IMAGE_PREFIX,\n getImageKey,\n getOptimizedImageKeyPrefix,\n getOptimizedTransformedImageKeyPrefix\n};\n"]}
@@ -16,7 +16,7 @@ export interface DownloadHandlerEventArgs extends HandlerEventArgs {
16
16
  path: string;
17
17
  };
18
18
  queryStringParameters?: {
19
- width: string;
19
+ width?: string;
20
20
  };
21
21
  }
22
22
  export interface TransformHandlerEventArgs extends HandlerEventArgs {
@@ -28,6 +28,6 @@ export interface TransformHandlerEventArgs extends HandlerEventArgs {
28
28
  };
29
29
  }
30
30
  export interface HandlerHeaders {
31
- [key: string]: string | boolean;
31
+ [key: string]: string | boolean | undefined;
32
32
  }
33
33
  export {};
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
@@ -1,7 +1,7 @@
1
1
  import { HandlerEventArgs, HandlerHeaders } from "../types";
2
2
  import { Body } from "aws-sdk/clients/s3";
3
3
  interface EventHandlerResponse {
4
- data: Body;
4
+ data: Body | null;
5
5
  statusCode?: number;
6
6
  headers: HandlerHeaders;
7
7
  }
@@ -12,7 +12,7 @@ export declare const createHandler: <T extends HandlerEventArgs>(eventHandler: E
12
12
  isBase64Encoded: boolean;
13
13
  statusCode: number;
14
14
  headers: {
15
- [x: string]: string | boolean;
15
+ [x: string]: string | boolean | undefined;
16
16
  };
17
17
  body: string;
18
18
  } | {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["createHandler.ts"],"names":["baseHeaders","DEFAULT_CACHE_MAX_AGE","createHandler","eventHandler","event","httpMethod","body","statusCode","headers","data","isBuffer","Buffer","toString","JSON","stringify","error","message","isBase64Encoded","e"],"mappings":";;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA,MAAMA,WAA2B,GAAG;AAChC,iCAA+B,GADC;AAEhC,sCAAoC;AAFJ,CAApC;AAIA,MAAMC,qBAAqB,GAAG,QAA9B,C,CAAwC;;AAWjC,MAAMC,aAAa,GACtBC,YADyB,IAExB;AACD,SAAO,MAAOC,KAAP,IAAoB;AACvB,QAAIA,KAAK,CAACC,UAAN,KAAqB,SAAzB,EAAoC;AAChC,aAAO;AACHC,QAAAA,IAAI,EAAE,EADH;AAEHC,QAAAA,UAAU,EAAE,GAFT;AAGHC,QAAAA,OAAO,kCACAR,WADA;AAEH,2BAAiB,qBAAqBC;AAFnC;AAHJ,OAAP;AAQH;;AAED,QAAI;AACA,YAAM;AAAEQ,QAAAA,IAAF;AAAQF,QAAAA,UAAR;AAAoBC,QAAAA,OAAO,GAAG;AAA9B,UAAqC,MAAML,YAAY,CAACC,KAAD,CAA7D;AACA,YAAMM,QAAQ,GAAGC,MAAM,CAACD,QAAP,CAAgBD,IAAhB,CAAjB;AACA,YAAMH,IAAI,GAAGI,QAAQ,GACdD,IAAD,CAAiBG,QAAjB,CAA0B,QAA1B,CADe,GAEfC,IAAI,CAACC,SAAL,CAAe;AACXC,QAAAA,KAAK,EAAE,KADI;AAEXN,QAAAA,IAFW;AAGXO,QAAAA,OAAO,EAAE;AAHE,OAAf,CAFN;AAQA,aAAO;AACHC,QAAAA,eAAe,EAAEP,QADd;AAEHH,QAAAA,UAAU,EAAEA,UAAU,IAAI,GAFvB;AAGHC,QAAAA,OAAO,kCAAOR,WAAP,GAAuBQ,OAAvB,CAHJ;AAIHF,QAAAA;AAJG,OAAP;AAMH,KAjBD,CAiBE,OAAOY,CAAP,EAAU;AACR,aAAO;AACHX,QAAAA,UAAU,EAAE,GADT;AAEHC,QAAAA,OAAO,EAAER,WAFN;AAGHM,QAAAA,IAAI,EAAEO,IAAI,CAACC,SAAL,CAAe;AACjBC,UAAAA,KAAK,EAAE,IADU;AAEjBN,UAAAA,IAAI,EAAE,IAFW;AAGjBO,UAAAA,OAAO,EAAEE,CAAC,CAACF;AAHM,SAAf;AAHH,OAAP;AASH;AACJ,GAxCD;AAyCH,CA5CM","sourcesContent":["import { HandlerEventArgs, HandlerHeaders } from \"~/handlers/types\";\nimport { Body } from \"aws-sdk/clients/s3\";\n\n/**\n * We need to respond with adequate CORS headers.\n */\nconst baseHeaders: HandlerHeaders = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Credentials\": true\n};\nconst DEFAULT_CACHE_MAX_AGE = 30758400; // 1 year\n\ninterface EventHandlerResponse {\n data: Body | null;\n statusCode?: number;\n headers: HandlerHeaders;\n}\nexport interface EventHandlerCallable<T> {\n (event: T): Promise<EventHandlerResponse>;\n}\n\nexport const createHandler = <T extends HandlerEventArgs>(\n eventHandler: EventHandlerCallable<T>\n) => {\n return async (event: T) => {\n if (event.httpMethod === \"OPTIONS\") {\n return {\n body: \"\",\n statusCode: 204,\n headers: {\n ...baseHeaders,\n \"Cache-Control\": \"public, max-age=\" + DEFAULT_CACHE_MAX_AGE\n }\n };\n }\n\n try {\n const { data, statusCode, headers = {} } = await eventHandler(event);\n const isBuffer = Buffer.isBuffer(data);\n const body = isBuffer\n ? (data as Buffer).toString(\"base64\")\n : JSON.stringify({\n error: false,\n data,\n message: null\n });\n\n return {\n isBase64Encoded: isBuffer,\n statusCode: statusCode || 200,\n headers: { ...baseHeaders, ...headers },\n body\n };\n } catch (e) {\n return {\n statusCode: 500,\n headers: baseHeaders,\n body: JSON.stringify({\n error: true,\n data: null,\n message: e.message\n })\n };\n }\n };\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["getEnvironment.ts"],"names":["bucket","process","env","S3_BUCKET","region","AWS_REGION"],"mappings":";;;;;;;eAAe,OAAO;AAClBA,EAAAA,MAAM,EAAEC,OAAO,CAACC,GAAR,CAAYC,SADF;AAElBC,EAAAA,MAAM,EAAEH,OAAO,CAACC,GAAR,CAAYG;AAFF,CAAP,C","sourcesContent":["export default () => ({\n bucket: process.env.S3_BUCKET as string,\n region: process.env.AWS_REGION as string\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["getObjectParams.ts"],"names":["filename","bucket","Bucket","Key"],"mappings":";;;;;;;;;AAAA;;AAMA;AACA;AACA;eACgBA,QAAD,IAA4C;AACvD,QAAM;AAAEC,IAAAA,MAAM,EAAEC;AAAV,MAAqB,8BAA3B;AAEA,SAAO;AACHA,IAAAA,MADG;AAEHC,IAAAA,GAAG,EAAG,GAAEH,QAAS;AAFd,GAAP;AAIH,C","sourcesContent":["import getEnvironment from \"./getEnvironment\";\n\nexport interface ObjectParamsResponse {\n Bucket: string;\n Key: string;\n}\n/**\n * Returns website's Bucket and file's Key values.\n */\nexport default (filename: string): ObjectParamsResponse => {\n const { bucket: Bucket } = getEnvironment();\n\n return {\n Bucket,\n Key: `${filename}`\n };\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA","sourcesContent":["export { default as getEnvironment } from \"./getEnvironment\";\nexport * from \"./createHandler\";\nexport { default as getObjectParams } from \"./getObjectParams\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-file-manager",
3
- "version": "5.24.0",
3
+ "version": "5.25.0-beta.0",
4
4
  "main": "index.js",
5
5
  "keywords": [
6
6
  "fm:base"
@@ -18,21 +18,21 @@
18
18
  ],
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
- "@babel/runtime": "7.16.7",
21
+ "@babel/runtime": "7.17.2",
22
22
  "@commodo/fields": "1.1.2-beta.20",
23
- "@webiny/api-i18n-content": "5.24.0",
24
- "@webiny/api-security": "5.24.0",
25
- "@webiny/api-tenancy": "5.24.0",
26
- "@webiny/api-upgrade": "5.24.0",
27
- "@webiny/error": "5.24.0",
28
- "@webiny/handler": "5.24.0",
29
- "@webiny/handler-args": "5.24.0",
30
- "@webiny/handler-client": "5.24.0",
31
- "@webiny/handler-graphql": "5.24.0",
32
- "@webiny/plugins": "5.24.0",
33
- "@webiny/project-utils": "5.24.0",
34
- "@webiny/validation": "5.24.0",
35
- "aws-sdk": "2.1066.0",
23
+ "@webiny/api-i18n-content": "5.25.0-beta.0",
24
+ "@webiny/api-security": "5.25.0-beta.0",
25
+ "@webiny/api-tenancy": "5.25.0-beta.0",
26
+ "@webiny/api-upgrade": "5.25.0-beta.0",
27
+ "@webiny/error": "5.25.0-beta.0",
28
+ "@webiny/handler": "5.25.0-beta.0",
29
+ "@webiny/handler-args": "5.25.0-beta.0",
30
+ "@webiny/handler-client": "5.25.0-beta.0",
31
+ "@webiny/handler-graphql": "5.25.0-beta.0",
32
+ "@webiny/plugins": "5.25.0-beta.0",
33
+ "@webiny/project-utils": "5.25.0-beta.0",
34
+ "@webiny/validation": "5.25.0-beta.0",
35
+ "aws-sdk": "2.1086.0",
36
36
  "commodo-fields-object": "1.0.6",
37
37
  "mdbid": "1.0.0",
38
38
  "object-hash": "1.3.1",
@@ -45,13 +45,13 @@
45
45
  "@babel/plugin-transform-runtime": "^7.16.4",
46
46
  "@babel/preset-env": "^7.16.4",
47
47
  "@babel/preset-typescript": "^7.16.0",
48
- "@webiny/api-i18n": "^5.24.0",
49
- "@webiny/api-i18n-ddb": "^5.24.0",
50
- "@webiny/cli": "^5.24.0",
48
+ "@webiny/api-i18n": "^5.25.0-beta.0",
49
+ "@webiny/api-i18n-ddb": "^5.25.0-beta.0",
50
+ "@webiny/cli": "^5.25.0-beta.0",
51
51
  "jest": "^26.6.3",
52
52
  "rimraf": "^3.0.2",
53
53
  "ttypescript": "^1.5.12",
54
- "typescript": "^4.1.3"
54
+ "typescript": "4.5.5"
55
55
  },
56
56
  "publishConfig": {
57
57
  "access": "public",
@@ -72,5 +72,5 @@
72
72
  ]
73
73
  }
74
74
  },
75
- "gitHead": "be0cbfcaa9247c658c44179af7943cc5d6d71bc7"
75
+ "gitHead": "2d3e7833575e88fde77d84e5490e746933a5ec28"
76
76
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["validation.ts"],"names":["FilePlugin","beforeCreate","data","FileModel","fileData","populate","validate","beforeUpdate","updatedFileData","beforeBatchCreate","input","fileInstance"],"mappings":";;;;;;;;;AAAA;;AACA;;eAEe,MAAoB,CAC/B,IAAIA,sBAAJ,CAAe;AACXC,EAAAA,YAAY,EAAE,OAAO;AAAEC,IAAAA;AAAF,GAAP,KAAoB;AAC9B,UAAMC,SAAS,GAAG,+BAAlB;AACA,UAAMC,QAAQ,GAAG,IAAID,SAAJ,GAAgBE,QAAhB,CAAyBH,IAAzB,CAAjB;AACA,UAAME,QAAQ,CAACE,QAAT,EAAN;AACH,GALU;AAMXC,EAAAA,YAAY,EAAE,OAAO;AAAEL,IAAAA;AAAF,GAAP,KAAoB;AAC9B,UAAMC,SAAS,GAAG,8BAAgB,KAAhB,CAAlB;AACA,UAAMK,eAAe,GAAG,IAAIL,SAAJ,GAAgBE,QAAhB,CAAyBH,IAAzB,CAAxB;AACA,UAAMM,eAAe,CAACF,QAAhB,EAAN;AACH,GAVU;AAWXG,EAAAA,iBAAiB,EAAE,OAAO;AAAEP,IAAAA;AAAF,GAAP,KAAoB;AACnC,UAAMC,SAAS,GAAG,+BAAlB;;AACA,SAAK,MAAMO,KAAX,IAAoBR,IAApB,EAA0B;AACtB,YAAMS,YAAY,GAAG,IAAIR,SAAJ,GAAgBE,QAAhB,CAAyBK,KAAzB,CAArB;AACA,YAAMC,YAAY,CAACL,QAAb,EAAN;AACH;AACJ;AAjBU,CAAf,CAD+B,C","sourcesContent":["import { FilePlugin } from \"~/plugins/definitions/FilePlugin\";\nimport createFileModel from \"~/plugins/crud/utils/createFileModel\";\n\nexport default (): FilePlugin[] => [\n new FilePlugin({\n beforeCreate: async ({ data }) => {\n const FileModel = createFileModel();\n const fileData = new FileModel().populate(data);\n await fileData.validate();\n },\n beforeUpdate: async ({ data }) => {\n const FileModel = createFileModel(false);\n const updatedFileData = new FileModel().populate(data);\n await updatedFileData.validate();\n },\n beforeBatchCreate: async ({ data }) => {\n const FileModel = createFileModel();\n for (const input of data) {\n const fileInstance = new FileModel().populate(input);\n await fileInstance.validate();\n }\n }\n })\n];\n"]}
@@ -15,8 +15,6 @@ var _handlerGraphql = require("@webiny/handler-graphql");
15
15
 
16
16
  var _apiSecurity = require("@webiny/api-security");
17
17
 
18
- var _error = _interopRequireDefault(require("@webiny/error"));
19
-
20
18
  var _checkBasePermissions = _interopRequireDefault(require("./utils/checkBasePermissions"));
21
19
 
22
20
  var _handler = require("@webiny/handler");
@@ -25,6 +23,8 @@ var _FilePlugin = require("../definitions/FilePlugin");
25
23
 
26
24
  var _FilesStorageOperationsProviderPlugin = require("../definitions/FilesStorageOperationsProviderPlugin");
27
25
 
26
+ var _error = _interopRequireDefault(require("@webiny/error"));
27
+
28
28
  var _lifecycleEvents = require("./utils/lifecycleEvents");
29
29
 
30
30
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -317,7 +317,7 @@ const filesContextCrudPlugin = new _handler.ContextPlugin(async context => {
317
317
 
318
318
  const where = _objectSpread(_objectSpread({}, initialWhere), {}, {
319
319
  private: false,
320
- locale: context.i18nContent.getCurrentLocale().code,
320
+ locale: getLocaleCode(context),
321
321
  tenant: context.tenancy.getCurrentTenant().id
322
322
  });
323
323
  /**
@@ -392,12 +392,9 @@ const filesContextCrudPlugin = new _handler.ContextPlugin(async context => {
392
392
  limit
393
393
  }) {
394
394
  await (0, _checkBasePermissions.default)(context);
395
- const {
396
- i18nContent
397
- } = context;
398
395
  const where = {
399
396
  tenant: context.tenancy.getCurrentTenant().id,
400
- locale: i18nContent.locale.code
397
+ locale: getLocaleCode(context)
401
398
  };
402
399
  const params = {
403
400
  where,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["files.crud.ts"],"names":["BATCH_CREATE_MAX_FILES","checkOwnership","file","permission","context","own","identity","security","getIdentity","createdBy","id","NotAuthorizedError","getLocaleCode","i18nContent","WebinyError","locale","code","filesContextCrudPlugin","ContextPlugin","pluginType","FilesStorageOperationsProviderPlugin","type","providerPlugin","plugins","byType","find","storageOperations","provide","fileManager","filePlugins","FilePlugin","files","getFile","rwd","get","where","tenant","tenancy","getCurrentTenant","NotFoundError","createFile","input","tags","Array","isArray","meta","private","createdOn","Date","toISOString","displayName","webinyVersion","WEBINY_VERSION","data","result","create","ex","message","updateFile","original","update","deleteFile","delete","createFilesInBatch","inputs","length","map","results","createBatch","listFiles","params","limit","search","types","ids","after","initialWhere","sort","initialSort","type_in","tag_in","tag","toLowerCase","id_in","list","listTags","name"],"mappings":"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","sourcesContent":["/**\n * Package mdbid does not have types.\n */\n// @ts-ignore\nimport mdbid from \"mdbid\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport {\n CreatedBy,\n File,\n FileManagerContext,\n FileManagerFilesStorageOperationsListParamsWhere,\n FileManagerFilesStorageOperationsTagsParamsWhere,\n FilePermission,\n FilesListOpts\n} from \"~/types\";\nimport checkBasePermissions from \"./utils/checkBasePermissions\";\nimport { ContextPlugin } from \"@webiny/handler\";\nimport { FilePlugin } from \"~/plugins/definitions/FilePlugin\";\nimport { FilesStorageOperationsProviderPlugin } from \"~/plugins/definitions/FilesStorageOperationsProviderPlugin\";\nimport WebinyError from \"@webiny/error\";\nimport { runLifecycleEvent } from \"~/plugins/crud/utils/lifecycleEvents\";\n\nconst BATCH_CREATE_MAX_FILES = 20;\n\n/**\n * If permission is limited to \"own\" files only, check that current identity owns the file.\n */\nconst checkOwnership = (file: File, permission: FilePermission, context: FileManagerContext) => {\n if (permission?.own === true) {\n const identity = context.security.getIdentity();\n if (file.createdBy.id !== identity.id) {\n throw new NotAuthorizedError();\n }\n }\n};\n\nconst getLocaleCode = (context: FileManagerContext): string => {\n if (!context.i18nContent) {\n throw new WebinyError(\n \"Missing i18nContent on the FileManagerContext.\",\n \"MISSING_I18N_CONTENT\"\n );\n } else if (!context.i18nContent.locale) {\n throw new WebinyError(\n \"Missing i18nContent.locale on the FileManagerContext.\",\n \"MISSING_I18N_CONTENT_LOCALE\"\n );\n } else if (!context.i18nContent.locale.code) {\n throw new WebinyError(\n \"Missing i18nContent.locale.code on the FileManagerContext.\",\n \"MISSING_I18N_CONTENT_LOCALE_CODE\"\n );\n }\n return context.i18nContent.locale.code;\n};\n\nconst filesContextCrudPlugin = new ContextPlugin<FileManagerContext>(async context => {\n const pluginType = FilesStorageOperationsProviderPlugin.type;\n\n const providerPlugin = context.plugins\n .byType<FilesStorageOperationsProviderPlugin>(pluginType)\n .find(() => true);\n\n if (!providerPlugin) {\n throw new WebinyError(`Missing \"${pluginType}\" plugin.`, \"PLUGIN_NOT_FOUND\", {\n type: pluginType\n });\n }\n\n const storageOperations = await providerPlugin.provide({\n context\n });\n\n if (!context.fileManager) {\n context.fileManager = {} as any;\n }\n\n const filePlugins = context.plugins.byType<FilePlugin>(FilePlugin.type);\n\n context.fileManager.files = {\n async getFile(id: string) {\n const permission = await checkBasePermissions(context, { rwd: \"r\" });\n\n const file = await storageOperations.get({\n where: {\n id,\n tenant: context.tenancy.getCurrentTenant().id,\n locale: getLocaleCode(context)\n }\n });\n\n if (!file) {\n throw new NotFoundError(`File with id \"${id}\" does not exists.`);\n }\n\n checkOwnership(file, permission, context);\n\n return file;\n },\n async createFile(input) {\n await checkBasePermissions(context, { rwd: \"w\" });\n const identity = context.security.getIdentity();\n const tenant = context.tenancy.getCurrentTenant();\n\n const id = mdbid();\n\n const file: File = {\n ...input,\n tags: Array.isArray(input.tags) ? input.tags : [],\n id,\n meta: {\n private: false,\n ...(input.meta || {})\n },\n tenant: tenant.id,\n createdOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n locale: getLocaleCode(context),\n webinyVersion: context.WEBINY_VERSION\n };\n\n try {\n await runLifecycleEvent(\"beforeCreate\", {\n context,\n plugins: filePlugins,\n data: file\n });\n const result = await storageOperations.create({\n file\n });\n await runLifecycleEvent(\"afterCreate\", {\n context,\n plugins: filePlugins,\n data: file,\n file: result\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create a file.\",\n ex.code || \"CREATE_FILE_ERROR\",\n {\n ...(ex.data || {}),\n file\n }\n );\n }\n },\n async updateFile(id, input) {\n const permission = await checkBasePermissions(context, { rwd: \"w\" });\n\n const original = await storageOperations.get({\n where: {\n id,\n tenant: context.tenancy.getCurrentTenant().id,\n locale: getLocaleCode(context)\n }\n });\n\n if (!original) {\n throw new NotFoundError(`File with id \"${id}\" does not exists.`);\n }\n\n checkOwnership(original, permission, context);\n\n const file: File = {\n ...original,\n ...input,\n tags: Array.isArray(input.tags)\n ? input.tags\n : Array.isArray(original.tags)\n ? original.tags\n : [],\n id: original.id,\n webinyVersion: context.WEBINY_VERSION\n };\n\n try {\n await runLifecycleEvent(\"beforeUpdate\", {\n context,\n plugins: filePlugins,\n original,\n data: file\n });\n const result = await storageOperations.update({\n original,\n file\n });\n await runLifecycleEvent(\"afterUpdate\", {\n context,\n plugins: filePlugins,\n original,\n data: file,\n file: result\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update a file.\",\n ex.code || \"UPDATE_FILE_ERROR\",\n {\n ...(ex.data || {}),\n original,\n file\n }\n );\n }\n },\n async deleteFile(id) {\n const permission = await checkBasePermissions(context, { rwd: \"d\" });\n\n const file = await storageOperations.get({\n where: {\n id,\n tenant: context.tenancy.getCurrentTenant().id,\n locale: getLocaleCode(context)\n }\n });\n if (!file) {\n throw new NotFoundError(`File with id \"${id}\" does not exists.`);\n }\n\n checkOwnership(file, permission, context);\n\n try {\n await runLifecycleEvent(\"beforeDelete\", {\n context,\n plugins: filePlugins,\n file\n });\n await storageOperations.delete({\n file\n });\n await runLifecycleEvent(\"afterDelete\", {\n context,\n plugins: filePlugins,\n file\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete a file.\",\n ex.code || \"DELETE_FILE_ERROR\",\n {\n ...(ex.data || {}),\n id,\n file\n }\n );\n }\n\n return true;\n },\n async createFilesInBatch(inputs) {\n if (!Array.isArray(inputs)) {\n throw new WebinyError(`\"data\" must be an array.`, \"CREATE_FILES_NON_ARRAY\");\n }\n\n if (inputs.length === 0) {\n throw new WebinyError(\n `\"data\" argument must contain at least one file.`,\n \"CREATE_FILES_MIN_FILES\"\n );\n }\n\n if (inputs.length > BATCH_CREATE_MAX_FILES) {\n throw new WebinyError(\n `\"data\" argument must not contain more than ${BATCH_CREATE_MAX_FILES} files.`,\n \"CREATE_FILES_MAX_FILES\"\n );\n }\n\n await checkBasePermissions(context, { rwd: \"w\" });\n\n const identity = context.security.getIdentity();\n const tenant = context.tenancy.getCurrentTenant();\n const createdBy: CreatedBy = {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n\n const files: File[] = inputs.map(input => {\n return {\n ...input,\n tags: Array.isArray(input.tags) ? input.tags : [],\n meta: {\n private: false,\n ...(input.meta || {})\n },\n id: mdbid(),\n tenant: tenant.id,\n createdOn: new Date().toISOString(),\n createdBy,\n locale: getLocaleCode(context),\n webinyVersion: context.WEBINY_VERSION\n };\n });\n\n try {\n await runLifecycleEvent(\"beforeBatchCreate\", {\n context,\n plugins: filePlugins,\n data: files\n });\n const results = await storageOperations.createBatch({\n files\n });\n await runLifecycleEvent(\"afterBatchCreate\", {\n context,\n plugins: filePlugins,\n data: files,\n files: results\n });\n return results;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create a batch of files.\",\n ex.code || \"CREATE_FILES_ERROR\",\n {\n ...(ex.data || {}),\n files\n }\n );\n }\n },\n async listFiles(params: FilesListOpts = {}) {\n const permission = await checkBasePermissions(context, { rwd: \"r\" });\n\n const {\n limit = 40,\n search = \"\",\n types = [],\n tags = [],\n ids = [],\n after = null,\n where: initialWhere,\n sort: initialSort\n } = params;\n\n const where: FileManagerFilesStorageOperationsListParamsWhere = {\n ...initialWhere,\n private: false,\n locale: getLocaleCode(context),\n tenant: context.tenancy.getCurrentTenant().id\n };\n /**\n * Always override the createdBy received from the user, if any.\n */\n if (permission.own === true) {\n const identity = context.security.getIdentity();\n where.createdBy = identity.id;\n }\n /**\n * We need to map the old GraphQL definition to the new one.\n * That GQL definition is marked as deprecated.\n */\n /**\n * To have standardized where objects across the applications, we transform the types into type_in.\n */\n if (Array.isArray(types) && types.length > 0 && !where.type_in) {\n where.type_in = types;\n }\n /**\n * We are assigning search to tag and name search.\n * This should be treated as OR condition in the storage operations.\n */\n if (search && !where.search) {\n where.search = search;\n }\n /**\n * Same as on types/type_in.\n */\n if (Array.isArray(tags) && tags.length > 0 && !where.tag_in) {\n where.tag_in = tags.map(tag => tag.toLowerCase());\n }\n /**\n * Same as on types/type_in.\n */\n if (Array.isArray(ids) && ids.length > 0 && !where.id_in) {\n where.id_in = ids;\n }\n\n const sort =\n Array.isArray(initialSort) && initialSort.length > 0 ? initialSort : [\"id_DESC\"];\n try {\n return await storageOperations.list({\n where,\n after,\n limit,\n sort\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not list files by given parameters.\",\n ex.code || \"FILE_TAG_SEARCH_ERROR\",\n {\n ...(ex.data || {}),\n where,\n after,\n limit,\n sort\n }\n );\n }\n },\n async listTags({ after, limit }) {\n await checkBasePermissions(context);\n\n const where: FileManagerFilesStorageOperationsTagsParamsWhere = {\n tenant: context.tenancy.getCurrentTenant().id,\n locale: getLocaleCode(context)\n };\n\n const params = {\n where,\n limit: limit || 100000,\n after\n };\n\n try {\n const [tags] = await storageOperations.tags(params);\n if (Array.isArray(tags) === false) {\n return [];\n }\n /**\n * just to keep it standardized, sort by the tag ASC\n */\n return tags.sort();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not search for tags.\",\n ex.code || \"FILE_TAG_SEARCH_ERROR\",\n {\n ...(ex.data || {}),\n params\n }\n );\n }\n }\n };\n});\n\nfilesContextCrudPlugin.name = \"FileManagerFilesCrud\";\n\nexport default filesContextCrudPlugin;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["settings.crud.ts"],"names":["SETTINGS_KEY","CreateDataModel","uploadMinFileSize","value","validation","create","uploadMaxFileSize","srcPrefix","endsWith","UpdateDataModel","settingsCrudContextPlugin","ContextPlugin","context","pluginType","SettingsStorageOperationsProviderPlugin","type","providerPlugin","plugins","byType","find","WebinyError","storageOperations","provide","fileManager","settings","getSettings","get","createSettings","data","populate","validate","settingsData","toJSON","updateSettings","updatedValue","existingSettings","updatedSettings","onlyDirty","update","original","deleteSettings","delete","name"],"mappings":"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","sourcesContent":["/**\n * Package @commodo/fields does not have types.\n */\n// @ts-ignore\nimport { withFields, string, number, onSet } from \"@commodo/fields\";\nimport { validation } from \"@webiny/validation\";\nimport { FileManagerContext, FileManagerSettings } from \"~/types\";\nimport { SettingsStorageOperationsProviderPlugin } from \"~/plugins/definitions/SettingsStorageOperationsProviderPlugin\";\nimport WebinyError from \"@webiny/error\";\nimport { ContextPlugin } from \"@webiny/handler\";\n\n// TODO @ts-refactor verify that this is not used and remove it\nexport const SETTINGS_KEY = \"file-manager\";\n\nconst CreateDataModel = withFields({\n uploadMinFileSize: number({ value: 0, validation: validation.create(\"gte:0\") }),\n uploadMaxFileSize: number({ value: 26214401 }),\n srcPrefix: onSet((value?: string) => {\n // Make sure srcPrefix always ends with forward slash.\n if (typeof value === \"string\") {\n return value.endsWith(\"/\") ? value : value + \"/\";\n }\n return value;\n })(string({ value: \"/files/\" }))\n})();\n\nconst UpdateDataModel = withFields({\n uploadMinFileSize: number({\n validation: validation.create(\"gte:0\")\n }),\n uploadMaxFileSize: number(),\n srcPrefix: onSet((value?: string) => {\n // Make sure srcPrefix always ends with forward slash.\n if (typeof value === \"string\") {\n return value.endsWith(\"/\") ? value : value + \"/\";\n }\n return value;\n })(string())\n})();\n\nconst settingsCrudContextPlugin = new ContextPlugin<FileManagerContext>(async context => {\n const pluginType = SettingsStorageOperationsProviderPlugin.type;\n\n const providerPlugin = context.plugins\n .byType<SettingsStorageOperationsProviderPlugin>(pluginType)\n .find(() => true);\n\n if (!providerPlugin) {\n throw new WebinyError(`Missing \"${pluginType}\" plugin.`, \"PLUGIN_NOT_FOUND\", {\n type: pluginType\n });\n }\n\n const storageOperations = await providerPlugin.provide({\n context\n });\n\n if (!context.fileManager) {\n context.fileManager = {} as any;\n }\n\n context.fileManager.settings = {\n async getSettings() {\n return storageOperations.get();\n },\n async createSettings(data) {\n const settings = new CreateDataModel().populate(data);\n await settings.validate();\n\n const settingsData: FileManagerSettings = await settings.toJSON();\n\n return storageOperations.create({\n data: settingsData\n });\n },\n async updateSettings(data) {\n const updatedValue = new UpdateDataModel().populate(data);\n await updatedValue.validate();\n\n const existingSettings = (await storageOperations.get()) as FileManagerSettings;\n\n const updatedSettings: Partial<FileManagerSettings> = await updatedValue.toJSON({\n onlyDirty: true\n });\n\n return storageOperations.update({\n original: existingSettings,\n data: {\n ...existingSettings,\n ...updatedSettings\n }\n });\n },\n async deleteSettings() {\n await storageOperations.delete();\n\n return true;\n }\n };\n});\n\nsettingsCrudContextPlugin.name = \"FileMangerSettingsCrud\";\n\nexport default settingsCrudContextPlugin;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["system.crud.ts"],"names":["systemCrudContextPlugin","ContextPlugin","context","pluginType","SystemStorageOperationsProviderPlugin","type","providerPlugin","plugins","byType","find","WebinyError","storageOperations","provide","fileManager","getTenantId","tenancy","getCurrentTenant","id","system","getVersion","get","version","setVersion","data","tenant","update","original","ex","create","install","srcPrefix","identity","security","getIdentity","NotAuthorizedError","installationPlugins","InstallationPlugin","settings","createSettings","WEBINY_VERSION","upgrade","upgradePlugins","filter","pl","app","plugin","deployedVersion","installedAppVersion","upgradeToVersion","apply","name"],"mappings":"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","sourcesContent":["import { NotAuthorizedError } from \"@webiny/api-security\";\nimport { getApplicablePlugin } from \"@webiny/api-upgrade\";\nimport { FileManagerContext, FileManagerSettings, FileManagerSystem } from \"~/types\";\nimport { UpgradePlugin } from \"@webiny/api-upgrade/types\";\nimport WebinyError from \"@webiny/error\";\nimport { ContextPlugin } from \"@webiny/handler\";\nimport { executeCallbacks } from \"~/utils\";\nimport { InstallationPlugin } from \"~/plugins/definitions/InstallationPlugin\";\nimport { SystemStorageOperationsProviderPlugin } from \"~/plugins/definitions/SystemStorageOperationsProviderPlugin\";\n\nconst systemCrudContextPlugin = new ContextPlugin<FileManagerContext>(async context => {\n const pluginType = SystemStorageOperationsProviderPlugin.type;\n const providerPlugin = context.plugins\n .byType<SystemStorageOperationsProviderPlugin>(pluginType)\n .find(() => true);\n\n if (!providerPlugin) {\n throw new WebinyError(`Missing \"${pluginType}\" plugin.`, \"PLUGIN_NOT_FOUND\", {\n type: pluginType\n });\n }\n\n const storageOperations = await providerPlugin.provide({\n context\n });\n\n if (!context.fileManager) {\n context.fileManager = {} as any;\n }\n\n const getTenantId = (): string => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n context.fileManager.system = {\n async getVersion() {\n const system = await storageOperations.get();\n\n return system ? system.version : null;\n },\n async setVersion(version: string) {\n const system = await storageOperations.get();\n\n if (system) {\n const data: FileManagerSystem = {\n ...system,\n tenant: system.tenant || getTenantId(),\n version\n };\n try {\n await storageOperations.update({\n original: system,\n data\n });\n return;\n } catch (ex) {\n throw new WebinyError(\n \"Could not update the system data.\",\n \"SYSTEM_UPDATE_ERROR\",\n {\n data\n }\n );\n }\n }\n\n const data: FileManagerSystem = {\n version,\n tenant: getTenantId()\n };\n try {\n await storageOperations.create({\n data\n });\n return;\n } catch (ex) {\n throw new WebinyError(\"Could not create the system data.\", \"SYSTEM_CREATE_ERROR\", {\n data\n });\n }\n },\n async install({ srcPrefix }) {\n const identity = context.security.getIdentity();\n if (!identity) {\n throw new NotAuthorizedError();\n }\n const { fileManager } = context;\n const version = await fileManager.system.getVersion();\n\n if (version) {\n throw new WebinyError(\n \"File Manager is already installed.\",\n \"FILES_INSTALL_ABORTED\"\n );\n }\n\n const data: Partial<FileManagerSettings> = {};\n\n if (srcPrefix) {\n data.srcPrefix = srcPrefix;\n }\n\n const installationPlugins = context.plugins.byType<InstallationPlugin>(\n InstallationPlugin.type\n );\n\n await executeCallbacks<InstallationPlugin[\"beforeInstall\"]>(\n installationPlugins,\n \"beforeInstall\",\n {\n context\n }\n );\n\n await fileManager.settings.createSettings(data);\n\n await fileManager.system.setVersion(context.WEBINY_VERSION);\n\n await executeCallbacks<InstallationPlugin[\"afterInstall\"]>(\n installationPlugins,\n \"afterInstall\",\n {\n context\n }\n );\n\n return true;\n },\n async upgrade(version) {\n const identity = context.security.getIdentity();\n if (!identity) {\n throw new NotAuthorizedError();\n }\n\n const upgradePlugins = context.plugins\n .byType<UpgradePlugin>(\"api-upgrade\")\n .filter(pl => pl.app === \"file-manager\");\n\n const plugin = getApplicablePlugin({\n deployedVersion: context.WEBINY_VERSION,\n installedAppVersion: await this.getVersion(),\n upgradePlugins,\n upgradeToVersion: version\n });\n\n await plugin.apply(context);\n\n // Store new app version\n await context.fileManager.system.setVersion(version);\n\n return true;\n }\n };\n});\n\nsystemCrudContextPlugin.name = \"FileManagerSystemCrud\";\n\nexport default systemCrudContextPlugin;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["checkBasePermissions.ts"],"names":["context","check","i18nContent","checkI18NContentPermission","filePermission","security","getPermission","NotAuthorizedError","rwd","hasRwd","filesFilePermission","includes"],"mappings":";;;;;;;AACA;;eAEe,OACXA,OADW,EAEXC,KAAuB,GAAG,EAFf,KAGe;AAC1B,QAAMD,OAAO,CAACE,WAAR,CAAoBC,0BAApB,EAAN;AACA,QAAMC,cAAc,GAAG,MAAMJ,OAAO,CAACK,QAAR,CAAiBC,aAAjB,CAA+C,SAA/C,CAA7B;;AACA,MAAI,CAACF,cAAL,EAAqB;AACjB,UAAM,IAAIG,+BAAJ,EAAN;AACH;;AACD,MAAIN,KAAK,CAACO,GAAN,IAAa,CAACC,MAAM,CAACL,cAAD,EAAiBH,KAAK,CAACO,GAAvB,CAAxB,EAAqD;AACjD,UAAM,IAAID,+BAAJ,EAAN;AACH;;AAED,SAAOH,cAAP;AACH,C;;;;AAED,MAAMK,MAAM,GAAG,CAACC,mBAAD,EAAsCF,GAAtC,KAA+D;AAC1E,MAAI,OAAOE,mBAAmB,CAACF,GAA3B,KAAmC,QAAvC,EAAiD;AAC7C,WAAO,IAAP;AACH;;AAED,SAAOE,mBAAmB,CAACF,GAApB,CAAwBG,QAAxB,CAAiCH,GAAjC,CAAP;AACH,CAND","sourcesContent":["import { FileManagerContext, FilePermission } from \"~/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nexport default async (\n context: FileManagerContext,\n check: { rwd?: string } = {}\n): Promise<FilePermission> => {\n await context.i18nContent.checkI18NContentPermission();\n const filePermission = await context.security.getPermission<FilePermission>(\"fm.file\");\n if (!filePermission) {\n throw new NotAuthorizedError();\n }\n if (check.rwd && !hasRwd(filePermission, check.rwd)) {\n throw new NotAuthorizedError();\n }\n\n return filePermission;\n};\n\nconst hasRwd = (filesFilePermission: FilePermission, rwd: string): boolean => {\n if (typeof filesFilePermission.rwd !== \"string\") {\n return true;\n }\n\n return filesFilePermission.rwd.includes(rwd);\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["createFileModel.ts"],"names":["create","key","validation","name","size","type","meta","value","private","tags","Array","isArray","map","item","toLowerCase","list","length","Error","i","tag"],"mappings":";;;;;;;AAIA;;AAKA;;AACA;;AAVA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAIA;AACA;AACA;eACe,CAACA,MAAM,GAAG,IAAV,KAAmB;AAC9B,SAAO,wBAAW;AACdC,IAAAA,GAAG,EAAE,oBAAO;AACRC,MAAAA,UAAU,EAAEA,uBAAWF,MAAX,CAAmB,GAAEA,MAAM,GAAG,WAAH,GAAiB,EAAG,gBAA/C;AADJ,KAAP,CADS;AAIdG,IAAAA,IAAI,EAAE,oBAAO;AAAED,MAAAA,UAAU,EAAEA,uBAAWF,MAAX,CAAkB,gBAAlB;AAAd,KAAP,CAJQ;AAKdI,IAAAA,IAAI,EAAE,qBALQ;AAMdC,IAAAA,IAAI,EAAE,oBAAO;AAAEH,MAAAA,UAAU,EAAEA,uBAAWF,MAAX,CAAkB,eAAlB;AAAd,KAAP,CANQ;AAOdM,IAAAA,IAAI,EAAE,iCAAO;AAAEC,MAAAA,KAAK,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AAAT,KAAP,CAPQ;AAQdC,IAAAA,IAAI,EAAE,mBAAOF,KAAD,IAAqB;AAC7B,UAAI,CAACG,KAAK,CAACC,OAAN,CAAcJ,KAAd,CAAL,EAA2B;AACvB,eAAO,IAAP;AACH;;AAED,aAAOA,KAAK,CAACK,GAAN,CAAUC,IAAI,IAAIA,IAAI,CAACC,WAAL,EAAlB,CAAP;AACH,KANK,EAOF,oBAAO;AACHC,MAAAA,IAAI,EAAE,IADH;AAEHb,MAAAA,UAAU,EAAGO,IAAD,IAAoB;AAC5B,YAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,IAAd,CAAL,EAA0B;AACtB;AACH;;AAED,YAAIA,IAAI,CAACO,MAAL,GAAc,EAAlB,EAAsB;AAClB,gBAAMC,KAAK,CAAC,mCAAD,CAAX;AACH;;AAED,aAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGT,IAAI,CAACO,MAAzB,EAAiCE,CAAC,EAAlC,EAAsC;AAClC,gBAAMC,GAAG,GAAGV,IAAI,CAACS,CAAD,CAAhB;;AACA,cAAI,OAAOC,GAAP,KAAe,QAAnB,EAA6B;AACzB,kBAAMF,KAAK,CAAC,4BAAD,CAAX;AACH;;AAED,cAAIE,GAAG,CAACH,MAAJ,GAAa,EAAjB,EAAqB;AACjB,kBAAMC,KAAK,CAAE,OAAME,GAAI,mCAAZ,CAAX;AACH;AACJ;AACJ;AArBE,KAAP,CAPE;AARQ,GAAX,GAAP;AAwCH,C","sourcesContent":["/**\n * Package @commodo/fields does not have types\n */\n// @ts-ignore\nimport { withFields, string, number, onSet } from \"@commodo/fields\";\n/**\n * Package commodo-fields-object does not have types\n */\n// @ts-ignore\nimport { object } from \"commodo-fields-object\";\nimport { validation } from \"@webiny/validation\";\n\n/**\n * TODO @ts-refactor change for JOI or some other validation library\n */\nexport default (create = true) => {\n return withFields({\n key: string({\n validation: validation.create(`${create ? \"required,\" : \"\"}maxLength:1000`)\n }),\n name: string({ validation: validation.create(\"maxLength:1000\") }),\n size: number(),\n type: string({ validation: validation.create(\"maxLength:255\") }),\n meta: object({ value: { private: false } }),\n tags: onSet((value: string[]) => {\n if (!Array.isArray(value)) {\n return null;\n }\n\n return value.map(item => item.toLowerCase());\n })(\n string({\n list: true,\n validation: (tags: string[]) => {\n if (!Array.isArray(tags)) {\n return;\n }\n\n if (tags.length > 15) {\n throw Error(\"You cannot set more than 15 tags.\");\n }\n\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (typeof tag !== \"string\") {\n throw Error(\"Tag must be typeof string.\");\n }\n\n if (tag.length > 50) {\n throw Error(`Tag ${tag} is more than 50 characters long.`);\n }\n }\n }\n })\n )\n })();\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["lifecycleEvents.ts"],"names":["runLifecycleEvent","hook","params","plugins","rest","length","plugin"],"mappings":";;;;;;;;;;;;;AAAA;AAIO,MAAMA,iBAAiB,GAAG,OAC7BC,IAD6B,EAE7BC,MAF6B,KAGb;AAChB,QAAM;AAAEC,IAAAA;AAAF,MAAuBD,MAA7B;AAAA,QAAoBE,IAApB,0CAA6BF,MAA7B;;AACA,MAAIC,OAAO,CAACE,MAAR,KAAmB,CAAvB,EAA0B;AACtB;AACH;;AACD,OAAK,MAAMC,MAAX,IAAqBH,OAArB,EAA8B;AAC1B,QAAI,CAACG,MAAM,CAACL,IAAD,CAAX,EAAmB;AACf;AACH;AACD;AACR;AACA;;;AACQ,UAAMK,MAAM,CAACL,IAAD,CAAN,CAAaG,IAAb,CAAN;AACH;AACJ,CAjBM","sourcesContent":["// TODO @ts-refactor introduce pubsub methods\nimport { FilePlugin, FilePluginParams } from \"~/plugins/definitions/FilePlugin\";\nimport { FileManagerContext } from \"~/types\";\n\nexport const runLifecycleEvent = async (\n hook: keyof FilePluginParams,\n params: { context: FileManagerContext; plugins: FilePlugin[] } & Record<string, any>\n): Promise<void> => {\n const { plugins, ...rest } = params;\n if (plugins.length === 0) {\n return;\n }\n for (const plugin of plugins) {\n if (!plugin[hook]) {\n continue;\n }\n /**\n * Keep any because we do not know which hook needs to be executed. This will be removed, so it does not matter.\n */\n await plugin[hook](rest as any);\n }\n};\n"]}
@@ -13,7 +13,7 @@ export interface FilePhysicalStoragePluginDeleteParams {
13
13
  key: string;
14
14
  }
15
15
  export declare class FilePhysicalStoragePlugin<U extends FilePhysicalStoragePluginUploadParams = FilePhysicalStoragePluginUploadParams, D extends FilePhysicalStoragePluginDeleteParams = FilePhysicalStoragePluginDeleteParams> extends Plugin {
16
- static readonly type = "api-file-manager-storage";
16
+ static readonly type: string;
17
17
  private readonly _params;
18
18
  constructor(params: FilePhysicalStoragePluginParams<U, D>);
19
19
  upload(params: U): Promise<any>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FilePhysicalStoragePlugin.ts"],"names":["FilePhysicalStoragePlugin","Plugin","constructor","params","_params","upload","WebinyError","delete"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAoBO,MAAMA,yBAAN,SAGGC,eAHH,CAGU;AAINC,EAAAA,WAAW,CAACC,MAAD,EAAgD;AAC9D;AAD8D;AAE9D,SAAKC,OAAL,GAAeD,MAAf;AACH;;AAEkB,QAANE,MAAM,CAACF,MAAD,EAA0B;AACzC,QAAI,CAAC,KAAKC,OAAL,CAAaC,MAAlB,EAA0B;AACtB,YAAM,IAAIC,cAAJ,CACD,qDADC,EAEF,qBAFE,CAAN;AAIH;;AACD,WAAO,KAAKF,OAAL,CAAaC,MAAb,CAAoBF,MAApB,CAAP;AACH;;AAEkB,QAANI,MAAM,CAACJ,MAAD,EAA0B;AACzC,QAAI,CAAC,KAAKC,OAAL,CAAaG,MAAlB,EAA0B;AACtB,YAAM,IAAID,cAAJ,CACD,qDADC,EAEF,qBAFE,CAAN;AAIH;;AACD,WAAO,KAAKF,OAAL,CAAaG,MAAb,CAAoBJ,MAApB,CAAP;AACH;;AA3BY;;;8BAHJH,yB,UAIsC,0B","sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport WebinyError from \"@webiny/error\";\nimport { FileManagerSettings } from \"~/types\";\n\nexport interface FilePhysicalStoragePluginParams<\n U extends FilePhysicalStoragePluginUploadParams,\n D extends FilePhysicalStoragePluginDeleteParams\n> {\n upload: (args: U) => Promise<any>;\n delete: (args: D) => Promise<void>;\n}\n\nexport interface FilePhysicalStoragePluginUploadParams {\n settings: FileManagerSettings;\n buffer: Buffer;\n}\n\nexport interface FilePhysicalStoragePluginDeleteParams {\n key: string;\n}\n\nexport class FilePhysicalStoragePlugin<\n U extends FilePhysicalStoragePluginUploadParams = FilePhysicalStoragePluginUploadParams,\n D extends FilePhysicalStoragePluginDeleteParams = FilePhysicalStoragePluginDeleteParams\n> extends Plugin {\n public static override readonly type: string = \"api-file-manager-storage\";\n private readonly _params: FilePhysicalStoragePluginParams<U, D>;\n\n public constructor(params: FilePhysicalStoragePluginParams<U, D>) {\n super();\n this._params = params;\n }\n\n public async upload(params: U): Promise<any> {\n if (!this._params.upload) {\n throw new WebinyError(\n `You must define the \"upload\" method of this plugin.`,\n \"UPLOAD_METHOD_ERROR\"\n );\n }\n return this._params.upload(params);\n }\n\n public async delete(params: D): Promise<any> {\n if (!this._params.delete) {\n throw new WebinyError(\n `You must define the \"delete\" method of this plugin.`,\n \"DELETE_METHOD_ERROR\"\n );\n }\n return this._params.delete(params);\n }\n}\n"]}
@@ -118,7 +118,7 @@ export interface FilePluginParams {
118
118
  afterDelete?: (params: AfterDeleteParams) => Promise<void>;
119
119
  }
120
120
  export declare class FilePlugin extends Plugin {
121
- static readonly type = "fm.file";
121
+ static readonly type: string;
122
122
  private readonly _params;
123
123
  constructor(params?: FilePluginParams);
124
124
  beforeCreate(params: BeforeCreateParams): Promise<void>;
@@ -55,11 +55,13 @@ class FilePlugin extends _plugins.Plugin {
55
55
 
56
56
 
57
57
  async _execute(callback, params) {
58
- if (typeof this._params[callback] !== "function") {
58
+ const cb = this._params[callback];
59
+
60
+ if (typeof cb !== "function") {
59
61
  return;
60
62
  }
61
63
 
62
- await this._params[callback](params);
64
+ await cb(params);
63
65
  }
64
66
 
65
67
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FilePlugin.ts"],"names":["FilePlugin","Plugin","constructor","params","_params","beforeCreate","_execute","afterCreate","beforeUpdate","afterUpdate","beforeBatchCreate","afterBatchCreate","beforeDelete","afterDelete","callback","cb"],"mappings":";;;;;;;;;;;AAAA;;AA2HO,MAAMA,UAAN,SAAyBC,eAAzB,CAAgC;AAI5BC,EAAAA,WAAW,CAACC,MAAD,EAA4B;AAC1C;AAD0C;AAE1C,SAAKC,OAAL,GAAeD,MAAM,IAAK,EAA1B;AACH;;AAEwB,QAAZE,YAAY,CAACF,MAAD,EAA4C;AACjE,UAAM,KAAKG,QAAL,CAAc,cAAd,EAA8BH,MAA9B,CAAN;AACH;;AAEuB,QAAXI,WAAW,CAACJ,MAAD,EAA2C;AAC/D,UAAM,KAAKG,QAAL,CAAc,aAAd,EAA6BH,MAA7B,CAAN;AACH;;AAEwB,QAAZK,YAAY,CAACL,MAAD,EAA4C;AACjE,UAAM,KAAKG,QAAL,CAAc,cAAd,EAA8BH,MAA9B,CAAN;AACH;;AAEuB,QAAXM,WAAW,CAACN,MAAD,EAA2C;AAC/D,UAAM,KAAKG,QAAL,CAAc,aAAd,EAA6BH,MAA7B,CAAN;AACH;;AAE6B,QAAjBO,iBAAiB,CAACP,MAAD,EAAiD;AAC3E,UAAM,KAAKG,QAAL,CAAc,mBAAd,EAAmCH,MAAnC,CAAN;AACH;;AAE4B,QAAhBQ,gBAAgB,CAACR,MAAD,EAAgD;AACzE,UAAM,KAAKG,QAAL,CAAc,kBAAd,EAAkCH,MAAlC,CAAN;AACH;;AAEwB,QAAZS,YAAY,CAACT,MAAD,EAA4C;AACjE,UAAM,KAAKG,QAAL,CAAc,cAAd,EAA8BH,MAA9B,CAAN;AACH;;AAEuB,QAAXU,WAAW,CAACV,MAAD,EAA2C;AAC/D,UAAM,KAAKG,QAAL,CAAc,aAAd,EAA6BH,MAA7B,CAAN;AACH;AACD;AACJ;AACA;;;AAC0B,QAARG,QAAQ,CAACQ,QAAD,EAAmCX,MAAnC,EAA+D;AACjF,UAAMY,EAAE,GAAG,KAAKX,OAAL,CAAaU,QAAb,CAAX;;AACA,QAAI,OAAOC,EAAP,KAAc,UAAlB,EAA8B;AAC1B;AACH;;AACD,UAAMA,EAAE,CAACZ,MAAD,CAAR;AACH;;AAjDkC;;;8BAA1BH,U,UACsC,S","sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport { File, FileManagerContext } from \"~/types\";\n\n/**\n * Parameters for beforeCreate lifecycle.\n */\nexport interface BeforeCreateParams {\n context: FileManagerContext;\n /**\n * Data to be inserted into the storage.\n */\n data: File;\n}\n/**\n * Parameters for afterCreate lifecycle.\n */\nexport interface AfterCreateParams {\n context: FileManagerContext;\n /**\n * Data that was inserted into the storage.\n */\n data: File;\n /**\n * Result of the storage operations create method.\n * Possibly changed something on the \"data\".\n */\n file: File;\n}\n/**\n * Parameters for beforeUpdate lifecycle.\n */\nexport interface BeforeUpdateParams {\n context: FileManagerContext;\n /**\n * Original file from the storage.\n */\n original: File;\n /**\n * Data to be updated to the storage.\n */\n data: File;\n}\n/**\n * Parameters for afterUpdate lifecycle.\n */\nexport interface AfterUpdateParams {\n context: FileManagerContext;\n /**\n * Original file from the storage.\n */\n original: File;\n /**\n * Data that was updated in the storage.\n */\n data: File;\n /**\n * Result of the storage operations update method.\n * Possibly changed something on the \"data\".\n */\n file: File;\n}\n/**\n * Parameters for beforeBatchCreate lifecycle.\n */\nexport interface BeforeBatchCreateParams {\n context: FileManagerContext;\n /**\n * Files to be inserted into the storage.\n */\n data: File[];\n}\n\n/**\n * Parameters for afterBatchCreate lifecycle.\n */\nexport interface AfterBatchCreateParams {\n context: FileManagerContext;\n /**\n * Files that were inserted into the storage.\n */\n data: File[];\n /**\n * Results of the insert.\n */\n files: File[];\n}\n/**\n * Parameters for beforeDelete lifecycle.\n */\nexport interface BeforeDeleteParams {\n context: FileManagerContext;\n /**\n * File to be deleted from the storage.\n */\n file: File;\n}\n/**\n * Parameters for afterDelete lifecycle.\n */\nexport interface AfterDeleteParams {\n context: FileManagerContext;\n /**\n * File that was deleted from the storage.\n */\n file: File;\n}\n\n/**\n * Definition for the constructor parameters of the FilePlugin.\n *\n * @category FilePlugin\n */\nexport interface FilePluginParams {\n beforeCreate?: (params: BeforeCreateParams) => Promise<void>;\n afterCreate?: (params: AfterCreateParams) => Promise<void>;\n beforeUpdate?: (params: BeforeUpdateParams) => Promise<void>;\n afterUpdate?: (params: AfterUpdateParams) => Promise<void>;\n beforeBatchCreate?: (params: BeforeBatchCreateParams) => Promise<void>;\n afterBatchCreate?: (params: AfterBatchCreateParams) => Promise<void>;\n beforeDelete?: (params: BeforeDeleteParams) => Promise<void>;\n afterDelete?: (params: AfterDeleteParams) => Promise<void>;\n}\n\nexport class FilePlugin extends Plugin {\n public static override readonly type: string = \"fm.file\";\n private readonly _params: FilePluginParams;\n\n public constructor(params?: FilePluginParams) {\n super();\n this._params = params || ({} as any);\n }\n\n public async beforeCreate(params: BeforeCreateParams): Promise<void> {\n await this._execute(\"beforeCreate\", params);\n }\n\n public async afterCreate(params: AfterCreateParams): Promise<void> {\n await this._execute(\"afterCreate\", params);\n }\n\n public async beforeUpdate(params: BeforeUpdateParams): Promise<void> {\n await this._execute(\"beforeUpdate\", params);\n }\n\n public async afterUpdate(params: AfterUpdateParams): Promise<void> {\n await this._execute(\"afterUpdate\", params);\n }\n\n public async beforeBatchCreate(params: BeforeBatchCreateParams): Promise<void> {\n await this._execute(\"beforeBatchCreate\", params);\n }\n\n public async afterBatchCreate(params: AfterBatchCreateParams): Promise<void> {\n await this._execute(\"afterBatchCreate\", params);\n }\n\n public async beforeDelete(params: BeforeDeleteParams): Promise<void> {\n await this._execute(\"beforeDelete\", params);\n }\n\n public async afterDelete(params: AfterDeleteParams): Promise<void> {\n await this._execute(\"afterDelete\", params);\n }\n /**\n * Keep any here because it can be a number of params. Method is internal so no need to complicate the code.\n */\n private async _execute(callback: keyof FilePluginParams, params: any): Promise<void> {\n const cb = this._params[callback];\n if (typeof cb !== \"function\") {\n return;\n }\n await cb(params);\n }\n}\n"]}
@@ -17,7 +17,7 @@ export interface FileStorageTransformPluginParams {
17
17
  fromStorage?: (params: FileStorageTransformPluginFromParams) => Promise<File & Record<string, any>>;
18
18
  }
19
19
  export declare class FileStorageTransformPlugin extends Plugin {
20
- static readonly type = "fm.files.storage.transform";
20
+ static readonly type: string;
21
21
  private readonly _params;
22
22
  constructor(params: FileStorageTransformPluginParams);
23
23
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FileStorageTransformPlugin.ts"],"names":["FileStorageTransformPlugin","Plugin","constructor","params","_params","toStorage","file","fromStorage"],"mappings":";;;;;;;;;;;AAAA;;AAwBO,MAAMA,0BAAN,SAAyCC,eAAzC,CAAgD;AAI5CC,EAAAA,WAAW,CAACC,MAAD,EAA2C;AACzD;AADyD;AAGzD,SAAKC,OAAL,GAAeD,MAAf;AACH;AAED;AACJ;AACA;AACA;;;AAC0B,QAATE,SAAS,CAClBF,MADkB,EAEiB;AACnC,QAAI,CAAC,KAAKC,OAAL,CAAaC,SAAlB,EAA6B;AACzB,aAAOF,MAAM,CAACG,IAAd;AACH;;AACD,WAAO,KAAKF,OAAL,CAAaC,SAAb,CAAuBF,MAAvB,CAAP;AACH;AACD;AACJ;AACA;AACA;AACA;;;AAC4B,QAAXI,WAAW,CACpBJ,MADoB,EAEe;AACnC,QAAI,CAAC,KAAKC,OAAL,CAAaG,WAAlB,EAA+B;AAC3B,aAAOJ,MAAM,CAACG,IAAd;AACH;;AACD,WAAO,KAAKF,OAAL,CAAaG,WAAb,CAAyBJ,MAAzB,CAAP;AACH;;AAlCkD;;;8BAA1CH,0B,UACsC,4B","sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport { File } from \"~/types\";\n\nexport interface FileStorageTransformPluginToParams {\n /**\n * File that is being sent to the storage operations method.\n */\n file: File & Record<string, any>;\n}\n\nexport interface FileStorageTransformPluginFromParams {\n /**\n * File that was fetched from the storage operations method.\n */\n file: File & Record<string, any>;\n}\n\nexport interface FileStorageTransformPluginParams {\n toStorage?: (params: FileStorageTransformPluginToParams) => Promise<File & Record<string, any>>;\n fromStorage?: (\n params: FileStorageTransformPluginFromParams\n ) => Promise<File & Record<string, any>>;\n}\n\nexport class FileStorageTransformPlugin extends Plugin {\n public static override readonly type: string = \"fm.files.storage.transform\";\n private readonly _params: FileStorageTransformPluginParams;\n\n public constructor(params: FileStorageTransformPluginParams) {\n super();\n\n this._params = params;\n }\n\n /**\n * Transform the file value into something that can be stored.\n * Be aware that you must return the whole file object.\n */\n public async toStorage(\n params: FileStorageTransformPluginToParams\n ): Promise<File & Record<string, any>> {\n if (!this._params.toStorage) {\n return params.file;\n }\n return this._params.toStorage(params);\n }\n /**\n * Transform the file value from the storage type to one required by our system.\n * Be aware that you must return the whole file object.\n * This method MUST reverse what ever toStorage method changed on the file object.\n */\n public async fromStorage(\n params: FileStorageTransformPluginFromParams\n ): Promise<File & Record<string, any>> {\n if (!this._params.fromStorage) {\n return params.file;\n }\n return this._params.fromStorage(params);\n }\n}\n"]}
@@ -4,6 +4,6 @@ export interface FilesStorageOperationsProviderPluginParams {
4
4
  context: FileManagerContext;
5
5
  }
6
6
  export declare abstract class FilesStorageOperationsProviderPlugin extends Plugin {
7
- static readonly type = "fm.storageOperationsProvider.files";
7
+ static readonly type: string;
8
8
  abstract provide(params: FilesStorageOperationsProviderPluginParams): Promise<FileManagerFilesStorageOperations>;
9
9
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FilesStorageOperationsProviderPlugin.ts"],"names":["FilesStorageOperationsProviderPlugin","Plugin"],"mappings":";;;;;;;;;;;AAAA;;AAOO,MAAeA,oCAAf,SAA4DC,eAA5D,CAAmE;;;8BAApDD,oC,UAC6B,oC","sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport { FileManagerContext, FileManagerFilesStorageOperations } from \"~/types\";\n\nexport interface FilesStorageOperationsProviderPluginParams {\n context: FileManagerContext;\n}\n\nexport abstract class FilesStorageOperationsProviderPlugin extends Plugin {\n public static override readonly type: string = \"fm.storageOperationsProvider.files\";\n\n public abstract provide(\n params: FilesStorageOperationsProviderPluginParams\n ): Promise<FileManagerFilesStorageOperations>;\n}\n"]}
@@ -9,7 +9,7 @@ interface InstallationPluginConfig {
9
9
  afterInstall?: CallbackFunction<InstallationPluginParams>;
10
10
  }
11
11
  export declare abstract class InstallationPlugin extends Plugin {
12
- static readonly type = "fm.install";
12
+ static readonly type: string;
13
13
  private readonly _config;
14
14
  constructor(config?: Partial<InstallationPluginConfig>);
15
15
  beforeInstall(params: InstallationPluginParams): Promise<void>;
@@ -27,11 +27,13 @@ class InstallationPlugin extends _plugins.Plugin {
27
27
  }
28
28
 
29
29
  async _execute(callback, params) {
30
- if (typeof this._config[callback] !== "function") {
30
+ const cb = this._config[callback];
31
+
32
+ if (!cb) {
31
33
  return;
32
34
  }
33
35
 
34
- return this._config[callback](params);
36
+ return cb(params);
35
37
  }
36
38
 
37
39
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["InstallationPlugin.ts"],"names":["InstallationPlugin","Plugin","constructor","config","_config","beforeInstall","params","_execute","afterInstall","callback","cb"],"mappings":";;;;;;;;;;;AACA;;AAYO,MAAeA,kBAAf,SAA0CC,eAA1C,CAAiD;AAIpDC,EAAAA,WAAW,CAACC,MAAD,EAA6C;AACpD;AADoD;AAEpD,SAAKC,OAAL,GAAeD,MAAM,IAAI,EAAzB;AACH;;AAEyB,QAAbE,aAAa,CAACC,MAAD,EAAkD;AACxE,WAAO,KAAKC,QAAL,CAAc,eAAd,EAA+BD,MAA/B,CAAP;AACH;;AAEwB,QAAZE,YAAY,CAACF,MAAD,EAAkD;AACvE,WAAO,KAAKC,QAAL,CAAc,cAAd,EAA8BD,MAA9B,CAAP;AACH;;AAEqB,QAARC,QAAQ,CAClBE,QADkB,EAElBH,MAFkB,EAGL;AACb,UAAMI,EAAE,GAAG,KAAKN,OAAL,CAAaK,QAAb,CAAX;;AACA,QAAI,CAACC,EAAL,EAAS;AACL;AACH;;AACD,WAAOA,EAAE,CAACJ,MAAD,CAAT;AACH;;AA1BmD;;;8BAAlCN,kB,UAC6B,Y","sourcesContent":["import { FileManagerContext } from \"~/types\";\nimport { Plugin } from \"@webiny/plugins\";\n\nexport interface InstallationPluginParams {\n context: FileManagerContext;\n}\nexport type CallbackFunction<TParams> = (params: TParams) => Promise<void>;\n\ninterface InstallationPluginConfig {\n beforeInstall?: CallbackFunction<InstallationPluginParams>;\n afterInstall?: CallbackFunction<InstallationPluginParams>;\n}\n\nexport abstract class InstallationPlugin extends Plugin {\n public static override readonly type: string = \"fm.install\";\n private readonly _config: Partial<InstallationPluginConfig>;\n\n constructor(config?: Partial<InstallationPluginConfig>) {\n super();\n this._config = config || {};\n }\n\n public async beforeInstall(params: InstallationPluginParams): Promise<void> {\n return this._execute(\"beforeInstall\", params);\n }\n\n public async afterInstall(params: InstallationPluginParams): Promise<void> {\n return this._execute(\"afterInstall\", params);\n }\n\n private async _execute(\n callback: keyof InstallationPluginConfig,\n params: InstallationPluginParams\n ): Promise<void> {\n const cb = this._config[callback];\n if (!cb) {\n return;\n }\n return cb(params);\n }\n}\n"]}
@@ -4,6 +4,6 @@ export interface SettingsStorageOperationsProviderPluginParams {
4
4
  context: FileManagerContext;
5
5
  }
6
6
  export declare abstract class SettingsStorageOperationsProviderPlugin extends Plugin {
7
- static readonly type = "fm.storageOperationsProvider.settings";
7
+ static readonly type: string;
8
8
  abstract provide(params: SettingsStorageOperationsProviderPluginParams): Promise<FileManagerSettingsStorageOperations>;
9
9
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["SettingsStorageOperationsProviderPlugin.ts"],"names":["SettingsStorageOperationsProviderPlugin","Plugin"],"mappings":";;;;;;;;;;;AAAA;;AAOO,MAAeA,uCAAf,SAA+DC,eAA/D,CAAsE;;;8BAAvDD,uC,UAC6B,uC","sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport { FileManagerContext, FileManagerSettingsStorageOperations } from \"~/types\";\n\nexport interface SettingsStorageOperationsProviderPluginParams {\n context: FileManagerContext;\n}\n\nexport abstract class SettingsStorageOperationsProviderPlugin extends Plugin {\n public static override readonly type: string = \"fm.storageOperationsProvider.settings\";\n\n public abstract provide(\n params: SettingsStorageOperationsProviderPluginParams\n ): Promise<FileManagerSettingsStorageOperations>;\n}\n"]}
@@ -4,6 +4,6 @@ export interface SystemStorageOperationsProviderPluginParams {
4
4
  context: FileManagerContext;
5
5
  }
6
6
  export declare abstract class SystemStorageOperationsProviderPlugin extends Plugin {
7
- static readonly type = "fm.storageOperationsProvider.system";
7
+ static readonly type: string;
8
8
  abstract provide(params: SystemStorageOperationsProviderPluginParams): Promise<FileManagerSystemStorageOperations>;
9
9
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["SystemStorageOperationsProviderPlugin.ts"],"names":["SystemStorageOperationsProviderPlugin","Plugin"],"mappings":";;;;;;;;;;;AAAA;;AAOO,MAAeA,qCAAf,SAA6DC,eAA7D,CAAoE;;;8BAArDD,qC,UAC6B,qC","sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport { FileManagerContext, FileManagerSystemStorageOperations } from \"~/types\";\n\nexport interface SystemStorageOperationsProviderPluginParams {\n context: FileManagerContext;\n}\n\nexport abstract class SystemStorageOperationsProviderPlugin extends Plugin {\n public static override readonly type: string = \"fm.storageOperationsProvider.system\";\n\n public abstract provide(\n params: SystemStorageOperationsProviderPluginParams\n ): Promise<FileManagerSystemStorageOperations>;\n}\n"]}
@@ -65,6 +65,7 @@ const plugin = {
65
65
  code: String
66
66
  message: String
67
67
  data: JSON
68
+ stack: String
68
69
  }
69
70
 
70
71
  type FileListResponse {
@@ -185,7 +186,7 @@ const plugin = {
185
186
  File: {
186
187
  async src(file, _, context) {
187
188
  const settings = await context.fileManager.settings.getSettings();
188
- return settings.srcPrefix + file.key;
189
+ return ((settings === null || settings === void 0 ? void 0 : settings.srcPrefix) || "") + file.key;
189
190
  }
190
191
 
191
192
  },
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["graphql.ts"],"names":["emptyResolver","resolve","fn","Response","e","ErrorResponse","plugin","type","schema","typeDefs","resolvers","File","src","file","_","context","settings","fileManager","getSettings","srcPrefix","key","Query","Mutation","FmQuery","getFile","args","files","id","listFiles","data","meta","ListResponse","listTags","error","version","__","i18nContent","tenancy","getCurrentTenant","getCurrentLocale","system","getVersion","FmMutation","createFile","updateFile","createFiles","createFilesInBatch","deleteFile","storage","delete","install","upgrade","updateSettings"],"mappings":";;;;;;;AAAA;;AAIA,MAAMA,aAAa,GAAG,OAAO,EAAP,CAAtB;AAEA;AACA;AACA;AACA;;;AAKA,MAAMC,OAAO,GAAG,MAAOC,EAAP,IAA+B;AAC3C,MAAI;AACA,WAAO,IAAIC,wBAAJ,CAAa,MAAMD,EAAE,EAArB,CAAP;AACH,GAFD,CAEE,OAAOE,CAAP,EAAU;AACR,WAAO,IAAIC,6BAAJ,CAAkBD,CAAlB,CAAP;AACH;AACJ,CAND;;AAQA,MAAME,MAA+C,GAAG;AACpDC,EAAAA,IAAI,EAAE,gBAD8C;AAEpDC,EAAAA,MAAM,EAAE;AACJC,IAAAA,QAAQ;AAAE;AAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SA3JY;AA4JJC,IAAAA,SAAS,EAAE;AACPC,MAAAA,IAAI,EAAE;AACF,cAAMC,GAAN,CAA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","sourcesContent":["import { Response, ErrorResponse, ListResponse } from \"@webiny/handler-graphql\";\nimport { FileManagerContext, FilesListOpts } from \"~/types\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\n\nconst emptyResolver = () => ({});\n\n/**\n * Use any because it really can be any.\n * TODO @ts-refactor maybe use generics at some point?\n */\ninterface ResolveCallable {\n (): Promise<any>;\n}\n\nconst resolve = async (fn: ResolveCallable) => {\n try {\n return new Response(await fn());\n } catch (e) {\n return new ErrorResponse(e);\n }\n};\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n schema: {\n typeDefs: /* GraphQL */ `\n type FmCreatedBy {\n id: ID\n displayName: String\n }\n\n input FileInput {\n key: String\n name: String\n size: Int\n type: String\n tags: [String]\n meta: JSON\n }\n\n type UploadFileResponseDataFile {\n name: String\n type: String\n size: Int\n key: String\n }\n\n type UploadFileResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON\n file: UploadFileResponseDataFile\n }\n\n type FileListMeta {\n cursor: String\n totalCount: Int\n hasMoreItems: Boolean\n }\n\n type FileError {\n code: String\n message: String\n data: JSON\n stack: String\n }\n\n type FileListResponse {\n data: [File]\n meta: FileListMeta\n error: FileError\n }\n\n type FileResponse {\n data: File\n error: FileError\n }\n\n type CreateFilesResponse {\n data: [File]!\n error: FileError\n }\n\n type File {\n id: ID\n key: String\n name: String\n size: Int\n type: String\n src: String\n tags: [String]\n meta: JSON\n createdOn: DateTime\n createdBy: FmCreatedBy\n }\n\n type FileManagerBooleanResponse {\n data: Boolean\n error: FileError\n }\n\n type FileManagerSettings {\n uploadMinFileSize: Number\n uploadMaxFileSize: Number\n srcPrefix: String\n }\n\n input FileManagerSettingsInput {\n uploadMinFileSize: Number\n uploadMaxFileSize: Number\n srcPrefix: String\n }\n\n type FileManagerSettingsResponse {\n data: FileManagerSettings\n error: FileError\n }\n\n input FileWhereInput {\n search: String\n type: String\n type_in: [String!]\n tag: String\n tag_in: [String!]\n tag_and_in: [String!]\n id_in: [ID!]\n id: ID\n }\n\n type FmQuery {\n getFile(id: ID, where: JSON, sort: String): FileResponse\n\n listFiles(\n limit: Int\n after: String\n types: [String]\n tags: [String]\n ids: [ID]\n search: String\n where: FileWhereInput\n ): FileListResponse\n\n listTags: [String]\n\n # Get installed version\n version: String\n\n getSettings: FileManagerSettingsResponse\n }\n\n type FilesDeleteResponse {\n data: Boolean\n error: FileError\n }\n\n type FmMutation {\n createFile(data: FileInput!): FileResponse\n createFiles(data: [FileInput]!): CreateFilesResponse\n updateFile(id: ID!, data: FileInput!): FileResponse\n deleteFile(id: ID!): FilesDeleteResponse\n\n # Install File manager\n install(srcPrefix: String): FileManagerBooleanResponse\n\n upgrade(version: String!): FileManagerBooleanResponse\n\n updateSettings(data: FileManagerSettingsInput): FileManagerSettingsResponse\n }\n\n input FilesInstallInput {\n srcPrefix: String!\n }\n\n extend type Query {\n fileManager: FmQuery\n }\n\n extend type Mutation {\n fileManager: FmMutation\n }\n `,\n resolvers: {\n File: {\n async src(file, _, context: FileManagerContext) {\n const settings = await context.fileManager.settings.getSettings();\n return (settings?.srcPrefix || \"\") + file.key;\n }\n },\n Query: {\n fileManager: emptyResolver\n },\n Mutation: {\n fileManager: emptyResolver\n },\n FmQuery: {\n getFile(_, args: any, context) {\n return resolve(() => context.fileManager.files.getFile(args.id));\n },\n async listFiles(_, args: FilesListOpts, context) {\n try {\n const [data, meta] = await context.fileManager.files.listFiles(args);\n return new ListResponse(data, meta);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n async listTags(_, args: any, context) {\n try {\n return await context.fileManager.files.listTags(args || {});\n } catch (error) {\n return new ErrorResponse(error);\n }\n },\n async version(_, __, context) {\n const { i18nContent, tenancy, fileManager } = context;\n if (!tenancy.getCurrentTenant() || !i18nContent.getCurrentLocale()) {\n return null;\n }\n\n return await fileManager.system.getVersion();\n },\n async getSettings(_, __, context) {\n return resolve(() => context.fileManager.settings.getSettings());\n }\n },\n FmMutation: {\n async createFile(_, args: any, context) {\n return resolve(() => context.fileManager.files.createFile(args.data));\n },\n async updateFile(_, args: any, context) {\n return resolve(() => context.fileManager.files.updateFile(args.id, args.data));\n },\n async createFiles(_, args: any, context) {\n return resolve(() => context.fileManager.files.createFilesInBatch(args.data));\n },\n async deleteFile(_, args: any, context) {\n return resolve(async () => {\n const file = await context.fileManager.files.getFile(args.id);\n return await context.fileManager.storage.delete({\n id: file.id,\n key: file.key\n });\n });\n },\n async install(_, args: any, context) {\n return resolve(() =>\n context.fileManager.system.install({ srcPrefix: args.srcPrefix })\n );\n },\n async upgrade(_, args: any, context) {\n return resolve(() => context.fileManager.system.upgrade(args.version));\n },\n async updateSettings(_, args: any, context) {\n return resolve(() => context.fileManager.settings.updateSettings(args.data));\n }\n }\n }\n }\n};\n\nexport default plugin;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["systemCRUD","settingsCRUD","filesCRUD","storage","graphql"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;eAEe,MAAM,CACjBA,eADiB,EAEjBC,iBAFiB,EAGjBC,cAHiB,EAIjBC,gBAJiB,EAKjBC,gBALiB,EAMjB,0BANiB,C","sourcesContent":["import graphql from \"./graphql\";\nimport filesCRUD from \"./crud/files.crud\";\nimport fileValidationPlugin from \"./crud/files/validation\";\nimport settingsCRUD from \"./crud/settings.crud\";\nimport systemCRUD from \"./crud/system.crud\";\nimport storage from \"./storage\";\n\nexport default () => [\n systemCRUD,\n settingsCRUD,\n filesCRUD,\n storage,\n graphql,\n fileValidationPlugin()\n];\n"]}
@@ -23,17 +23,23 @@ class FileStorage {
23
23
  }) {
24
24
  (0, _defineProperty2.default)(this, "storagePlugin", void 0);
25
25
  (0, _defineProperty2.default)(this, "context", void 0);
26
- this.storagePlugin = context.plugins.byType(storagePluginType).pop();
26
+ const storagePlugin = context.plugins.byType(storagePluginType).pop();
27
27
 
28
- if (!this.storagePlugin) {
28
+ if (!storagePlugin) {
29
29
  throw new _error.default(`Missing plugin of type "${storagePluginType}".`, "STORAGE_PLUGIN_ERROR");
30
30
  }
31
31
 
32
+ this.storagePlugin = storagePlugin;
32
33
  this.context = context;
33
34
  }
34
35
 
35
36
  async upload(params) {
36
- const settings = await this.context.fileManager.settings.getSettings(); // Add file to cloud storage.
37
+ const settings = await this.context.fileManager.settings.getSettings();
38
+
39
+ if (!settings) {
40
+ throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_ERROR");
41
+ } // Add file to cloud storage.
42
+
37
43
 
38
44
  const {
39
45
  file: fileData
@@ -53,7 +59,12 @@ class FileStorage {
53
59
  }
54
60
 
55
61
  async uploadFiles(params) {
56
- const settings = await this.context.fileManager.settings.getSettings(); // Upload files to cloud storage.
62
+ const settings = await this.context.fileManager.settings.getSettings();
63
+
64
+ if (!settings) {
65
+ throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_ERROR");
66
+ } // Upload files to cloud storage.
67
+
57
68
 
58
69
  const promises = [];
59
70
 
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FileStorage.ts"],"names":["storagePluginType","FileStorage","constructor","context","storagePlugin","plugins","byType","pop","WebinyError","upload","params","settings","fileManager","getSettings","file","fileData","files","createFile","meta","private","Boolean","hideInFileManager","tags","Array","isArray","uploadFiles","promises","item","push","uploadFileResponses","Promise","all","filesData","map","response","createFilesInBatch","delete","id","key","deleteFile"],"mappings":"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","sourcesContent":["import { FileManagerContext } from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport { FilePhysicalStoragePlugin } from \"~/plugins/definitions/FilePhysicalStoragePlugin\";\n\nexport type Result = Record<string, any>;\n\nconst storagePluginType = \"api-file-manager-storage\";\n\nexport interface FileStorageUploadParams {\n buffer: Buffer;\n hideInFileManager: boolean | string;\n tags?: string[];\n size: number;\n name: string;\n keyPrefix: string;\n type: string;\n}\nexport interface FileStorageDeleteParams {\n id: string;\n key: string;\n}\n\nexport interface FileStorageUploadMultipleParams {\n files: FileStorageUploadParams[];\n}\n\nexport interface FileStorageParams {\n context: FileManagerContext;\n}\nexport class FileStorage {\n private readonly storagePlugin: FilePhysicalStoragePlugin;\n private readonly context: FileManagerContext;\n\n constructor({ context }: FileStorageParams) {\n const storagePlugin = context.plugins\n .byType<FilePhysicalStoragePlugin>(storagePluginType)\n .pop();\n if (!storagePlugin) {\n throw new WebinyError(\n `Missing plugin of type \"${storagePluginType}\".`,\n \"STORAGE_PLUGIN_ERROR\"\n );\n }\n this.storagePlugin = storagePlugin;\n this.context = context;\n }\n\n async upload(params: FileStorageUploadParams): Promise<Result> {\n const settings = await this.context.fileManager.settings.getSettings();\n if (!settings) {\n throw new WebinyError(\"Missing File Manager Settings.\", \"FILE_MANAGER_ERROR\");\n }\n // Add file to cloud storage.\n const { file: fileData } = await this.storagePlugin.upload({\n ...params,\n settings\n });\n\n const { fileManager } = this.context;\n\n // Save file in DB.\n return await fileManager.files.createFile({\n ...(fileData as any),\n meta: {\n private: Boolean(params.hideInFileManager)\n },\n tags: Array.isArray(params.tags) ? params.tags : []\n });\n }\n\n async uploadFiles(params: FileStorageUploadMultipleParams) {\n const settings = await this.context.fileManager.settings.getSettings();\n if (!settings) {\n throw new WebinyError(\"Missing File Manager Settings.\", \"FILE_MANAGER_ERROR\");\n }\n // Upload files to cloud storage.\n const promises = [];\n for (const item of params.files) {\n promises.push(\n this.storagePlugin.upload({\n ...item,\n settings\n })\n );\n }\n // Wait for all to resolve.\n const uploadFileResponses = await Promise.all(promises);\n\n const filesData = uploadFileResponses.map(response => response.file);\n\n const { fileManager } = this.context;\n // Save files in DB.\n return fileManager.files.createFilesInBatch(filesData);\n }\n\n async delete(params: FileStorageDeleteParams) {\n const { id, key } = params;\n const { fileManager } = this.context;\n // Delete file from cloud storage.\n await this.storagePlugin.delete({\n key\n });\n // Delete file from the DB.\n return await fileManager.files.deleteFile(id);\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["fileStorageContextPlugin","ContextPlugin","context","fileManager","storage","FileStorage"],"mappings":";;;;;;;AACA;;AACA;;AAEA,MAAMA,wBAAwB,GAAG,IAAIC,sBAAJ,CAAsC,MAAMC,OAAN,IAAiB;AACpF,MAAI,CAACA,OAAO,CAACC,WAAb,EAA0B;AACtB;AACR;AACA;AACA;AACQD,IAAAA,OAAO,CAACC,WAAR,GAAsB,EAAtB;AACH;;AACDD,EAAAA,OAAO,CAACC,WAAR,CAAoBC,OAApB,GAA8B,IAAIC,wBAAJ,CAAgB;AAC1CH,IAAAA;AAD0C,GAAhB,CAA9B;AAGH,CAXgC,CAAjC;eAaeF,wB","sourcesContent":["import { FileManagerContext } from \"~/types\";\nimport { ContextPlugin } from \"@webiny/handler\";\nimport { FileStorage } from \"./FileStorage\";\n\nconst fileStorageContextPlugin = new ContextPlugin<FileManagerContext>(async context => {\n if (!context.fileManager) {\n /**\n * We need to define the fileManager initial property as empty object.\n * When casting as FileManagerContext, typescript is complaining.\n */\n context.fileManager = {} as any;\n }\n context.fileManager.storage = new FileStorage({\n context\n });\n});\n\nexport default fileStorageContextPlugin;\n"]}
package/types.d.ts CHANGED
@@ -39,7 +39,7 @@ export interface File {
39
39
  }
40
40
  export interface CreatedBy {
41
41
  id: string;
42
- displayName: string;
42
+ displayName: string | null;
43
43
  type: string;
44
44
  }
45
45
  export interface FileInput {
@@ -48,7 +48,7 @@ export interface FileInput {
48
48
  size: number;
49
49
  type: string;
50
50
  meta: Record<string, any>;
51
- tags: [string];
51
+ tags: string[];
52
52
  }
53
53
  export interface FileListWhereParams {
54
54
  search?: string;
@@ -71,8 +71,9 @@ export interface FilesListOpts {
71
71
  sort?: string[];
72
72
  }
73
73
  export interface FileListMeta {
74
- cursor: string;
74
+ cursor: string | null;
75
75
  totalCount: number;
76
+ hasMoreItems: boolean;
76
77
  }
77
78
  interface FilesCrudListTagsWhere {
78
79
  tag?: string;
@@ -94,7 +95,7 @@ export interface FilesCRUD {
94
95
  createFilesInBatch(data: FileInput[]): Promise<File[]>;
95
96
  }
96
97
  export interface SystemCRUD {
97
- getVersion(): Promise<string>;
98
+ getVersion(): Promise<string | null>;
98
99
  setVersion(version: string): Promise<void>;
99
100
  install(args: {
100
101
  srcPrefix: string;
@@ -112,7 +113,7 @@ export interface FileManagerSystem {
112
113
  tenant: string;
113
114
  }
114
115
  export declare type SettingsCRUD = {
115
- getSettings(): Promise<FileManagerSettings>;
116
+ getSettings(): Promise<FileManagerSettings | null>;
116
117
  createSettings(data?: Partial<FileManagerSettings>): Promise<FileManagerSettings>;
117
118
  updateSettings(data: Partial<FileManagerSettings>): Promise<FileManagerSettings>;
118
119
  deleteSettings(): Promise<boolean>;
@@ -297,7 +298,7 @@ export interface FileManagerFilesStorageOperationsListParams {
297
298
  export interface FileManagerFilesStorageOperationsListResponseMeta {
298
299
  hasMoreItems: boolean;
299
300
  totalCount: number;
300
- cursor: string;
301
+ cursor: string | null;
301
302
  }
302
303
  export declare type FileManagerFilesStorageOperationsListResponse = [
303
304
  File[],
@@ -333,11 +334,11 @@ export interface FileManagerFilesStorageOperations {
333
334
  /**
334
335
  * Insert the file data into the database.
335
336
  */
336
- create: (params: FileManagerFilesStorageOperationsCreateParams) => Promise<File | null>;
337
+ create: (params: FileManagerFilesStorageOperationsCreateParams) => Promise<File>;
337
338
  /**
338
339
  * Update the file data in the database.
339
340
  */
340
- update: (params: FileManagerFilesStorageOperationsUpdateParams) => Promise<File | null>;
341
+ update: (params: FileManagerFilesStorageOperationsUpdateParams) => Promise<File>;
341
342
  /**
342
343
  * Delete the file from the database.
343
344
  */
package/types.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
package/utils.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["utils.ts"],"names":["executeCallbacks","plugins","hook","args","plugin"],"mappings":";;;;;;;AAIO,MAAMA,gBAAgB,GAAG,OAG5BC,OAH4B,EAI5BC,IAJ4B,EAK5BC,IAL4B,KAM3B;AACD,OAAK,MAAMC,MAAX,IAAqBH,OAArB,EAA8B;AAC1B,QAAI,OAAOG,MAAM,CAACF,IAAD,CAAb,KAAwB,UAA5B,EAAwC;AACpC,YAAME,MAAM,CAACF,IAAD,CAAN,CAAaC,IAAb,CAAN;AACH;AACJ;AACJ,CAZM","sourcesContent":["import { Plugin } from \"@webiny/plugins/types\";\n\ntype CallbackFallback = (args: any) => void | Promise<void>;\n\nexport const executeCallbacks = async <\n TCallbackFunction extends CallbackFallback = CallbackFallback\n>(\n plugins: Plugin[],\n hook: string,\n args: Parameters<TCallbackFunction>[0]\n) => {\n for (const plugin of plugins) {\n if (typeof plugin[hook] === \"function\") {\n await plugin[hook](args);\n }\n }\n};\n"]}